Apply Patch
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
<Bindings>
|
||||
<Binding name="OUTFITTER_OUTFIT1" header="OUTFITTER_TITLE">
|
||||
Outfitter_WearBoundOutfit(1);
|
||||
</Binding>
|
||||
<Binding name="OUTFITTER_OUTFIT2">
|
||||
Outfitter_WearBoundOutfit(2);
|
||||
</Binding>
|
||||
<Binding name="OUTFITTER_OUTFIT3">
|
||||
Outfitter_WearBoundOutfit(3);
|
||||
</Binding>
|
||||
<Binding name="OUTFITTER_OUTFIT4">
|
||||
Outfitter_WearBoundOutfit(4);
|
||||
</Binding>
|
||||
<Binding name="OUTFITTER_OUTFIT5">
|
||||
Outfitter_WearBoundOutfit(5);
|
||||
</Binding>
|
||||
<Binding name="OUTFITTER_OUTFIT6">
|
||||
Outfitter_WearBoundOutfit(6);
|
||||
</Binding>
|
||||
<Binding name="OUTFITTER_OUTFIT7">
|
||||
Outfitter_WearBoundOutfit(7);
|
||||
</Binding>
|
||||
<Binding name="OUTFITTER_OUTFIT8">
|
||||
Outfitter_WearBoundOutfit(8);
|
||||
</Binding>
|
||||
<Binding name="OUTFITTER_OUTFIT9">
|
||||
Outfitter_WearBoundOutfit(9);
|
||||
</Binding>
|
||||
<Binding name="OUTFITTER_OUTFIT10">
|
||||
Outfitter_WearBoundOutfit(10);
|
||||
</Binding>
|
||||
</Bindings>
|
||||
@@ -0,0 +1,34 @@
|
||||
gBossTrashNames = {
|
||||
--MC--
|
||||
["Core Rager"] = true,
|
||||
["Firesworn"] = true,
|
||||
["Flamewaker"] = true,
|
||||
["Flamewaker Protector"] = true,
|
||||
["Flamewaker Healer"] = true,
|
||||
["Flamewaker Elite"] = true,
|
||||
["Flamewaker Priest"] = true,
|
||||
|
||||
--ZG--
|
||||
["Razzashi Cobra"] = true,
|
||||
["Zealot Zath"] = true,
|
||||
["Zealot Lor'Khan"] = true,
|
||||
["Witherbark Speaker"] = true,
|
||||
["Vilebranch Speaker"] = true,
|
||||
|
||||
--BWL--
|
||||
["Grethok the Controller"] = true,
|
||||
["Blackwing Guardsman"] = true,
|
||||
|
||||
--AQ--
|
||||
["Sartura's Royal Guard"] = true,
|
||||
|
||||
--NAXX--
|
||||
["Crypt Guard"] = true,
|
||||
["Deathknight Understudy"] = true,
|
||||
["Naxxramas Combat Dummy"] = true,
|
||||
["Naxxramas Follower"] = true,
|
||||
["Naxxramas Worshipper"] = true,
|
||||
["Soldier of the Frozen Wastes"] = true,
|
||||
["Soul Weaver"] = true,
|
||||
["Unstoppable Abomination"] = true,
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
Version 2.0:
|
||||
|
||||
- Outfit analyzer displays complete statistics for the current outfit
|
||||
- Generate outfits to maximize TankPoints and HealPoints
|
||||
- Unequipping items will attempt to return them to their original bag
|
||||
- Dining outfit will automatically unequip once health and mana reach 100%
|
||||
- Enhanced tooltips in the character window explaining how each stat affects other attributes
|
||||
- Mage Evocate outfit
|
||||
- Hunter aspects
|
||||
- Create custom Special Occassion outfits for particular zones/areas
|
||||
- Scriptable special occassion outfits with custom event triggers and code
|
||||
- Shows info in item tooltips stating whether that item would be an upgrade for you
|
||||
- Show info in item tooltips listing the outfits in which the item is used
|
||||
- Ability to update an outfit with the currently equipped items
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 51 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 93 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 133 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 52 KiB |
@@ -0,0 +1,490 @@
|
||||
-------------------------------------------
|
||||
Having an item on the cursor (ie, clicking a bag item) and then activating an outfit
|
||||
while the item is still being held will cause the outfit to fail to equip properly
|
||||
-------------------------------------------
|
||||
Stance/Shapeshift changing outfits should swap in-place in the outfit stack
|
||||
-------------------------------------------
|
||||
Optimizing for +Healing appears to sometimes select gear which has lower damage+healing
|
||||
stats over gear which has healing only (Peacekeeper Leggings being selected over
|
||||
Judgement Legplates)
|
||||
-------------------------------------------
|
||||
Generating an outfit will not find items in the main bank slots
|
||||
-------------------------------------------
|
||||
|
||||
Version 1.6.0 Changes
|
||||
|
||||
- Optional SuperWoW / ClassicAPI support: client mount flag for the Riding outfit,
|
||||
per-spell-ID caching of buff tooltip scans, GUID-based target tracking
|
||||
- New Swimming special occasion outfit (surface swimming needs SuperWoW or ClassicAPI;
|
||||
falls back to the breath timer otherwise)
|
||||
- /outfitter mods reports detected client mods
|
||||
- Fixed gear being unequipped into bags after logging in following a game crash
|
||||
- Fixed Sunnyglade Valley outfit never equipping
|
||||
- "Disable in instances" now covers all dungeons and raids
|
||||
- World-boss classification counts as Boss target
|
||||
- Localized creature types for target outfits (deDE, frFR)
|
||||
|
||||
Version 1.4 Changes
|
||||
|
||||
- Special Occassion outfit added for mages when evocating
|
||||
- Special Occassion outfits added for the various hunter aspects
|
||||
- Battleground and Around Town outfits now have German translations
|
||||
- Eastern and Western Plaguelands are correctly identified by German versions
|
||||
- Titan and FuBar menus will now update when renaming an outfit
|
||||
- Multipart enchants are supported (ie, Zul'Gurub)
|
||||
- Korean language support
|
||||
|
||||
Version 1.4b5 Changes
|
||||
|
||||
- Generating an outfit now properly recognizes items in the main bank slots
|
||||
- Added Korean translation
|
||||
|
||||
Version 1.4b4 Changes
|
||||
|
||||
- Arclight Spanner is no longer counted as an unused item
|
||||
- Added Small Soul Pouch (12 slot shard bag)
|
||||
- Ammo slot now ignores unequipping ammo
|
||||
- Multipart enchants are supported (ie, Zul'Gurub)
|
||||
- Health regen items of the form "xx health per 5 sec." are supported
|
||||
|
||||
Version 1.4b3 Changes
|
||||
|
||||
- Fixed outfit optimization bug so that 2H weapons are compared correctly to 1H/OH combinations
|
||||
- Fixed shapeshift/stance detection for patch 1.12
|
||||
- Fixed Priest: Shadowform
|
||||
|
||||
Version 1.4b2 Changes
|
||||
|
||||
- Changed cloak to low priority when unequipping since it doesn't have durability
|
||||
- Fixed inventory caching bug (sometimes caused current outfit to appear as "Custom")
|
||||
|
||||
Version 1.3.3 Changes
|
||||
|
||||
- Added a spaz filter to prevent outfits from toggling repeatedly if the user spams a key binding
|
||||
- Added an on-screen message when changing outfits using a key binding
|
||||
- Removed Repair Bags feature
|
||||
- Added Naxxramas to the Argent Dawn zone list
|
||||
- Corrected plaguelands zone names for German clients
|
||||
|
||||
Version 1.3.3b2 Changes
|
||||
|
||||
- Added Naxxramas to the Argent Dawn zone list
|
||||
- Correct plaguelands zone names for German clients
|
||||
|
||||
Version 1.3.2 Changes
|
||||
|
||||
- Patch 1.11 compatibility
|
||||
- Added ability to deposit only the unique items in an outfit to the bank
|
||||
- Improved QuickSlot support for ammo slot
|
||||
- Mining pick, skinning knife, blacksmith hammer, twilight cultist pieces and other items are now excluded
|
||||
from being displayed in the unused items list
|
||||
- Dining outfit now automatically unequips once health and mana reach 99%
|
||||
- Fixed initialization so that Argent Dawn, Riding, Fishing etc. outfits are automatically
|
||||
set up again
|
||||
- Added ability to recover from outfit stack corruption errors
|
||||
|
||||
Version 1.3.2b4 Changes
|
||||
|
||||
- Modified behavior of Special Occassion outfits so that when they're disabled in Battlegrounds
|
||||
they'll still automatically unequip
|
||||
- Added APIs to aid in external addons building an Outfit menu (third-party FuBar support)
|
||||
- Added OUTFITTER_INIT message to outfit events which is sent after Outfitter finishes initialization
|
||||
|
||||
Version 1.3.2b3 Changes
|
||||
|
||||
- Fixed lockup when generating outfits which utilize weapons, rings or trinkets
|
||||
|
||||
Version 1.3.2b2 Changes
|
||||
|
||||
- Removed debug messages
|
||||
|
||||
Version 1.3.1 Changes
|
||||
|
||||
- Selected items are no longer accidentally updated if another outfit with overlapping
|
||||
items is deposited to the bank
|
||||
- Outfit status is now correctly updated after depositing, withdrawing, opening or closing
|
||||
the bank window
|
||||
- Battleground-specific outfits are now given priority over the general Battleground outfit
|
||||
when there is overlap
|
||||
- Minimap and Titan outfit menus will now update if they're open during an outfit change
|
||||
- Removed ammo items from the Unused Items list
|
||||
- Identical items which are both used in an outfit will no longer list one of those items
|
||||
as being unused
|
||||
|
||||
Version 1.3.1b2 Changes
|
||||
|
||||
- Fixed bug causing a selected outfit to be modified if another outfit containing some
|
||||
of the same items was deposited to the bank
|
||||
- Fixed item cache to update correctly afer the bank is opened
|
||||
|
||||
Version 1.3.1b1 Changes
|
||||
|
||||
- Outfits specific to each battleground will now be equipped on top of the general
|
||||
Battleground outfit
|
||||
- Minimap and Titan outfit menus modified to update on outfit changes
|
||||
- Fixed bugs causing outfit status to be incorrect after depositing or withdrawing
|
||||
them from the bank or equipping them directly from the bank
|
||||
- Fixed bug causing identical items to sometimes appear in the unused items list even
|
||||
though they both were used in an outfit
|
||||
- Modified unused item list to never list ammo
|
||||
|
||||
Version 1.3 Changes
|
||||
|
||||
- Repair All button for repairing everything including items in backpacks
|
||||
- Show and hide helm and cloak settings are saved with each helm and cloak
|
||||
- Ammo slot is now supported in outfits
|
||||
- Improved performance
|
||||
- Enabled outfit changes when hunters are feigning death. Changing equipment while feigned
|
||||
may cause the character to appear to stand up, but does not actually break the feign as
|
||||
previously assumed
|
||||
- Titan Outfitter displays the name of the most recently equipped outfit
|
||||
|
||||
Version 1.2 Changes
|
||||
|
||||
- Added Around Town outfit which is equipped automatically in friendly cities
|
||||
- Added Shaman: Ghost Wolf outfit
|
||||
- Added battleground-specific outfits for AB, AV, WSG
|
||||
- Added Chance to Hit with Spells outfit generation
|
||||
- Gave priority to Rune and Seal of the Dawn so they're selected before the old
|
||||
commission when there's a choice
|
||||
- Modified stat parsing to ignore set bonuses when generating outfits
|
||||
- Modified minimap outfit menu to only list outfits which actually contain items
|
||||
- Odds 'n Ends (unused items) now show icons and color-coded names
|
||||
|
||||
Version 1.1:
|
||||
|
||||
- Better performance when changing outfits and generating smart outfits
|
||||
- Supports identical items which only differ by their enchantments
|
||||
- Outfits with missing items are displayed in red and the missing items for that outfit
|
||||
are listed in the tooltip
|
||||
- There is a new category, Odds 'n ends, which lists all equipable items which aren't part
|
||||
of any outfit
|
||||
- New support for banked items when the bank window is opened:
|
||||
QuickSlots will include banked items in the list of equippable items for that slot
|
||||
Outfits with banked items are displayed in blue and the banked items for that
|
||||
outfit are listed in the tooltip
|
||||
Items for an outfit can be moved directly to or from the bank
|
||||
Outfits can be equipped directly from the bank (note that this will cause existing
|
||||
equipped items to be placed into the bank)
|
||||
- Generated outfits now take contributions from other item stats into account, including:
|
||||
Agility is included in armor, dodge, and melee critical strike calculations
|
||||
Stamina is included in health calculations
|
||||
Intellect is included in mana and spell critical strike calculations
|
||||
Spirit is included in mana regen calculations
|
||||
Strength is included in blocking calculations
|
||||
- Support for minimaps which have been repositioned to other corners of the screen
|
||||
- Improved support for complex item swaps for weapon, trinket and ring slots
|
||||
- Rings, trinkets, and weapons are now calculated correctly when generating outfits
|
||||
- On-equip category-specific spell damage is now supported, such as "Equip: Increases
|
||||
damage done by Shadow spells and effects..."
|
||||
- Titan Panel support
|
||||
|
||||
Version 1.3b10 Changes
|
||||
|
||||
- Fixed bug in Titan Outfitter addon which caused errors during outfit changes
|
||||
|
||||
Version 1.3b9 Changes
|
||||
|
||||
- Fixed bugs which may have caused the tooltip to appear while repairing items
|
||||
|
||||
Version 1.3b8 Changes
|
||||
|
||||
- Fixed bug causing second finger and second trinket slot to be processed incorrectly
|
||||
during equipment changes as well as causing nil pointer errors to sometimes be generated
|
||||
when unequipping items
|
||||
|
||||
Version 1.3b7 Changes
|
||||
|
||||
- Fixed bug causing GetCurrentOutfitInfo to sometimes fail (was possibly causing
|
||||
problems for Titan Outfitter)
|
||||
|
||||
Version 1.3b6 Changes
|
||||
|
||||
- Suppressed outfit change notifications until after initialization is completed (was
|
||||
possibly causing problems for Titan Outfitter)
|
||||
- Changed GetCurrentOutfitInfo to return an empty string for the name instead of nil
|
||||
when no named outfits are found (was possibly causing problems for Titan Outfitter)
|
||||
|
||||
Version 1.3b5 Changes
|
||||
|
||||
- Fixed typo in detecting Spirit stat on German clients
|
||||
- Fixed outfit caching bug which could sometimes cause outfit items to be marked as missing
|
||||
|
||||
Version 1.3b4 Changes
|
||||
|
||||
- Turned off debug messages
|
||||
- Added outfit name display to Titan plugin
|
||||
- Added Herb Pouch (12 slot herb bag) to list of specialty bags
|
||||
|
||||
Version 1.3b3 Changes
|
||||
|
||||
- Disabled hunter feign death handling introduced in 1.2
|
||||
- Changed repair in bags button strata to prevent it from being hidden behind the vendor window
|
||||
- Fixed item caching bugs which caused empty slots to become unselectable
|
||||
|
||||
Version 1.3b2 Changes
|
||||
|
||||
- Slightly improved responsiveness of repair items in bags button
|
||||
- Fixed repair items in bags feature so that the main backpack gets examined
|
||||
- Fixed ammo slot support so ammo is now included in the outfit
|
||||
- Optimized equipment/bag updates. This should improve performance slightly when changing
|
||||
items as well as when shooting arrows/bullets.
|
||||
|
||||
Version 1.2b6 Changes
|
||||
|
||||
- Fixed bug which caused multiple errors messages on startup when using Titan Panel
|
||||
- Added ability to hide label text in Titan Panel
|
||||
|
||||
Version 1.2b5 Changes
|
||||
|
||||
- Fixed broken slot enable checkboxes
|
||||
- Fixed cursor updating in the outfit list
|
||||
|
||||
Version 1.2b4 Changes
|
||||
|
||||
- Added icons and quality-based name coloring to Odds 'n Ends list to make it easier to find
|
||||
the item (eventually I'll make it so that you can click the item and open the bag containing
|
||||
it but that'll have to wait for another day)
|
||||
- Outfit changes will no longer take place while a hunter is feigning death
|
||||
- Fixed bug with auto equipping city outfit when entering Ironforge under certain circumstances
|
||||
- Added support for external addons to be notified when outfits are equipped or removed
|
||||
- Added Outfitter_FindOutfitByStatID for use by external addons
|
||||
- Fixed outfit changing to wait until the player is alive before changing gear
|
||||
|
||||
Version 1.2b3 Changes
|
||||
|
||||
- Added caching code to improve performance when changing outfits
|
||||
|
||||
Version 1.2b2 Changes
|
||||
|
||||
- Fixed nil pointer bug
|
||||
- Fixed Disable in Battlegrounds outfit setting
|
||||
- Updated French translations
|
||||
|
||||
Version 1.1.11 Changes
|
||||
|
||||
- Remove debug code
|
||||
|
||||
Version 1.1.10 Changes
|
||||
|
||||
- Worked around problem with shaepshift/stance outfits not working after leaving battlegrounds
|
||||
- Corrected stat-detection strings for French clients
|
||||
- Fixed bug which caused switching from a 2H to a 1H/OH combo to fail sometimes while in combat
|
||||
- Changed the order in which items are unequipped so that durabiliity items are removed first
|
||||
|
||||
Version 1.1.9 Changes:
|
||||
|
||||
- Modified QuickSlots for better compatibility with other inventory slot addons
|
||||
- Fixed detection of items in the main bank slots
|
||||
- Fixed Rebuild Outfit to update an outfit's category after setting the new items
|
||||
- Correct mount detection for French clients
|
||||
- Fixed /outfitter wear and unwear commands so they behave the same as clicking in the UI
|
||||
|
||||
Version 1.1.8 Changes:
|
||||
|
||||
- Suspended updates between leaving/entering world events to slightly improve load
|
||||
screen performance
|
||||
- Ammo slot checkbox is now hidden for classes which have a relic slot
|
||||
- Fixed Quickslots to hide on second click if Quickslot is already opened
|
||||
|
||||
Version 1.1.7 Changes:
|
||||
|
||||
- Added support for herbalism and enchanting bags
|
||||
|
||||
Version 1.1.6 Changes:
|
||||
|
||||
- Fixed bug which caused a nil pointer error when using outfit combinations which
|
||||
don't specify every slot
|
||||
- Added support for relic items (untested)
|
||||
|
||||
Version 1.1.5 Changes:
|
||||
|
||||
- Fixed Riding outfit and other features related to reading game tooltip text such as outfit generation
|
||||
|
||||
Version 1.1.4 Changes:
|
||||
|
||||
- Modified behavior so that switching between a 1H/OH weapon combo to a 2H weapon will
|
||||
put the offhand item into the left-most available bag instead of the right-most to match
|
||||
the behavior of other items when they're unequipped
|
||||
- Changed base outfit to be empty instead of naked when compiling the current outfit. This
|
||||
allows a player who don't use complete outfits to have unused slots which are left alone instead of
|
||||
being made naked. A side effect of this will be that nothing will happen when a complete
|
||||
wardrobe is uneqipped, where previously that would've removed all armor/weapons.
|
||||
- Fixed Priest: Shadowform outfit
|
||||
- Updated for patch 1.10
|
||||
|
||||
Version 1.1.3 Changes:
|
||||
|
||||
- Fixed problem with outfit changes when entering or leaving an instance while in combat (again)
|
||||
- Modified outfit updating to occur after all changes have been processed. This should prevent
|
||||
problems caused by switching stances/shapeshifting outfit changes
|
||||
- Changed key binding behavior to toggle the bound outfit instead of only wearing it
|
||||
- Fixed bug causing toggled outfits to not unequip other outfits when worn
|
||||
|
||||
Version 1.1.2 Changes:
|
||||
|
||||
- Modified database item updating to defer until a BAG_UPDATE event is received in
|
||||
order to provide a more reliable update and avoid having outfits showing items as missing
|
||||
- Changed minimap menu to skip populating the menu items if main initialization hasn't
|
||||
completed yet (fixes first-time initialization error when using Titan Panel)
|
||||
- Fixed bug causing list items to become hidden when the list doesn't fill the display
|
||||
- Fixed expand/collapse icons to correctly indicate the category state
|
||||
|
||||
Version 1.1.1 Changes:
|
||||
|
||||
- Removed debug messages
|
||||
|
||||
Version 1.1 Changes:
|
||||
|
||||
- Fixed moonkin form for french clients
|
||||
- Fixed dire bear form for german clients
|
||||
- Added TitanOutfitter support for Titan Panel
|
||||
|
||||
Version 1.1b8 Changes:
|
||||
|
||||
- Fixed bug which caused Outfitter to become confused about the combat state if
|
||||
the player entered an instance while in combat
|
||||
- Fixed Quickslots so they close when the character window is closed
|
||||
|
||||
Version 1.1b7 Changes:
|
||||
|
||||
- Added deposit/withdraw outfit items
|
||||
- Added coloring and tooltip to indicate banked items
|
||||
- Fixed error message when using with characters that have empty bag slots
|
||||
|
||||
Version 1.1b6 Changes:
|
||||
|
||||
- Updated user's manual with descriptions of macro commands and key bindings
|
||||
- Fixed bug causing weapon changes to fail when moving between main hand and secondary hand
|
||||
- Improved error message when an outfit combination attempts to use the same item in two
|
||||
different positions (ie, both ring slots, both trinket slots, or both weapon slots)
|
||||
- Fixed bugs in handling temporary item changes. This was causing problems with items
|
||||
not swapping back after dining, dismounting, or in some combat situations
|
||||
- Fixed frame strata so that outfitter UI doesn't obscure the Quickslots
|
||||
|
||||
Version 1.1b5 Changes:
|
||||
|
||||
- Added outfit availability check whenever the bank window is opened or closed
|
||||
- Changed outfitter frame strata to "high" so that it always opens on top of the bank window
|
||||
- Changed initialization back to PLAYER_ENTERING_WORLD
|
||||
- Added support for thrown weapons
|
||||
- Added error checks for unrecognized inventory types
|
||||
|
||||
Version 1.1b4 Changes:
|
||||
|
||||
- Fixed initial outfit generation to correctly find items (carrot, argent dawn commission, etc.)
|
||||
- Added bank slot support to QuickSlots so items can be equipped from the bank when the bank window
|
||||
is opened
|
||||
- Fixed problems with switching from a 2H weapon/item to a 1H/OH combo
|
||||
- Modified initialization to always re-create the special occassion outfits if they're missing
|
||||
- Fixed QuickSlot behavior so that the slots only open if an item is picked up from the inventory
|
||||
slot. This will prevent them from opening when applying poisons, oils, enchants, etc.
|
||||
|
||||
Version 1.0.2 Changes:
|
||||
|
||||
- Added Druid Moonkin form
|
||||
- Modified combat detection to use REGEN_ENABLED/DISABLED instead of ENTER/LEAVE_COMBAT. This should
|
||||
fix various problems with items not equipping properly when entering/leaving combat.
|
||||
- Fixed minimap menu position for players who relocate their minimap to another part of the screen
|
||||
- Improved behavior of QuickSlots to prevent them from spontaneously closing
|
||||
|
||||
Version 1.0.1 Changes:
|
||||
|
||||
- Fixed race condition which caused outfits to be accessed before they were initialized
|
||||
- Fixed initialization to select the Normal outfit after it's created
|
||||
- Added User's Manual
|
||||
|
||||
Verison 1.0 Changes:
|
||||
|
||||
- Fixed initialization so that a false temporary outfit isn't generated
|
||||
- Fixed initialization so that the special outfits will be updated correctly
|
||||
if the state has changed since logging off (ie, logging off while mounted will
|
||||
now correctly remove the Riding outfit at the next login)
|
||||
- Added tooltips explaining what the slot enable checkboxes do
|
||||
|
||||
Version 1.0b16 Changes:
|
||||
|
||||
- Fixed bug which generated a naked base outfit for weapons-only changes instead of a transparent outfit
|
||||
- Updated french translation
|
||||
|
||||
Version 1.0b15 Changes:
|
||||
|
||||
- Fixed nil pointer bug when unequipping items under some circumstances
|
||||
- Fixed duplicate messages when adding new items to an outfit
|
||||
- Added French translation
|
||||
|
||||
Version 1.0b14 Changes:
|
||||
|
||||
- Added "Disable outfit in Battlegrounds" option. This option is selected by default for the Riding outfit.
|
||||
- Fixed outfit changes made during combat so they occur after combat is exited (again)
|
||||
|
||||
Version 1.0b13 Changes:
|
||||
|
||||
- Fixed "That slot is empty" error message caused when switching to a 2H from a 1H/OH combo
|
||||
- Fixed outfit initialization so that if no previous outfits were worn the player won't be left naked after dismounting
|
||||
|
||||
Version 1.0b12 Changes:
|
||||
|
||||
- Added quivers to speciality bags
|
||||
- Modified equipment changes in order to improve in-combat weapon switching
|
||||
|
||||
Version 1.0b11 Changes:
|
||||
|
||||
- Added rogue stealth outfit
|
||||
- Fixed nil pointer bug when an unrecognized shapeshift type is encountered
|
||||
- Items which are BoE but not yet soulbound will no longer be chosen for smart outfits
|
||||
nor selected when attempting to equip items
|
||||
- Added ability to swap weapon slots during combat
|
||||
- Fixed equipping dual identical weapons/rings/trinkets (again)
|
||||
- Modified minimap menu to hide unused categories
|
||||
|
||||
Version 1.0b10 Changes:
|
||||
|
||||
- Fixed nil pointer error when attempting to move the minimap icon while
|
||||
the game time and minimap zoom in/out icons are hidden
|
||||
- Fixed nil pointer error when changing outfits with some slots being emptied
|
||||
- Changed minimap menu to hide disabled outfits
|
||||
|
||||
Version 1.0b9 Changes:
|
||||
|
||||
- Added Option panel with ability to turn off minimap button
|
||||
- Added ability to create an empty outfit
|
||||
- Added /outfitter command
|
||||
- Fixed tooltip position on QuickSlot items
|
||||
- Fixed minimap menu position
|
||||
- Fixed support for 1H weapons when optimizing outfits
|
||||
- Added support for displaying 1H weapons in the offhand QuickSlot
|
||||
- Fixed problems with QuickSlots not staying open
|
||||
- Fixed problems with multiple trinkets, rings or weapons of the same kind not equipping correctly
|
||||
- Added support for druid shapeshift, priest shadowform and warrior stance special occassion outfits
|
||||
|
||||
Version 1.0b8 Changes:
|
||||
|
||||
- Added QuickSlots
|
||||
- Fixed plus/minus button
|
||||
- Added ability to disable an outfit
|
||||
- Removed disable special occassions button
|
||||
- Added Battleground special occassion outfit
|
||||
- Added support for ammo pouches
|
||||
|
||||
Version 1.0b2 Changes:
|
||||
|
||||
- Fixed bug which clears the selection when an outfit is moved
|
||||
- Modified slot enable checkboxes to equip drag-and-drop items
|
||||
- Fixed initialization bug which caused outfits to not be created properly and errors
|
||||
|
||||
Version 1.0b3 Changes:
|
||||
|
||||
- Now remembers the outfits being worn at logoff
|
||||
- Defers outfit changes made during combat until combat ends
|
||||
|
||||
Version 1.0b4 Changes:
|
||||
|
||||
- Fixed initialization bugs
|
||||
|
||||
Version 1.0b5 Changes:
|
||||
|
||||
- Added Healing outfits
|
||||
- Added support for soul shard bags
|
||||
- Added support for Benediction/Anathema and Thunderstrike/Shadowstrike aliases
|
||||
- Equipping an item while editing an outfit will now add that item to the outfit
|
||||
@@ -0,0 +1,201 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Outfitter User's Manual</title>
|
||||
<style type="text/css"> a:link { color: #ffe040; }
|
||||
a:visited { color: #ffe040; }
|
||||
a:hover { color: white; }
|
||||
a:active { color: purple; }
|
||||
body { background-image: url('Images/background.jpg'); background-repeat: repeat-xy; color: #ffe040; }
|
||||
h2 { color: white; }
|
||||
p { font-size: medium; font-weight: bold; margin-left: 3em; }
|
||||
div { font-size: medium; font-weight: bold; padding-left: 3em; }
|
||||
ul { margin-left: 5em; }
|
||||
li { font-size: medium; font-weight: bold; }
|
||||
.title { font-size: xx-large; font-weight: bold; color: #ffffff; }
|
||||
.note { color: #ffffff; margin-left: 2em; }
|
||||
.GameFontNormal { font-size: medium; font-weight: bold; color: #ffe040; }
|
||||
.GameFontHighlight { font-size: medium; font-weight: bold; color: #ffffff; }
|
||||
.Cmd { font-family: courier; font-size: medium; font-weight: normal; color: #ffffff; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<span class="title"><img align="absMiddle" src="Images/OutfitterIcon.jpg">Outfitter Instructions</span>
|
||||
<h2>Contents</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="#Install">Installing Outfitter</a>
|
||||
<li>
|
||||
<a href="#Access">Accessing Outfitter</a>
|
||||
<li>
|
||||
<a href="#Categories">Outfit categories and ready-made outfits</a>
|
||||
<li>
|
||||
<a href="#Create">Creating an outfit</a>
|
||||
<li>
|
||||
<a href="#Update">Updating an outfit</a>
|
||||
<li>
|
||||
<a href="#Minimap">The minimap button</a>
|
||||
<li>
|
||||
<a href="#Quickslots">QuickSlots</a>
|
||||
<li>
|
||||
<a href="#Commands">Commands</a>
|
||||
<li>
|
||||
<a href="#KeyBindings">Key Bindings</a>
|
||||
</ul>
|
||||
<h2><a name="Install">Installing Outfitter</a></h2>
|
||||
<p>Outfitter is installed just like any other addon. If World of Warcraft is
|
||||
running you should exit from the game before installing. Extract the contents
|
||||
of the Outfitter.zip file and then copy the resulting Outfitter folder to your
|
||||
World of Warcraft's Addons folder located inside the Interface folder.</p>
|
||||
<p><span class="GameFontHighlight">Windows users:</span>
|
||||
The Addons folder can normally be found at
|
||||
<span class="Cmd">C:\Program
|
||||
Files\World of Warcraft\Interface\Addons</span></p>
|
||||
<p><span class="GameFontHighlight">MacOS users:</span>The Addons folder can
|
||||
normally be found inside the Interface folder which is located inside the World
|
||||
of Warcraft application folder</p>
|
||||
<p>IMPORTANT: Depending on your unzipping application, you may end up with the
|
||||
addon folder inside another folder. Look inside the Outfitter folder and verify
|
||||
that there's a file named Outfitter.toc. If you don't see this file and see
|
||||
another folder instead, open that folder and look for the file. The folder
|
||||
containing the .toc file is the one which should be copied to your World of
|
||||
Warcraft addons folder.</p>
|
||||
<p>The addon is now installed and you can now launch World of Warcraft.</p>
|
||||
<h2><a name="Access">Accessing Outfitter</a></h2>
|
||||
<p>To open Outfitter simply open World of Warcrafts character window (usually the
|
||||
'c' key on your keyboard. You can open Outfitter from the Character window by
|
||||
click the button with a robe icon in the top right corner of the window.</p>
|
||||
<div align="center"><img src="Images/OutfitterUI.jpg"></div>
|
||||
<h2><a name="Categories">Outfit categories and ready-made outfits</a></h2>
|
||||
<p>One of the first things you will notice is that Outfitter has created several
|
||||
outfits for you and that these outfits are in categories named Complete
|
||||
Wardrobes, Mix-n-match, Accessories, and Special Occassions.</p>
|
||||
<p><span class="GameFontHighlight">Complete Wardrobes</span>
|
||||
are outfits which contain an item for every slot of your inventory. Whenever
|
||||
you wear a complete wardrobe you will replace any other outfits you're wearing
|
||||
at the time. The first time you use Outfitter it will create two complete
|
||||
wardrobes for you. The Normal wardrobe is whatever gear you happened to be
|
||||
wearing when Outfitter was first run. The Birthday Suit outfit is a naked
|
||||
outfit which will remove all of your gear when you wear it.</p>
|
||||
<p><span class="GameFontHighlight">Mix-n-match</span>
|
||||
outfits on the other hand don't have items in every slot. These outfits are
|
||||
used to overlay special sets of items, such as Fire Resist gear or PvP items,
|
||||
over a complete wardrobe. Any time you select a Mix-n-match outfit you will
|
||||
replace all other outfits you're wearing, except for the selected Complete
|
||||
Wardrobe which will act as a base outfit for the overlay. The first time you
|
||||
use Outfitter it will attempt to create a set of resistance gear (Fire, Nature,
|
||||
etc.) for you. If you don't have any items which give you a particular
|
||||
resistance then Outfitter won't create that outfit automatically.</p>
|
||||
<p><span class="GameFontHighlight">Accessories</span>, like Mix-n-match, are also
|
||||
only partial outfits. The difference is that you can combine as many accessory
|
||||
outfits as you like. These outfits can be used for equipping special items such
|
||||
as Jumper Cables, Lei of Lilies, fishing poles, or other items which you don't
|
||||
normally have as part of another outfit. The first time you use Outfitter it
|
||||
will search your bags for tradeskill items, such as fishing poles, gloves with
|
||||
herbalism, mining or skinning enchants, etc. and create Accessory outfits for
|
||||
those.</p>
|
||||
<p>The last category is
|
||||
<span class="GameFontHighlight">Special Occassion</span>
|
||||
outfits which are worn automatically for you at the appropriate time. There are
|
||||
several of these outfits, some are created for every class and others are only
|
||||
created for specific classes</p>
|
||||
<p>The
|
||||
<span class="GameFontHighlight">Argent Dawn</span>
|
||||
outfit will be worn whenever you're in the plaguelands, Scholomance or
|
||||
Stratholme and will automatically be setup with your Argent Dawn trinket if you
|
||||
have one.</p>
|
||||
<p>The
|
||||
<span class="GameFontHighlight">Riding</span>
|
||||
outfit will be worn whenever you are mounted and will automatically be setup
|
||||
with your Carrot on a Stick, boots with Mithril Spurs, and gloves with the
|
||||
Riding Skill enchantment if you have those. Note that by default the riding
|
||||
outfit is setup so that it won't equip when you are in a battleground. You can
|
||||
change this setting using the menu to the right of the outfit.</p>
|
||||
<p>The
|
||||
<span class="GameFontHighlight">Dining</span>
|
||||
outfit will be worn whenever you start eating or drinking. This outfit is
|
||||
initially "transparent" (meaning it has no inventory slots enabled) but can be
|
||||
edited to include items which boost your spirit or health and mana regen in
|
||||
order to lower your down time. Choosing items for this outfit can be tricky
|
||||
though since you don't want to swap in items which reduce your stamina or
|
||||
intellect.</p>
|
||||
<p>The
|
||||
<span class="GameFontHighlight">Battlegrounds</span>
|
||||
outfit will be worn whenever you're in one of the three battlegrounds and can
|
||||
be used to automatically equip your PvP gear.</p>
|
||||
<p>There are also class-specific outfits for priests (shadowform), rogues
|
||||
(stealth), warriors (all three stances), and druids (all four shapeshift
|
||||
forms). These outfits are set to transparent by default, so they have no
|
||||
effect.</p>
|
||||
<p>Any of the Special Occassion outfits can be disabled by using the menu to the
|
||||
right of the outfit. This is useful if you only temporarily want to prevent
|
||||
that outfit from auto-equipping.</p>
|
||||
<h2><a name="Create">Creating an outfit</a></h2>
|
||||
<p>To create an outfit click the New Outfit button at the bottom of the window.
|
||||
This will open the New Outfit window where you can name your new outfit and
|
||||
specify how you want it initially setup.</p>
|
||||
<div align="center"><img src="Images/NewOutfit.jpg"></div>
|
||||
<p>By default the Optimize menu will be set to use current outfit. This will create
|
||||
the new outfit as a Complete Wardrobe using whatever items you currently have
|
||||
equipped.</p>
|
||||
<p>You may choose Create Empty Outfit which will create an outfit with no slots
|
||||
enabled.</p>
|
||||
<p>If you want to have Outfitter generate an outfit for you which maximizes some
|
||||
attribute, you can choose that attribute from the various sub-menus of the
|
||||
Optimize menu. You can maximize stamina, nature resistance, spell damage, and
|
||||
many other attributes using this feature. Outfitter will scan your bags and
|
||||
inventory and choose an item for each slot which has the maximum value for that
|
||||
attribute. If you don't have any items for a slot which contain that attribute
|
||||
then that slot will not be enabled in your new outfit.</p>
|
||||
<h2><a name="Update">Updating an outfit</a></h2>
|
||||
<p>You can change the contents of an outfit at any time by opening Outfitter and
|
||||
selecting the outfit from your list of outfits. The selected outfit will equip
|
||||
and the enabled slots for that outfit will have checkmarks in them. Just equip
|
||||
an item and it will be added to the selected outfit. If you no longer want that
|
||||
outfit to include a particular slot just uncheck the box for that slot.</p>
|
||||
<p>When an outfit is selected you will also see two new buttons at the top of your
|
||||
character window "Enable all" and "Enable none" These buttons can be used to
|
||||
quickly enable all item slots or disable all item slots to make it easier to
|
||||
create your outfit.</p>
|
||||
<h2><a name="Minimap">The minimap button</a></h2>
|
||||
<p>The minimap button will initially be located at the center of the left side of
|
||||
your minimap. If you are using other addons which place buttons around the
|
||||
minimap you may have to temporarily move them out of the way in order to see
|
||||
Outfitters button.</p>
|
||||
<div align="center"><img src="Images/Minimap.jpg"></div>
|
||||
<p>To change the position of Outfitter button just drag it to where you'd like it.
|
||||
This position will be remembered and set for you each time you start World of
|
||||
Warcraft.</p>
|
||||
<p>To bring up Outfitters minimap menu click the button. From here you can open the
|
||||
Outfitter UI in order to edit outfits or you can quickly select an outfit to
|
||||
wear.</p>
|
||||
<h2><a name="Quickslots">QuickSlots</a></h2>
|
||||
<p>QuickSlots are automatically added to your character window for each item slot.
|
||||
They allow you to quickly find items which go into that slot without having to
|
||||
dig through all your bags. To access the QuickSlot just click a slot in your
|
||||
character window. A row of inventory slots will appear containing every item
|
||||
you have which can go into that slot. An empty slot is also provided so you can
|
||||
quickly unequip an item without having to open your bags.</p>
|
||||
<div align="center"><img src="Images/QuickSlots.jpg"></div>
|
||||
<h2><a name="Commands">Commands</a></h2>
|
||||
<p>Commands to equip or unequip outfits can be included in macros. Outfitter
|
||||
supports these commands:</p>
|
||||
<p>
|
||||
<span class="Cmd">/outfitter wear outfitname</span>
|
||||
Equips the outfit named outfitname<br>
|
||||
<span class="Cmd">/outfitter unwear outfitname</span>
|
||||
Unequips the outfit named outfitname<br>
|
||||
<span class="Cmd">/outfitter toggle outfitname</span>
|
||||
Toggles the outfit named outfitname (if it is currently equipped it's removed,
|
||||
otherwise it's equipped<br>
|
||||
</p>
|
||||
<h2><a name="KeyBindings">Key Bindings</a></h2>
|
||||
<p>Outfits can be attached to a key so that they can be equipped or removed using a
|
||||
key press. Outfitter supports up to 10 outfits being attached to keys. To
|
||||
attach an outfit to a key on your keyboard, do the following:</p>
|
||||
<p>First, use the menu next to the outfit to choose which of the 10 key bindings
|
||||
you want to use for your outfit.</p>
|
||||
<p>Next open World of Warcraft's Key Binding settings window and scroll down to the
|
||||
Outfitter section. In that section you will see the 10 key binding outfits
|
||||
listed and you can associate a key combination with that outfit.</p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,973 @@
|
||||
--[[
|
||||
Name: AceEvent-2.0
|
||||
Revision: $Rev: 17803 $
|
||||
Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team)
|
||||
Inspired By: Ace 1.x by Turan (turan@gryphon.com)
|
||||
Website: http://www.wowace.com/
|
||||
Documentation: http://www.wowace.com/index.php/AceEvent-2.0
|
||||
SVN: http://svn.wowace.com/root/trunk/Ace2/AceEvent-2.0
|
||||
Description: Mixin to allow for event handling, scheduling, and inter-addon
|
||||
communication.
|
||||
Dependencies: AceLibrary, AceOO-2.0
|
||||
]]
|
||||
|
||||
local MAJOR_VERSION = "AceEvent-2.0"
|
||||
local MINOR_VERSION = "$Revision: 17803 $"
|
||||
|
||||
if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end
|
||||
if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end
|
||||
|
||||
if loadstring("return function(...) return ... end") and AceLibrary:HasInstance(MAJOR_VERSION) then return end -- lua51 check
|
||||
if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0") end
|
||||
|
||||
local AceOO = AceLibrary:GetInstance("AceOO-2.0")
|
||||
local Mixin = AceOO.Mixin
|
||||
local AceEvent = Mixin {
|
||||
"RegisterEvent",
|
||||
"RegisterAllEvents",
|
||||
"UnregisterEvent",
|
||||
"UnregisterAllEvents",
|
||||
"TriggerEvent",
|
||||
"ScheduleEvent",
|
||||
"ScheduleRepeatingEvent",
|
||||
"CancelScheduledEvent",
|
||||
"CancelAllScheduledEvents",
|
||||
"IsEventRegistered",
|
||||
"IsEventScheduled",
|
||||
"RegisterBucketEvent",
|
||||
"UnregisterBucketEvent",
|
||||
"UnregisterAllBucketEvents",
|
||||
"IsBucketEventRegistered",
|
||||
}
|
||||
|
||||
local table_setn
|
||||
do
|
||||
local version = GetBuildInfo()
|
||||
if string.find(version, "^2%.") then
|
||||
-- 2.0.0
|
||||
table_setn = function() end
|
||||
else
|
||||
table_setn = table.setn
|
||||
end
|
||||
end
|
||||
|
||||
local weakKey = {__mode="k"}
|
||||
local new, del
|
||||
do
|
||||
local list = setmetatable({}, weakKey)
|
||||
function new()
|
||||
local t = next(list)
|
||||
if t then
|
||||
list[t] = nil
|
||||
return t
|
||||
else
|
||||
return {}
|
||||
end
|
||||
end
|
||||
|
||||
function del(t)
|
||||
setmetatable(t, nil)
|
||||
for k in pairs(t) do
|
||||
t[k] = nil
|
||||
end
|
||||
list[t] = true
|
||||
end
|
||||
end
|
||||
|
||||
local FAKE_NIL
|
||||
local RATE
|
||||
|
||||
local eventsWhichHappenOnce = {
|
||||
PLAYER_LOGIN = true,
|
||||
AceEvent_FullyInitialized = true,
|
||||
VARIABLES_LOADED = true,
|
||||
PLAYER_LOGOUT = true,
|
||||
}
|
||||
|
||||
local registeringFromAceEvent
|
||||
function AceEvent:RegisterEvent(event, method, once)
|
||||
AceEvent:argCheck(event, 2, "string")
|
||||
if self == AceEvent and not registeringFromAceEvent then
|
||||
AceEvent:argCheck(method, 3, "function")
|
||||
self = method
|
||||
else
|
||||
AceEvent:argCheck(method, 3, "string", "function", "nil", "boolean", "number")
|
||||
if type(method) == "boolean" or type(method) == "number" then
|
||||
AceEvent:argCheck(once, 4, "nil")
|
||||
once, method = method, event
|
||||
end
|
||||
end
|
||||
AceEvent:argCheck(once, 4, "number", "boolean", "nil")
|
||||
if eventsWhichHappenOnce[event] then
|
||||
once = true
|
||||
end
|
||||
local throttleRate
|
||||
if type(once) == "number" then
|
||||
throttleRate, once = once
|
||||
end
|
||||
if not method then
|
||||
method = event
|
||||
end
|
||||
if type(method) == "string" and type(self[method]) ~= "function" then
|
||||
AceEvent:error("Cannot register event %q to method %q, it does not exist", event, method)
|
||||
else
|
||||
assert(type(method) == "function" or type(method) == "string")
|
||||
end
|
||||
|
||||
local AceEvent_registry = AceEvent.registry
|
||||
if not AceEvent_registry[event] then
|
||||
AceEvent_registry[event] = new()
|
||||
AceEvent.frame:RegisterEvent(event)
|
||||
end
|
||||
|
||||
local remember = true
|
||||
if AceEvent_registry[event][self] then
|
||||
remember = false
|
||||
end
|
||||
AceEvent_registry[event][self] = method
|
||||
|
||||
local AceEvent_onceRegistry = AceEvent.onceRegistry
|
||||
if once then
|
||||
if not AceEvent_onceRegistry then
|
||||
AceEvent.onceRegistry = new()
|
||||
AceEvent_onceRegistry = AceEvent.onceRegistry
|
||||
end
|
||||
if not AceEvent_onceRegistry[event] then
|
||||
AceEvent_onceRegistry[event] = new()
|
||||
end
|
||||
AceEvent_onceRegistry[event][self] = true
|
||||
else
|
||||
if AceEvent_onceRegistry and AceEvent_onceRegistry[event] then
|
||||
AceEvent_onceRegistry[event][self] = nil
|
||||
if not next(AceEvent_onceRegistry[event]) then
|
||||
AceEvent_onceRegistry[event] = del(AceEvent_onceRegistry[event])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local AceEvent_throttleRegistry = AceEvent.throttleRegistry
|
||||
if throttleRate then
|
||||
if not AceEvent_throttleRegistry then
|
||||
AceEvent.throttleRegistry = new()
|
||||
AceEvent_throttleRegistry = AceEvent.throttleRegistry
|
||||
end
|
||||
if not AceEvent_throttleRegistry[event] then
|
||||
AceEvent_throttleRegistry[event] = new()
|
||||
end
|
||||
if AceEvent_throttleRegistry[event][self] then
|
||||
AceEvent_throttleRegistry[event][self] = del(AceEvent_throttleRegistry[event][self])
|
||||
end
|
||||
AceEvent_throttleRegistry[event][self] = setmetatable(new(), weakKey)
|
||||
local t = AceEvent_throttleRegistry[event][self]
|
||||
t[RATE] = throttleRate
|
||||
else
|
||||
if AceEvent_throttleRegistry and AceEvent_throttleRegistry[event] then
|
||||
if AceEvent_throttleRegistry[event][self] then
|
||||
AceEvent_throttleRegistry[event][self] = del(AceEvent_throttleRegistry[event][self])
|
||||
end
|
||||
if not next(AceEvent_throttleRegistry[event]) then
|
||||
AceEvent_throttleRegistry[event] = del(AceEvent_throttleRegistry[event])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if remember then
|
||||
AceEvent:TriggerEvent("AceEvent_EventRegistered", self, event)
|
||||
end
|
||||
end
|
||||
|
||||
local ALL_EVENTS
|
||||
|
||||
function AceEvent:RegisterAllEvents(method)
|
||||
if self == AceEvent then
|
||||
AceEvent:argCheck(method, 1, "function")
|
||||
self = method
|
||||
else
|
||||
AceEvent:argCheck(method, 1, "string", "function")
|
||||
if type(method) == "string" and type(self[method]) ~= "function" then
|
||||
AceEvent:error("Cannot register all events to method %q, it does not exist", method)
|
||||
end
|
||||
end
|
||||
|
||||
local AceEvent_registry = AceEvent.registry
|
||||
if not AceEvent_registry[ALL_EVENTS] then
|
||||
AceEvent_registry[ALL_EVENTS] = new()
|
||||
AceEvent.frame:RegisterAllEvents()
|
||||
end
|
||||
|
||||
AceEvent_registry[ALL_EVENTS][self] = method
|
||||
end
|
||||
|
||||
local _G = getfenv(0)
|
||||
local memstack, timestack = {}, {}
|
||||
local memdiff, timediff
|
||||
function AceEvent:TriggerEvent(event, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
AceEvent:argCheck(event, 2, "string")
|
||||
local AceEvent_registry = AceEvent.registry
|
||||
if (not AceEvent_registry[event] or not next(AceEvent_registry[event])) and (not AceEvent_registry[ALL_EVENTS] or not next(AceEvent_registry[ALL_EVENTS])) then
|
||||
return
|
||||
end
|
||||
local _G_event = _G.event
|
||||
_G.event = event
|
||||
local lastEvent = AceEvent.currentEvent
|
||||
AceEvent.currentEvent = event
|
||||
|
||||
local AceEvent_onceRegistry = AceEvent.onceRegistry
|
||||
local AceEvent_debugTable = AceEvent.debugTable
|
||||
if AceEvent_onceRegistry and AceEvent_onceRegistry[event] then
|
||||
local tmp = new()
|
||||
for obj, method in pairs(AceEvent_onceRegistry[event]) do
|
||||
tmp[obj] = AceEvent_registry[event] and AceEvent_registry[event][obj] or nil
|
||||
end
|
||||
local obj = next(tmp)
|
||||
while obj do
|
||||
local mem, time
|
||||
if AceEvent_debugTable then
|
||||
if not AceEvent_debugTable[event] then
|
||||
AceEvent_debugTable[event] = new()
|
||||
end
|
||||
if not AceEvent_debugTable[event][obj] then
|
||||
AceEvent_debugTable[event][obj] = new()
|
||||
AceEvent_debugTable[event][obj].mem = 0
|
||||
AceEvent_debugTable[event][obj].time = 0
|
||||
AceEvent_debugTable[event][obj].count = 0
|
||||
end
|
||||
if memdiff then
|
||||
table.insert(memstack, memdiff)
|
||||
table.insert(timestack, timediff)
|
||||
end
|
||||
memdiff, timediff = 0, 0
|
||||
mem, time = gcinfo(), GetTime()
|
||||
end
|
||||
local method = tmp[obj]
|
||||
AceEvent.UnregisterEvent(obj, event)
|
||||
if type(method) == "string" then
|
||||
local obj_method = obj[method]
|
||||
if obj_method then
|
||||
obj_method(obj, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
end
|
||||
elseif method then -- function
|
||||
method(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
end
|
||||
if AceEvent_debugTable then
|
||||
local dmem, dtime = memdiff, timediff
|
||||
mem, time = gcinfo() - mem - memdiff, GetTime() - time - timediff
|
||||
AceEvent_debugTable[event][obj].mem = AceEvent_debugTable[event][obj].mem + mem
|
||||
AceEvent_debugTable[event][obj].time = AceEvent_debugTable[event][obj].time + time
|
||||
AceEvent_debugTable[event][obj].count = AceEvent_debugTable[event][obj].count + 1
|
||||
|
||||
memdiff, timediff = table.remove(memstack), table.remove(timestack)
|
||||
if memdiff then
|
||||
memdiff = memdiff + mem + dmem
|
||||
timediff = timediff + time + dtime
|
||||
end
|
||||
end
|
||||
tmp[obj] = nil
|
||||
obj = next(tmp)
|
||||
end
|
||||
del(tmp)
|
||||
end
|
||||
|
||||
local AceEvent_throttleRegistry = AceEvent.throttleRegistry
|
||||
local throttleTable = AceEvent_throttleRegistry and AceEvent_throttleRegistry[event]
|
||||
if AceEvent_registry[event] then
|
||||
local tmp = new()
|
||||
for obj, method in pairs(AceEvent_registry[event]) do
|
||||
tmp[obj] = method
|
||||
end
|
||||
local obj = next(tmp)
|
||||
while obj do
|
||||
local method = tmp[obj]
|
||||
local continue = false
|
||||
if throttleTable and throttleTable[obj] then
|
||||
local a1 = a1
|
||||
if a1 == nil then
|
||||
a1 = FAKE_NIL
|
||||
end
|
||||
if not throttleTable[obj][a1] or GetTime() - throttleTable[obj][a1] >= throttleTable[obj][RATE] then
|
||||
throttleTable[obj][a1] = GetTime()
|
||||
else
|
||||
continue = true
|
||||
end
|
||||
end
|
||||
if not continue then
|
||||
local mem, time
|
||||
if AceEvent_debugTable then
|
||||
if not AceEvent_debugTable[event] then
|
||||
AceEvent_debugTable[event] = new()
|
||||
end
|
||||
if not AceEvent_debugTable[event][obj] then
|
||||
AceEvent_debugTable[event][obj] = new()
|
||||
AceEvent_debugTable[event][obj].mem = 0
|
||||
AceEvent_debugTable[event][obj].time = 0
|
||||
AceEvent_debugTable[event][obj].count = 0
|
||||
end
|
||||
if memdiff then
|
||||
table.insert(memstack, memdiff)
|
||||
table.insert(timestack, timediff)
|
||||
end
|
||||
memdiff, timediff = 0, 0
|
||||
mem, time = gcinfo(), GetTime()
|
||||
end
|
||||
if type(method) == "string" then
|
||||
local obj_method = obj[method]
|
||||
if obj_method then
|
||||
obj_method(obj, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
end
|
||||
elseif method then -- function
|
||||
method(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
end
|
||||
if AceEvent_debugTable then
|
||||
local dmem, dtime = memdiff, timediff
|
||||
mem, time = gcinfo() - mem - memdiff, GetTime() - time - timediff
|
||||
AceEvent_debugTable[event][obj].mem = AceEvent_debugTable[event][obj].mem + mem
|
||||
AceEvent_debugTable[event][obj].time = AceEvent_debugTable[event][obj].time + time
|
||||
AceEvent_debugTable[event][obj].count = AceEvent_debugTable[event][obj].count + 1
|
||||
|
||||
memdiff, timediff = table.remove(memstack), table.remove(timestack)
|
||||
if memdiff then
|
||||
memdiff = memdiff + mem + dmem
|
||||
timediff = timediff + time + dtime
|
||||
end
|
||||
end
|
||||
end
|
||||
tmp[obj] = nil
|
||||
obj = next(tmp)
|
||||
end
|
||||
del(tmp)
|
||||
end
|
||||
if AceEvent_registry[ALL_EVENTS] then
|
||||
local tmp = new()
|
||||
for obj, method in pairs(AceEvent_registry[ALL_EVENTS]) do
|
||||
tmp[obj] = method
|
||||
end
|
||||
local obj = next(tmp)
|
||||
while obj do
|
||||
local method = tmp[obj]
|
||||
local mem, time
|
||||
if AceEvent_debugTable then
|
||||
if not AceEvent_debugTable[event] then
|
||||
AceEvent_debugTable[event] = new()
|
||||
end
|
||||
if not AceEvent_debugTable[event][obj] then
|
||||
AceEvent_debugTable[event][obj] = new()
|
||||
AceEvent_debugTable[event][obj].mem = 0
|
||||
AceEvent_debugTable[event][obj].time = 0
|
||||
AceEvent_debugTable[event][obj].count = 0
|
||||
end
|
||||
if memdiff then
|
||||
table.insert(memstack, memdiff)
|
||||
table.insert(timestack, timediff)
|
||||
end
|
||||
memdiff, timediff = 0, 0
|
||||
mem, time = gcinfo(), GetTime()
|
||||
end
|
||||
if type(method) == "string" then
|
||||
local obj_method = obj[method]
|
||||
if obj_method then
|
||||
obj_method(obj, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
end
|
||||
elseif method then -- function
|
||||
method(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
end
|
||||
if AceEvent_debugTable then
|
||||
local dmem, dtime = memdiff, timediff
|
||||
mem, time = gcinfo() - mem - memdiff, GetTime() - time - timediff
|
||||
AceEvent_debugTable[event][obj].mem = AceEvent_debugTable[event][obj].mem + mem
|
||||
AceEvent_debugTable[event][obj].time = AceEvent_debugTable[event][obj].time + time
|
||||
AceEvent_debugTable[event][obj].count = AceEvent_debugTable[event][obj].count + 1
|
||||
|
||||
memdiff, timediff = table.remove(memstack), table.remove(timestack)
|
||||
if memdiff then
|
||||
memdiff = memdiff + mem + dmem
|
||||
timediff = timediff + time + dtime
|
||||
end
|
||||
end
|
||||
tmp[obj] = nil
|
||||
obj = next(tmp)
|
||||
end
|
||||
del(tmp)
|
||||
end
|
||||
_G.event = _G_event
|
||||
AceEvent.currentEvent = lastEvent
|
||||
end
|
||||
|
||||
-- local accessors
|
||||
local getn = table.getn
|
||||
local tinsert = table.insert
|
||||
local tremove = table.remove
|
||||
local floor = math.floor
|
||||
local GetTime = GetTime
|
||||
local next = next
|
||||
local pairs = pairs
|
||||
local unpack = unpack
|
||||
|
||||
local delayRegistry
|
||||
local tmp = {}
|
||||
local function OnUpdate()
|
||||
local t = GetTime()
|
||||
for k,v in pairs(delayRegistry) do
|
||||
tmp[k] = true
|
||||
end
|
||||
for k in pairs(tmp) do
|
||||
local v = delayRegistry[k]
|
||||
if v then
|
||||
local v_time = v.time
|
||||
if not v_time then
|
||||
delayRegistry[k] = del(v)
|
||||
elseif v_time <= t then
|
||||
local v_repeatDelay = v.repeatDelay
|
||||
if v_repeatDelay then
|
||||
-- use the event time, not the current time, else timing inaccuracies add up over time
|
||||
v.time = v_time + v_repeatDelay
|
||||
end
|
||||
local event = v.event
|
||||
local mem, time
|
||||
if AceEvent_debugTable then
|
||||
mem, time = gcinfo(), GetTime()
|
||||
end
|
||||
if type(event) == "function" then
|
||||
event(unpack(v))
|
||||
else
|
||||
AceEvent:TriggerEvent(event, unpack(v))
|
||||
end
|
||||
if AceEvent_debugTable then
|
||||
mem, time = gcinfo() - mem, GetTime() - time
|
||||
v.mem = v.mem + mem
|
||||
v.timeSpent = v.timeSpent + time
|
||||
v.count = v.count + 1
|
||||
end
|
||||
if not v_repeatDelay then
|
||||
local x = delayRegistry[k]
|
||||
if x and x.time == v_time then -- check if it was manually reset
|
||||
delayRegistry[k] = del(v)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
for k in pairs(tmp) do
|
||||
tmp[k] = nil
|
||||
end
|
||||
if not next(delayRegistry) then
|
||||
AceEvent.frame:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
local function ScheduleEvent(self, repeating, event, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
local id
|
||||
if type(event) == "string" or type(event) == "table" then
|
||||
if type(event) == "table" then
|
||||
if not delayRegistry or not delayRegistry[event] then
|
||||
AceEvent:error("Bad argument #2 to `ScheduleEvent'. Improper id table fed in.")
|
||||
end
|
||||
end
|
||||
if type(delay) ~= "number" then
|
||||
id, event, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20 = event, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20
|
||||
AceEvent:argCheck(event, 3, "string", "function", --[[ so message is right ]] "number")
|
||||
AceEvent:argCheck(delay, 4, "number")
|
||||
self:CancelScheduledEvent(id)
|
||||
end
|
||||
else
|
||||
AceEvent:argCheck(event, 2, "string", "function")
|
||||
AceEvent:argCheck(delay, 3, "number")
|
||||
end
|
||||
|
||||
if not delayRegistry then
|
||||
AceEvent.delayRegistry = new()
|
||||
delayRegistry = AceEvent.delayRegistry
|
||||
AceEvent.frame:SetScript("OnUpdate", OnUpdate)
|
||||
end
|
||||
local t
|
||||
if type(id) == "table" then
|
||||
for k in pairs(id) do
|
||||
id[k] = nil
|
||||
end
|
||||
t = id
|
||||
else
|
||||
t = new()
|
||||
end
|
||||
t[1] = a1
|
||||
t[2] = a2
|
||||
t[3] = a3
|
||||
t[4] = a4
|
||||
t[5] = a5
|
||||
t[6] = a6
|
||||
t[7] = a7
|
||||
t[8] = a8
|
||||
t[9] = a9
|
||||
t[10] = a10
|
||||
t[11] = a11
|
||||
t[12] = a12
|
||||
t[13] = a13
|
||||
t[14] = a14
|
||||
t[15] = a15
|
||||
t[16] = a16
|
||||
t[17] = a17
|
||||
t[18] = a18
|
||||
t[19] = a19
|
||||
t[20] = a20
|
||||
table_setn(t, 20)
|
||||
t.event = event
|
||||
t.time = GetTime() + delay
|
||||
t.self = self
|
||||
t.id = id or t
|
||||
t.repeatDelay = repeating and delay
|
||||
if AceEvent_debugTable then
|
||||
t.mem = 0
|
||||
t.count = 0
|
||||
t.timeSpent = 0
|
||||
end
|
||||
delayRegistry[t.id] = t
|
||||
AceEvent.frame:Show()
|
||||
return t.id
|
||||
end
|
||||
|
||||
function AceEvent:ScheduleEvent(event, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
if type(event) == "string" or type(event) == "table" then
|
||||
if type(event) == "table" then
|
||||
if not delayRegistry or not delayRegistry[event] then
|
||||
AceEvent:error("Bad argument #2 to `ScheduleEvent'. Improper id table fed in.")
|
||||
end
|
||||
end
|
||||
if type(delay) ~= "number" then
|
||||
AceEvent:argCheck(delay, 3, "string", "function", --[[ so message is right ]] "number")
|
||||
AceEvent:argCheck(a1, 4, "number")
|
||||
end
|
||||
else
|
||||
AceEvent:argCheck(event, 2, "string", "function")
|
||||
AceEvent:argCheck(delay, 3, "number")
|
||||
end
|
||||
|
||||
return ScheduleEvent(self, false, event, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
end
|
||||
|
||||
function AceEvent:ScheduleRepeatingEvent(event, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
if type(event) == "string" or type(event) == "table" then
|
||||
if type(event) == "table" then
|
||||
if not delayRegistry or not delayRegistry[event] then
|
||||
AceEvent:error("Bad argument #2 to `ScheduleEvent'. Improper id table fed in.")
|
||||
end
|
||||
end
|
||||
if type(delay) ~= "number" then
|
||||
AceEvent:argCheck(delay, 3, "string", "function", --[[ so message is right ]] "number")
|
||||
AceEvent:argCheck(a1, 4, "number")
|
||||
end
|
||||
else
|
||||
AceEvent:argCheck(event, 2, "string", "function")
|
||||
AceEvent:argCheck(delay, 3, "number")
|
||||
end
|
||||
|
||||
return ScheduleEvent(self, true, event, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
end
|
||||
|
||||
function AceEvent:CancelScheduledEvent(t)
|
||||
AceEvent:argCheck(t, 2, "string", "table")
|
||||
if delayRegistry then
|
||||
local v = delayRegistry[t]
|
||||
if v then
|
||||
delayRegistry[t] = del(v)
|
||||
if not next(delayRegistry) then
|
||||
AceEvent.frame:Hide()
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function AceEvent:IsEventScheduled(t)
|
||||
AceEvent:argCheck(t, 2, "string", "table")
|
||||
if delayRegistry then
|
||||
local v = delayRegistry[t]
|
||||
if v then
|
||||
return true, v.time - GetTime()
|
||||
end
|
||||
end
|
||||
return false, nil
|
||||
end
|
||||
|
||||
function AceEvent:UnregisterEvent(event)
|
||||
AceEvent:argCheck(event, 2, "string")
|
||||
local AceEvent_registry = AceEvent.registry
|
||||
if AceEvent_registry[event] and AceEvent_registry[event][self] then
|
||||
AceEvent_registry[event][self] = nil
|
||||
local AceEvent_onceRegistry = AceEvent.onceRegistry
|
||||
if AceEvent_onceRegistry and AceEvent_onceRegistry[event] and AceEvent_onceRegistry[event][self] then
|
||||
AceEvent_onceRegistry[event][self] = nil
|
||||
if not next(AceEvent_onceRegistry[event]) then
|
||||
AceEvent_onceRegistry[event] = del(AceEvent_onceRegistry[event])
|
||||
end
|
||||
end
|
||||
local AceEvent_throttleRegistry = AceEvent.throttleRegistry
|
||||
if AceEvent_throttleRegistry and AceEvent_throttleRegistry[event] and AceEvent_throttleRegistry[event][self] then
|
||||
AceEvent_throttleRegistry[event][self] = del(AceEvent_throttleRegistry[event][self])
|
||||
if not next(AceEvent_throttleRegistry[event]) then
|
||||
AceEvent_throttleRegistry[event] = del(AceEvent_throttleRegistry[event])
|
||||
end
|
||||
end
|
||||
if not next(AceEvent_registry[event]) then
|
||||
AceEvent_registry[event] = del(AceEvent_registry[event])
|
||||
if not AceEvent_registry[ALL_EVENTS] or not next(AceEvent_registry[ALL_EVENTS]) then
|
||||
AceEvent.frame:UnregisterEvent(event)
|
||||
end
|
||||
end
|
||||
else
|
||||
if self == AceEvent then
|
||||
error(string.format("Cannot unregister event %q. Improperly unregistering from AceEvent-2.0.", event), 2)
|
||||
else
|
||||
AceEvent:error("Cannot unregister event %q. %q is not registered with it.", event, self)
|
||||
end
|
||||
end
|
||||
AceEvent:TriggerEvent("AceEvent_EventUnregistered", self, event)
|
||||
end
|
||||
|
||||
function AceEvent:UnregisterAllEvents()
|
||||
local AceEvent_registry = AceEvent.registry
|
||||
if AceEvent_registry[ALL_EVENTS] and AceEvent_registry[ALL_EVENTS][self] then
|
||||
AceEvent_registry[ALL_EVENTS][self] = nil
|
||||
if not next(AceEvent_registry[ALL_EVENTS]) then
|
||||
del(AceEvent_registry[ALL_EVENTS])
|
||||
AceEvent.frame:UnregisterAllEvents()
|
||||
for k,v in pairs(AceEvent_registry) do
|
||||
if k ~= ALL_EVENTS then
|
||||
AceEvent.frame:RegisterEvent(k)
|
||||
end
|
||||
end
|
||||
AceEvent_registry[event] = nil
|
||||
end
|
||||
end
|
||||
local first = true
|
||||
for event, data in pairs(AceEvent_registry) do
|
||||
if first then
|
||||
if AceEvent_registry.AceEvent_EventUnregistered then
|
||||
event = "AceEvent_EventUnregistered"
|
||||
else
|
||||
first = false
|
||||
end
|
||||
end
|
||||
local x = data[self]
|
||||
data[self] = nil
|
||||
if x and event ~= ALL_EVENTS then
|
||||
if not next(data) then
|
||||
del(data)
|
||||
if not AceEvent_registry[ALL_EVENTS] or not next(AceEvent_registry[ALL_EVENTS]) then
|
||||
AceEvent.frame:UnregisterEvent(event)
|
||||
end
|
||||
AceEvent_registry[event] = nil
|
||||
end
|
||||
AceEvent:TriggerEvent("AceEvent_EventUnregistered", self, event)
|
||||
end
|
||||
if first then
|
||||
event = nil
|
||||
end
|
||||
end
|
||||
if AceEvent.onceRegistry then
|
||||
for event, data in pairs(AceEvent.onceRegistry) do
|
||||
data[self] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function AceEvent:CancelAllScheduledEvents()
|
||||
if delayRegistry then
|
||||
for k,v in pairs(delayRegistry) do
|
||||
if v.self == self then
|
||||
delayRegistry[k] = del(v)
|
||||
end
|
||||
end
|
||||
if not next(delayRegistry) then
|
||||
AceEvent.frame:Hide()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function AceEvent:IsEventRegistered(event)
|
||||
AceEvent:argCheck(event, 2, "string")
|
||||
local AceEvent_registry = AceEvent.registry
|
||||
if self == AceEvent then
|
||||
return AceEvent_registry[event] and next(AceEvent_registry[event]) and true or false
|
||||
end
|
||||
if AceEvent_registry[event] and AceEvent_registry[event][self] then
|
||||
return true, AceEvent_registry[event][self]
|
||||
end
|
||||
return false, nil
|
||||
end
|
||||
|
||||
local bucketfunc
|
||||
function AceEvent:RegisterBucketEvent(event, delay, method)
|
||||
AceEvent:argCheck(event, 2, "string", "table")
|
||||
if type(event) == "table" then
|
||||
for k,v in pairs(event) do
|
||||
if type(k) ~= "number" then
|
||||
AceEvent:error("All keys to argument #2 to `RegisterBucketEvent' must be numbers.")
|
||||
elseif type(v) ~= "string" then
|
||||
AceEvent:error("All values to argument #2 to `RegisterBucketEvent' must be strings.")
|
||||
end
|
||||
end
|
||||
end
|
||||
AceEvent:argCheck(delay, 3, "number")
|
||||
if AceEvent == self then
|
||||
AceEvent:argCheck(method, 4, "function")
|
||||
self = method
|
||||
else
|
||||
if type(event) == "string" then
|
||||
AceEvent:argCheck(method, 4, "string", "function", "nil")
|
||||
if not method then
|
||||
method = event
|
||||
end
|
||||
else
|
||||
AceEvent:argCheck(method, 4, "string", "function")
|
||||
end
|
||||
|
||||
if type(method) == "string" and type(self[method]) ~= "function" then
|
||||
AceEvent:error("Cannot register event %q to method %q, it does not exist", event, method)
|
||||
end
|
||||
end
|
||||
if not AceEvent.buckets then
|
||||
AceEvent.buckets = new()
|
||||
end
|
||||
if not AceEvent.buckets[event] then
|
||||
AceEvent.buckets[event] = new()
|
||||
end
|
||||
if not AceEvent.buckets[event][self] then
|
||||
AceEvent.buckets[event][self] = new()
|
||||
AceEvent.buckets[event][self].current = new()
|
||||
AceEvent.buckets[event][self].self = self
|
||||
else
|
||||
AceEvent.CancelScheduledEvent(self, AceEvent.buckets[event][self].id)
|
||||
end
|
||||
local bucket = AceEvent.buckets[event][self]
|
||||
bucket.method = method
|
||||
|
||||
local func = function(arg1)
|
||||
bucket.run = true
|
||||
if arg1 then
|
||||
bucket.current[arg1] = true
|
||||
end
|
||||
end
|
||||
AceEvent.buckets[event][self].func = func
|
||||
if type(event) == "string" then
|
||||
AceEvent.RegisterEvent(self, event, func)
|
||||
else
|
||||
for _,v in ipairs(event) do
|
||||
AceEvent.RegisterEvent(self, v, func)
|
||||
end
|
||||
end
|
||||
if not bucketfunc then
|
||||
bucketfunc = function(bucket)
|
||||
local current = bucket.current
|
||||
local method = bucket.method
|
||||
local self = bucket.self
|
||||
if bucket.run then
|
||||
if type(method) == "string" then
|
||||
self[method](self, current)
|
||||
elseif method then -- function
|
||||
method(current)
|
||||
end
|
||||
for k in pairs(current) do
|
||||
current[k] = nil
|
||||
k = nil
|
||||
end
|
||||
bucket.run = false
|
||||
end
|
||||
end
|
||||
end
|
||||
bucket.id = AceEvent.ScheduleRepeatingEvent(self, bucketfunc, delay, bucket)
|
||||
end
|
||||
|
||||
function AceEvent:IsBucketEventRegistered(event)
|
||||
AceEvent:argCheck(event, 2, "string", "table")
|
||||
return AceEvent.buckets and AceEvent.buckets[event] and AceEvent.buckets[event][self]
|
||||
end
|
||||
|
||||
function AceEvent:UnregisterBucketEvent(event)
|
||||
AceEvent:argCheck(event, 2, "string", "table")
|
||||
if not AceEvent.buckets or not AceEvent.buckets[event] or not AceEvent.buckets[event][self] then
|
||||
AceEvent:error("Cannot unregister bucket event %q. %q is not registered with it.", event, self)
|
||||
end
|
||||
|
||||
local bucket = AceEvent.buckets[event][self]
|
||||
|
||||
if type(event) == "string" then
|
||||
AceEvent.UnregisterEvent(self, event)
|
||||
else
|
||||
for _,v in ipairs(event) do
|
||||
AceEvent.UnregisterEvent(self, v)
|
||||
end
|
||||
end
|
||||
AceEvent:CancelScheduledEvent(bucket.id)
|
||||
|
||||
del(bucket.current)
|
||||
AceEvent.buckets[event][self] = del(AceEvent.buckets[event][self])
|
||||
if not next(AceEvent.buckets[event]) then
|
||||
AceEvent.buckets[event] = del(AceEvent.buckets[event])
|
||||
end
|
||||
end
|
||||
|
||||
function AceEvent:UnregisterAllBucketEvents()
|
||||
if not AceEvent.buckets or not next(AceEvent.buckets) then
|
||||
return
|
||||
end
|
||||
for k,v in pairs(AceEvent.buckets) do
|
||||
if v == self then
|
||||
AceEvent.UnregisterBucketEvent(self, k)
|
||||
k = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function AceEvent:OnEmbedDisable(target)
|
||||
self.UnregisterAllEvents(target)
|
||||
|
||||
self.CancelAllScheduledEvents(target)
|
||||
|
||||
self.UnregisterAllBucketEvents(target)
|
||||
end
|
||||
|
||||
function AceEvent:EnableDebugging()
|
||||
if not self.debugTable then
|
||||
self.debugTable = new()
|
||||
|
||||
if delayRegistry then
|
||||
for k,v in pairs(self.delayRegistry) do
|
||||
if not v.mem then
|
||||
v.mem = 0
|
||||
v.count = 0
|
||||
v.timeSpent = 0
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function AceEvent:IsFullyInitialized()
|
||||
return self.postInit or false
|
||||
end
|
||||
|
||||
function AceEvent:IsPostPlayerLogin()
|
||||
return self.playerLogin or false
|
||||
end
|
||||
|
||||
function AceEvent:activate(oldLib, oldDeactivate)
|
||||
AceEvent = self
|
||||
|
||||
if oldLib then
|
||||
self.onceRegistry = oldLib.onceRegistry
|
||||
self.throttleRegistry = oldLib.throttleRegistry
|
||||
self.delayRegistry = oldLib.delayRegistry
|
||||
self.buckets = oldLib.buckets
|
||||
self.registry = oldLib.registry
|
||||
self.frame = oldLib.frame
|
||||
self.debugTable = oldLib.debugTable
|
||||
self.playerLogin = oldLib.pew or DEFAULT_CHAT_FRAME and DEFAULT_CHAT_FRAME.defaultLanguage and true
|
||||
self.postInit = oldLib.postInit or self.playerLogin and ChatTypeInfo and ChatTypeInfo.WHISPER and ChatTypeInfo.WHISPER.r and true
|
||||
self.ALL_EVENTS = oldLib.ALL_EVENTS
|
||||
self.FAKE_NIL = oldLib.FAKE_NIL
|
||||
self.RATE = oldLib.RATE
|
||||
end
|
||||
if not self.registry then
|
||||
self.registry = {}
|
||||
end
|
||||
if not self.frame then
|
||||
self.frame = CreateFrame("Frame", "AceEvent20Frame")
|
||||
end
|
||||
if not self.ALL_EVENTS then
|
||||
self.ALL_EVENTS = {}
|
||||
end
|
||||
if not self.FAKE_NIL then
|
||||
self.FAKE_NIL = {}
|
||||
end
|
||||
if not self.RATE then
|
||||
self.RATE = {}
|
||||
end
|
||||
ALL_EVENTS = self.ALL_EVENTS
|
||||
FAKE_NIL = self.FAKE_NIL
|
||||
RATE = self.RATE
|
||||
local inPlw = false
|
||||
local blacklist = {
|
||||
UNIT_INVENTORY_CHANGED = true,
|
||||
BAG_UPDATE = true,
|
||||
ITEM_LOCK_CHANGED = true,
|
||||
ACTIONBAR_SLOT_CHANGED = true,
|
||||
}
|
||||
self.frame:SetScript("OnEvent", function()
|
||||
local event = event
|
||||
if event == "PLAYER_ENTERING_WORLD" then
|
||||
inPlw = false
|
||||
elseif event == "PLAYER_LEAVING_WORLD" then
|
||||
inPlw = true
|
||||
end
|
||||
if event and (not inPlw or not blacklist[event]) then
|
||||
self:TriggerEvent(event, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
|
||||
end
|
||||
end)
|
||||
if self.delayRegistry then
|
||||
delayRegistry = self.delayRegistry
|
||||
self.frame:SetScript("OnUpdate", OnUpdate)
|
||||
end
|
||||
|
||||
self:UnregisterAllEvents()
|
||||
self:CancelAllScheduledEvents()
|
||||
|
||||
registeringFromAceEvent = true
|
||||
self:RegisterEvent("LOOT_OPENED", function()
|
||||
SendAddonMessage("LOOT_OPENED", "", "RAID")
|
||||
end)
|
||||
registeringFromAceEvent = nil
|
||||
|
||||
if not self.playerLogin then
|
||||
registeringFromAceEvent = true
|
||||
self:RegisterEvent("PLAYER_LOGIN", function()
|
||||
self.playerLogin = true
|
||||
end, true)
|
||||
registeringFromAceEvent = nil
|
||||
end
|
||||
|
||||
if not self.postInit then
|
||||
local isReload = true
|
||||
local function func()
|
||||
self.postInit = true
|
||||
self:TriggerEvent("AceEvent_FullyInitialized")
|
||||
if self.registry["CHAT_MSG_CHANNEL_NOTICE"] and self.registry["CHAT_MSG_CHANNEL_NOTICE"][self] then
|
||||
self:UnregisterEvent("CHAT_MSG_CHANNEL_NOTICE")
|
||||
end
|
||||
if self.registry["MEETINGSTONE_CHANGED"] and self.registry["MEETINGSTONE_CHANGED"][self] then
|
||||
self:UnregisterEvent("MEETINGSTONE_CHANGED")
|
||||
end
|
||||
if self.registry["MINIMAP_ZONE_CHANGED"] and self.registry["MINIMAP_ZONE_CHANGED"][self] then
|
||||
self:UnregisterEvent("MINIMAP_ZONE_CHANGED")
|
||||
end
|
||||
if self.registry["LANGUAGE_LIST_CHANGED"] and self.registry["LANGUAGE_LIST_CHANGED"][self] then
|
||||
self:UnregisterEvent("LANGUAGE_LIST_CHANGED")
|
||||
end
|
||||
end
|
||||
registeringFromAceEvent = true
|
||||
local f = function()
|
||||
self.playerLogin = true
|
||||
self:ScheduleEvent("AceEvent_FullyInitialized", func, 1)
|
||||
end
|
||||
self:RegisterEvent("MEETINGSTONE_CHANGED", f, true)
|
||||
self:RegisterEvent("CHAT_MSG_CHANNEL_NOTICE", function()
|
||||
self:ScheduleEvent("AceEvent_FullyInitialized", func, 0.05)
|
||||
end)
|
||||
self:RegisterEvent("LANGUAGE_LIST_CHANGED", function()
|
||||
if self.registry["MEETINGSTONE_CHANGED"] and self.registry["MEETINGSTONE_CHANGED"][self] then
|
||||
registeringFromAceEvent = true
|
||||
self:UnregisterEvent("MEETINGSTONE_CHANGED")
|
||||
self:RegisterEvent("MINIMAP_ZONE_CHANGED", f, true)
|
||||
registeringFromAceEvent = nil
|
||||
end
|
||||
end)
|
||||
self:ScheduleEvent("AceEvent_FullyInitialized", func, 10)
|
||||
registeringFromAceEvent = nil
|
||||
end
|
||||
|
||||
self.super.activate(self, oldLib, oldDeactivate)
|
||||
if oldLib then
|
||||
oldDeactivate(oldLib)
|
||||
end
|
||||
end
|
||||
|
||||
AceLibrary:Register(AceEvent, MAJOR_VERSION, MINOR_VERSION, AceEvent.activate)
|
||||
AceEvent = AceLibrary(MAJOR_VERSION)
|
||||
@@ -0,0 +1,757 @@
|
||||
--[[
|
||||
Name: AceLibrary
|
||||
Revision: $Rev: 17722 $
|
||||
Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team)
|
||||
Inspired By: Iriel (iriel@vigilance-committee.org)
|
||||
Tekkub (tekkub@gmail.com)
|
||||
Revision: $Rev: 17722 $
|
||||
Website: http://www.wowace.com/
|
||||
Documentation: http://www.wowace.com/index.php/AceLibrary
|
||||
SVN: http://svn.wowace.com/root/trunk/Ace2/AceLibrary
|
||||
Description: Versioning library to handle other library instances, upgrading,
|
||||
and proper access.
|
||||
It also provides a base for libraries to work off of, providing
|
||||
proper error tools. It is handy because all the errors occur in the
|
||||
file that called it, not in the library file itself.
|
||||
Dependencies: None
|
||||
]]
|
||||
|
||||
local ACELIBRARY_MAJOR = "AceLibrary"
|
||||
local ACELIBRARY_MINOR = "$Revision: 17722 $"
|
||||
|
||||
if loadstring("return function(...) return ... end") and AceLibrary and AceLibrary:HasInstance(ACELIBRARY_MAJOR) then return end -- lua51 check
|
||||
local table_setn
|
||||
do
|
||||
local version = GetBuildInfo()
|
||||
if string.find(version, "^2%.") then
|
||||
-- 2.0.0
|
||||
table_setn = function() end
|
||||
else
|
||||
table_setn = table.setn
|
||||
end
|
||||
end
|
||||
|
||||
local string_gfind = string.gmatch or string.gfind
|
||||
|
||||
local _G = getfenv(0)
|
||||
local previous = _G[ACELIBRARY_MAJOR]
|
||||
if previous and not previous:IsNewVersion(ACELIBRARY_MAJOR, ACELIBRARY_MINOR) then return end
|
||||
|
||||
local function safecall(func,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
|
||||
local success, err = pcall(func,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
|
||||
if not success then geterrorhandler()(err) end
|
||||
end
|
||||
|
||||
-- @table AceLibrary
|
||||
-- @brief System to handle all versioning of libraries.
|
||||
local AceLibrary = {}
|
||||
local AceLibrary_mt = {}
|
||||
setmetatable(AceLibrary, AceLibrary_mt)
|
||||
|
||||
local tmp
|
||||
local function error(self, message, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
if type(self) ~= "table" then
|
||||
_G.error(string.format("Bad argument #1 to `error' (table expected, got %s)", type(self)), 2)
|
||||
end
|
||||
if not tmp then
|
||||
tmp = {}
|
||||
else
|
||||
for k in pairs(tmp) do tmp[k] = nil end
|
||||
table_setn(tmp, 0)
|
||||
end
|
||||
|
||||
table.insert(tmp, a1)
|
||||
table.insert(tmp, a2)
|
||||
table.insert(tmp, a3)
|
||||
table.insert(tmp, a4)
|
||||
table.insert(tmp, a5)
|
||||
table.insert(tmp, a6)
|
||||
table.insert(tmp, a7)
|
||||
table.insert(tmp, a8)
|
||||
table.insert(tmp, a9)
|
||||
table.insert(tmp, a10)
|
||||
table.insert(tmp, a11)
|
||||
table.insert(tmp, a12)
|
||||
table.insert(tmp, a13)
|
||||
table.insert(tmp, a14)
|
||||
table.insert(tmp, a15)
|
||||
table.insert(tmp, a16)
|
||||
table.insert(tmp, a17)
|
||||
table.insert(tmp, a18)
|
||||
table.insert(tmp, a19)
|
||||
table.insert(tmp, a20)
|
||||
|
||||
local stack = debugstack()
|
||||
if not message then
|
||||
local _,_,second = string.find(stack, "\n(.-)\n")
|
||||
message = "error raised! " .. second
|
||||
else
|
||||
for i = 1,table.getn(tmp) do
|
||||
tmp[i] = tostring(tmp[i])
|
||||
end
|
||||
for i = 1,10 do
|
||||
table.insert(tmp, "nil")
|
||||
end
|
||||
message = string.format(message, unpack(tmp))
|
||||
end
|
||||
|
||||
if getmetatable(self) and getmetatable(self).__tostring then
|
||||
message = string.format("%s: %s", tostring(self), message)
|
||||
elseif type(rawget(self, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self:GetLibraryVersion()) then
|
||||
message = string.format("%s: %s", self:GetLibraryVersion(), message)
|
||||
elseif type(rawget(self, 'class')) == "table" and type(rawget(self.class, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self.class:GetLibraryVersion()) then
|
||||
message = string.format("%s: %s", self.class:GetLibraryVersion(), message)
|
||||
end
|
||||
|
||||
local first = string.gsub(stack, "\n.*", "")
|
||||
local file = string.gsub(first, ".*\\(.*).lua:%d+: .*", "%1")
|
||||
file = string.gsub(file, "([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
|
||||
|
||||
local i = 0
|
||||
for s in string_gfind(stack, "\n([^\n]*)") do
|
||||
i = i + 1
|
||||
if not string.find(s, file .. "%.lua:%d+:") then
|
||||
file = string.gsub(s, "^.*\\(.*).lua:%d+: .*", "%1")
|
||||
file = string.gsub(file, "([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
|
||||
break
|
||||
end
|
||||
end
|
||||
local j = 0
|
||||
for s in string_gfind(stack, "\n([^\n]*)") do
|
||||
j = j + 1
|
||||
if j > i and not string.find(s, file .. "%.lua:%d+:") then
|
||||
_G.error(message, j + 1)
|
||||
return
|
||||
end
|
||||
end
|
||||
_G.error(message, 2)
|
||||
return
|
||||
end
|
||||
|
||||
local function assert(self, condition, message, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
if not condition then
|
||||
if not message then
|
||||
local stack = debugstack()
|
||||
local _,_,second = string.find(stack, "\n(.-)\n")
|
||||
message = "assertion failed! " .. second
|
||||
end
|
||||
error(self, message, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
return
|
||||
end
|
||||
return condition
|
||||
end
|
||||
|
||||
local function argCheck(self, arg, num, kind, kind2, kind3, kind4, kind5)
|
||||
if type(num) ~= "number" then
|
||||
error(self, "Bad argument #3 to `argCheck' (number expected, got %s)", type(num))
|
||||
elseif type(kind) ~= "string" then
|
||||
error(self, "Bad argument #4 to `argCheck' (string expected, got %s)", type(kind))
|
||||
end
|
||||
local errored = false
|
||||
arg = type(arg)
|
||||
if arg ~= kind and arg ~= kind2 and arg ~= kind3 and arg ~= kind4 and arg ~= kind5 then
|
||||
local _,_,func = string.find(debugstack(), "`argCheck'.-([`<].-['>])")
|
||||
if not func then
|
||||
_,_,func = string.find(debugstack(), "([`<].-['>])")
|
||||
end
|
||||
if kind5 then
|
||||
error(self, "Bad argument #%s to %s (%s, %s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, kind5, arg)
|
||||
elseif kind4 then
|
||||
error(self, "Bad argument #%s to %s (%s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, arg)
|
||||
elseif kind3 then
|
||||
error(self, "Bad argument #%s to %s (%s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, arg)
|
||||
elseif kind2 then
|
||||
error(self, "Bad argument #%s to %s (%s or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, arg)
|
||||
else
|
||||
error(self, "Bad argument #%s to %s (%s expected, got %s)", tonumber(num) or 0/0, func, kind, arg)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function pcall(self, func, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20 = _G.pcall(func, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
||||
if not a1 then
|
||||
error(self, string.gsub(a2, ".-%.lua:%d-: ", ""))
|
||||
else
|
||||
return a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20
|
||||
end
|
||||
end
|
||||
|
||||
local recurse = {}
|
||||
local function addToPositions(t, major)
|
||||
if not AceLibrary.positions[t] or AceLibrary.positions[t] == major then
|
||||
rawset(t, recurse, true)
|
||||
AceLibrary.positions[t] = major
|
||||
for k,v in pairs(t) do
|
||||
if type(v) == "table" and not rawget(v, recurse) then
|
||||
addToPositions(v, major)
|
||||
end
|
||||
if type(k) == "table" and not rawget(k, recurse) then
|
||||
addToPositions(k, major)
|
||||
end
|
||||
end
|
||||
local mt = getmetatable(t)
|
||||
if mt and not rawget(mt, recurse) then
|
||||
addToPositions(mt, major)
|
||||
end
|
||||
rawset(t, recurse, nil)
|
||||
end
|
||||
end
|
||||
|
||||
local function svnRevisionToNumber(text)
|
||||
if type(text) == "string" then
|
||||
if string.find(text, "^%$Revision: (%d+) %$$") then
|
||||
return tonumber((string.gsub(text, "^%$Revision: (%d+) %$$", "%1")))
|
||||
elseif string.find(text, "^%$Rev: (%d+) %$$") then
|
||||
return tonumber((string.gsub(text, "^%$Rev: (%d+) %$$", "%1")))
|
||||
elseif string.find(text, "^%$LastChangedRevision: (%d+) %$$") then
|
||||
return tonumber((string.gsub(text, "^%$LastChangedRevision: (%d+) %$$", "%1")))
|
||||
end
|
||||
elseif type(text) == "number" then
|
||||
return text
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
local crawlReplace
|
||||
do
|
||||
local recurse = {}
|
||||
local function func(t, to, from)
|
||||
if recurse[t] then
|
||||
return
|
||||
end
|
||||
recurse[t] = true
|
||||
local mt = getmetatable(t)
|
||||
setmetatable(t, nil)
|
||||
rawset(t, to, rawget(t, from))
|
||||
rawset(t, from, nil)
|
||||
for k,v in pairs(t) do
|
||||
if v == from then
|
||||
t[k] = to
|
||||
elseif type(v) == "table" then
|
||||
if not recurse[v] then
|
||||
func(v, to, from)
|
||||
end
|
||||
end
|
||||
|
||||
if type(k) == "table" then
|
||||
if not recurse[k] then
|
||||
func(k, to, from)
|
||||
end
|
||||
end
|
||||
end
|
||||
setmetatable(t, mt)
|
||||
if mt then
|
||||
if mt == from then
|
||||
setmetatable(t, to)
|
||||
elseif not recurse[mt] then
|
||||
func(mt, to, from)
|
||||
end
|
||||
end
|
||||
end
|
||||
function crawlReplace(t, to, from)
|
||||
func(t, to, from)
|
||||
for k in pairs(recurse) do
|
||||
recurse[k] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- @function destroyTable
|
||||
-- @brief remove all the contents of a table
|
||||
-- @param t table to destroy
|
||||
local function destroyTable(t)
|
||||
setmetatable(t, nil)
|
||||
for k,v in pairs(t) do t[k] = nil end
|
||||
table_setn(t, 0)
|
||||
end
|
||||
|
||||
local function isFrame(frame)
|
||||
return type(frame) == "table" and type(rawget(frame, 0)) == "userdata" and type(rawget(frame, 'IsFrameType')) == "function" and getmetatable(frame) and type(rawget(getmetatable(frame), '__index')) == "function"
|
||||
end
|
||||
|
||||
local new, del
|
||||
do
|
||||
local tables = setmetatable({}, {__mode = "k"})
|
||||
|
||||
function new()
|
||||
local t = next(tables)
|
||||
if t then
|
||||
tables[t] = nil
|
||||
return t
|
||||
else
|
||||
return {}
|
||||
end
|
||||
end
|
||||
|
||||
function del(t, depth)
|
||||
if depth and depth > 0 then
|
||||
for k,v in pairs(t) do
|
||||
if type(v) == "table" and not isFrame(v) then
|
||||
del(v, depth - 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
destroyTable(t)
|
||||
tables[t] = true
|
||||
end
|
||||
end
|
||||
|
||||
-- @function copyTable
|
||||
-- @brief Create a shallow copy of a table and return it.
|
||||
-- @param from The table to copy from
|
||||
-- @return A shallow copy of the table
|
||||
local function copyTable(from)
|
||||
local to = new()
|
||||
for k,v in pairs(from) do to[k] = v end
|
||||
table_setn(to, table.getn(from))
|
||||
setmetatable(to, getmetatable(from))
|
||||
return to
|
||||
end
|
||||
|
||||
-- @function deepTransfer
|
||||
-- @brief Fully transfer all data, keeping proper previous table
|
||||
-- backreferences stable.
|
||||
-- @param to The table with which data is to be injected into
|
||||
-- @param from The table whose data will be injected into the first
|
||||
-- @param saveFields If available, a shallow copy of the basic data is saved
|
||||
-- in here.
|
||||
-- @param list The account of table references
|
||||
-- @param list2 The current status on which tables have been traversed.
|
||||
local deepTransfer
|
||||
do
|
||||
-- @function examine
|
||||
-- @brief Take account of all the table references to be shared
|
||||
-- between the to and from tables.
|
||||
-- @param to The table with which data is to be injected into
|
||||
-- @param from The table whose data will be injected into the first
|
||||
-- @param list An account of the table references
|
||||
local function examine(to, from, list, major)
|
||||
list[from] = to
|
||||
for k,v in pairs(from) do
|
||||
if rawget(to, k) and type(from[k]) == "table" and type(to[k]) == "table" and not list[from[k]] then
|
||||
if from[k] == to[k] then
|
||||
list[from[k]] = to[k]
|
||||
elseif AceLibrary.positions[from[v]] ~= major and AceLibrary.positions[from[v]] then
|
||||
list[from[k]] = from[k]
|
||||
elseif not list[from[k]] then
|
||||
examine(to[k], from[k], list, major)
|
||||
end
|
||||
end
|
||||
end
|
||||
return list
|
||||
end
|
||||
|
||||
function deepTransfer(to, from, saveFields, major, list, list2)
|
||||
setmetatable(to, nil)
|
||||
local createdList
|
||||
if not list then
|
||||
createdList = true
|
||||
list = new()
|
||||
list2 = new()
|
||||
examine(to, from, list, major)
|
||||
end
|
||||
list2[to] = to
|
||||
for k,v in pairs(to) do
|
||||
if type(rawget(from, k)) ~= "table" or type(v) ~= "table" or isFrame(v) then
|
||||
if saveFields then
|
||||
saveFields[k] = v
|
||||
end
|
||||
to[k] = nil
|
||||
elseif v ~= _G then
|
||||
if saveFields then
|
||||
saveFields[k] = copyTable(v)
|
||||
end
|
||||
end
|
||||
end
|
||||
for k in pairs(from) do
|
||||
if rawget(to, k) and to[k] ~= from[k] and AceLibrary.positions[to[k]] == major and from[k] ~= _G then
|
||||
if not list2[to[k]] then
|
||||
deepTransfer(to[k], from[k], nil, major, list, list2)
|
||||
end
|
||||
to[k] = list[to[k]] or list2[to[k]]
|
||||
else
|
||||
rawset(to, k, from[k])
|
||||
end
|
||||
end
|
||||
table_setn(to, table.getn(from))
|
||||
setmetatable(to, getmetatable(from))
|
||||
local mt = getmetatable(to)
|
||||
if mt then
|
||||
if list[mt] then
|
||||
setmetatable(to, list[mt])
|
||||
elseif mt.__index and list[mt.__index] then
|
||||
mt.__index = list[mt.__index]
|
||||
end
|
||||
end
|
||||
destroyTable(from)
|
||||
if createdList then
|
||||
del(list)
|
||||
del(list2)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- @method TryToLoadStandalone
|
||||
-- @brief Attempt to find and load a standalone version of the requested library
|
||||
-- @param major A string representing the major version
|
||||
-- @return If library is found, return values from the call to LoadAddOn are returned
|
||||
-- If the library has been requested previously, nil is returned.
|
||||
local function TryToLoadStandalone(major)
|
||||
if not AceLibrary.scannedlibs then AceLibrary.scannedlibs = {} end
|
||||
if AceLibrary.scannedlibs[major] then return end
|
||||
|
||||
AceLibrary.scannedlibs[major] = true
|
||||
|
||||
local name, _, _, enabled, loadable = GetAddOnInfo(major)
|
||||
if loadable then
|
||||
return LoadAddOn(name)
|
||||
end
|
||||
|
||||
for i=1,GetNumAddOns() do
|
||||
if GetAddOnMetadata(i, "X-AceLibrary-"..major) then
|
||||
local name, _, _, enabled, loadable = GetAddOnInfo(i)
|
||||
if loadable then
|
||||
return LoadAddOn(name)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- @method IsNewVersion
|
||||
-- @brief Obtain whether the supplied version would be an upgrade to the
|
||||
-- current version. This allows for bypass code in library
|
||||
-- declaration.
|
||||
-- @param major A string representing the major version
|
||||
-- @param minor An integer or an svn revision string representing the minor version
|
||||
-- @return whether the supplied version would be newer than what is
|
||||
-- currently available.
|
||||
function AceLibrary:IsNewVersion(major, minor)
|
||||
argCheck(self, major, 2, "string")
|
||||
TryToLoadStandalone(major)
|
||||
|
||||
if type(minor) == "string" then
|
||||
local m = svnRevisionToNumber(minor)
|
||||
if m then
|
||||
minor = m
|
||||
else
|
||||
_G.error(string.format("Bad argument #3 to `IsNewVersion'. Must be a number or SVN revision string. %q is not appropriate", minor), 2)
|
||||
end
|
||||
end
|
||||
argCheck(self, minor, 3, "number")
|
||||
local data = self.libs[major]
|
||||
if not data then
|
||||
return true
|
||||
end
|
||||
return data.minor < minor
|
||||
end
|
||||
|
||||
-- @method HasInstance
|
||||
-- @brief Returns whether an instance exists. This allows for optional support of a library.
|
||||
-- @param major A string representing the major version.
|
||||
-- @param minor (optional) An integer or an svn revision string representing the minor version.
|
||||
-- @return Whether an instance exists.
|
||||
function AceLibrary:HasInstance(major, minor)
|
||||
argCheck(self, major, 2, "string")
|
||||
TryToLoadStandalone(major)
|
||||
|
||||
if minor then
|
||||
if type(minor) == "string" then
|
||||
local m = svnRevisionToNumber(minor)
|
||||
if m then
|
||||
minor = m
|
||||
else
|
||||
_G.error(string.format("Bad argument #3 to `HasInstance'. Must be a number or SVN revision string. %q is not appropriate", minor), 2)
|
||||
end
|
||||
end
|
||||
argCheck(self, minor, 3, "number")
|
||||
if not self.libs[major] then
|
||||
return
|
||||
end
|
||||
return self.libs[major].minor == minor
|
||||
end
|
||||
return self.libs[major] and true
|
||||
end
|
||||
|
||||
-- @method GetInstance
|
||||
-- @brief Returns the library with the given major/minor version.
|
||||
-- @param major A string representing the major version.
|
||||
-- @param minor (optional) An integer or an svn revision string representing the minor version.
|
||||
-- @return The library with the given major/minor version.
|
||||
function AceLibrary:GetInstance(major, minor)
|
||||
argCheck(self, major, 2, "string")
|
||||
TryToLoadStandalone(major)
|
||||
|
||||
local data = self.libs[major]
|
||||
if not data then
|
||||
_G.error(string.format("Cannot find a library instance of %s.", major), 2)
|
||||
return
|
||||
end
|
||||
if minor then
|
||||
if type(minor) == "string" then
|
||||
local m = svnRevisionToNumber(minor)
|
||||
if m then
|
||||
minor = m
|
||||
else
|
||||
_G.error(string.format("Bad argument #3 to `GetInstance'. Must be a number or SVN revision string. %q is not appropriate", minor), 2)
|
||||
end
|
||||
end
|
||||
argCheck(self, minor, 2, "number")
|
||||
if data.minor ~= minor then
|
||||
_G.error(string.format("Cannot find a library instance of %s, minor version %d.", major, minor), 2)
|
||||
return
|
||||
end
|
||||
end
|
||||
return data.instance
|
||||
end
|
||||
|
||||
-- Syntax sugar. AceLibrary("FooBar-1.0")
|
||||
AceLibrary_mt.__call = AceLibrary.GetInstance
|
||||
|
||||
local donothing
|
||||
|
||||
local AceEvent
|
||||
|
||||
-- @method Register
|
||||
-- @brief Registers a new version of a given library.
|
||||
-- @param newInstance the library to register
|
||||
-- @param major the major version of the library
|
||||
-- @param minor the minor version of the library
|
||||
-- @param activateFunc (optional) A function to be called when the library is
|
||||
-- fully activated. Takes the arguments
|
||||
-- (newInstance [, oldInstance, oldDeactivateFunc]). If
|
||||
-- oldInstance is given, you should probably call
|
||||
-- oldDeactivateFunc(oldInstance).
|
||||
-- @param deactivateFunc (optional) A function to be called by a newer library's
|
||||
-- activateFunc.
|
||||
-- @param externalFunc (optional) A function to be called whenever a new
|
||||
-- library is registered.
|
||||
function AceLibrary:Register(newInstance, major, minor, activateFunc, deactivateFunc, externalFunc)
|
||||
argCheck(self, newInstance, 2, "table")
|
||||
argCheck(self, major, 3, "string")
|
||||
if type(minor) == "string" then
|
||||
local m = svnRevisionToNumber(minor)
|
||||
if m then
|
||||
minor = m
|
||||
else
|
||||
_G.error(string.format("Bad argument #4 to `Register'. Must be a number or SVN revision string. %q is not appropriate", minor), 2)
|
||||
end
|
||||
end
|
||||
argCheck(self, minor, 4, "number")
|
||||
if math.floor(minor) ~= minor or minor < 0 then
|
||||
error(self, "Bad argument #4 to `Register' (integer >= 0 expected, got %s)", minor)
|
||||
end
|
||||
argCheck(self, activateFunc, 5, "function", "nil")
|
||||
argCheck(self, deactivateFunc, 6, "function", "nil")
|
||||
argCheck(self, externalFunc, 7, "function", "nil")
|
||||
if not deactivateFunc then
|
||||
if not donothing then
|
||||
donothing = function() end
|
||||
end
|
||||
deactivateFunc = donothing
|
||||
end
|
||||
local data = self.libs[major]
|
||||
if not data then
|
||||
-- This is new
|
||||
local instance = copyTable(newInstance)
|
||||
crawlReplace(instance, instance, newInstance)
|
||||
destroyTable(newInstance)
|
||||
if AceLibrary == newInstance then
|
||||
self = instance
|
||||
AceLibrary = instance
|
||||
end
|
||||
self.libs[major] = {
|
||||
instance = instance,
|
||||
minor = minor,
|
||||
deactivateFunc = deactivateFunc,
|
||||
externalFunc = externalFunc,
|
||||
}
|
||||
rawset(instance, 'GetLibraryVersion', function(self)
|
||||
return major, minor
|
||||
end)
|
||||
if not rawget(instance, 'error') then
|
||||
rawset(instance, 'error', error)
|
||||
end
|
||||
if not rawget(instance, 'assert') then
|
||||
rawset(instance, 'assert', assert)
|
||||
end
|
||||
if not rawget(instance, 'argCheck') then
|
||||
rawset(instance, 'argCheck', argCheck)
|
||||
end
|
||||
if not rawget(instance, 'pcall') then
|
||||
rawset(instance, 'pcall', pcall)
|
||||
end
|
||||
addToPositions(instance, major)
|
||||
if activateFunc then
|
||||
safecall(activateFunc, instance, nil, nil) -- no old version, so explicit nil
|
||||
end
|
||||
|
||||
if externalFunc then
|
||||
for k,data in pairs(self.libs) do
|
||||
if k ~= major then
|
||||
safecall(externalFunc, instance, k, data.instance)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for k,data in pairs(self.libs) do
|
||||
if k ~= major and data.externalFunc then
|
||||
safecall(data.externalFunc, data.instance, major, instance)
|
||||
end
|
||||
end
|
||||
if major == "AceEvent-2.0" then
|
||||
AceEvent = instance
|
||||
end
|
||||
if AceEvent then
|
||||
AceEvent.TriggerEvent(self, "AceLibrary_Register", major, instance)
|
||||
end
|
||||
|
||||
return instance
|
||||
end
|
||||
local instance = data.instance
|
||||
if minor <= data.minor then
|
||||
-- This one is already obsolete, raise an error.
|
||||
_G.error(string.format("Obsolete library registered. %s is already registered at version %d. You are trying to register version %d. Hint: if not AceLibrary:IsNewVersion(%q, %d) then return end", major, data.minor, minor, major, minor), 2)
|
||||
return
|
||||
end
|
||||
-- This is an update
|
||||
local oldInstance = new()
|
||||
|
||||
addToPositions(newInstance, major)
|
||||
local isAceLibrary = (AceLibrary == newInstance)
|
||||
local old_error, old_assert, old_argCheck, old_pcall
|
||||
if isAceLibrary then
|
||||
self = instance
|
||||
AceLibrary = instance
|
||||
|
||||
old_error = instance.error
|
||||
old_assert = instance.assert
|
||||
old_argCheck = instance.argCheck
|
||||
old_pcall = instance.pcall
|
||||
|
||||
self.error = error
|
||||
self.assert = assert
|
||||
self.argCheck = argCheck
|
||||
self.pcall = pcall
|
||||
end
|
||||
deepTransfer(instance, newInstance, oldInstance, major)
|
||||
crawlReplace(instance, instance, newInstance)
|
||||
local oldDeactivateFunc = data.deactivateFunc
|
||||
data.minor = minor
|
||||
data.deactivateFunc = deactivateFunc
|
||||
data.externalFunc = externalFunc
|
||||
rawset(instance, 'GetLibraryVersion', function(self)
|
||||
return major, minor
|
||||
end)
|
||||
if not rawget(instance, 'error') then
|
||||
rawset(instance, 'error', error)
|
||||
end
|
||||
if not rawget(instance, 'assert') then
|
||||
rawset(instance, 'assert', assert)
|
||||
end
|
||||
if not rawget(instance, 'argCheck') then
|
||||
rawset(instance, 'argCheck', argCheck)
|
||||
end
|
||||
if not rawget(instance, 'pcall') then
|
||||
rawset(instance, 'pcall', pcall)
|
||||
end
|
||||
if isAceLibrary then
|
||||
for _,v in pairs(self.libs) do
|
||||
local i = type(v) == "table" and v.instance
|
||||
if type(i) == "table" then
|
||||
if not rawget(i, 'error') or i.error == old_error then
|
||||
rawset(i, 'error', error)
|
||||
end
|
||||
if not rawget(i, 'assert') or i.assert == old_assert then
|
||||
rawset(i, 'assert', assert)
|
||||
end
|
||||
if not rawget(i, 'argCheck') or i.argCheck == old_argCheck then
|
||||
rawset(i, 'argCheck', argCheck)
|
||||
end
|
||||
if not rawget(i, 'pcall') or i.pcall == old_pcall then
|
||||
rawset(i, 'pcall', pcall)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if activateFunc then
|
||||
safecall(activateFunc, instance, oldInstance, oldDeactivateFunc)
|
||||
else
|
||||
safecall(oldDeactivateFunc, oldInstance)
|
||||
end
|
||||
del(oldInstance)
|
||||
|
||||
if externalFunc then
|
||||
for k,data in pairs(self.libs) do
|
||||
if k ~= major then
|
||||
safecall(externalFunc, instance, k, data.instance)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return instance
|
||||
end
|
||||
|
||||
local iter
|
||||
function AceLibrary:IterateLibraries()
|
||||
if not iter then
|
||||
local function iter(t, k)
|
||||
k = next(t, k)
|
||||
if not k then
|
||||
return nil
|
||||
else
|
||||
return k, t[k].instance
|
||||
end
|
||||
end
|
||||
end
|
||||
return iter, self.libs, nil
|
||||
end
|
||||
|
||||
-- @function Activate
|
||||
-- @brief The activateFunc for AceLibrary itself. Called when
|
||||
-- AceLibrary properly registers.
|
||||
-- @param self Reference to AceLibrary
|
||||
-- @param oldLib (optional) Reference to an old version of AceLibrary
|
||||
-- @param oldDeactivate (optional) Function to deactivate the old lib
|
||||
local function activate(self, oldLib, oldDeactivate)
|
||||
if not self.libs then
|
||||
if oldLib then
|
||||
self.libs = oldLib.libs
|
||||
self.scannedlibs = oldLib.scannedlibs
|
||||
end
|
||||
if not self.libs then
|
||||
self.libs = {}
|
||||
end
|
||||
if not self.scannedlibs then
|
||||
self.scannedlibs = {}
|
||||
end
|
||||
end
|
||||
if not self.positions then
|
||||
if oldLib then
|
||||
self.positions = oldLib.positions
|
||||
end
|
||||
if not self.positions then
|
||||
self.positions = setmetatable({}, { __mode = "k" })
|
||||
end
|
||||
end
|
||||
|
||||
-- Expose the library in the global environment
|
||||
_G[ACELIBRARY_MAJOR] = self
|
||||
|
||||
if oldDeactivate then
|
||||
oldDeactivate(oldLib)
|
||||
end
|
||||
end
|
||||
|
||||
if not previous then
|
||||
previous = AceLibrary
|
||||
end
|
||||
if not previous.libs then
|
||||
previous.libs = {}
|
||||
end
|
||||
AceLibrary.libs = previous.libs
|
||||
if not previous.positions then
|
||||
previous.positions = setmetatable({}, { __mode = "k" })
|
||||
end
|
||||
AceLibrary.positions = previous.positions
|
||||
AceLibrary:Register(AceLibrary, ACELIBRARY_MAJOR, ACELIBRARY_MINOR, activate)
|
||||
File diff suppressed because it is too large
Load Diff
+7387
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,25 @@
|
||||
## Interface: 11200
|
||||
## Title: Outfitter
|
||||
## Notes: Outfitter
|
||||
## Author: |cff5BCEFAL|cffF5A9B8e|cffFFFFFFx|cffF5A9B8i|cff5BCEFAe|r
|
||||
## Version: 1.6.0
|
||||
## OptionalDeps: TankPoints, Ace2
|
||||
## X-ClientMods: SuperWoW, ClassicAPI (optional)
|
||||
## RequiredDeps:
|
||||
## SavedVariablesPerCharacter: gOutfitter_Settings
|
||||
|
||||
Libs\AceLibrary\AceLibrary.lua
|
||||
Libs\AceOO-2.0\AceOO-2.0.lua
|
||||
Libs\AceEvent-2.0\AceEvent-2.0.lua
|
||||
|
||||
OutfitterStrings.lua
|
||||
OutfitterStrings_de.lua
|
||||
OutfitterStrings_fr.lua
|
||||
OutfitterStrings_cn.lua
|
||||
OutfitterStrings_tw.lua
|
||||
OutfitterStrings_kr.lua
|
||||
|
||||
BossTrash.lua
|
||||
OutfitterClientMods.lua
|
||||
Outfitter.lua
|
||||
Outfitter.xml
|
||||
+1774
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,157 @@
|
||||
-- OutfitterClientMods.lua
|
||||
--
|
||||
-- Optional integration with 1.12.1 client mods. Every helper here has a
|
||||
-- plain-vanilla fallback, so Outfitter behaves exactly as before when no
|
||||
-- client mod is installed.
|
||||
--
|
||||
-- SuperWoW : UnitBuff() 3rd return = aura spell ID, IsMounted(),
|
||||
-- IsSwimming(), UnitExists() 2nd return = GUID
|
||||
-- ClassicAPI : C_UnitAuras.GetAuraDataByIndex() (spellId + name),
|
||||
-- IsMounted(), IsSwimming(), UnitGUID()
|
||||
-- Nampower : detected and reported only. Its item/cast/spell-queue API
|
||||
-- has no task inside Outfitter that it does better.
|
||||
-- UnitXP SP3 : detected and reported only. Distance, line of sight and
|
||||
-- camera functions have no use in an equipment manager.
|
||||
--
|
||||
-- Lua 5.0 (no select(), no #, no varargs expressions).
|
||||
|
||||
Outfitter_ClientMods = {
|
||||
SuperWoW = false,
|
||||
ClassicAPI = false,
|
||||
Nampower = false,
|
||||
UnitXP = false,
|
||||
Detected = false,
|
||||
};
|
||||
|
||||
local OCM = Outfitter_ClientMods;
|
||||
|
||||
function Outfitter_DetectClientMods()
|
||||
OCM.SuperWoW = (SUPERWOW_VERSION ~= nil) or (SUPERWOW_STRING ~= nil);
|
||||
|
||||
OCM.ClassicAPI = (CLASSIC_API_VERSION ~= nil)
|
||||
or (type(C_UnitAuras) == "table" and type(C_UnitAuras.GetAuraDataByIndex) == "function");
|
||||
|
||||
OCM.Nampower = type(GetNampowerVersion) == "function";
|
||||
|
||||
OCM.UnitXP = false;
|
||||
if type(UnitXP) == "function" then
|
||||
-- UnitXP("nop", "nop") is the documented presence check; it raises if the dll is missing
|
||||
local vOK = pcall(UnitXP, "nop", "nop");
|
||||
OCM.UnitXP = vOK and true or false;
|
||||
end
|
||||
|
||||
-- Capabilities actually used by Outfitter
|
||||
|
||||
OCM.HasIsMounted = type(IsMounted) == "function" and (OCM.SuperWoW or OCM.ClassicAPI);
|
||||
OCM.HasIsSwimming = type(IsSwimming) == "function" and (OCM.SuperWoW or OCM.ClassicAPI);
|
||||
OCM.HasAuraSpellID = OCM.SuperWoW or OCM.ClassicAPI;
|
||||
OCM.HasGUID = OCM.SuperWoW or (OCM.ClassicAPI and type(UnitGUID) == "function");
|
||||
|
||||
OCM.Detected = true;
|
||||
end
|
||||
|
||||
-- Returns texture, spellID[, name] for the player's buff at pIndex (1-based).
|
||||
-- spellID is nil when no client mod provides it.
|
||||
|
||||
function Outfitter_GetPlayerBuffInfo(pIndex)
|
||||
if OCM.SuperWoW then
|
||||
local vTexture, vCount, vSpellID = UnitBuff("player", pIndex);
|
||||
return vTexture, vSpellID;
|
||||
end
|
||||
|
||||
if OCM.ClassicAPI then
|
||||
local vTexture = UnitBuff("player", pIndex);
|
||||
|
||||
if not vTexture then
|
||||
return nil;
|
||||
end
|
||||
|
||||
local vOK, vData = pcall(C_UnitAuras.GetAuraDataByIndex, "player", pIndex, "HELPFUL");
|
||||
|
||||
if vOK and type(vData) == "table" then
|
||||
-- name lets the caller confirm the two APIs agree on this index
|
||||
return vTexture, vData.spellId, vData.name;
|
||||
end
|
||||
|
||||
return vTexture, nil;
|
||||
end
|
||||
|
||||
return UnitBuff("player", pIndex), nil;
|
||||
end
|
||||
|
||||
-- Returns true/false when a client mod can answer, nil when unknown
|
||||
|
||||
function Outfitter_ClientIsMounted()
|
||||
if not OCM.HasIsMounted then
|
||||
return nil;
|
||||
end
|
||||
|
||||
local vOK, vResult = pcall(IsMounted);
|
||||
|
||||
if not vOK then
|
||||
return nil;
|
||||
end
|
||||
|
||||
return vResult and vResult ~= 0 and true or false;
|
||||
end
|
||||
|
||||
function Outfitter_ClientIsSwimming()
|
||||
if not OCM.HasIsSwimming then
|
||||
return nil;
|
||||
end
|
||||
|
||||
local vOK, vResult = pcall(IsSwimming);
|
||||
|
||||
if not vOK then
|
||||
return nil;
|
||||
end
|
||||
|
||||
return vResult and vResult ~= 0 and true or false;
|
||||
end
|
||||
|
||||
-- Stable identity for a unit: GUID when available, otherwise name..level
|
||||
|
||||
function Outfitter_GetUnitIdentity(pUnit)
|
||||
if not UnitExists(pUnit) then
|
||||
return nil;
|
||||
end
|
||||
|
||||
if OCM.ClassicAPI and type(UnitGUID) == "function" then
|
||||
local vOK, vGUID = pcall(UnitGUID, pUnit);
|
||||
|
||||
if vOK and vGUID then
|
||||
return vGUID;
|
||||
end
|
||||
end
|
||||
|
||||
if OCM.SuperWoW then
|
||||
local vExists, vGUID = UnitExists(pUnit);
|
||||
|
||||
if vGUID then
|
||||
return vGUID;
|
||||
end
|
||||
end
|
||||
|
||||
return (UnitName(pUnit) or "?") .. ":" .. (UnitLevel(pUnit) or 0);
|
||||
end
|
||||
|
||||
function Outfitter_ClientModsSummary()
|
||||
if not OCM.Detected then
|
||||
Outfitter_DetectClientMods();
|
||||
end
|
||||
|
||||
local function YesNo(pValue)
|
||||
if pValue then
|
||||
return GREEN_FONT_COLOR_CODE .. "yes" .. FONT_COLOR_CODE_CLOSE;
|
||||
end
|
||||
return GRAY_FONT_COLOR_CODE .. "no" .. FONT_COLOR_CODE_CLOSE;
|
||||
end
|
||||
|
||||
DEFAULT_CHAT_FRAME:AddMessage(NORMAL_FONT_COLOR_CODE .. "Outfitter client mod support:" .. FONT_COLOR_CODE_CLOSE);
|
||||
DEFAULT_CHAT_FRAME:AddMessage(" SuperWoW: " .. YesNo(OCM.SuperWoW) .. " ClassicAPI: " .. YesNo(OCM.ClassicAPI)
|
||||
.. " Nampower: " .. YesNo(OCM.Nampower) .. " UnitXP SP3: " .. YesNo(OCM.UnitXP));
|
||||
DEFAULT_CHAT_FRAME:AddMessage(" Mount detection: " .. (OCM.HasIsMounted and "client flag" or "buff tooltip text"));
|
||||
DEFAULT_CHAT_FRAME:AddMessage(" Swimming detection: " .. (OCM.HasIsSwimming and "client flag (surface + underwater)" or "breath timer (underwater only)"));
|
||||
DEFAULT_CHAT_FRAME:AddMessage(" Buff tooltip scans: " .. (OCM.HasAuraSpellID and "cached per spell ID" or "every aura change"));
|
||||
DEFAULT_CHAT_FRAME:AddMessage(" Target identity: " .. (OCM.HasGUID and "GUID" or "name + level"));
|
||||
end
|
||||
@@ -0,0 +1,411 @@
|
||||
Outfitter_cVersion = "1.6.0";
|
||||
|
||||
Outfitter_cTitle = "Outfitter";
|
||||
Outfitter_cTitleVersion = Outfitter_cTitle .. " " .. Outfitter_cVersion;
|
||||
|
||||
Outfitter_cNameLabel = "Name:";
|
||||
Outfitter_cCreateUsingTitle = "Optimize for:";
|
||||
Outfitter_cUseCurrentOutfit = "Use Current Outfit";
|
||||
Outfitter_cUseEmptyOutfit = "Create Empty Outfit";
|
||||
|
||||
Outfitter_cOutfitterTabTitle = "Outfitter";
|
||||
Outfitter_cOptionsTabTitle = "Options";
|
||||
Outfitter_cAboutTabTitle = "About";
|
||||
|
||||
Outfitter_cNewOutfit = "New Outfit";
|
||||
Outfitter_cRenameOutfit = "Rename Outfit";
|
||||
|
||||
Outfitter_cCompleteOutfits = "Complete wardrobes";
|
||||
Outfitter_cPartialOutfits = "Mix-n-match";
|
||||
Outfitter_cAccessoryOutfits = "Accessories";
|
||||
Outfitter_cSpecialOutfits = "Special occassions";
|
||||
Outfitter_cOddsNEndsOutfits = "Odds 'n ends";
|
||||
|
||||
Outfitter_cNormalOutfit = "Normal";
|
||||
Outfitter_cNakedOutfit = "Birthday Suit";
|
||||
|
||||
Outfitter_cFishingOutfit = "Fishing";
|
||||
Outfitter_cHerbalismOutfit = "Herbalism";
|
||||
Outfitter_cMiningOutfit = "Mining";
|
||||
Outfitter_cSkinningOutfit = "Skinning";
|
||||
Outfitter_cFireResistOutfit = "Fire Resist";
|
||||
Outfitter_cNatureResistOutfit = "Nature Resist";
|
||||
Outfitter_cShadowResistOutfit = "Shadow Resist";
|
||||
Outfitter_cArcaneResistOutfit = "Arcane Resist";
|
||||
Outfitter_cFrostResistOutfit = "Frost Resist";
|
||||
|
||||
Outfitter_cArgentDawnOutfit = "Argent Dawn";
|
||||
Outfitter_cRidingOutfit = "Riding";
|
||||
Outfitter_cDiningOutfit = "Dining";
|
||||
Outfitter_cBattlegroundOutfit = "Battleground";
|
||||
Outfitter_cABOutfit = "Battleground: Arathi Basin";
|
||||
Outfitter_cAVOutfit = "Battleground: Alterac Valley";
|
||||
Outfitter_cWSGOutfit = "Battleground: Warsong Gulch";
|
||||
Outfitter_cBROutfit = "Battleground: Blood Ring";
|
||||
Outfitter_cSGVOutfit = "Battleground: Sunnyglade Valley";
|
||||
Outfitter_cSwimmingOutfit = "Swimming";
|
||||
Outfitter_cDiscardedStripOutfit = "Outfitter: ignored a saved change that would have unequipped all your gear (left over from a crash or disconnect)";
|
||||
Outfitter_cCityOutfit = "Around Town";
|
||||
Outfitter_cBossOutfit = "Boss Mobs";
|
||||
Outfitter_cLvl63Outfit = "Lvl63+";
|
||||
Outfitter_cTrashOutfit = "Trash Mobs";
|
||||
Outfitter_cCritterOutfit = "Critters";
|
||||
|
||||
Outfitter_cBeastTrashOutfit = "Beast Trash Mobs";
|
||||
Outfitter_cUndeadTrashOutfit = "Undead Trash Mobs";
|
||||
Outfitter_cDemonTrashOutfit = "Demon Trash Mobs";
|
||||
|
||||
Outfitter_cMountSpeedFormat = "Increases speed by (%d+)%%."; -- For detecting when mounted
|
||||
|
||||
Outfitter_cBagsFullError = "Outfitter: Can't remove %s because all bags are full";
|
||||
Outfitter_cDepositBagsFullError = "Outfitter: Can't deposit %s because all bank bags are full";
|
||||
Outfitter_cWithdrawBagsFullError = "Outfitter: Can't withdraw %s because all bags are full";
|
||||
Outfitter_cItemNotFoundError = "Outfitter: Can't find item %s";
|
||||
Outfitter_cItemAlreadyUsedError = "Outfitter: Can't put %s in the %s slot because it's already being used in another slot";
|
||||
Outfitter_cAddingItem = "Outfitter: Adding %s to %s outfit";
|
||||
Outfitter_cNameAlreadyUsedError = "Error: That name is already being used";
|
||||
Outfitter_cNoItemsWithStatError = "Warning: None of your items have that attribute";
|
||||
|
||||
Outfitter_cEnableAll = "Enable all";
|
||||
Outfitter_cEnableNone = "Enable none";
|
||||
|
||||
Outfitter_cConfirmDeleteMsg = "Are you sure you want to delete the outfit %s?";
|
||||
Outfitter_cConfirmUpdateMsg = "Are you sure you want to update the outfit %s to your current outfit?";
|
||||
Outfitter_cConfirmRebuildMsg = "Are you sure you want to rebuild the outfit %s?";
|
||||
Outfitter_cRebuild = "Rebuild";
|
||||
Outfitter_cUpdate = "Update";
|
||||
Outfitter_cUpdateToCurrent = "Update to current";
|
||||
|
||||
Outfitter_cWesternPlaguelands = "Western Plaguelands";
|
||||
Outfitter_cEasternPlaguelands = "Eastern Plaguelands";
|
||||
Outfitter_cStratholme = "Stratholme";
|
||||
Outfitter_cScholomance = "Scholomance";
|
||||
Outfitter_cNaxxramas = "Naxxramas";
|
||||
Outfitter_cAlteracValley = "Alterac Valley";
|
||||
Outfitter_cArathiBasin = "Arathi Basin";
|
||||
Outfitter_cWarsongGulch = "Warsong Gulch";
|
||||
Outfitter_cBloodRing = "Blood Ring";
|
||||
Outfitter_cSunnygladeValley = "Sunnyglade Valley";
|
||||
Outfitter_cIronforge = "Ironforge";
|
||||
Outfitter_cCityOfIronforge = "City of Ironforge";
|
||||
Outfitter_cDarnassus = "Darnassus";
|
||||
Outfitter_cStormwind = "Stormwind City";
|
||||
Outfitter_cOrgrimmar = "Orgrimmar";
|
||||
Outfitter_cThunderBluff = "Thunder Bluff";
|
||||
Outfitter_cUndercity = "Undercity";
|
||||
|
||||
--Instances
|
||||
Outfitter_cAQ20 = "Ruins of Ahn'Qiraj";
|
||||
Outfitter_cAQ40 = "Ahn'Qiraj";
|
||||
Outfitter_cZG = "Zul'Gurub";
|
||||
Outfitter_cES = "Emerald Sanctum";
|
||||
Outfitter_cBM = "The Black Morass";
|
||||
Outfitter_cK40 = "The Rock of Desolation";
|
||||
|
||||
Outfitter_cFishingPole = "Fishing Pole";
|
||||
Outfitter_cStrongFishingPole = "Strong Fishing Pole";
|
||||
Outfitter_cDarkwoodFishingPole = "Darkwood Fishing Pole";
|
||||
Outfitter_cBigIronFishingPole = "Big Iron Fishing Pole";
|
||||
Outfitter_cBlumpFishingPole = "Blump Family Fishing Pole";
|
||||
Outfitter_cNatPaglesFishingPole = "Nat Pagle's Extreme Angler FC-5000";
|
||||
Outfitter_cArcaniteFishingPole = "Arcanite Fishing Pole";
|
||||
Outfitter_cBarkskinFisher = "Barkskin Fisher";
|
||||
|
||||
Outfitter_cArgentDawnCommission = "Argent Dawn Commission";
|
||||
Outfitter_cSealOfTheDawn = "Seal of the Dawn";
|
||||
Outfitter_cRuneOfTheDawn = "Rune of the Dawn";
|
||||
|
||||
Outfitter_cWhipOfEncouragement = "Whip of Encouragement";
|
||||
Outfitter_cGoblinCarKey = "Goblin Car Key";
|
||||
Outfitter_cGnomeCarKey = "Gnome Car Key";
|
||||
Outfitter_cCarrotOnAStick = "Carrot on a Stick";
|
||||
|
||||
Outfitter_cItemStatFormats = {
|
||||
{ Format = "Stamina %+(%d+)", Types = { "Stamina" } },
|
||||
{ Format = "Intellect %+(%d+)", Types = { "Intellect" } },
|
||||
{ Format = "Agility %+(%d+)", Types = { "Agility" } },
|
||||
{ Format = "Strength %+(%d+)", Types = { "Strength" } },
|
||||
{ Format = "Spirit %+(%d+)", Types = { "Spirit" } },
|
||||
{ Format = "Armor %+(%d+)", Types = { "Armor" } },
|
||||
{ Format = "Defense %+(%d+)", Types = { "Defense" } },
|
||||
{ Format = "Increased Defense %+(%d+)", Types = { "Defense" } },
|
||||
|
||||
{ Format = "%+(%d+) Stamina", Types = { "Stamina" } },
|
||||
{ Format = "%+(%d+) Intellect", Types = { "Intellect" } },
|
||||
{ Format = "%+(%d+) Agility", Types = { "Agility" } },
|
||||
{ Format = "%+(%d+) Strength", Types = { "Strength" } },
|
||||
{ Format = "%+(%d+) Spirit", Types = { "Spirit" } },
|
||||
{ Format = "(%d+) Armor", Types = { "Armor" } },
|
||||
{ Format = "%+(%d+) Attack Power", Types = { "Attack" } },
|
||||
|
||||
{ Format = "All Stats %+(%d+)", Types = { "Stamina", "Intellect", "Agility", "Strength", "Spirit" } },
|
||||
|
||||
{ Format = "Mana %+(%d+)", Types = { "Mana" } },
|
||||
{ Format = "Health %+(%d+)", Types = { "Health" } },
|
||||
|
||||
{ Format = "%+(%d+) mana every 5 sec.", Types = { "ManaRegen" } },
|
||||
{ Format = "Restores (%d+) mana per 5 sec.", Types = { "ManaRegen" } },
|
||||
|
||||
{ Format = "%+(%d+) health every 5 sec.", Types = { "HealthRegen" } },
|
||||
{ Format = "Restores (%d+) health every 5 sec.", Types = { "HealthRegen" } },
|
||||
{ Format = "Restores (%d+) health per 5 sec.", Types = { "HealthRegen" } },
|
||||
|
||||
{ Format = "Minor Mount Speed Increase", Value = 3, Types = { "Riding" } },
|
||||
{ Format = "Mithril Spurs", Value = 3, Types = { "Riding" } },
|
||||
{ Format = "Thorium Spurs", Value = 5, Types = { "Riding" } },
|
||||
|
||||
{ Format = "%+(%d+) Fire Resistance", Types = { "FireResist" } },
|
||||
{ Format = "%+(%d+) Nature Resistance", Types = { "NatureResist" } },
|
||||
{ Format = "%+(%d+) Frost Resistance", Types = { "FrostResist" } },
|
||||
{ Format = "%+(%d+) Shadow Resistance", Types = { "ShadowResist" } },
|
||||
{ Format = "%+(%d+) Arcane Resistance", Types = { "ArcaneResist" } },
|
||||
{ Format = "%+(%d+) All Resistances", Types = { "FireResist", "NatureResist", "FrostResist", "ShadowResist", "ArcaneResist" } },
|
||||
|
||||
{ Format = "Weapon Damage %+(%d+)", Types = { "MeleeDmg" } },
|
||||
{ Format = "Improves your chance to hit by (%d+)%%", Types = { "MeleeHit" } },
|
||||
{ Format = "Improves your chance to get a critical strike by (%d+)%%", Types = { "MeleeCrit" } },
|
||||
{ Format = "Increases your chance to dodge an attack by (%d+)%%", Types = { "Dodge" } },
|
||||
{ Format = "Damage %+(%d+)", Types = { "MeleeDmg" } },
|
||||
{ Format = "(%d+) Block", Types = { "Block" } },
|
||||
{ Format = "Block Value %+(%d+)", Types = { "Block" } },
|
||||
{ Format = "Increases the block value of your shield by (%d+)", Types = { "Block" } },
|
||||
|
||||
{ Format = "Increased Fishing %+(%d+)%.", Types = { "Fishing" } },
|
||||
{ Format = "Fishing %+(%d+)", Types = { "Fishing" } },
|
||||
{ Format = "Herbalism %+(%d+)", Types = { "Herbalism" } },
|
||||
{ Format = "Mining %+(%d+)", Types = { "Mining" } },
|
||||
{ Format = "Skinning %+(%d+)", Types = { "Skinning" } },
|
||||
|
||||
{ Format = "Improves your chance to get a critical strike with spells by (%d+)%%", Types = { "SpellCrit" } },
|
||||
{ Format = "Improves your chance to hit with spells by (%d+)%%", Types = { "SpellHit" } },
|
||||
{ Format = "Increases damage and healing done by magical spells and effects by up to (%d+)", Types = { "SpellDmg", "ShadowDmg", "FireDmg", "FrostDmg", "ArcaneDmg", "NatureDmg", "Healing" } },
|
||||
{ Format = "Increases healing done by spells and effects by up to (%d+)", Types = { "Healing" } },
|
||||
{ Format = "Healing Spells %+(%d+)", Types = { "Healing" } },
|
||||
{ Format = "%+(%d+) Healing Spells", Types = { "Healing" } },
|
||||
|
||||
{ Format = "%+(%d+) Fire Spell Damage", Types = { "FireDmg" } },
|
||||
{ Format = "%+(%d+) Shadow Spell Damage", Types = { "ShadowDmg" } },
|
||||
{ Format = "%+(%d+) Frost Spell Damage", Types = { "FrostDmg" } },
|
||||
{ Format = "%+(%d+) Arcane Spell Damage", Types = { "ArcaneDmg" } },
|
||||
{ Format = "%+(%d+) Nature Spell Damage", Types = { "NatureDmg" } },
|
||||
|
||||
{ Format = "Increases damage done by Fire spells and effects by up to (%d+)", Types = { "FireDmg" } },
|
||||
{ Format = "Increases damage done by Shadow spells and effects by up to (%d+)", Types = { "ShadowDmg" } },
|
||||
{ Format = "Increases damage done by Frost spells and effects by up to (%d+)", Types = { "FrostDmg" } },
|
||||
{ Format = "Increases damage done by Arcane spells and effects by up to (%d+)", Types = { "ArcaneDmg" } },
|
||||
{ Format = "Increases damage done by Nature spells and effects by up to (%d+)", Types = { "NatureDmg" } },
|
||||
};
|
||||
|
||||
Outfitter_cAgilityStatName = "Agility";
|
||||
Outfitter_cArmorStatName = "Armor";
|
||||
Outfitter_cDefenseStatName = "Defense";
|
||||
Outfitter_cIntellectStatName = "Intellect";
|
||||
Outfitter_cSpiritStatName = "Spirit";
|
||||
Outfitter_cStaminaStatName = "Stamina";
|
||||
Outfitter_cStrengthStatName = "Strength";
|
||||
|
||||
Outfitter_cManaRegenStatName = "Mana Regeneration";
|
||||
Outfitter_cHealthRegenStatName = "Health Regeneration";
|
||||
|
||||
Outfitter_cSpellCritStatName = "Spell Critical Strike";
|
||||
Outfitter_cSpellHitStatName = "Spell Chance to Hit";
|
||||
Outfitter_cSpellDmgStatName = "Spell Damage";
|
||||
Outfitter_cFrostDmgStatName = "Frost Spell Damage";
|
||||
Outfitter_cFireDmgStatName = "Fire Spell Damage";
|
||||
Outfitter_cArcaneDmgStatName = "Arcane Spell Damage";
|
||||
Outfitter_cShadowDmgStatName = "Shadow Spell Damage";
|
||||
Outfitter_cNatureDmgStatName = "Nature Spell Damage";
|
||||
Outfitter_cHealingStatName = "Healing";
|
||||
|
||||
Outfitter_cMeleeCritStatName = "Melee Critical Strike";
|
||||
Outfitter_cMeleeHitStatName = "Melee Chance to Hit";
|
||||
Outfitter_cMeleeDmgStatName = "Melee Damage";
|
||||
Outfitter_cAttackStatName = "Attack Power";
|
||||
Outfitter_cDodgeStatName = "Dodge";
|
||||
|
||||
Outfitter_cArcaneResistStatName = "Arcane Resistance";
|
||||
Outfitter_cFireResistStatName = "Fire Resistance";
|
||||
Outfitter_cFrostResistStatName = "Frost Resistance";
|
||||
Outfitter_cNatureResistStatName = "Nature Resistance";
|
||||
Outfitter_cShadowResistStatName = "Shadow Resistance";
|
||||
|
||||
Outfitter_cFishingStatName = "Fishing";
|
||||
Outfitter_cHerbalismStatName = "Herbalism";
|
||||
Outfitter_cMiningStatName = "Mining";
|
||||
Outfitter_cSkinningStatName = "Skinning";
|
||||
|
||||
Outfitter_cOptionsTitle = "Outfitter Options";
|
||||
Outfitter_cShowMinimapButton = "Show Minimap Button";
|
||||
Outfitter_cShowMinimapButtonOnDescription = "Turn this off if you don't want the Outfitter button on your minimap cluster";
|
||||
Outfitter_cShowMinimapButtonOffDescription = "Turn this on if you want the Outfitter button on your minimap cluster";
|
||||
Outfitter_cRememberVisibility = "Remember cloak and helm settings";
|
||||
Outfitter_cRememberVisibilityOnDescription = "Turn this off if you want to use a single show/hide setting for all cloaks and helms";
|
||||
Outfitter_cRememberVisibilityOffDescription = "Turn this on if you want Outfitter to remember your preference for showing or hiding each cloak and helm individually";
|
||||
Outfitter_cShowHotkeyMessages = "Show key binding outfit changes";
|
||||
Outfitter_cShowHotkeyMessagesOnDescription = "Turn this off if you don't want to see a message when you change outfits using a key binding";
|
||||
Outfitter_cShowHotkeyMessagesOffDescription = "Turn this on if you want to see a message when you change outfits using a key binding";
|
||||
Outfitter_cShowCurrentOutfit = "Display current outfit in small window";
|
||||
Outfitter_cHideDisabledOutfits = "Hide disabled outfits from list";
|
||||
|
||||
Outfitter_cEquipOutfitMessageFormat = "Outfitter: %s equipped";
|
||||
Outfitter_cUnequipOutfitMessageFormat = "Outfitter: %s unequipped";
|
||||
|
||||
Outfitter_cAboutTitle = "About Outfitter";
|
||||
Outfitter_cAuthor = "Designed and written by John Stephen\nUpdated for WoW 1.18.1 Clients by |cff5BCEFAL|cffF5A9B8e|cffFFFFFFx|cffF5A9B8i|cff5BCEFAe|r";
|
||||
Outfitter_cTestersTitle = "Beta Testers";
|
||||
Outfitter_cTestersNames = "Airmid, Desiree, Fizzlebang, Harper, Kallah and Sumitra";
|
||||
Outfitter_cSpecialThanksTitle = "Special thanks for their support to";
|
||||
Outfitter_cSpecialThanksNames = "Brian, Dave, Glenn, Leah, Mark, The Mighty Pol, SFC and Forge";
|
||||
Outfitter_cGuildURL = "";
|
||||
Outfitter_cGuildURL2 = "";
|
||||
|
||||
Outfitter_cOpenOutfitter = "Open Outfitter";
|
||||
|
||||
Outfitter_cArgentDawnOutfitDescription = "This outfit will automatically be worn whenever you're in the Plaguelands";
|
||||
Outfitter_cRidingOutfitDescription = "This outfit will automatically be worn whenever you're mounted";
|
||||
Outfitter_cDiningOutfitDescription = "This outfit will automatically be worn whenever you're eating or drinking";
|
||||
Outfitter_cBattlegroundOutfitDescription = "This outfit will automatically be worn whenever you're in a battleground";
|
||||
Outfitter_cArathiBasinOutfitDescription = "This outfit will automatically be worn whenever you're in the Arathi Basin battleground";
|
||||
Outfitter_cAlteracValleyOutfitDescription = "This outfit will automatically be worn whenever you're in the Alterac Valley battleground";
|
||||
Outfitter_cWarsongGulchOutfitDescription = "This outfit will automatically be worn whenever you're in the Warsong Gulch battleground";
|
||||
Outfitter_cBloodRingOutfitDescription = "This outfit will automatically be worn whenever you're in the Blood Ring battleground";
|
||||
Outfitter_cSunnygladeValleyOutfitDescription = "This outfit will automatically be worn whenever you're in the Sunnyglade Valley battleground";
|
||||
Outfitter_cCityOutfitDescription = "This outfit will automatically be worn whenever you're in a friendly major city";
|
||||
Outfitter_cBossOutfitDescription = "This outfit will automatically be worn whenever you target level 63+ Boss mobs";
|
||||
Outfitter_cLvl63OutfitDescription = "This outfit will automatically be worn whenever you target level 63+ mobs";
|
||||
Outfitter_cTrashOutfitDescription = "This outfit will automatically be worn whenever you target level <63 mobs";
|
||||
Outfitter_cCritterOutfitDescription = "This outfit will automatically be worn whenever you target a critter";
|
||||
Outfitter_cBeastTrashOutfitDescription = "This outfit will automatically be worn whenever you target beasts level <63 mobs";
|
||||
Outfitter_cUndeadTrashOutfitDescription = "This outfit will automatically be worn whenever you target undead level <63 mobs";
|
||||
Outfitter_cDemonTrashOutfitDescription = "This outfit will automatically be worn whenever you target demons level <63 mobs";
|
||||
Outfitter_cSwimmingOutfitDescription = "This outfit will automatically be worn whenever you're swimming (underwater only unless SuperWoW or ClassicAPI is installed)";
|
||||
|
||||
Outfitter_cKeyBinding = "Key Binding";
|
||||
|
||||
BINDING_HEADER_OUTFITTER_TITLE = Outfitter_cTitle;
|
||||
|
||||
BINDING_NAME_OUTFITTER_OUTFIT1 = "Outfit 1";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT2 = "Outfit 2";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT3 = "Outfit 3";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT4 = "Outfit 4";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT5 = "Outfit 5";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT6 = "Outfit 6";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT7 = "Outfit 7";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT8 = "Outfit 8";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT9 = "Outfit 9";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT10 = "Outfit 10";
|
||||
|
||||
Outfitter_cDisableOutfit = "Disable Outfit";
|
||||
Outfitter_cDisableOutfitInBG = "Disable Outfit When in Battlegrounds";
|
||||
Outfitter_cDisableOutfitInInstance = "Disable Outfit When in Instances";
|
||||
Outfitter_cDisabledOutfitName = "%s (Disabled)";
|
||||
|
||||
Outfitter_cMinimapButtonTitle = "Outfitter Minimap Button";
|
||||
Outfitter_cMinimapButtonDescription = "Click to select a different outfit or drag to re-position this button.";
|
||||
|
||||
Outfitter_cDruidClassName = "Druid";
|
||||
Outfitter_cHunterClassName = "Hunter";
|
||||
Outfitter_cMageClassName = "Mage";
|
||||
Outfitter_cPaladinClassName = "Paladin";
|
||||
Outfitter_cPriestClassName = "Priest";
|
||||
Outfitter_cRogueClassName = "Rogue";
|
||||
Outfitter_cShamanClassName = "Shaman";
|
||||
Outfitter_cWarlockClassName = "Warlock";
|
||||
Outfitter_cWarriorClassName = "Warrior";
|
||||
|
||||
Outfitter_cBattleStance = "Battle Stance";
|
||||
Outfitter_cDefensiveStance = "Defensive Stance";
|
||||
Outfitter_cBerserkerStance = "Berserker Stance";
|
||||
|
||||
Outfitter_cWarriorBattleStance = "Warrior: Battle Stance";
|
||||
Outfitter_cWarriorDefensiveStance = "Warrior: Defensive Stance";
|
||||
Outfitter_cWarriorBerserkerStance = "Warrior: Berserker Stance";
|
||||
|
||||
Outfitter_cBearForm = "Bear Form";
|
||||
Outfitter_cCatForm = "Cat Form";
|
||||
Outfitter_cAquaticForm = "Aquatic Form";
|
||||
Outfitter_cTravelForm = "Travel Form";
|
||||
Outfitter_cDireBearForm = "Dire Bear Form";
|
||||
Outfitter_cMoonkinForm = "Moonkin Form";
|
||||
|
||||
Outfitter_cGhostWolfForm = "Ghost Wolf";
|
||||
|
||||
Outfitter_cStealth = "Stealth";
|
||||
|
||||
Outfitter_cDruidBearForm = "Druid: Bear Form";
|
||||
Outfitter_cDruidCatForm = "Druid: Cat Form";
|
||||
Outfitter_cDruidAquaticForm = "Druid: Aquatic Form";
|
||||
Outfitter_cDruidTravelForm = "Druid: Travel Form";
|
||||
Outfitter_cDruidMoonkinForm = "Druid: Moonkin Form";
|
||||
|
||||
Outfitter_cPriestShadowform = "Priest: Shadowform";
|
||||
|
||||
Outfitter_cRogueStealth = "Rogue: Stealth";
|
||||
|
||||
Outfitter_cShamanGhostWolf = "Shaman: Ghost Wolf";
|
||||
|
||||
Outfitter_cHunterMonkey = "Hunter: Monkey";
|
||||
Outfitter_cHunterHawk = "Hunter: Hawk";
|
||||
Outfitter_cHunterCheetah = "Hunter: Cheetah";
|
||||
Outfitter_cHunterPack = "Hunter: Pack";
|
||||
Outfitter_cHunterBeast = "Hunter: Beast";
|
||||
Outfitter_cHunterWild = "Hunter: Wild";
|
||||
|
||||
Outfitter_cMageEvocate = "Mage: Evocate";
|
||||
|
||||
Outfitter_cAspectOfTheCheetah = "Aspect of the Cheetah";
|
||||
Outfitter_cAspectOfThePack = "Aspect of the Pack";
|
||||
Outfitter_cAspectOfTheBeast = "Aspect of the Beast";
|
||||
Outfitter_cAspectOfTheWild = "Aspect of the Wild";
|
||||
Outfitter_cEvocate = "Evocation";
|
||||
|
||||
Outfitter_cCritter = "Critter";
|
||||
Outfitter_cCreatureBeast = "Beast";
|
||||
Outfitter_cCreatureUndead = "Undead";
|
||||
Outfitter_cCreatureDemon = "Demon";
|
||||
|
||||
Outfitter_cCompleteCategoryDescripton = "Complete outfits have items specified for every slot and will replace all other outfits when worn.";
|
||||
Outfitter_cPartialCategoryDescription = "Mix-n-match outfits have only some slots specified, but not all. When equipped, they are added on top of your selcted Complete outfit, replacing any other Mix-n-match or Accessory outfits selected.";
|
||||
Outfitter_cAccessoryCategoryDescription = "Accessory outfits have only some slots specified, but not all. Unlike mix-n-match, you can select as many Accessory outfits as you like and they will all be combined together and worn on top of your selected Complete and Mix-n-match outfits.";
|
||||
Outfitter_cSpecialCategoryDescription = "Special Occassion outfits are automatically worn whenever the occassion warrants it. They are worn over all other selected outfits.";
|
||||
Outfitter_cOddsNEndsCategoryDescription = "Odds 'n ends is a list of items which you haven't used in any of your outfits. This may be useful in ensuring that you're using all of your items or that you're not carrying around excess baggage.";
|
||||
|
||||
Outfitter_cRebuildOutfitFormat = "Rebuild for %s";
|
||||
|
||||
Outfitter_cTranslationCredit = " ";
|
||||
|
||||
Outfitter_cSlotEnableTitle = "Slot Enable";
|
||||
Outfitter_cSlotEnableDescription = "Select this if you want the item in this slot to be equipped when changing to the selected outfit. If not selected then this slot will not be modified when changing to the selected outfit.";
|
||||
|
||||
Outfitter_cFinger0SlotName = "First Finger";
|
||||
Outfitter_cFinger1SlotName = "Second Finger";
|
||||
|
||||
Outfitter_cTrinket0SlotName = "First Trinket";
|
||||
Outfitter_cTrinket1SlotName = "Second Trinket";
|
||||
|
||||
Outfitter_cOutfitCategoryTitle = "Category";
|
||||
Outfitter_cBankCategoryTitle = "Bank";
|
||||
Outfitter_cDepositToBank = "Deposit all items to bank";
|
||||
Outfitter_cDepositUniqueToBank = "Deposit unique items to bank";
|
||||
Outfitter_cWithdrawFromBank = "Withdraw items from bank";
|
||||
|
||||
Outfitter_cMissingItemsLabel = "Missing items: ";
|
||||
Outfitter_cBankedItemsLabel = "Banked items: ";
|
||||
|
||||
Outfitter_cRepairAllBags = "Outfitter: Repair All Bagged Items";
|
||||
|
||||
Outfitter_cStatsCategory = "Stats";
|
||||
Outfitter_cMeleeCategory = "Melee";
|
||||
Outfitter_cSpellsCategory = "Healing and Spells";
|
||||
Outfitter_cRegenCategory = "Regeneration";
|
||||
Outfitter_cResistCategory = "Resistances";
|
||||
Outfitter_cTradeCategory = "Trade Skills";
|
||||
|
||||
Outfitter_cTankPoints = "TankPoints";
|
||||
Outfitter_cCustom = "Custom";
|
||||
|
||||
Outfitter_cRequiresHerbalism = "Requires Herbalism";
|
||||
Outfitter_cRequiresSkinning = "Requires Skinning";
|
||||
Outfitter_cRequiresMining = "Requires Mining";
|
||||
Outfitter_cAutoEquip = "Auto equip";
|
||||
Outfitter_cAutoUnEquip = "Auto unequip";
|
||||
@@ -0,0 +1,339 @@
|
||||
if GetLocale() == "deDE" then
|
||||
Outfitter_cTitle = "Outfitter";
|
||||
Outfitter_cTitleVersion = Outfitter_cTitle .. " " .. Outfitter_cVersion;
|
||||
|
||||
Outfitter_cNameLabel = "Name:";
|
||||
Outfitter_cCreateUsingTitle = "Optimieren f\195\188r:";
|
||||
Outfitter_cUseCurrentOutfit = "Benutze derzeitiges Outfit";
|
||||
Outfitter_cUseEmptyOutfit = "Erstelle neues Outfit";
|
||||
|
||||
Outfitter_cOutfitterTabTitle = "Outfitter";
|
||||
Outfitter_cOptionsTabTitle = "Einstellungen";
|
||||
Outfitter_cAboutTabTitle = "\195\188ber";
|
||||
|
||||
Outfitter_cNewOutfit = "Neues Outfit";
|
||||
Outfitter_cRenameOutfit = "Outfit umbenennen";
|
||||
|
||||
Outfitter_cCompleteOutfits = "Vollst\195\164ndige Ausr\195\188stungen";
|
||||
Outfitter_cPartialOutfits = "Mix-n-match";
|
||||
Outfitter_cAccessoryOutfits = "Zusatzgegenst\195\164nde";
|
||||
Outfitter_cSpecialOutfits = "Besondere Gelegenheiten";
|
||||
|
||||
Outfitter_cNormalOutfit = "Normal";
|
||||
Outfitter_cNakedOutfit = "Ausgehroben";
|
||||
|
||||
Outfitter_cFishingOutfit = "Angeln";
|
||||
Outfitter_cHerbalismOutfit = "Kr\195\164uterkunde";
|
||||
Outfitter_cMiningOutfit = "Bergbau";
|
||||
Outfitter_cSkinningOutfit = "K\195\188rschnerei";
|
||||
Outfitter_cFireResistOutfit = "Feuerwiderstand";
|
||||
Outfitter_cNatureResistOutfit = "Naturwiderstand";
|
||||
Outfitter_cShadowResistOutfit = "Schattenwiderstand";
|
||||
Outfitter_cArcaneResistOutfit = "Arkanwiderstand";
|
||||
Outfitter_cFrostResistOutfit = "Frostwiderstand";
|
||||
|
||||
Outfitter_cArgentDawnOutfit = "Argentumd\195\164mmerung";
|
||||
Outfitter_cRidingOutfit = "Reiten";
|
||||
Outfitter_cDiningOutfit = "Ausruhen";
|
||||
Outfitter_cBattlegroundOutfit = "Schlachtfeld";
|
||||
Outfitter_cBossOutfit = "Boss Mobs";
|
||||
Outfitter_cLvl63Outfit = "Lvl63+";
|
||||
Outfitter_cTrashOutfit = "Trash Mobs";
|
||||
Outfitter_cBeastTrashOutfit = "Beast Trash Mobs";
|
||||
Outfitter_cUndeadTrashOutfit = "Undead Trash Mobs";
|
||||
Outfitter_cDemonTrashOutfit = "Demon Trash Mobs";
|
||||
|
||||
Outfitter_cABOutfit = "Schlachtfeld: Arathibecken";
|
||||
Outfitter_cAVOutfit = "Schlachtfeld: Alteractal";
|
||||
Outfitter_cWSGOutfit = "Schlachtfeld: Warsongschlucht";
|
||||
Outfitter_cCityOutfit = "Stadt";
|
||||
|
||||
Outfitter_cMountSpeedFormat = "Erh\195\182ht Tempo um (%d+)%%."; -- For detecting when mounted
|
||||
|
||||
Outfitter_cBagsFullError = "Outfitter: %s kann nicht enfernt werden da alle Taschen voll sind.";
|
||||
Outfitter_cItemNotFoundError = "Outfitter: Kann %s nicht finden.";
|
||||
Outfitter_cAddingItem = "Outfitter: F\195\188ge %s zum %s Outfit.";
|
||||
Outfitter_cNameAlreadyUsedError = "Fehler: Dieser Name ist bereits vergeben.";
|
||||
Outfitter_cNoItemsWithStatError = "Warnung: Keines deiner Gegenst\195\164nde hat dieses Attribut.";
|
||||
|
||||
Outfitter_cEnableAll = "Alle aktivieren";
|
||||
Outfitter_cEnableNone = "Alle deaktivieren";
|
||||
|
||||
Outfitter_cConfirmDeleteMsg = "Bist du sicher dass du das %s Outfit l\195\182schen willst?";
|
||||
Outfitter_cConfirmRebuildMsg = "Bist du sicher dass du das %s Outfit ver\195\164ndern willst?";
|
||||
Outfitter_cRebuild = "Ver\195\164ndern";
|
||||
|
||||
Outfitter_cWesternPlaguelands = "Westliche Pestl\195\164nder";
|
||||
Outfitter_cEasternPlaguelands = "\195\150stliche Pestl\195\164nder";
|
||||
Outfitter_cStratholme = "Stratholme";
|
||||
Outfitter_cScholomance = "Scholomance";
|
||||
Outfitter_cNaxxramas = "Naxxramas";
|
||||
Outfitter_cAlteracValley = "Alteractal";
|
||||
Outfitter_cArathiBasin = "Arathibecken";
|
||||
Outfitter_cWarsongGulch = "Warsongschlucht";
|
||||
Outfitter_cIronforge = "Ironforge";
|
||||
Outfitter_cDarnassus = "Darnassus";
|
||||
Outfitter_cStormwind = "Stormwind";
|
||||
Outfitter_cOrgrimmar = "Orgrimmar";
|
||||
Outfitter_cThunderBluff = "Thunder Bluff";
|
||||
Outfitter_cUndercity = "Undercity";
|
||||
|
||||
Outfitter_cFishingPole = "Angel";
|
||||
Outfitter_cStrongFishingPole = "Starke Angel";
|
||||
Outfitter_cBigIronFishingPole = "Gro\195\159e Eisenangel";
|
||||
Outfitter_cBlumpFishingPole = "Angel der Familie Blump";
|
||||
Outfitter_cNatPaglesFishingPole = "Nat Pagles Extremangler FC-5000";
|
||||
Outfitter_cArcaniteFishingPole = "Arkanitangel";
|
||||
|
||||
Outfitter_cArgentDawnCommission = "Anstecknadel der Argentumd\195\164mmerung";
|
||||
Outfitter_cSealOfTheDawn = "Siegel der D\195\164mmerung";
|
||||
Outfitter_cRuneOfTheDawn = "Rune der D\195\164mmerung";
|
||||
|
||||
Outfitter_cCarrotOnAStick = "Karotte am Stiel";
|
||||
|
||||
Outfitter_cItemStatFormats = {
|
||||
{ Format = "Ausdauer %+(%d+)", Types = { "Stamina" } },
|
||||
{ Format = "Intelligenz %+(%d+)", Types = { "Intellect" } },
|
||||
{ Format = "Beweglichkeit %+(%d+)", Types = { "Agility" } },
|
||||
{ Format = "St\195\164rke %+(%d+)", Types = { "Strength" } },
|
||||
{ Format = "Willenskraft %+(%d+)", Types = { "Spirit" } },
|
||||
{ Format = "R\195\188stung %+(%d+)", Types = { "Armor" } },
|
||||
{ Format = "Verteidigung %+(%d+)", Types = { "Defense" } },
|
||||
{ Format = "Anlegen: Verteidigung %+(%d+)", Types = { "Defense" } },
|
||||
|
||||
{ Format = "%+(%d+) Ausdauer", Types = { "Stamina" } },
|
||||
{ Format = "%+(%d+) Intelligenz", Types = { "Intellect" } },
|
||||
{ Format = "%+(%d+) Beweglichkeit", Types = { "Agility" } },
|
||||
{ Format = "%+(%d+) St\195\164rke", Types = { "Strength" } },
|
||||
{ Format = "%+(%d+) Willenskraft", Types = { "Spirit" } },
|
||||
{ Format = "(%d+) R\195\188stung", Types = { "Armor" } },
|
||||
{ Format = "%+(%d+) Angriffskraft", Types = { "Attack" } },
|
||||
|
||||
{ Format = "Mana %+(%d+)", Types = { "Mana" } },
|
||||
{ Format = "Gesundheit %+(%d+)", Types = { "Health" } },
|
||||
|
||||
{ Format = "%+(%d+) Mana alle 5 Sek.", Types = { "ManaRegen" } },
|
||||
{ Format = "Stellt alle 5 Sek. (%d+) Punkt(e) Mana wieder her.", Types = { "ManaRegen" } },
|
||||
|
||||
{ Format = "%+(%d+) Gesundheit alle 5 Sek.", Types = { "HealthRegen" } },
|
||||
{ Format = "Stellt alle 5 Sek. (%d+) Punkt(e) Gesundheit wieder her.", Types = { "HealthRegen" } },
|
||||
|
||||
{ Format = "Schwache Reittemposteigerung", Value = 3, Types = { "Riding" } },
|
||||
{ Format = "Mithrilsporen", Value = 3, Types = { "Riding" } },
|
||||
|
||||
{ Format = "%+(%d+) Feuerwiderstand", Types = { "FireResist" } },
|
||||
{ Format = "%+(%d+) Naturwiderstand", Types = { "NatureResist" } },
|
||||
{ Format = "%+(%d+) Frostwiderstand", Types = { "FrostResist" } },
|
||||
{ Format = "%+(%d+) Schattenwiderstand", Types = { "ShadowResist" } },
|
||||
{ Format = "%+(%d+) Arkanwiderstand", Types = { "ArcaneResist" } },
|
||||
{ Format = "%+(%d+) Alle Widerst\195\164nde", Types = { "FireResist", "NatureResist", "FrostResist", "ShadowResist", "ArcaneResist" } },
|
||||
|
||||
{ Format = "Waffenschaden %+(%d+)", Types = { "MeleeDmg" } },
|
||||
{ Format = "Erh\195\182ht Eure Trefferchance um (%d+)%%", Types = { "MeleeHit" } },
|
||||
{ Format = "Erh\195\182ht Eure Chance, einen kritischen Schlag zu erzielen, um (%d+)%%", Types = { "MeleeCrit" } },
|
||||
{ Format = "Erh\195\182ht Eure Chance, einem Angriff auszuweichen, um (%d+)%%", Types = { "Dodge" } },
|
||||
{ Format = "Schaden %+(%d+)", Types = { "MeleeDmg" } },
|
||||
{ Format = "(%d+) Blocken", Types = { "BlockAmount" } },
|
||||
|
||||
{ Format = "Erh\195\182ht Angeln um %+(%d+)%.", Types = { "Fishing" } },
|
||||
{ Format = "Angeln %+(%d+)", Types = { "Fishing" } },
|
||||
{ Format = "Kr\195\164uterkunde %+(%d+)", Types = { "Herbalism" } },
|
||||
{ Format = "Bergbau %+(%d+)", Types = { "Mining" } },
|
||||
{ Format = "K\195\188rschnerei %+(%d+)", Types = { "Skinning" } },
|
||||
|
||||
{ Format = "Erh\195\182ht Eure Chance, einen kritischen Treffer durch Zauber zu erzielen, um (%d+)%%", Types = { "SpellCrit" } },
|
||||
{ Format = "Improves your chance to hit with spells by (%d+)%%", Types = { "SpellHit" } },
|
||||
{ Format = "Erh\195\182ht durch Zauber und magische Effekte zugef\195\188gten Schaden und Heilung um bis zu (%d+)", Types = { "SpellDmg", "ShadowDmg", "FireDmg", "FrostDmg", "ArcaneDmg", "NatureDmg", "Healing" } },
|
||||
{ Format = "Erh\195\182ht durch Zauber und Effekte verursachte Heilung um bis zu (%d+)", Types = { "Healing" } },
|
||||
{ Format = "Heilzauber %+(%d+)", Types = { "Healing" } },
|
||||
{ Format = "%+(%d+) Heilzauber", Types = { "Healing" } },
|
||||
|
||||
{ Format = "%+(%d+) Feuerzauberschaden", Types = { "FireDmg" } },
|
||||
{ Format = "%+(%d+) Schattenzauberschaden", Types = { "ShadowDmg" } },
|
||||
{ Format = "%+(%d+) Frostzauberschaden", Types = { "FrostDmg" } },
|
||||
{ Format = "%+(%d+) Arkanzauberschaden", Types = { "ArcaneDmg" } },
|
||||
{ Format = "%+(%d+) Naturzauberschaden", Types = { "NatureDmg" } },
|
||||
|
||||
{ Format = "Increases damage done by Fire spells and effects by up to (%d+)", Types = { "FireDmg" } },
|
||||
{ Format = "Increases damage done by Shadow spells and effects by up to (%d+)", Types = { "ShadowDmg" } },
|
||||
{ Format = "Increases damage done by Frost spells and effects by up to (%d+)", Types = { "FrostDmg" } },
|
||||
{ Format = "Increases damage done by Arcane spells and effects by up to (%d+)", Types = { "ArcaneDmg" } },
|
||||
{ Format = "Increases damage done by Nature spells and effects by up to (%d+)", Types = { "NatureDmg" } },
|
||||
};
|
||||
|
||||
Outfitter_cAgilityStatName = "Beweglichkeit";
|
||||
Outfitter_cArmorStatName = "R\195\188stung";
|
||||
Outfitter_cDefenseStatName = "Verteidigung";
|
||||
Outfitter_cIntellectStatName = "Intelligenz";
|
||||
Outfitter_cSpiritStatName = "Willenskraft";
|
||||
Outfitter_cStaminaStatName = "Ausdauer";
|
||||
Outfitter_cStrengthStatName = "St\195\164rke";
|
||||
|
||||
Outfitter_cManaRegenStatName = "Manaregeneration";
|
||||
Outfitter_cHealthRegenStatName = "Gesundheitsregeneration";
|
||||
|
||||
Outfitter_cSpellCritStatName = "Zauberkritisch";
|
||||
Outfitter_cSpellHitStatName = "Spell Chance to Hit";
|
||||
Outfitter_cSpellDmgStatName = "Zauberschaden";
|
||||
Outfitter_cFrostDmgStatName = "Frostzauberschaden";
|
||||
Outfitter_cFireDmgStatName = "Feuerzauberschaden";
|
||||
Outfitter_cArcaneDmgStatName = "Arkanzauberschaden";
|
||||
Outfitter_cShadowDmgStatName = "Schattenzauberschaden";
|
||||
Outfitter_cNatureDmgStatName = "Naturzauberschaden";
|
||||
Outfitter_cHealingStatName = "Heilung";
|
||||
|
||||
Outfitter_cMeleeCritStatName = "Kampfkritisch";
|
||||
Outfitter_cMeleeHitStatName = "Kampftrefferchance";
|
||||
Outfitter_cMeleeDmgStatName = "Kampfschaden";
|
||||
Outfitter_cAttackStatName = "Angriffskraft";
|
||||
Outfitter_cDodgeStatName = "Ausweichen";
|
||||
|
||||
Outfitter_cArcaneResistStatName = "Arkanwiderstand";
|
||||
Outfitter_cFireResistStatName = "Feuerwiderstand";
|
||||
Outfitter_cFrostResistStatName = "Frostwiderstand";
|
||||
Outfitter_cNatureResistStatName = "Naturwiderstand";
|
||||
Outfitter_cShadowResistStatName = "Schattenwiderstand";
|
||||
|
||||
Outfitter_cFishingStatName = "Angeln";
|
||||
Outfitter_cHerbalismStatName = "Kr\195\164uterkunde";
|
||||
Outfitter_cMiningStatName = "Bergbau";
|
||||
Outfitter_cSkinningStatName = "K\195\188rschnerei";
|
||||
|
||||
Outfitter_cOptionsTitle = "Outfitter Einstellungen";
|
||||
Outfitter_cShowMinimapButton = "Zeige Minimapbutton";
|
||||
Outfitter_cShowMinimapButtonOnDescription = "Deaktivieren, um den Minimapbutton von Outfitter zu verstecken.";
|
||||
Outfitter_cShowMinimapButtonOffDescription = "Aktivieren, um den Minimapbutton von Outfitter zu zeigen.";
|
||||
Outfitter_cRememberVisibility = "Remember cloak and helm settings";
|
||||
Outfitter_cRememberVisibilityOnDescription = "Turn this off if you want to use a single show/hide setting for all cloaks and helms";
|
||||
Outfitter_cRememberVisibilityOffDescription = "Turn this on if you want Outfitter to remember your preference for showing or hiding each cloak and helm individually";
|
||||
|
||||
Outfitter_cAboutTitle = "\195\188ber Outfitter";
|
||||
Outfitter_cAuthor = "Gestaltet und geschrieben von John Stephen";
|
||||
Outfitter_cTestersTitle = "Beta Tester";
|
||||
Outfitter_cTestersNames = "Airmid, Desiree, Fizzlebang, Harper, Kallah und Sumitra";
|
||||
Outfitter_cSpecialThanksTitle = "Besonderen Dank f\195\188r ihre Unterst\195\188tzung geht an";
|
||||
Outfitter_cSpecialThanksNames = "Brian, Dave, Glenn, Leah, Mark, The Mighty Pol, SFC und Forge";
|
||||
Outfitter_cGuildURL = "http://www.starfleetclan.com";
|
||||
Outfitter_cGuildURL2 = "http://www.forgeguild.com";
|
||||
|
||||
Outfitter_cOpenOutfitter = "Outfitter \195\182ffnen";
|
||||
|
||||
Outfitter_cArgentDawnOutfitDescription = "Dieses Outfit wird automatisch beim Betreten der Pestl\195\164nder angelegt.";
|
||||
Outfitter_cRidingOutfitDescription = "Dieses Outfit wird automatisch beim Reiten angelegt.";
|
||||
Outfitter_cDiningOutfitDescription = "Dieses Outfit wird automatisch beim Essen und/oder Trinken angelegt.";
|
||||
Outfitter_cBattlegroundOutfitDescription = "Dieses Outfit wird automatisch beim Betreten eines Schlachtfeldes angelegt.";
|
||||
Outfitter_cArathiBasinOutfitDescription = "This outfit will automatically be worn whenever you're in the Arathi Basin battleground";
|
||||
Outfitter_cAlteracValleyOutfitDescription = "This outfit will automatically be worn whenever you're in the Alterac Valley battleground";
|
||||
Outfitter_cWarsongGulchOutfitDescription = "This outfit will automatically be worn whenever you're in the Warsong Gulch battleground";
|
||||
Outfitter_cCityOutfitDescription = "This outfit will automatically be worn whenever you're in a friendly major city";
|
||||
Outfitter_cBossOutfitDescription = "This outfit will automatically be worn whenever you target level 63+ Boss mobs";
|
||||
Outfitter_cLvl63OutfitDescription = "This outfit will automatically be worn whenever you target level 63+ mobs";
|
||||
Outfitter_cTrashOutfitDescription = "This outfit will automatically be worn whenever you target level <63 mobs";
|
||||
Outfitter_cBeastTrashOutfitDescription = "This outfit will automatically be worn whenever you target beasts level <63 mobs";
|
||||
Outfitter_cUndeadTrashOutfitDescription = "This outfit will automatically be worn whenever you target undead level <63 mobs";
|
||||
Outfitter_cDemonTrashOutfitDescription = "This outfit will automatically be worn whenever you target demons level <63 mobs";
|
||||
|
||||
Outfitter_cKeyBinding = "Tastaturbelegung";
|
||||
|
||||
BINDING_HEADER_OUTFITTER_TITLE = Outfitter_cTitle;
|
||||
|
||||
BINDING_NAME_OUTFITTER_OUTFIT1 = "Outfit 1";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT2 = "Outfit 2";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT3 = "Outfit 3";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT4 = "Outfit 4";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT5 = "Outfit 5";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT6 = "Outfit 6";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT7 = "Outfit 7";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT8 = "Outfit 8";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT9 = "Outfit 9";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT10 = "Outfit 10";
|
||||
|
||||
Outfitter_cDisableOutfit = "Outfit abschalten";
|
||||
Outfitter_cDisableOutfitInBG = "Outfit beim Betreten eines Schlachtfeldes abschalten.";
|
||||
Outfitter_cDisabledOutfitName = "%s (Abgeschalten)";
|
||||
|
||||
Outfitter_cMinimapButtonTitle = "Outfitter Minimapbutton";
|
||||
Outfitter_cMinimapButtonDescription = "Klicken f\195\188r eine Auswahl an Outfits oder gedr\195\188ckthalten zum bewegen des Buttons.";
|
||||
|
||||
Outfitter_cDruidClassName = "Druide";
|
||||
Outfitter_cHunterClassName = "J\195\164ger";
|
||||
Outfitter_cMageClassName = "Magier";
|
||||
Outfitter_cPaladinClassName = "Paladin";
|
||||
Outfitter_cPriestClassName = "Priester";
|
||||
Outfitter_cRogueClassName = "Schurke";
|
||||
Outfitter_cShamanClassName = "Schamane";
|
||||
Outfitter_cWarlockClassName = "Hexenmeister";
|
||||
Outfitter_cWarriorClassName = "Krieger";
|
||||
|
||||
Outfitter_cBattleStance = "Kampfhaltung";
|
||||
Outfitter_cDefensiveStance = "Verteidigungshaltung";
|
||||
Outfitter_cBerserkerStance = "Berserkerhaltung";
|
||||
|
||||
Outfitter_cWarriorBattleStance = "Krieger: Kampfhaltung";
|
||||
Outfitter_cWarriorDefensiveStance = "Krieger: Verteidigungshaltung";
|
||||
Outfitter_cWarriorBerserkerStance = "Krieger: Berserkerhaltung";
|
||||
|
||||
Outfitter_cBearForm = "B\195\164rengestalt";
|
||||
Outfitter_cCatForm = "Katzengestalt";
|
||||
Outfitter_cAquaticForm = "Wassergestalt";
|
||||
Outfitter_cTravelForm = "Reisegestalt";
|
||||
Outfitter_cDireBearForm = "Terrorb\195\164rengestalt";
|
||||
Outfitter_cMoonkinForm = "Moonkin Form";
|
||||
|
||||
Outfitter_cGhostWolfForm = "Geisterwolf";
|
||||
|
||||
Outfitter_cStealth = "Verstohlenheit";
|
||||
|
||||
Outfitter_cDruidBearForm = "Druide: B\195\164rengestalt";
|
||||
Outfitter_cDruidCatForm = "Druide: Katzengestalt";
|
||||
Outfitter_cDruidAquaticForm = "Druide: Wassergestalt";
|
||||
Outfitter_cDruidTravelForm = "Druide: Reisegestalt";
|
||||
Outfitter_cDruidMoonkinForm = "Druide: Moonkin Form";
|
||||
|
||||
Outfitter_cPriestShadowform = "Priester: Schattengestalt";
|
||||
|
||||
Outfitter_cRogueStealth = "Schurke: Verstohlenheit";
|
||||
|
||||
Outfitter_cShamanGhostWolf = "Schamane: Geisterwolf";
|
||||
|
||||
Outfitter_cCompleteCategoryDescripton = "Vollst\195\164ndige Outfits haben f\195\188r jeden Inventarslot festgelegte Gegenst\195\164nde, die alles andere ersetzen wenn sie getragen werden.";
|
||||
Outfitter_cPartialCategoryDescription = "Bei Mix-n-match Outfits sind nur einige Gegenst\195\164nde festgelegt, jedoch nicht alle. Werden diese Outfits ausgew\195\164hlt bleibt das vorherige Outfit erhalten, nur die neuen Gegenst\195\164nde werden ge\195\164ndert.";
|
||||
Outfitter_cAccessoryCategoryDescription = "Zusatzgegenst\195\164nde-Outfits haben nur einige festgelegte Inventarslots. Anders als beim Mix-n-match kannst du so viele Zusatzgegenst\195\164nde-Outfits erstellen und tragen, sie werden alle miteinander verbunden und \195\188ber bestehenden Outfits getragen.";
|
||||
Outfitter_cSpecialCategoryDescription = "Besondere Gelegenheit-Outfits werden automatisch angelegt wenn die Situation es verlangt. Sie werden \195\188ber allen anderen Outfits getragen.";
|
||||
Outfitter_cOddsNEndsCategoryDescription = "Odds 'n ends ist eine Auflistung der Gegenst\195\164nde, die keinem Outfit zugewiesen sind. Mit dieser Funktion kannst du sicherstellen, dass alle Gegenst\195\164nde ihren Platz haben oder dass du keine unn\195\182tigen Gegenst\195\164nde mit dir herumtr\195\164gst.";
|
||||
|
||||
Outfitter_cRebuildOutfitFormat = "%s ge\195\164ndert.";
|
||||
|
||||
Outfitter_cTranslationCredit = "Deutsche \195\156bersetzung: Ani";
|
||||
|
||||
Outfitter_cSlotEnableTitle = "Slot aktivieren";
|
||||
Outfitter_cSlotEnableDescription = "Aktiviere diese Option, damit der Gegenstand in diesem Slot automatisch angelegt wird wenn du zu diesem Outfit wechselst. Ist dieser Slot nicht aktiviert, wird er beim Anlegen eines anderen Outfits nicht ver\195\164ndert.";
|
||||
|
||||
Outfitter_cFinger0SlotName = "Erster Finger";
|
||||
Outfitter_cFinger1SlotName = "Zweiter Finger";
|
||||
|
||||
Outfitter_cTrinket0SlotName = "Erstes Schmuckst\195\188ck";
|
||||
Outfitter_cTrinket1SlotName = "Zweites Schmuckst\195\188ck";
|
||||
|
||||
Outfitter_cOutfitCategoryTitle = "Kategorie";
|
||||
Outfitter_cBankCategoryTitle = "Bank";
|
||||
Outfitter_cDepositToBank = "Gegenst\195\164nde im Bankfach ablegen";
|
||||
Outfitter_cDepositUniqueToBank = "Deposit unique items to bank";
|
||||
Outfitter_cWithdrawFromBank = "Gegenst\195\164nde vom Bankfach aufnehmen";
|
||||
|
||||
Outfitter_cMissingItemsLabel = "Fehlende Gegenst\195\164nde: ";
|
||||
Outfitter_cBankedItemsLabel = "Gegenst\195\164nde auf der Bank: ";
|
||||
|
||||
Outfitter_cStatsCategory = "Stats";
|
||||
Outfitter_cMeleeCategory = "Melee";
|
||||
Outfitter_cSpellsCategory = "Healing and Spells";
|
||||
Outfitter_cRegenCategory = "Regeneration";
|
||||
Outfitter_cResistCategory = "Resistances";
|
||||
Outfitter_cTradeCategory = "Trade Skills";
|
||||
|
||||
Outfitter_cCritter = "Kleintier";
|
||||
Outfitter_cCreatureBeast = "Wildtier";
|
||||
Outfitter_cCreatureUndead = "Untoter";
|
||||
Outfitter_cCreatureDemon = "Dämon";
|
||||
Outfitter_cSwimmingOutfit = "Schwimmen";
|
||||
end
|
||||
@@ -0,0 +1,349 @@
|
||||
if GetLocale() == "frFR" then
|
||||
Outfitter_cTitle = "Outfitter";
|
||||
Outfitter_cTitleVersion = Outfitter_cTitle .. " " .. Outfitter_cVersion;
|
||||
|
||||
Outfitter_cNameLabel = "Nom:";
|
||||
Outfitter_cCreateUsingTitle = "Optimiser pour:";
|
||||
Outfitter_cUseCurrentOutfit = "Utiliser la tenue actuelle";
|
||||
Outfitter_cUseEmptyOutfit = "Cr\195\169er une tenue vide";
|
||||
|
||||
Outfitter_cOutfitterTabTitle = "Outfitter";
|
||||
Outfitter_cOptionsTabTitle = "Options";
|
||||
Outfitter_cAboutTabTitle = "A propos";
|
||||
|
||||
Outfitter_cNewOutfit = "Nouvelle tenue";
|
||||
Outfitter_cRenameOutfit = "Renommer la tenue";
|
||||
|
||||
Outfitter_cCompleteOutfits = "Tenues compl\195\168tes";
|
||||
Outfitter_cPartialOutfits = "Mix-n-match";
|
||||
Outfitter_cAccessoryOutfits = "Accessoires";
|
||||
Outfitter_cSpecialOutfits = "Occasions sp\195\169ciales";
|
||||
Outfitter_cOddsNEndsOutfits = "Odds \226\128\153n ends";
|
||||
|
||||
Outfitter_cNormalOutfit = "Normale";
|
||||
Outfitter_cNakedOutfit = "Nu(e)";
|
||||
|
||||
Outfitter_cFishingOutfit = "P\195\170che";
|
||||
Outfitter_cHerbalismOutfit = "Herborisme";
|
||||
Outfitter_cMiningOutfit = "Minage";
|
||||
Outfitter_cSkinningOutfit = "D\195\169pecage";
|
||||
Outfitter_cFireResistOutfit = "R\195\169sistance au feu";
|
||||
Outfitter_cNatureResistOutfit = "R\195\169sistance \195\160 la nature";
|
||||
Outfitter_cShadowResistOutfit = "R\195\169sistance \195\160 l\226\128\153ombre";
|
||||
Outfitter_cArcaneResistOutfit = "R\195\169sistance aux arcanes";
|
||||
Outfitter_cFrostResistOutfit = "R\195\169sistance au givre";
|
||||
|
||||
Outfitter_cArgentDawnOutfit = "L\226\128\153aube d\226\128\153argent";
|
||||
Outfitter_cRidingOutfit = "Monture";
|
||||
Outfitter_cDiningOutfit = "Diner";
|
||||
Outfitter_cBattlegroundOutfit = "Champs de Bataille";
|
||||
Outfitter_cABOutfit = "Battleground: Arathi Basin";
|
||||
Outfitter_cAVOutfit = "Battleground: Alterac Valley";
|
||||
Outfitter_cWSGOutfit = "Battleground: Warsong Gulch";
|
||||
Outfitter_cCityOutfit = "Around Town";
|
||||
Outfitter_cBossOutfit = "Boss Mobs";
|
||||
Outfitter_cLvl63Outfit = "Lvl63+";
|
||||
Outfitter_cTrashOutfit = "Trash Mobs";
|
||||
Outfitter_cBeastTrashOutfit = "Beast Trash Mobs";
|
||||
Outfitter_cUndeadTrashOutfit = "Undead Trash Mobs";
|
||||
Outfitter_cDemonTrashOutfit = "Demon Trash Mobs";
|
||||
|
||||
Outfitter_cMountSpeedFormat = "Augmente la vitesse de (%d+)%%."; -- For detecting when mounted
|
||||
|
||||
Outfitter_cBagsFullError = "Outfitter: Impossible d\226\128\153enlever %s, tous les sacs sont pleins";
|
||||
Outfitter_cDepositBagsFullError = "Outfitter: Impossible de d\195\169poser %s. Tous les sacs de la banque sont pleins.";
|
||||
Outfitter_cWithdrawBagsFullError = "Outfitter: Impossible de r\195\169cup\195\169rer %s. Tous vos sacs sont pleins.";
|
||||
Outfitter_cItemNotFoundError = "Outfitter: %s est introuvable";
|
||||
Outfitter_cItemAlreadyUsedError = "Outfitter: Impossible d\226\128\153 \195\169quiper %s \195\160 la place \226\128\153%s\226\128\153 car il est d\195\169j\195\160 utilis\195\169 \195\160 un autre endroit.";
|
||||
Outfitter_cAddingItem = "Outfitter: %s ajout\195\169 \195\160 la tenue : %s";
|
||||
Outfitter_cNameAlreadyUsedError = "Erreur: Nom existant";
|
||||
Outfitter_cNoItemsWithStatError = "Attention: Aucuns de vos objets n\226\128\153a cet attribut";
|
||||
|
||||
Outfitter_cEnableAll = "Tout activer";
|
||||
Outfitter_cEnableNone = "Tout d\195\169sactiver";
|
||||
|
||||
Outfitter_cConfirmDeleteMsg = "Etes vous s\195\187r de vouloir supprimer la tenue : %s?";
|
||||
Outfitter_cConfirmRebuildMsg = "Etes vous s\195\187r de vouloir reconstruire la tenue : %s?";
|
||||
Outfitter_cRebuild = "Reconstruire";
|
||||
|
||||
Outfitter_cWesternPlaguelands = "Maleterres de l\226\128\153ouest";
|
||||
Outfitter_cEasternPlaguelands = "Maleterres de l\226\128\153est";
|
||||
Outfitter_cStratholme = "Stratholme";
|
||||
Outfitter_cScholomance = "Scholomance";
|
||||
Outfitter_cNaxxramas = "Naxxramas";
|
||||
Outfitter_cAlteracValley = "Vall\195\169e d\226\128\153alterac";
|
||||
Outfitter_cArathiBasin = "Bassin d\226\128\153arathi";
|
||||
Outfitter_cWarsongGulch = "Goulet des warsong";
|
||||
Outfitter_cIronforge = "Ironforge";
|
||||
Outfitter_cDarnassus = "Darnassus";
|
||||
Outfitter_cStormwind = "Stormwind City";
|
||||
Outfitter_cOrgrimmar = "Orgrimmar";
|
||||
Outfitter_cThunderBluff = "Thunder Bluff";
|
||||
Outfitter_cUndercity = "Undercity";
|
||||
|
||||
Outfitter_cFishingPole = "Canne \195\160 p\195\170che";
|
||||
Outfitter_cStrongFishingPole = "Solide canne \195\160 p\195\170che";
|
||||
Outfitter_cBigIronFishingPole = "Grande canne \195\160 p\195\170che en fer";
|
||||
Outfitter_cBlumpFishingPole = "Canne \195\160 p\195\170che de la famille Blump";
|
||||
Outfitter_cNatPaglesFishingPole = "FC-5000 de Nat Pagle, p\195\170cheur de l\226\128\153extr\195\170me";
|
||||
Outfitter_cArcaniteFishingPole = "Canne \195\160 p\195\170che en arcanite";
|
||||
|
||||
Outfitter_cArgentDawnCommission = "Brevet de l\226\128\153aube d\226\128\153argent";
|
||||
Outfitter_cSealOfTheDawn = "Sceau de l\226\128\153aube";
|
||||
Outfitter_cRuneOfTheDawn = "Rune de l\226\128\153aube";
|
||||
|
||||
Outfitter_cCarrotOnAStick = "Carotte et b\195\162ton";
|
||||
|
||||
Outfitter_cItemStatFormats = {
|
||||
{ Format = "Endurance %+(%d+)", Types = { "Stamina" } },
|
||||
{ Format = "Intelligence %+(%d+)", Types = { "Intellect" } },
|
||||
{ Format = "Agilit\195\169 %+(%d+)", Types = { "Agility" } },
|
||||
{ Format = "Force %+(%d+)", Types = { "Strength" } },
|
||||
{ Format = "Esprit %+(%d+)", Types = { "Spirit" } },
|
||||
{ Format = "Armure %+(%d+)", Types = { "Armor" } },
|
||||
{ Format = "D\195\169fense %+(%d+)", Types = { "Defense" } },
|
||||
{ Format = "D\195\169fense augment\195\169e de %+(%d+)", Types = { "Defense" } },
|
||||
|
||||
{ Format = "%+(%d+) Endurance", Types = { "Stamina" } },
|
||||
{ Format = "%+(%d+) Intelligence", Types = { "Intellect" } },
|
||||
{ Format = "%+(%d+) Agilit\195\169", Types = { "Agility" } },
|
||||
{ Format = "%+(%d+) Force", Types = { "Strength" } },
|
||||
{ Format = "%+(%d+) Esprit", Types = { "Spirit" } },
|
||||
{ Format = "%+(%d+) Armure", Types = { "Armor" } },
|
||||
{ Format = "%+(%d+) \195\160 la puissance d\226\128\153attaque", Types = { "Attack" } },
|
||||
|
||||
{ Format = "%+(%d+) \195\160 toutes les caract\195\169ristiques", Types = { "Stamina", "Intellect", "Agility", "Strength", "Spirit" } },
|
||||
|
||||
{ Format = "Mana %+(%d+)", Types = { "Mana" } },
|
||||
{ Format = "Vie %+(%d+)", Types = { "Health" } },
|
||||
|
||||
{ Format = "%+(%d+) points de mana toutes les 5 secondes.", Types = { "ManaRegen" } },
|
||||
{ Format = "Rends (%d+) points de mana toutes les 5 secondes.", Types = { "ManaRegen" } },
|
||||
|
||||
{ Format = "%+(%d+) points de vie toutes les 5 secondes.", Types = { "HealthRegen" } },
|
||||
{ Format = "Rends (%d+) points de vie toutes les 5 secondes.", Types = { "HealthRegen" } },
|
||||
|
||||
{ Format = "Augmentation mineure de la vitesse de monture", Value = 3, Types = { "Riding" } },
|
||||
{ Format = "Eperons en mithril", Value = 3, Types = { "Riding" } },
|
||||
|
||||
{ Format = "%+(%d+) R\195\169sistance Feu", Types = { "FireResist" } },
|
||||
{ Format = "%+(%d+) \195\160 la r\195\169sistance Feu", Types = { "FireResist" } },
|
||||
{ Format = "%+(%d+) R\195\169sistance Nature", Types = { "NatureResist" } },
|
||||
{ Format = "%+(%d+) \195\160 la r\195\169sistance Nature", Types = { "NatureResist" } },
|
||||
{ Format = "%+(%d+) R\195\169sistance Givre", Types = { "FrostResist" } },
|
||||
{ Format = "%+(%d+) \195\160 la r\195\169sistance Givre", Types = { "FrostResist" } },
|
||||
{ Format = "%+(%d+) R\195\169sistance Ombre", Types = { "ShadowResist" } },
|
||||
{ Format = "%+(%d+) \195\160 la r\195\169sistance Ombre", Types = { "ShadowResist" } },
|
||||
{ Format = "%+(%d+) R\195\169sistance Arcanes", Types = { "ArcaneResist" } },
|
||||
{ Format = "%+(%d+) \195\160 la r\195\169sistance Arcanes", Types = { "ArcaneResist" } },
|
||||
{ Format = "%+(%d+) \195\160 toutes les r\195\169sistances", Types = { "FireResist", "NatureResist", "FrostResist", "ShadowResist", "ArcaneResist" } },
|
||||
|
||||
{ Format = "D\195\169g\195\162ts de l\226\128\153arme %+(%d+)", Types = { "MeleeDmg" } },
|
||||
{ Format = "Augmente vos chances de toucher de (%d+)%%", Types = { "MeleeHit" } },
|
||||
{ Format = "Augmente vos chance de faire un coup critique de (%d+)%%", Types = { "MeleeCrit" } },
|
||||
{ Format = "Augmente vos chances d\226\128\153esquiver une attaque de (%d+)%%", Types = { "Dodge" } },
|
||||
{ Format = "D\195\169g\195\162ts %+(%d+)", Types = { "MeleeDmg" } },
|
||||
{ Format = "(%d+) Block", Types = { "BlockAmount" } },
|
||||
|
||||
{ Format = "Augmente la p\195\168che de %+(%d+)%.", Types = { "Fishing" } },
|
||||
{ Format = "P\195\168che %+(%d+)", Types = { "Fishing" } },
|
||||
{ Format = "Herborisme %+(%d+)", Types = { "Herbalism" } },
|
||||
{ Format = "Minage %+(%d+)", Types = { "Mining" } },
|
||||
{ Format = "D\195\169pecage %+(%d+)", Types = { "Skinning" } },
|
||||
|
||||
{ Format = "Augmente vos chances d\226\128\153infliger des coups critiques avec vos sorts de (%d+)%%", Types = { "SpellCrit" } },
|
||||
{ Format = "Improves your chance to hit with spells by (%d+)%%", Types = { "SpellHit" } },
|
||||
{ Format = "Augmente les d\195\169g\195\162ts et les soins produits par les sorts et effets magiques de (%d+) au maximum", Types = { "SpellDmg", "ShadowDmg", "FireDmg", "FrostDmg", "ArcaneDmg", "NatureDmg", "Healing" } },
|
||||
{ Format = "Augmente les soins prodigu\195\169s par les sorts et effets de (%d+) au maximum", Types = { "Healing" } },
|
||||
{ Format = "Sorts de soins %+(%d+)", Types = { "Healing" } },
|
||||
{ Format = "%+(%d+) Sorts de soins", Types = { "Healing" } },
|
||||
|
||||
{ Format = "%+(%d+) aux d\195\169g\195\162ts des sorts de feu", Types = { "FireDmg" } },
|
||||
{ Format = "%+(%d+) aux d\195\169g\195\162ts des sorts d\226\128\153ombre", Types = { "ShadowDmg" } },
|
||||
{ Format = "%+(%d+) aux d\195\169g\195\162ts des sorts de givre", Types = { "FrostDmg" } },
|
||||
{ Format = "%+(%d+) aux d\195\169g\195\162ts des sorts d\226\128\153arcane", Types = { "ArcaneDmg" } },
|
||||
{ Format = "%+(%d+) aux d\195\169g\195\162ts des sorts de nature", Types = { "NatureDmg" } },
|
||||
|
||||
{ Format = "Augmente les points de d\195\169g\195\162ts inflig\195\169 par les sorts et effets de feu de (%d+) au maximum", Types = { "FireDmg" } },
|
||||
{ Format = "Augmente les points de d\195\169g\195\162ts inflig\195\169 par les sorts et effets d\226\128\153ombre de (%d+) au maximum", Types = { "ShadowDmg" } },
|
||||
{ Format = "Augmente les points de d\195\169g\195\162ts inflig\195\169 par les sorts et effets de givre de (%d+) au maximum", Types = { "FrostDmg" } },
|
||||
{ Format = "Augmente les points de d\195\169g\195\162ts inflig\195\169 par les sorts et effets d\226\128\153arcane de (%d+) au maximum", Types = { "ArcaneDmg" } },
|
||||
{ Format = "Augmente les points de d\195\169g\195\162ts inflig\195\169 par les sorts et effets de nature de (%d+) au maximum", Types = { "NatureDmg" } },
|
||||
};
|
||||
|
||||
Outfitter_cAgilityStatName = "Agilit\195\169";
|
||||
Outfitter_cArmorStatName = "Armure";
|
||||
Outfitter_cDefenseStatName = "D\195\169fense";
|
||||
Outfitter_cIntellectStatName = "Intelligence";
|
||||
Outfitter_cSpiritStatName = "Esprit";
|
||||
Outfitter_cStaminaStatName = "Endurance";
|
||||
Outfitter_cStrengthStatName = "Force";
|
||||
|
||||
Outfitter_cManaRegenStatName = "R\195\169g\195\169n\195\169ration de mana";
|
||||
Outfitter_cHealthRegenStatName = "R\195\169g\195\169n\195\169ration de vie";
|
||||
|
||||
Outfitter_cSpellCritStatName = "Coups critiques des sorts";
|
||||
Outfitter_cSpellHitStatName = "Spell Chance to Hit";
|
||||
Outfitter_cSpellDmgStatName = "D\195\169g\195\162ts des sorts";
|
||||
Outfitter_cFrostDmgStatName = "D\195\169g\195\162ts des sorts de givre";
|
||||
Outfitter_cFireDmgStatName = "D\195\169g\195\162ts des sorts de feu";
|
||||
Outfitter_cArcaneDmgStatName = "D\195\169g\195\162ts des sorts d\226\128\153arcane";
|
||||
Outfitter_cShadowDmgStatName = "D\195\169g\195\162ts des sorts d\226\128\153ombre";
|
||||
Outfitter_cNatureDmgStatName = "D\195\169g\195\162ts des sorts de nature";
|
||||
Outfitter_cHealingStatName = "Soins";
|
||||
|
||||
Outfitter_cMeleeCritStatName = "Coups critiques";
|
||||
Outfitter_cMeleeHitStatName = "Chance de toucher";
|
||||
Outfitter_cMeleeDmgStatName = "D\195\169g\195\162ts";
|
||||
Outfitter_cAttackStatName = "Puissance d\226\128\153attaque";
|
||||
Outfitter_cDodgeStatName = "Esquive";
|
||||
|
||||
Outfitter_cArcaneResistStatName = "R\195\169sistance aux arcanes";
|
||||
Outfitter_cFireResistStatName = "R\195\169sistance au feu";
|
||||
Outfitter_cFrostResistStatName = "R\195\169sistance au givre";
|
||||
Outfitter_cNatureResistStatName = "R\195\169sistance \195\160 la nature";
|
||||
Outfitter_cShadowResistStatName = "R\195\169sistance \195\160 l\226\128\153ombre";
|
||||
|
||||
Outfitter_cFishingStatName = "P\195\170che";
|
||||
Outfitter_cHerbalismStatName = "Herborisme";
|
||||
Outfitter_cMiningStatName = "Minage";
|
||||
Outfitter_cSkinningStatName = "D\195\169pecage";
|
||||
|
||||
Outfitter_cOptionsTitle = "Options de Outfitter";
|
||||
Outfitter_cShowMinimapButton = "Bouton Minimap";
|
||||
Outfitter_cShowMinimapButtonOnDescription = "D\195\169sactivez si vous ne voulez pas le bouton d\226\128\153Outfitter sur votre minimap";
|
||||
Outfitter_cShowMinimapButtonOffDescription = "Activez pour afficher le bouton d\226\128\153Outfitter sur la minimap";
|
||||
Outfitter_cRememberVisibility = "Remember cloak and helm settings";
|
||||
Outfitter_cRememberVisibilityOnDescription = "Turn this off if you want to use a single show/hide setting for all cloaks and helms";
|
||||
Outfitter_cRememberVisibilityOffDescription = "Turn this on if you want Outfitter to remember your preference for showing or hiding each cloak and helm individually";
|
||||
|
||||
Outfitter_cAboutTitle = "A propos d\226\128\153Outfitter";
|
||||
Outfitter_cAuthor = "Designed and written by Baylord of Thunderlord";
|
||||
Outfitter_cTestersTitle = "Beta Testers";
|
||||
Outfitter_cTestersNames = "Airmid, Desiree, Fizzlebang, Harper, Kallah and Sumitra";
|
||||
Outfitter_cSpecialThanksTitle = "Special thanks for their support to";
|
||||
Outfitter_cSpecialThanksNames = "Brian, Dave, Glenn, Leah, Mark, The Mighty Pol, SFC and Forge";
|
||||
Outfitter_cGuildURL = "http://www.starfleetclan.com";
|
||||
Outfitter_cGuildURL2 = "http://www.forgeguild.com";
|
||||
|
||||
Outfitter_cOpenOutfitter = "Ouvrir Outfitter";
|
||||
|
||||
Outfitter_cArgentDawnOutfitDescription = "Cette tenue sera automatiquement \195\169quip\195\169e quand vous serez dans les Maleterres";
|
||||
Outfitter_cRidingOutfitDescription = "Cette tenue sera automatiquement \195\169quip\195\169e quand vous serez sur votre monture";
|
||||
Outfitter_cDiningOutfitDescription = "Cette tenue sera automatiquement \195\169quip\195\169e quand vous mangerez ou boirez";
|
||||
Outfitter_cBattlegroundOutfitDescription = "Cette tenue sera automatiquement \195\169quip\195\169e quand vous serez dans un Champ de BAtaille";
|
||||
Outfitter_cArathiBasinOutfitDescription = "This outfit will automatically be worn whenever you're in the Arathi Basin battleground";
|
||||
Outfitter_cAlteracValleyOutfitDescription = "This outfit will automatically be worn whenever you're in the Alterac Valley battleground";
|
||||
Outfitter_cWarsongGulchOutfitDescription = "This outfit will automatically be worn whenever you're in the Warsong Gulch battleground";
|
||||
Outfitter_cCityOutfitDescription = "This outfit will automatically be worn whenever you're in a friendly major city";
|
||||
Outfitter_cBossOutfitDescription = "This outfit will automatically be worn whenever you target level 63+ Boss mobs";
|
||||
Outfitter_cLvl63OutfitDescription = "This outfit will automatically be worn whenever you target level 63+ mobs";
|
||||
Outfitter_cTrashOutfitDescription = "This outfit will automatically be worn whenever you target level <63 mobs";
|
||||
Outfitter_cBeastTrashOutfitDescription = "This outfit will automatically be worn whenever you target beasts level <63 mobs";
|
||||
Outfitter_cUndeadTrashOutfitDescription = "This outfit will automatically be worn whenever you target undead level <63 mobs";
|
||||
Outfitter_cDemonTrashOutfitDescription = "This outfit will automatically be worn whenever you target demons level <63 mobs";
|
||||
|
||||
Outfitter_cKeyBinding = "Raccourcis";
|
||||
|
||||
BINDING_HEADER_OUTFITTER_TITLE = Outfitter_cTitle;
|
||||
|
||||
BINDING_NAME_OUTFITTER_OUTFIT1 = "Tenue 1";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT2 = "Tenue 2";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT3 = "Tenue 3";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT4 = "Tenue 4";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT5 = "Tenue 5";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT6 = "Tenue 6";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT7 = "Tenue 7";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT8 = "Tenue 8";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT9 = "Tenue 9";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT10 = "Tenue 10";
|
||||
|
||||
Outfitter_cDisableOutfit = "D\195\169sactiver la tenue";
|
||||
Outfitter_cDisableOutfitInBG = "D\195\169sactiver la tenue dans les Champs de Bataille";
|
||||
Outfitter_cDisabledOutfitName = "%s (D\195\169sactiv\195\169)";
|
||||
|
||||
Outfitter_cMinimapButtonTitle = "Outfitter";
|
||||
Outfitter_cMinimapButtonDescription = "Cliquez pour s\195\169l\195\169ctionner une autre tenue ou d\195\169placez pour changer la position du bouton.";
|
||||
|
||||
Outfitter_cDruidClassName = "Druide";
|
||||
Outfitter_cHunterClassName = "Chasseur";
|
||||
Outfitter_cMageClassName = "Mage";
|
||||
Outfitter_cPaladinClassName = "Paladin";
|
||||
Outfitter_cPriestClassName = "Pr\195\170tre";
|
||||
Outfitter_cRogueClassName = "Voleur";
|
||||
Outfitter_cShamanClassName = "Chaman";
|
||||
Outfitter_cWarlockClassName = "D\195\169moniste";
|
||||
Outfitter_cWarriorClassName = "Guerrier";
|
||||
|
||||
Outfitter_cBattleStance = "Posture de combat";
|
||||
Outfitter_cDefensiveStance = "Posture d\195\169fensive";
|
||||
Outfitter_cBerserkerStance = "Posture berzeker";
|
||||
|
||||
Outfitter_cWarriorBattleStance = "Guerrier: Posture de combat";
|
||||
Outfitter_cWarriorDefensiveStance = "Guerrier: Posture d\195\169fensive";
|
||||
Outfitter_cWarriorBerserkerStance = "Guerrier: Posture berzeker";
|
||||
|
||||
Outfitter_cBearForm = "Forme d\226\128\153ours";
|
||||
Outfitter_cCatForm = "Forme de f\195\169lin";
|
||||
Outfitter_cAquaticForm = "Forme aquatique";
|
||||
Outfitter_cTravelForm = "Forme de voyage";
|
||||
Outfitter_cDireBearForm = "Forme d\226\128\153ours redoutable";
|
||||
Outfitter_cMoonkinForm = "Fome de s\195\169l\195\169nien";
|
||||
|
||||
Outfitter_cGhostWolfForm = "Loup fant\195\180me";
|
||||
|
||||
Outfitter_cStealth = "Camouflage";
|
||||
|
||||
Outfitter_cDruidBearForm = "Druide: Forme d\226\128\153ours";
|
||||
Outfitter_cDruidCatForm = "Druide: Forme de f\195\169lin";
|
||||
Outfitter_cDruidAquaticForm = "Druide: Forme aquatique";
|
||||
Outfitter_cDruidTravelForm = "Druide: Forme de voyage";
|
||||
Outfitter_cDruidMoonkinForm = "Druid: Forme de s\195\169l\195\169nien";
|
||||
|
||||
Outfitter_cPriestShadowform = "Pr\195\170tre: Forme d\226\128\153ombre";
|
||||
|
||||
Outfitter_cRogueStealth = "Voleur: Camouflage";
|
||||
|
||||
Outfitter_cShamanGhostWolf = "Chaman: Loup fant\195\180me";
|
||||
|
||||
Outfitter_cCompleteCategoryDescripton = "Les tenues compl\195\168tes ont un objet sp\195\169cifi\195\169 pour chaque emplacement et remplaceront toutes les autres tenues quand elles sont activ\195\169es";
|
||||
Outfitter_cPartialCategoryDescription = "Les tenues \"Mix-n-match\" ont quelques emplacements sp\195\169cifi\195\169s. Quand on les \195\169quipe, elles vont par-dessus la tenue compl\195\168te s\195\169l\195\169ctionn\195\169e et remplace toutes les tenues \"Mix-n-match\" et Accessoires";
|
||||
Outfitter_cAccessoryCategoryDescription = "Les tenues d\226\128\153accessoires ont quelques emplacements sp\195\169cifi\195\169s. Contrairement aux \"Mix-n-Match\", Contrairement aux \"Mix-n-Match\", vous pouvez s\195\169l\195\169ctionner autant d\226\128\153accessoires que vous voulez et ils seront combin\195\169s par-dessus votre tenue compl\195\168te et \"Mix-n-Match\".";
|
||||
Outfitter_cSpecialCategoryDescription = "Les tenues sp\195\169ciales sont automatiquement \195\169quip\195\169es dans certaines conditions. Elles remplacent les tenues \195\169quip\195\169es avant.";
|
||||
Outfitter_cOddsNEndsCategoryDescription = "Les Odds \226\128\153n ends sont des objets que vous n\226\128\153utilisez dans aucune tenue. Ceci peut \195\170tre utile pour v\195\169rifier que vous utilisez tous les objets que vous avez dans l\226\128\153inventaire.";
|
||||
|
||||
Outfitter_cRebuildOutfitFormat = "Reconstruire pour %s";
|
||||
|
||||
Outfitter_cTranslationCredit = "Traduction fran\195\167aise: Jullye de Kael\226\128\153Thas";
|
||||
|
||||
Outfitter_cSlotEnableTitle = "Activer l\226\128\153emplacement";
|
||||
Outfitter_cSlotEnableDescription = "Cochez la case si vous voulez que l\226\128\153objet de cet emplacement soit automatiquement \195\169quip\195\169 lors du changement de tenue. Si la case n\226\128\153est pas coch\195\169e, l\226\128\153objet ne sera pas modifi\195\169 lors du changement de tenue.";
|
||||
|
||||
Outfitter_cFinger0SlotName = "Premier doigt";
|
||||
Outfitter_cFinger1SlotName = "Second doigt";
|
||||
|
||||
Outfitter_cTrinket0SlotName = "Premier bijou";
|
||||
Outfitter_cTrinket1SlotName = "Second bijou";
|
||||
|
||||
Outfitter_cOutfitCategoryTitle = "Cat\195\169gorie";
|
||||
Outfitter_cBankCategoryTitle = "Banque";
|
||||
Outfitter_cDepositToBank = "D\195\169poser les objets \195\160 la banque.";
|
||||
Outfitter_cDepositUniqueToBank = "Deposit unique items to bank";
|
||||
Outfitter_cWithdrawFromBank = "R\195\169cup\195\169rer les objets de la banque.";
|
||||
|
||||
Outfitter_cMissingItemsLabel = "Objets manquants: ";
|
||||
Outfitter_cBankedItemsLabel = "Objets \195\160 la banque: ";
|
||||
|
||||
Outfitter_cStatsCategory = "Stats";
|
||||
Outfitter_cMeleeCategory = "Melee";
|
||||
Outfitter_cSpellsCategory = "Healing and Spells";
|
||||
Outfitter_cRegenCategory = "Regeneration";
|
||||
Outfitter_cResistCategory = "Resistances";
|
||||
Outfitter_cTradeCategory = "Trade Skills";
|
||||
|
||||
Outfitter_cCritter = "Bestiole";
|
||||
Outfitter_cCreatureBeast = "Bête";
|
||||
Outfitter_cCreatureUndead = "Mort-vivant";
|
||||
Outfitter_cCreatureDemon = "Démon";
|
||||
Outfitter_cSwimmingOutfit = "Natation";
|
||||
end
|
||||
@@ -0,0 +1,368 @@
|
||||
if GetLocale() == "koKR" then
|
||||
Outfitter_cTitle = "Outfitter";
|
||||
Outfitter_cTitleVersion = Outfitter_cTitle .. " " .. Outfitter_cVersion;
|
||||
|
||||
Outfitter_cNameLabel = "이름:";
|
||||
Outfitter_cCreateUsingTitle = "최적화:";
|
||||
Outfitter_cUseCurrentOutfit = "현재 장비 세트 사용";
|
||||
Outfitter_cUseEmptyOutfit = "빈 장비 세트 만듬";
|
||||
|
||||
Outfitter_cOutfitterTabTitle = "Outfitter";
|
||||
Outfitter_cOptionsTabTitle = "옵션";
|
||||
Outfitter_cAboutTabTitle = "정보";
|
||||
|
||||
Outfitter_cNewOutfit = "신규 장비 세트";
|
||||
Outfitter_cRenameOutfit = "장비 세트 이름 변경";
|
||||
|
||||
Outfitter_cCompleteOutfits = "완비 세트";
|
||||
Outfitter_cPartialOutfits = "Mix-n-match";
|
||||
Outfitter_cAccessoryOutfits = "보조 장비";
|
||||
Outfitter_cSpecialOutfits = "특수 조건";
|
||||
Outfitter_cOddsNEndsOutfits = "나머지 장비들";
|
||||
|
||||
Outfitter_cNormalOutfit = "평상시";
|
||||
Outfitter_cNakedOutfit = "벗기";
|
||||
|
||||
Outfitter_cFishingOutfit = "낚시";
|
||||
Outfitter_cHerbalismOutfit = "약초 채집";
|
||||
Outfitter_cMiningOutfit = "채광";
|
||||
Outfitter_cSkinningOutfit = "무두질";
|
||||
Outfitter_cFireResistOutfit = "화염 저항";
|
||||
Outfitter_cNatureResistOutfit = "자연 저항";
|
||||
Outfitter_cShadowResistOutfit = "암흑 저항";
|
||||
Outfitter_cArcaneResistOutfit = "비전 저항";
|
||||
Outfitter_cFrostResistOutfit = "냉기 저항";
|
||||
|
||||
Outfitter_cArgentDawnOutfit = "은빛 여명회";
|
||||
Outfitter_cRidingOutfit = "말타기";
|
||||
Outfitter_cDiningOutfit = "음식 먹기";
|
||||
Outfitter_cBattlegroundOutfit = "전장";
|
||||
Outfitter_cABOutfit = "전장: 아라시 분지";
|
||||
Outfitter_cAVOutfit = "전장: 알터랙 계곡";
|
||||
Outfitter_cWSGOutfit = "전장: 전쟁노래 협곡";
|
||||
Outfitter_cCityOutfit = "마을 주변";
|
||||
Outfitter_cBossOutfit = "Boss Mobs";
|
||||
Outfitter_cLvl63Outfit = "Lvl63+";
|
||||
Outfitter_cTrashOutfit = "Trash Mobs";
|
||||
Outfitter_cBeastTrashOutfit = "Beast Trash Mobs";
|
||||
Outfitter_cUndeadTrashOutfit = "Undead Trash Mobs";
|
||||
Outfitter_cDemonTrashOutfit = "Demon Trash Mobs";
|
||||
|
||||
Outfitter_cMountSpeedFormat = "이동 속도 (%d+)%%만큼 증가"; -- For detecting when mounted
|
||||
|
||||
Outfitter_cBagsFullError = "Outfitter: 가방이 가득 차서 %s|1을;를; 벗을 수 없습니다.";
|
||||
Outfitter_cDepositBagsFullError = "Outfitter: 가방이 가득 차서 %s|1을;를; 벗을 수 없습니다.";
|
||||
Outfitter_cWithdrawBagsFullError = "Outfitter: 가방이 가득 차서 %s|1을;를; 벗을 수 없습니다.";
|
||||
Outfitter_cItemNotFoundError = "Outfitter: %s 아이템을 찾을 수 없습니다.";
|
||||
Outfitter_cItemAlreadyUsedError = "Outfitter: %s|1은;는; 이미 다른 슬롯에서 사용중이므로 %s 슬롯에 착용할 수 없습니다.";
|
||||
Outfitter_cAddingItem = "Outfitter: %s|1을;를 %s 세트에 추가합니다.";
|
||||
Outfitter_cNameAlreadyUsedError = "에러: 사용중인 이름입니다.";
|
||||
Outfitter_cNoItemsWithStatError = "경고: 해당 능력을 가진 아이템이 없습니다.";
|
||||
|
||||
Outfitter_cEnableAll = "모두 활성화";
|
||||
Outfitter_cEnableNone = "모두 비활성화";
|
||||
|
||||
Outfitter_cConfirmDeleteMsg = "%s 세트를 삭제 하시겠습니까?";
|
||||
Outfitter_cConfirmRebuildMsg = "%s 세트를 재구성 하시겠습니까?";
|
||||
Outfitter_cRebuild = "Rebuild";
|
||||
|
||||
Outfitter_cWesternPlaguelands = "서부 역병지대";
|
||||
Outfitter_cEasternPlaguelands = "동부 역병지대";
|
||||
Outfitter_cStratholme = "스트라솔룸";
|
||||
Outfitter_cScholomance = "스칼로맨스";
|
||||
Outfitter_cNaxxramas = "낙스라마스";
|
||||
Outfitter_cAlteracValley = "알터랙 계곡";
|
||||
Outfitter_cArathiBasin = "아라시 분지";
|
||||
Outfitter_cWarsongGulch = "전쟁노래 협곡";
|
||||
Outfitter_cIronforge = "아이언포지";
|
||||
Outfitter_cCityOfIronforge = "아이언포지";
|
||||
Outfitter_cDarnassus = "다르나서스";
|
||||
Outfitter_cStormwind = "스톰윈드";
|
||||
Outfitter_cOrgrimmar = "오그리마";
|
||||
Outfitter_cThunderBluff = "썬더 블러프";
|
||||
Outfitter_cUndercity = "언더시티";
|
||||
|
||||
Outfitter_cFishingPole = "낚싯대";
|
||||
Outfitter_cStrongFishingPole = "특튼한 낚싯대";
|
||||
Outfitter_cBigIronFishingPole = "큰 철재 낚싯대";
|
||||
Outfitter_cBlumpFishingPole = "블럼프가의 낚싯대";
|
||||
Outfitter_cNatPaglesFishingPole = "네트 페이글의 다낚아 FC-5000";
|
||||
Outfitter_cArcaniteFishingPole = "아케이나이트 낚싯대";
|
||||
|
||||
Outfitter_cArgentDawnCommission = "은빛 여명회 위임봉";
|
||||
Outfitter_cSealOfTheDawn = "여명의 문장";
|
||||
Outfitter_cRuneOfTheDawn = "여명의 룬";
|
||||
|
||||
Outfitter_cCarrotOnAStick = "당근 달린 지팡이";
|
||||
|
||||
Outfitter_cItemStatFormats = {
|
||||
{ Format = "체력 %+(%d+)", Types = { "Stamina" } },
|
||||
{ Format = "지능 %+(%d+)", Types = { "Intellect" } },
|
||||
{ Format = "민첩 %+(%d+)", Types = { "Agility" } },
|
||||
{ Format = "힘 %+(%d+)", Types = { "Strength" } },
|
||||
{ Format = "정신력 %+(%d+)", Types = { "Spirit" } },
|
||||
{ Format = "방어도 %+(%d+)", Types = { "Armor" } },
|
||||
{ Format = "방어 숙련도 %+(%d+)", Types = { "Defense" } },
|
||||
{ Format = "Increased Defense %+(%d+)", Types = { "Defense" } },
|
||||
|
||||
{ Format = "%+(%d+) 체력", Types = { "Stamina" } },
|
||||
{ Format = "%+(%d+) 지능", Types = { "Intellect" } },
|
||||
{ Format = "%+(%d+) 민첩", Types = { "Agility" } },
|
||||
{ Format = "%+(%d+) 힘", Types = { "Strength" } },
|
||||
{ Format = "%+(%d+) 정신력", Types = { "Spirit" } },
|
||||
{ Format = "(%d+) 방어도", Types = { "Armor" } },
|
||||
{ Format = "%+(%d+) 전투력", Types = { "Attack" } },
|
||||
|
||||
{ Format = "모든 능력치 %+(%d+)", Types = { "Stamina", "Intellect", "Agility", "Strength", "Spirit" } },
|
||||
|
||||
{ Format = "마나 %+(%d+)", Types = { "Mana" } },
|
||||
{ Format = "생명력 %+(%d+)", Types = { "Health" } },
|
||||
|
||||
{ Format = "매 5초마다 %+(%d+)의 마나", Types = { "ManaRegen" } },
|
||||
{ Format = "매 5초마다 (%d+)의 마나가 회복됩니다.", Types = { "ManaRegen" } },
|
||||
|
||||
{ Format = "매 5초마다 %+(%d+)의 생명력", Types = { "HealthRegen" } },
|
||||
{ Format = "매 5초마다 (%d+)의 생명력이 회복됩니다.", Types = { "HealthRegen" } },
|
||||
{ Format = "Restores (%d+) health per 5 sec.", Types = { "HealthRegen" } },
|
||||
|
||||
{ Format = "최하급 탈것 속도 증가", Value = 3, Types = { "Riding" } },
|
||||
{ Format = "미스릴 박차", Value = 3, Types = { "Riding" } },
|
||||
|
||||
{ Format = "화염 저항력 %+(%d+)", Types = { "FireResist" } },
|
||||
{ Format = "자연 저항력 %+(%d+)", Types = { "NatureResist" } },
|
||||
{ Format = "냉기 저항력 %+(%d+)", Types = { "FrostResist" } },
|
||||
{ Format = "암흑 저항력 %+(%d+)", Types = { "ShadowResist" } },
|
||||
{ Format = "비전 저항력 %+(%d+)", Types = { "ArcaneResist" } },
|
||||
{ Format = "모든 저항력 %+(%d+)", Types = { "FireResist", "NatureResist", "FrostResist", "ShadowResist", "ArcaneResist" } },
|
||||
|
||||
{ Format = "무기 공격력 %+(%d+)", Types = { "MeleeDmg" } },
|
||||
{ Format = "무기의 적중률이 (%d+)%%만큼 증가합니다.", Types = { "MeleeHit" } },
|
||||
{ Format = "치명타를 적중시킬 확률이 (%d+)%%만큼 증가합니다.", Types = { "MeleeCrit" } },
|
||||
{ Format = "공격을 회피할 확률이 (%d+)%%만큼 증가합니다.", Types = { "Dodge" } },
|
||||
{ Format = "공격력 %+(%d+)", Types = { "MeleeDmg" } },
|
||||
{ Format = "(%d+)의 피해 방어", Types = { "Block" } },
|
||||
{ Format = "방어도 %+(%d+)", Types = { "Block" } },
|
||||
{ Format = "방패의 피해 방어량이 (%d+)만큼 증가합니다.", Types = { "Block" } },
|
||||
|
||||
{ Format = "낚시 숙련도 %+(%d+)%.", Types = { "Fishing" } },
|
||||
{ Format = "낚시 %+(%d+)", Types = { "Fishing" } },
|
||||
{ Format = "약초 채집 %+(%d+)", Types = { "Herbalism" } },
|
||||
{ Format = "채광 %+(%d+)", Types = { "Mining" } },
|
||||
{ Format = "무두질 %+(%d+)", Types = { "Skinning" } },
|
||||
|
||||
{ Format = "주문이 극대화 효과를 낼 확률이(%d+)%%만큼 증가합니다.", Types = { "SpellCrit" } },
|
||||
{ Format = "주문의 적중률이 (%d+)%%만큼 증가합니다.", Types = { "SpellHit" } },
|
||||
{ Format = "모든 주문 및 효과에 의한 피해와 치유량이 최대 (%d+)만큼 증가합니다.", Types = { "SpellDmg", "ShadowDmg", "FireDmg", "FrostDmg", "ArcaneDmg", "NatureDmg", "Healing" } },
|
||||
{ Format = "모든 주문 및 효과에 의한 치유량이 최대 (%d+)만큼 증가합니다.", Types = { "Healing" } },
|
||||
{ Format = "치유 주문 %+(%d+)", Types = { "Healing" } },
|
||||
{ Format = "%+(%d+) 치유 주문", Types = { "Healing" } },
|
||||
|
||||
{ Format = "%+(%d+) 화염 주문 공격력", Types = { "FireDmg" } },
|
||||
{ Format = "%+(%d+) 암흑 주문 공격력", Types = { "ShadowDmg" } },
|
||||
{ Format = "%+(%d+) 냉기 주문 공격력", Types = { "FrostDmg" } },
|
||||
{ Format = "%+(%d+) 비전 주문 공격력", Types = { "ArcaneDmg" } },
|
||||
{ Format = "%+(%d+) 자연 주문 공격력", Types = { "NatureDmg" } },
|
||||
|
||||
{ Format = "화염 계열의 주문과 효과의 공격력이 최대 (%d+)만큼 증가합니다.", Types = { "FireDmg" } },
|
||||
{ Format = "암흑 계열의 주문과 효과의 공격력이 최대 (%d+)만큼 증가합니다.", Types = { "ShadowDmg" } },
|
||||
{ Format = "냉기 계열의 주문과 효과의 공격력이 최대 (%d+)만큼 증가합니다.", Types = { "FrostDmg" } },
|
||||
{ Format = "비전 계열의 주문과 효과의 공격력이 최대 (%d+)만큼 증가합니다.", Types = { "ArcaneDmg" } },
|
||||
{ Format = "자연 계열의 주문과 효과의 공격력이 최대 (%d+)만큼 증가합니다.", Types = { "NatureDmg" } },
|
||||
};
|
||||
|
||||
Outfitter_cAgilityStatName = "민첩";
|
||||
Outfitter_cArmorStatName = "방어도";
|
||||
Outfitter_cDefenseStatName = "방어 숙련도";
|
||||
Outfitter_cIntellectStatName = "지능";
|
||||
Outfitter_cSpiritStatName = "정신력";
|
||||
Outfitter_cStaminaStatName = "체력";
|
||||
Outfitter_cStrengthStatName = "힘";
|
||||
|
||||
Outfitter_cManaRegenStatName = "마나 회복";
|
||||
Outfitter_cHealthRegenStatName = "생명력 회복";
|
||||
|
||||
Outfitter_cSpellCritStatName = "주문 치명타";
|
||||
Outfitter_cSpellHitStatName = "주문 적중률";
|
||||
Outfitter_cSpellDmgStatName = "주문 공격력";
|
||||
Outfitter_cFrostDmgStatName = "냉기 주문 공격력";
|
||||
Outfitter_cFireDmgStatName = "화염 주문 공격력";
|
||||
Outfitter_cArcaneDmgStatName = "비전 주문 공격력";
|
||||
Outfitter_cShadowDmgStatName = "암흑 주문 공격력";
|
||||
Outfitter_cNatureDmgStatName = "자연 주문 공격력";
|
||||
Outfitter_cHealingStatName = "치유량";
|
||||
|
||||
Outfitter_cMeleeCritStatName = "근접 치명타";
|
||||
Outfitter_cMeleeHitStatName = "근접 적중률";
|
||||
Outfitter_cMeleeDmgStatName = "근접 공격력";
|
||||
Outfitter_cAttackStatName = "전투력";
|
||||
Outfitter_cDodgeStatName = "회피";
|
||||
|
||||
Outfitter_cArcaneResistStatName = "비전 저항력";
|
||||
Outfitter_cFireResistStatName = "화염 저항력";
|
||||
Outfitter_cFrostResistStatName = "냉기 저항력";
|
||||
Outfitter_cNatureResistStatName = "자연 저항력";
|
||||
Outfitter_cShadowResistStatName = "암흑 저항력";
|
||||
|
||||
Outfitter_cFishingStatName = "낚시";
|
||||
Outfitter_cHerbalismStatName = "약초 채집";
|
||||
Outfitter_cMiningStatName = "채광";
|
||||
Outfitter_cSkinningStatName = "무두질";
|
||||
|
||||
Outfitter_cOptionsTitle = "Outfitter Options";
|
||||
Outfitter_cShowMinimapButton = "미니맵 버튼 표시";
|
||||
Outfitter_cShowMinimapButtonOnDescription = "미니맵 버튼을 사용하지 않으려면 끕니다.";
|
||||
Outfitter_cShowMinimapButtonOffDescription = "미니맵 버튼을 사용하려면 켭니다.";
|
||||
Outfitter_cRememberVisibility = "망토와 투구 설정 기억";
|
||||
Outfitter_cRememberVisibilityOnDescription = "모든 망토와 투구에 대해서 동일한 설정을 하려면 끕니다.";
|
||||
Outfitter_cRememberVisibilityOffDescription = "각각의 망토와 투구에 대한 설정을 기억하려면 켭니다.";
|
||||
Outfitter_cShowHotkeyMessages = "단축키로 변경할때 보여주기";
|
||||
Outfitter_cShowHotkeyMessagesOnDescription = "단축키로 세트를 변경할때 메시지를 보지 않으려면 끕니다.";
|
||||
Outfitter_cShowHotkeyMessagesOffDescription = "단축키로 세트를 변경할때 메시지를 보려면 켭니다.";
|
||||
|
||||
Outfitter_cEquipOutfitMessageFormat = "Outfitter: %s 장비됨";
|
||||
Outfitter_cUnequipOutfitMessageFormat = "Outfitter: %s 해제됨";
|
||||
|
||||
Outfitter_cAboutTitle = "Outfitter 정보";
|
||||
Outfitter_cAuthor = "Designed and written by John Stephen";
|
||||
Outfitter_cTestersTitle = "Beta Testers";
|
||||
Outfitter_cTestersNames = "Airmid, Desiree, Fizzlebang, Harper, Kallah and Sumitra";
|
||||
Outfitter_cSpecialThanksTitle = "Special thanks for their support to";
|
||||
Outfitter_cSpecialThanksNames = "Brian, Dave, Glenn, Leah, Mark, The Mighty Pol, SFC and Forge";
|
||||
Outfitter_cGuildURL = "http://www.starfleetclan.com";
|
||||
Outfitter_cGuildURL2 = "http://www.forgeguild.com";
|
||||
|
||||
Outfitter_cOpenOutfitter = "Outfitter 열기";
|
||||
|
||||
Outfitter_cArgentDawnOutfitDescription = "이 세트는 역병지대에 있을 때 자동으로 착용 됩니다.";
|
||||
Outfitter_cRidingOutfitDescription = "이 세트는 탈것을 탈 때 자동으로 착용 됩니다.";
|
||||
Outfitter_cDiningOutfitDescription = "이 세트는 음식을 먹거나 음료를 마실 때 자동으로 착용 됩니다.";
|
||||
Outfitter_cBattlegroundOutfitDescription = "이 세트는 전장에 있을 때 자동으로 착용 됩니다.";
|
||||
Outfitter_cArathiBasinOutfitDescription = "이 세트는 아라시 분지에 있을 때 자동으로 착용 됩니다.";
|
||||
Outfitter_cAlteracValleyOutfitDescription = "이 세트는 알터랙 계곡에 있을 때 자동으로 착용 됩니다.";
|
||||
Outfitter_cWarsongGulchOutfitDescription = "이 세트는 전쟁노래 협곡에 있을 때 자동으로 착용 됩니다.";
|
||||
Outfitter_cCityOutfitDescription = "이 세트는 우호적인 대도시에 있을 때 자동으로 착용 됩니다.";
|
||||
Outfitter_cBossOutfitDescription = "This outfit will automatically be worn whenever you target level 63+ Boss mobs";
|
||||
Outfitter_cLvl63OutfitDescription = "This outfit will automatically be worn whenever you target level 63+ mobs";
|
||||
Outfitter_cTrashOutfitDescription = "This outfit will automatically be worn whenever you target level <63 mobs";
|
||||
Outfitter_cBeastTrashOutfitDescription = "This outfit will automatically be worn whenever you target beasts level <63 mobs";
|
||||
Outfitter_cUndeadTrashOutfitDescription = "This outfit will automatically be worn whenever you target undead level <63 mobs";
|
||||
Outfitter_cDemonTrashOutfitDescription = "This outfit will automatically be worn whenever you target demons level <63 mobs";
|
||||
|
||||
Outfitter_cKeyBinding = "단축키";
|
||||
|
||||
BINDING_HEADER_OUTFITTER_TITLE = Outfitter_cTitle;
|
||||
|
||||
BINDING_NAME_OUTFITTER_OUTFIT1 = "세트 1";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT2 = "세트 2";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT3 = "세트 3";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT4 = "세트 4";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT5 = "세트 5";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT6 = "세트 6";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT7 = "세트 7";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT8 = "세트 8";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT9 = "세트 9";
|
||||
BINDING_NAME_OUTFITTER_OUTFIT10 = "세트 10";
|
||||
|
||||
Outfitter_cDisableOutfit = "세트 사용 안함";
|
||||
Outfitter_cDisableOutfitInBG = "전장에서 사용 안함";
|
||||
Outfitter_cDisabledOutfitName = "%s (사용 안함)";
|
||||
|
||||
Outfitter_cMinimapButtonTitle = "미니맵 버튼";
|
||||
Outfitter_cMinimapButtonDescription = "클릭 : 세트 선택, 드래그 : 미니맵 버튼 이동";
|
||||
|
||||
Outfitter_cDruidClassName = "드루이드";
|
||||
Outfitter_cHunterClassName = "사냥꾼";
|
||||
Outfitter_cMageClassName = "마법사";
|
||||
Outfitter_cPaladinClassName = "성기사";
|
||||
Outfitter_cPriestClassName = "사제";
|
||||
Outfitter_cRogueClassName = "도적";
|
||||
Outfitter_cShamanClassName = "주술사";
|
||||
Outfitter_cWarlockClassName = "흑마법사";
|
||||
Outfitter_cWarriorClassName = "전자";
|
||||
|
||||
Outfitter_cBattleStance = "전투 태세";
|
||||
Outfitter_cDefensiveStance = "방어 태세";
|
||||
Outfitter_cBerserkerStance = "광폭 태세";
|
||||
|
||||
Outfitter_cWarriorBattleStance = "전사: 전투 태세";
|
||||
Outfitter_cWarriorDefensiveStance = "전사: 방어 태세";
|
||||
Outfitter_cWarriorBerserkerStance = "전사: 광폭 태세";
|
||||
|
||||
Outfitter_cBearForm = "곰 변신";
|
||||
Outfitter_cCatForm = "표범 변신표범 변신";
|
||||
Outfitter_cAquaticForm = "바다표범 변신";
|
||||
Outfitter_cTravelForm = "치타 변신";
|
||||
Outfitter_cDireBearForm = "광포한 곰 변신";
|
||||
Outfitter_cMoonkinForm = "달빛야수 변신";
|
||||
|
||||
Outfitter_cGhostWolfForm = "늑대 정령";
|
||||
|
||||
Outfitter_cStealth = "은신";
|
||||
|
||||
Outfitter_cDruidBearForm = "드루이드: 곰 변신";
|
||||
Outfitter_cDruidCatForm = "드루이드: 표범 변신";
|
||||
Outfitter_cDruidAquaticForm = "드루이드: 바다표범 변신";
|
||||
Outfitter_cDruidTravelForm = "드루이드: 치타 변신";
|
||||
Outfitter_cDruidMoonkinForm = "드루이드: 달빛야수 변신";
|
||||
|
||||
Outfitter_cPriestShadowform = "사제: 어둠의 형상";
|
||||
|
||||
Outfitter_cRogueStealth = "도적: 은신";
|
||||
|
||||
Outfitter_cShamanGhostWolf = "주술사: 늑대 정령";
|
||||
|
||||
Outfitter_cHunterMonkey = "사냥꾼: 원숭이의 상";
|
||||
Outfitter_cHunterHawk = "사냥꾼: 매의 상";
|
||||
Outfitter_cHunterCheetah = "사냥꾼: 치타의 상";
|
||||
Outfitter_cHunterPack = "사냥꾼: 치타 무리의 상";
|
||||
Outfitter_cHunterBeast = "사냥꾼: 야수의 상";
|
||||
Outfitter_cHunterWild = "사냥꾼: 야생의 상";
|
||||
|
||||
Outfitter_cMageEvocate = "마법사: 환기";
|
||||
|
||||
Outfitter_cAspectOfTheCheetah = "치타의 상";
|
||||
Outfitter_cAspectOfThePack = "치타 무리의 상";
|
||||
Outfitter_cAspectOfTheBeast = "야수의 상";
|
||||
Outfitter_cAspectOfTheWild = "야생의 상";
|
||||
Outfitter_cEvocate = "환기";
|
||||
|
||||
Outfitter_cCompleteCategoryDescripton = "모든 슬롯의 아이템에 관한 설정이 들어있는 완전한 장비 세트입니다.";
|
||||
Outfitter_cPartialCategoryDescription = "Mix-n-match의 장비 세트는 전부가 아닌 일부 슬롯만 가집니다. 장비 세트가 선택되면 이전에 선택되었던 보조 장비 세트 또는 Mix-n-match 세트를 대체하면서, 완비 세트에서 해당 아이템만을 교체합니다.";
|
||||
Outfitter_cAccessoryCategoryDescription = "보조 장비의 장비 세트는 전부가 아닌 일부 슬롯만 가집니다. Mix-n-match와는 다르게 이전에 선택되었던 보조 장비 세트 또는 Mix-n-match 세트를 대체하지 않고 추가로 완비 세트에서 해당 아이템을 교체합니다.";
|
||||
Outfitter_cSpecialCategoryDescription = "특수 조건의 장비 세트는 해당하는 조건을 충족시킬 경우 자동으로 착용됩니다.";
|
||||
Outfitter_cOddsNEndsCategoryDescription = "나머지 장비들의 아이템들은 장비 세트에 한번도 사용되지 않은 아이템들입니다.";
|
||||
|
||||
Outfitter_cRebuildOutfitFormat = "%s 재구성";
|
||||
|
||||
Outfitter_cTranslationCredit = " ";
|
||||
|
||||
Outfitter_cSlotEnableTitle = "슬롯 활성화";
|
||||
Outfitter_cSlotEnableDescription = "슬롯을 활성화 하면 해당 장비 세트를 사용할때 같이 변경됩니다.";
|
||||
|
||||
Outfitter_cFinger0SlotName = "첫번째 손가락";
|
||||
Outfitter_cFinger1SlotName = "두번째 손가락";
|
||||
|
||||
Outfitter_cTrinket0SlotName = "첫번째 장신구";
|
||||
Outfitter_cTrinket1SlotName = "두번째 장신구";
|
||||
|
||||
Outfitter_cOutfitCategoryTitle = "카테고리";
|
||||
Outfitter_cBankCategoryTitle = "은행";
|
||||
Outfitter_cDepositToBank = "모든 아이템을 은행으로";
|
||||
Outfitter_cDepositUniqueToBank = "특정 아이템을 은행으로";
|
||||
Outfitter_cWithdrawFromBank = "은행으로부터 아이템 회수";
|
||||
|
||||
Outfitter_cMissingItemsLabel = "찾을 수 없는 아이템: ";
|
||||
Outfitter_cBankedItemsLabel = "은행에 있는 아이템: ";
|
||||
|
||||
Outfitter_cRepairAllBags = "Outfitter: 모든 아이템 수리";
|
||||
|
||||
Outfitter_cStatsCategory = "능력치";
|
||||
Outfitter_cMeleeCategory = "근접";
|
||||
Outfitter_cSpellsCategory = "주문과 치유";
|
||||
Outfitter_cRegenCategory = "회복";
|
||||
Outfitter_cResistCategory = "저항";
|
||||
Outfitter_cTradeCategory = "전문기술";
|
||||
|
||||
Outfitter_cTankPoints = "탱크 포인트";
|
||||
Outfitter_cCustom = "사용자 설정";
|
||||
end
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,663 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- edited with XMLSpy v2005 sp1 U (http://www.xmlspy.com) by Sam Lantinga (Blizzard Entertainment) -->
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.blizzard.com/wow/ui/" xmlns:ui="http://www.blizzard.com/wow/ui/" targetNamespace="http://www.blizzard.com/wow/ui/" elementFormDefault="qualified" attributeFormDefault="unqualified">
|
||||
<xs:simpleType name="FRAMEPOINT">
|
||||
<xs:restriction base="xs:NMTOKEN">
|
||||
<xs:enumeration value="TOPLEFT"/>
|
||||
<xs:enumeration value="TOPRIGHT"/>
|
||||
<xs:enumeration value="BOTTOMLEFT"/>
|
||||
<xs:enumeration value="BOTTOMRIGHT"/>
|
||||
<xs:enumeration value="TOP"/>
|
||||
<xs:enumeration value="BOTTOM"/>
|
||||
<xs:enumeration value="LEFT"/>
|
||||
<xs:enumeration value="RIGHT"/>
|
||||
<xs:enumeration value="CENTER"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="FRAMESTRATA">
|
||||
<xs:restriction base="xs:NMTOKEN">
|
||||
<xs:enumeration value="PARENT"/>
|
||||
<xs:enumeration value="BACKGROUND"/>
|
||||
<xs:enumeration value="LOW"/>
|
||||
<xs:enumeration value="MEDIUM"/>
|
||||
<xs:enumeration value="HIGH"/>
|
||||
<xs:enumeration value="DIALOG"/>
|
||||
<xs:enumeration value="FULLSCREEN"/>
|
||||
<xs:enumeration value="FULLSCREEN_DIALOG"/>
|
||||
<xs:enumeration value="TOOLTIP"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="DRAWLAYER">
|
||||
<xs:restriction base="xs:NMTOKEN">
|
||||
<xs:enumeration value="BACKGROUND"/>
|
||||
<xs:enumeration value="BORDER"/>
|
||||
<xs:enumeration value="ARTWORK"/>
|
||||
<xs:enumeration value="OVERLAY"/>
|
||||
<xs:enumeration value="HIGHLIGHT"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="ALPHAMODE">
|
||||
<xs:restriction base="xs:NMTOKEN">
|
||||
<xs:enumeration value="DISABLE"/>
|
||||
<xs:enumeration value="BLEND"/>
|
||||
<xs:enumeration value="ALPHAKEY"/>
|
||||
<xs:enumeration value="ADD"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="OUTLINETYPE">
|
||||
<xs:restriction base="xs:NMTOKEN">
|
||||
<xs:enumeration value="NONE"/>
|
||||
<xs:enumeration value="NORMAL"/>
|
||||
<xs:enumeration value="THICK"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="JUSTIFYVTYPE">
|
||||
<xs:restriction base="xs:NMTOKEN">
|
||||
<xs:enumeration value="TOP"/>
|
||||
<xs:enumeration value="MIDDLE"/>
|
||||
<xs:enumeration value="BOTTOM"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="JUSTIFYHTYPE">
|
||||
<xs:restriction base="xs:NMTOKEN">
|
||||
<xs:enumeration value="LEFT"/>
|
||||
<xs:enumeration value="CENTER"/>
|
||||
<xs:enumeration value="RIGHT"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="INSERTMODE">
|
||||
<xs:restriction base="xs:NMTOKEN">
|
||||
<xs:enumeration value="TOP"/>
|
||||
<xs:enumeration value="BOTTOM"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="ORIENTATION">
|
||||
<xs:restriction base="xs:NMTOKEN">
|
||||
<xs:enumeration value="HORIZONTAL"/>
|
||||
<xs:enumeration value="VERTICAL"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:element name="AbsValue">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="val" type="xs:int" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="RelValue">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="val" type="xs:float" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:complexType name="Value">
|
||||
<xs:choice minOccurs="0">
|
||||
<xs:element ref="AbsValue"/>
|
||||
<xs:element ref="RelValue"/>
|
||||
</xs:choice>
|
||||
<xs:attribute name="val" type="xs:int" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:element name="AbsDimension">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="x" type="xs:int" use="required"/>
|
||||
<xs:attribute name="y" type="xs:int" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="RelDimension">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="x" type="xs:float" use="required"/>
|
||||
<xs:attribute name="y" type="xs:float" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:complexType name="Dimension">
|
||||
<xs:choice minOccurs="0">
|
||||
<xs:element ref="AbsDimension"/>
|
||||
<xs:element ref="RelDimension"/>
|
||||
</xs:choice>
|
||||
<xs:attribute name="x" type="xs:int" use="optional"/>
|
||||
<xs:attribute name="y" type="xs:int" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:element name="AbsInset">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="left" type="xs:int" use="optional"/>
|
||||
<xs:attribute name="right" type="xs:int" use="optional"/>
|
||||
<xs:attribute name="top" type="xs:int" use="optional"/>
|
||||
<xs:attribute name="bottom" type="xs:int" use="optional"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="RelInset">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="left" type="xs:float" use="required"/>
|
||||
<xs:attribute name="right" type="xs:float" use="required"/>
|
||||
<xs:attribute name="top" type="xs:float" use="required"/>
|
||||
<xs:attribute name="bottom" type="xs:float" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:complexType name="Inset">
|
||||
<xs:choice minOccurs="0">
|
||||
<xs:element ref="AbsInset"/>
|
||||
<xs:element ref="RelInset"/>
|
||||
</xs:choice>
|
||||
<xs:attribute name="left" type="xs:int" use="optional"/>
|
||||
<xs:attribute name="right" type="xs:int" use="optional"/>
|
||||
<xs:attribute name="top" type="xs:int" use="optional"/>
|
||||
<xs:attribute name="bottom" type="xs:int" use="optional"/>
|
||||
</xs:complexType>
|
||||
<xs:simpleType name="ColorFloat">
|
||||
<xs:restriction base="xs:float">
|
||||
<xs:minInclusive value="0.0"/>
|
||||
<xs:maxInclusive value="1.0"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:complexType name="ColorType">
|
||||
<xs:attribute name="r" type="ColorFloat" use="required"/>
|
||||
<xs:attribute name="g" type="ColorFloat" use="required"/>
|
||||
<xs:attribute name="b" type="ColorFloat" use="required"/>
|
||||
<xs:attribute name="a" type="ColorFloat" default="1.0"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="GradientType">
|
||||
<xs:sequence>
|
||||
<xs:element name="MinColor" type="ColorType"/>
|
||||
<xs:element name="MaxColor" type="ColorType"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="orientation" type="ORIENTATION" default="HORIZONTAL"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="ScriptsType">
|
||||
<xs:sequence>
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="OnLoad" type="xs:string"/>
|
||||
<xs:element name="OnSizeChanged" type="xs:string"/>
|
||||
<xs:element name="OnEvent" type="xs:string"/>
|
||||
<xs:element name="OnUpdate" type="xs:string"/>
|
||||
<xs:element name="OnShow" type="xs:string"/>
|
||||
<xs:element name="OnHide" type="xs:string"/>
|
||||
<xs:element name="OnEnter" type="xs:string"/>
|
||||
<xs:element name="OnLeave" type="xs:string"/>
|
||||
<xs:element name="OnMouseDown" type="xs:string"/>
|
||||
<xs:element name="OnMouseUp" type="xs:string"/>
|
||||
<xs:element name="OnMouseWheel" type="xs:string"/>
|
||||
<xs:element name="OnDragStart" type="xs:string"/>
|
||||
<xs:element name="OnDragStop" type="xs:string"/>
|
||||
<xs:element name="OnReceiveDrag" type="xs:string"/>
|
||||
<xs:element name="OnClick" type="xs:string"/>
|
||||
<xs:element name="OnDoubleClick" type="xs:string"/>
|
||||
<xs:element name="OnValueChanged" type="xs:string"/>
|
||||
<xs:element name="OnUpdateModel" type="xs:string"/>
|
||||
<xs:element name="OnAnimFinished" type="xs:string"/>
|
||||
<xs:element name="OnEnterPressed" type="xs:string"/>
|
||||
<xs:element name="OnEscapePressed" type="xs:string"/>
|
||||
<xs:element name="OnSpacePressed" type="xs:string"/>
|
||||
<xs:element name="OnTabPressed" type="xs:string"/>
|
||||
<xs:element name="OnTextChanged" type="xs:string"/>
|
||||
<xs:element name="OnTextSet" type="xs:string"/>
|
||||
<xs:element name="OnCursorChanged" type="xs:string"/>
|
||||
<xs:element name="OnInputLanguageChanged" type="xs:string"/>
|
||||
<xs:element name="OnEditFocusGained" type="xs:string"/>
|
||||
<xs:element name="OnEditFocusLost" type="xs:string"/>
|
||||
<xs:element name="OnHorizontalScroll" type="xs:string"/>
|
||||
<xs:element name="OnVerticalScroll" type="xs:string"/>
|
||||
<xs:element name="OnScrollRangeChanged" type="xs:string"/>
|
||||
<xs:element name="OnChar" type="xs:string"/>
|
||||
<xs:element name="OnKeyDown" type="xs:string"/>
|
||||
<xs:element name="OnKeyUp" type="xs:string"/>
|
||||
<xs:element name="OnColorSelect" type="xs:string"/>
|
||||
<xs:element name="OnHyperlinkEnter" type="xs:string"/>
|
||||
<xs:element name="OnHyperlinkLeave" type="xs:string"/>
|
||||
<xs:element name="OnHyperlinkClick" type="xs:string"/>
|
||||
<xs:element name="OnMessageScrollChanged" type="xs:string"/>
|
||||
<xs:element name="OnMovieFinished" type="xs:string"/>
|
||||
<xs:element name="OnMovieShowSubtitle" type="xs:string"/>
|
||||
<xs:element name="OnMovieHideSubtitle" type="xs:string"/>
|
||||
<xs:element name="OnTooltipSetDefaultAnchor" type="xs:string"/>
|
||||
<xs:element name="OnTooltipCleared" type="xs:string"/>
|
||||
<xs:element name="OnTooltipAddMoney" type="xs:string"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="LayoutFrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="Size" type="Dimension"/>
|
||||
<xs:element name="Anchors">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="Anchor" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:element name="Offset" type="Dimension"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="point" type="FRAMEPOINT" use="required"/>
|
||||
<xs:attribute name="relativeTo" type="xs:string"/>
|
||||
<xs:attribute name="relativePoint" type="FRAMEPOINT"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="name" type="xs:string"/>
|
||||
<xs:attribute name="inherits" type="xs:string"/>
|
||||
<xs:attribute name="virtual" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="setAllPoints" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="hidden" type="xs:boolean" default="false"/>
|
||||
</xs:complexType>
|
||||
<xs:element name="LayoutFrame" type="LayoutFrameType"/>
|
||||
<xs:complexType name="BackdropType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="BackgroundInsets" type="Inset"/>
|
||||
<xs:element name="TileSize" type="Value"/>
|
||||
<xs:element name="EdgeSize" type="Value"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="bgFile" type="xs:string"/>
|
||||
<xs:attribute name="edgeFile" type="xs:string"/>
|
||||
<xs:attribute name="tile" type="xs:boolean" default="false"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="TextureType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="LayoutFrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="TexCoords">
|
||||
<xs:complexType>
|
||||
<xs:attribute name="left" type="xs:float" use="required"/>
|
||||
<xs:attribute name="right" type="xs:float" use="required"/>
|
||||
<xs:attribute name="top" type="xs:float" use="required"/>
|
||||
<xs:attribute name="bottom" type="xs:float" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="Color" type="ColorType"/>
|
||||
<xs:element name="Gradient" type="GradientType"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="file" type="xs:string"/>
|
||||
<xs:attribute name="alphaMode" type="ALPHAMODE" default="BLEND"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="Texture" type="TextureType" substitutionGroup="LayoutFrame"/>
|
||||
<xs:complexType name="FontStringType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="LayoutFrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="FontHeight" type="Value"/>
|
||||
<xs:element name="Color" type="ColorType"/>
|
||||
<xs:element name="Shadow">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="Color" type="ColorType"/>
|
||||
<xs:element name="Offset" type="Dimension"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="font" type="xs:string"/>
|
||||
<xs:attribute name="bytes" default="255">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:int">
|
||||
<xs:minInclusive value="0"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="text" type="xs:string"/>
|
||||
<xs:attribute name="spacing" type="xs:float" default="0"/>
|
||||
<xs:attribute name="outline" type="OUTLINETYPE" default="NONE"/>
|
||||
<xs:attribute name="monochrome" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="nonspacewrap" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="justifyV" type="JUSTIFYVTYPE" default="MIDDLE"/>
|
||||
<xs:attribute name="justifyH" type="JUSTIFYHTYPE" default="CENTER"/>
|
||||
<xs:attribute name="maxLines" type="xs:unsignedInt" default="0"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="FontString" type="FontStringType" substitutionGroup="LayoutFrame"/>
|
||||
<xs:complexType name="FrameType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="LayoutFrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="TitleRegion" type="ui:LayoutFrameType"/>
|
||||
<xs:element name="ResizeBounds">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="minResize" type="Dimension"/>
|
||||
<xs:element name="maxResize" type="Dimension"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="Backdrop" type="BackdropType"/>
|
||||
<xs:element name="HitRectInsets" type="Inset"/>
|
||||
<xs:element name="Layers">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="Layer" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element ref="Texture"/>
|
||||
<xs:element ref="FontString"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="level" type="DRAWLAYER" default="ARTWORK"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="Frames">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element ref="Frame" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="Scripts" type="ScriptsType"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="alpha" type="xs:float" default="1.0"/>
|
||||
<xs:attribute name="parent" type="xs:string"/>
|
||||
<xs:attribute name="toplevel" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="movable" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="resizable" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="frameStrata" type="ui:FRAMESTRATA" default="PARENT"/>
|
||||
<xs:attribute name="frameLevel" type="xs:int"/>
|
||||
<xs:attribute name="id" type="xs:int" default="0"/>
|
||||
<xs:attribute name="enableMouse" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="enableKeyboard" type="xs:boolean" default="false"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="Frame" type="FrameType" substitutionGroup="LayoutFrame"/>
|
||||
<xs:complexType name="ButtonType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="NormalTexture" type="ui:TextureType"/>
|
||||
<xs:element name="PushedTexture" type="ui:TextureType"/>
|
||||
<xs:element name="DisabledTexture" type="ui:TextureType"/>
|
||||
<xs:element name="HighlightTexture" type="ui:TextureType"/>
|
||||
<xs:element name="NormalText" type="FontStringType"/>
|
||||
<xs:element name="HighlightText" type="FontStringType"/>
|
||||
<xs:element name="DisabledText" type="FontStringType"/>
|
||||
<xs:element name="PushedTextOffset" type="Dimension"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="text" type="xs:string"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="Button" type="ButtonType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="CheckButtonType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="ButtonType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="CheckedTexture" type="TextureType"/>
|
||||
<xs:element name="DisabledCheckedTexture" type="TextureType"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="checked" type="xs:boolean" default="false"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="CheckButton" type="CheckButtonType" substitutionGroup="ui:Button"/>
|
||||
<xs:complexType name="StatusBarType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="BarTexture" type="TextureType"/>
|
||||
<xs:element name="BarColor" type="ui:ColorType"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="drawLayer" type="ui:DRAWLAYER" default="ARTWORK"/>
|
||||
<xs:attribute name="minValue" type="xs:float"/>
|
||||
<xs:attribute name="maxValue" type="xs:float"/>
|
||||
<xs:attribute name="defaultValue" type="xs:float"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="StatusBar" type="StatusBarType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="SliderType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="ThumbTexture" type="TextureType"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="drawLayer" type="ui:DRAWLAYER" default="OVERLAY"/>
|
||||
<xs:attribute name="minValue" type="xs:float"/>
|
||||
<xs:attribute name="maxValue" type="xs:float"/>
|
||||
<xs:attribute name="defaultValue" type="xs:float"/>
|
||||
<xs:attribute name="valueStep" type="xs:float"/>
|
||||
<xs:attribute name="orientation" type="ui:ORIENTATION" default="VERTICAL"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="Slider" type="SliderType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="EditBoxType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element ref="FontString"/>
|
||||
<xs:element name="HighlightColor" type="ColorType"/>
|
||||
<xs:element name="TextInsets" type="Inset"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="letters" type="xs:int" default="0"/>
|
||||
<xs:attribute name="blinkSpeed" type="xs:float" default="0.5"/>
|
||||
<xs:attribute name="numeric" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="password" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="multiLine" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="historyLines" type="xs:int" default="0"/>
|
||||
<xs:attribute name="autoFocus" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="ignoreArrows" type="xs:boolean" default="false"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="EditBox" type="EditBoxType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="ColorSelectType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType">
|
||||
<xs:sequence>
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="ColorWheelTexture" type="TextureType"/>
|
||||
<xs:element name="ColorWheelThumbTexture" type="TextureType"/>
|
||||
<xs:element name="ColorValueTexture" type="TextureType"/>
|
||||
<xs:element name="ColorValueThumbTexture" type="TextureType"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="ColorSelect" type="ui:ColorSelectType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="ModelType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:element name="FogColor" type="ColorType"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="file" type="xs:string"/>
|
||||
<xs:attribute name="scale" type="xs:float" default="1.0"/>
|
||||
<xs:attribute name="fogNear" default="0.0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:float"/>
|
||||
</xs:simpleType>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="fogFar" default="1.0">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:float"/>
|
||||
</xs:simpleType>
|
||||
</xs:attribute>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="Model" type="ModelType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="SimpleHTMLType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="ui:FrameType">
|
||||
<xs:sequence>
|
||||
<xs:element ref="FontString"/>
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="FontStringHeader1" type="ui:FontStringType"/>
|
||||
<xs:element name="FontStringHeader2" type="ui:FontStringType"/>
|
||||
<xs:element name="FontStringHeader3" type="ui:FontStringType"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="file" type="xs:string"/>
|
||||
<xs:attribute name="hyperlinkFormat" type="xs:string" default="|H%s|h%s|h"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="SimpleHTML" type="ui:SimpleHTMLType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="MessageFrameType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element ref="FontString"/>
|
||||
<xs:element name="TextInsets" type="Inset"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="fadeDuration" type="xs:float" default="3.0"/>
|
||||
<xs:attribute name="insertMode" type="INSERTMODE" default="BOTTOM"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="MessageFrame" type="MessageFrameType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="ScrollingMessageFrameType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element ref="FontString"/>
|
||||
<xs:element name="TextInsets" type="Inset"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="fade" type="xs:boolean" default="true"/>
|
||||
<xs:attribute name="fadeDuration" type="xs:float" default="3.0"/>
|
||||
<xs:attribute name="displayDuration" type="xs:float" default="10.0"/>
|
||||
<xs:attribute name="maxLines" default="8">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:int">
|
||||
<xs:minInclusive value="1"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:attribute>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="ScrollingMessageFrame" type="ScrollingMessageFrameType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="ScrollFrameType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType">
|
||||
<xs:sequence minOccurs="0">
|
||||
<xs:choice>
|
||||
<xs:element name="ScrollChild">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element ref="Frame"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="ScrollFrame" type="ScrollFrameType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="MovieFrameType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType"/>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="MovieFrame" type="MovieFrameType" substitutionGroup="ui:Frame"/>
|
||||
<xs:element name="Ui">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:choice maxOccurs="unbounded">
|
||||
<xs:element name="Include" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="file" type="xs:string" use="required"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="Script" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="file" type="xs:string" use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element ref="LayoutFrame" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:choice>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:complexType name="WorldFrameType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType"/>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="WorldFrame" type="WorldFrameType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="GameTooltipType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType"/>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="GameTooltip" type="GameTooltipType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="MinimapType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType">
|
||||
<xs:attribute name="minimapArrowModel" type="xs:string"/>
|
||||
<xs:attribute name="minimapPlayerModel" type="xs:string"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="Minimap" type="MinimapType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="PlayerModelType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="ModelType"/>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="PlayerModel" type="PlayerModelType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="DressUpModelType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="PlayerModelType"/>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="DressUpModel" type="DressUpModelType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="TabardModelType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="PlayerModelType"/>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="TabardModel" type="TabardModelType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="LootButtonType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="ButtonType"/>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="LootButton" type="LootButtonType" substitutionGroup="ui:Frame"/>
|
||||
<xs:complexType name="TaxiRouteFrameType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="FrameType"/>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="TaxiRouteFrame" type="TaxiRouteFrameType" substitutionGroup="ui:Frame"/>
|
||||
</xs:schema>
|
||||
Reference in New Issue
Block a user