Apply Patch

This commit is contained in:
2026-10-30 16:59:08 +00:00
parent b4047a95cd
commit b740289e9d
39 changed files with 14980 additions and 0 deletions
+32
View File
@@ -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>
+34
View File
@@ -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,
}
+14
View File
@@ -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

+490
View File
@@ -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
+201
View File
@@ -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>
+973
View File
@@ -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)
+757
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+25
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+157
View File
@@ -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
+411
View File
@@ -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";
View File
+339
View File
@@ -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
+349
View File
@@ -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
+368
View File
@@ -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
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
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.
+663
View File
@@ -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>