diff --git a/README.md b/README.md
index 80c4f537..bdc666f6 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,3 @@
-# This is no longer being maintained.
-
# Worgoblin Module
[![core-build](https://github.com/benjymansy123/mod-worgoblin/actions/workflows/core-build.yml/badge.svg)](https://github.com/benjymansy123/mod-worgoblin/actions/workflows/core-build.yml)
@@ -26,9 +24,20 @@ Or you can do it manually through a text editor of your choice by changing the l
Upon downloading the repo, you'll have the patch-contents file available to you. Copy all the contents of the DBFilesClient folder to your AzerothCore Data directory. Feel free to make a backup of the DBCs you'll be replacing, as backups never hurt.
+If you have added existing custom content (Spells, Items, SkillLines..etc) to any of the DBC files listed in patch, you will want to merge and DBC file conflicts that happen. There are multiple paths of doing this easiest likely being using DBXeditor with import on any conflicting files.
+
+If you have added existing custom content (Spells, Items, SkillLines..etc) to any of the DBC files listed in patch, you will want to merge and DBC file conflicts that happen. There are multiple paths of doing this easiest likely being using DBXeditor with import on any conflicting files.
+
### 3) Compile and install AzerothCore.
-### 4) Move the [patch-contents](https://github.com/benjymansy123/mod-worgoblin/tree/master/patch-contents) folder to your Data folder in your WoW client and rename the folder to `patch-A.MPQ`.
+### 4) **Non-HD** : Move the [patch-contents](https://github.com/benjymansy123/mod-worgoblin/tree/master/patch-contents) folder to your Data folder in your WoW client and rename the folder to `patch-A.MPQ`.
+
+> [!IMPORTANT]
+> If you are running a patched HD Client support use the following instructions instead or you will have game crashes.
+
+1. Install the client file [patch-K.MPQ](https://github.com/araxiaonline/wow-client-patches/) in to your WoW Client folder C:/(path to World of Warcraft)/Data/
+2. Copy the files in patch-hd/DBFilesClient onto your server DBC location similar to NonHD version.
+3. The character creation pages also are updated with a more modern look to incorporate the 2 new races.
### 5) Remove signature checks from your WoW executable.
I recommend Windows users to use [this patcher](https://model-changing.net/index.php?app=downloads&module=downloads&controller=view&id=314&tab=details) created by kebabstorm to patch your Wow.exe file. I recommend macOS users to download this [pre-patched .app file](https://github.com/benjymansy123/custom-race-ac-12_6_21/releases/download/sig-check/WoW.app.zip), since no easy patcher exists for macOS.
diff --git a/data/patch-hd/DBFilesClient/Achievement.dbc b/data/patch-hd/DBFilesClient/Achievement.dbc
new file mode 100644
index 00000000..03dde87f
Binary files /dev/null and b/data/patch-hd/DBFilesClient/Achievement.dbc differ
diff --git a/data/patch-hd/DBFilesClient/Achievement_Criteria.dbc b/data/patch-hd/DBFilesClient/Achievement_Criteria.dbc
new file mode 100644
index 00000000..82fd72ae
Binary files /dev/null and b/data/patch-hd/DBFilesClient/Achievement_Criteria.dbc differ
diff --git a/data/patch-hd/DBFilesClient/AnimationData.dbc b/data/patch-hd/DBFilesClient/AnimationData.dbc
new file mode 100644
index 00000000..da98f5d1
Binary files /dev/null and b/data/patch-hd/DBFilesClient/AnimationData.dbc differ
diff --git a/data/patch-hd/DBFilesClient/BarberShopStyle.dbc b/data/patch-hd/DBFilesClient/BarberShopStyle.dbc
new file mode 100644
index 00000000..fc6c5e5d
Binary files /dev/null and b/data/patch-hd/DBFilesClient/BarberShopStyle.dbc differ
diff --git a/data/patch-hd/DBFilesClient/CharBaseInfo.dbc b/data/patch-hd/DBFilesClient/CharBaseInfo.dbc
new file mode 100644
index 00000000..18048502
Binary files /dev/null and b/data/patch-hd/DBFilesClient/CharBaseInfo.dbc differ
diff --git a/data/patch-hd/DBFilesClient/CharHairGeosets.dbc b/data/patch-hd/DBFilesClient/CharHairGeosets.dbc
new file mode 100644
index 00000000..694d329d
Binary files /dev/null and b/data/patch-hd/DBFilesClient/CharHairGeosets.dbc differ
diff --git a/data/patch-hd/DBFilesClient/CharHairTextures.dbc b/data/patch-hd/DBFilesClient/CharHairTextures.dbc
new file mode 100644
index 00000000..e48e5f1f
Binary files /dev/null and b/data/patch-hd/DBFilesClient/CharHairTextures.dbc differ
diff --git a/data/patch-hd/DBFilesClient/CharSections.dbc b/data/patch-hd/DBFilesClient/CharSections.dbc
new file mode 100644
index 00000000..f5de874f
Binary files /dev/null and b/data/patch-hd/DBFilesClient/CharSections.dbc differ
diff --git a/data/patch-hd/DBFilesClient/CharStartOutfit.dbc b/data/patch-hd/DBFilesClient/CharStartOutfit.dbc
new file mode 100644
index 00000000..2ff378f0
Binary files /dev/null and b/data/patch-hd/DBFilesClient/CharStartOutfit.dbc differ
diff --git a/data/patch-hd/DBFilesClient/CharacterFacialHairStyles.dbc b/data/patch-hd/DBFilesClient/CharacterFacialHairStyles.dbc
new file mode 100644
index 00000000..a68cb5e5
Binary files /dev/null and b/data/patch-hd/DBFilesClient/CharacterFacialHairStyles.dbc differ
diff --git a/data/patch-hd/DBFilesClient/ChrRaces.dbc b/data/patch-hd/DBFilesClient/ChrRaces.dbc
new file mode 100644
index 00000000..f5d2ca83
Binary files /dev/null and b/data/patch-hd/DBFilesClient/ChrRaces.dbc differ
diff --git a/data/patch-hd/DBFilesClient/CreatureDisplayInfoExtra.dbc b/data/patch-hd/DBFilesClient/CreatureDisplayInfoExtra.dbc
new file mode 100644
index 00000000..beca24c8
Binary files /dev/null and b/data/patch-hd/DBFilesClient/CreatureDisplayInfoExtra.dbc differ
diff --git a/data/patch-hd/DBFilesClient/CreatureSoundData.dbc b/data/patch-hd/DBFilesClient/CreatureSoundData.dbc
new file mode 100644
index 00000000..8f39941a
Binary files /dev/null and b/data/patch-hd/DBFilesClient/CreatureSoundData.dbc differ
diff --git a/data/patch-hd/DBFilesClient/Creaturedisplayinfo.dbc b/data/patch-hd/DBFilesClient/Creaturedisplayinfo.dbc
new file mode 100644
index 00000000..f0e6c5b9
Binary files /dev/null and b/data/patch-hd/DBFilesClient/Creaturedisplayinfo.dbc differ
diff --git a/data/patch-hd/DBFilesClient/Creaturemodeldata.dbc b/data/patch-hd/DBFilesClient/Creaturemodeldata.dbc
new file mode 100644
index 00000000..17b894e3
Binary files /dev/null and b/data/patch-hd/DBFilesClient/Creaturemodeldata.dbc differ
diff --git a/data/patch-hd/DBFilesClient/EmotesTextSound.dbc b/data/patch-hd/DBFilesClient/EmotesTextSound.dbc
new file mode 100644
index 00000000..48d9c709
Binary files /dev/null and b/data/patch-hd/DBFilesClient/EmotesTextSound.dbc differ
diff --git a/data/patch-hd/DBFilesClient/Faction.dbc b/data/patch-hd/DBFilesClient/Faction.dbc
new file mode 100644
index 00000000..66a13aa8
Binary files /dev/null and b/data/patch-hd/DBFilesClient/Faction.dbc differ
diff --git a/data/patch-hd/DBFilesClient/HelmetGeosetVisData.dbc b/data/patch-hd/DBFilesClient/HelmetGeosetVisData.dbc
new file mode 100644
index 00000000..1e44d6d3
Binary files /dev/null and b/data/patch-hd/DBFilesClient/HelmetGeosetVisData.dbc differ
diff --git a/data/patch-hd/DBFilesClient/Item.dbc b/data/patch-hd/DBFilesClient/Item.dbc
new file mode 100644
index 00000000..c9bdb965
Binary files /dev/null and b/data/patch-hd/DBFilesClient/Item.dbc differ
diff --git a/data/patch-hd/DBFilesClient/ItemDisplayInfo.dbc b/data/patch-hd/DBFilesClient/ItemDisplayInfo.dbc
new file mode 100644
index 00000000..713627c3
Binary files /dev/null and b/data/patch-hd/DBFilesClient/ItemDisplayInfo.dbc differ
diff --git a/data/patch-hd/DBFilesClient/NameGen.dbc b/data/patch-hd/DBFilesClient/NameGen.dbc
new file mode 100644
index 00000000..138f0d62
Binary files /dev/null and b/data/patch-hd/DBFilesClient/NameGen.dbc differ
diff --git a/data/patch-hd/DBFilesClient/SkillLine.dbc b/data/patch-hd/DBFilesClient/SkillLine.dbc
new file mode 100644
index 00000000..daeb25aa
Binary files /dev/null and b/data/patch-hd/DBFilesClient/SkillLine.dbc differ
diff --git a/data/patch-hd/DBFilesClient/SkillLineAbility.dbc b/data/patch-hd/DBFilesClient/SkillLineAbility.dbc
new file mode 100644
index 00000000..0a5c6295
Binary files /dev/null and b/data/patch-hd/DBFilesClient/SkillLineAbility.dbc differ
diff --git a/data/patch-hd/DBFilesClient/SkillRaceClassInfo.dbc b/data/patch-hd/DBFilesClient/SkillRaceClassInfo.dbc
new file mode 100644
index 00000000..2b3f77fa
Binary files /dev/null and b/data/patch-hd/DBFilesClient/SkillRaceClassInfo.dbc differ
diff --git a/data/patch-hd/DBFilesClient/SoundEntries.dbc b/data/patch-hd/DBFilesClient/SoundEntries.dbc
new file mode 100644
index 00000000..9af17371
Binary files /dev/null and b/data/patch-hd/DBFilesClient/SoundEntries.dbc differ
diff --git a/data/patch-hd/DBFilesClient/Spell.dbc b/data/patch-hd/DBFilesClient/Spell.dbc
new file mode 100644
index 00000000..686ff4e6
Binary files /dev/null and b/data/patch-hd/DBFilesClient/Spell.dbc differ
diff --git a/data/patch-hd/DBFilesClient/SpellIcon.dbc b/data/patch-hd/DBFilesClient/SpellIcon.dbc
new file mode 100644
index 00000000..da5aa018
Binary files /dev/null and b/data/patch-hd/DBFilesClient/SpellIcon.dbc differ
diff --git a/data/patch-hd/DBFilesClient/SummonProperties.dbc b/data/patch-hd/DBFilesClient/SummonProperties.dbc
new file mode 100644
index 00000000..7da945f4
Binary files /dev/null and b/data/patch-hd/DBFilesClient/SummonProperties.dbc differ
diff --git a/data/patch-hd/DBFilesClient/TalentTab.dbc b/data/patch-hd/DBFilesClient/TalentTab.dbc
new file mode 100644
index 00000000..4b9674de
Binary files /dev/null and b/data/patch-hd/DBFilesClient/TalentTab.dbc differ
diff --git a/data/patch-hd/DBFilesClient/VocalUISounds.dbc b/data/patch-hd/DBFilesClient/VocalUISounds.dbc
new file mode 100644
index 00000000..68c9cbcb
Binary files /dev/null and b/data/patch-hd/DBFilesClient/VocalUISounds.dbc differ
diff --git a/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Female-Gilnean.blp b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Female-Gilnean.blp
new file mode 100644
index 00000000..c5a036e7
Binary files /dev/null and b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Female-Gilnean.blp differ
diff --git a/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Female-Goblin.blp b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Female-Goblin.blp
new file mode 100644
index 00000000..626bf990
Binary files /dev/null and b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Female-Goblin.blp differ
diff --git a/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Female-Worgen.blp b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Female-Worgen.blp
new file mode 100644
index 00000000..7c12a721
Binary files /dev/null and b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Female-Worgen.blp differ
diff --git a/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Male-Gilnean.blp b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Male-Gilnean.blp
new file mode 100644
index 00000000..9e90a4cc
Binary files /dev/null and b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Male-Gilnean.blp differ
diff --git a/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Male-Goblin.blp b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Male-Goblin.blp
new file mode 100644
index 00000000..9f466cef
Binary files /dev/null and b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Male-Goblin.blp differ
diff --git a/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Male-Worgen.blp b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Male-Worgen.blp
new file mode 100644
index 00000000..cc5b645f
Binary files /dev/null and b/data/patch-hd/Interface/CharacterFrame/TemporaryPortrait-Male-Worgen.blp differ
diff --git a/data/patch-hd/Interface/DialogFrame/UI-DialogBox-Background-Dark.blp b/data/patch-hd/Interface/DialogFrame/UI-DialogBox-Background-Dark.blp
new file mode 100644
index 00000000..13e61d1f
Binary files /dev/null and b/data/patch-hd/Interface/DialogFrame/UI-DialogBox-Background-Dark.blp differ
diff --git a/data/patch-hd/Interface/FrameXML/PetPaperDollFrame.lua b/data/patch-hd/Interface/FrameXML/PetPaperDollFrame.lua
new file mode 100644
index 00000000..89c6562f
--- /dev/null
+++ b/data/patch-hd/Interface/FrameXML/PetPaperDollFrame.lua
@@ -0,0 +1,634 @@
+NUM_PET_RESISTANCE_TYPES = 5;
+NUM_PET_STATS = 5;
+NUM_COMPANIONS_PER_PAGE = 12;
+
+function PetPaperDollFrame_OnLoad (self)
+ self:RegisterEvent("PET_UI_UPDATE");
+ self:RegisterEvent("PET_BAR_UPDATE");
+ self:RegisterEvent("PET_UI_CLOSE");
+ self:RegisterEvent("UNIT_NAME_UPDATE");
+ self:RegisterEvent("UNIT_PET");
+ self:RegisterEvent("UNIT_PET_EXPERIENCE");
+ self:RegisterEvent("UNIT_MODEL_CHANGED");
+ self:RegisterEvent("UNIT_LEVEL");
+ self:RegisterEvent("UNIT_RESISTANCES");
+ self:RegisterEvent("UNIT_STATS");
+ self:RegisterEvent("UNIT_DAMAGE");
+ self:RegisterEvent("UNIT_RANGEDDAMAGE");
+ self:RegisterEvent("UNIT_ATTACK_SPEED");
+ self:RegisterEvent("UNIT_ATTACK_POWER");
+ self:RegisterEvent("UNIT_RANGED_ATTACK_POWER");
+ self:RegisterEvent("UNIT_DEFENSE");
+ self:RegisterEvent("UNIT_ATTACK");
+ self:RegisterEvent("PLAYER_ENTERING_WORLD");
+ self:RegisterEvent("COMPANION_LEARNED");
+ self:RegisterEvent("COMPANION_UNLEARNED");
+ self:RegisterEvent("COMPANION_UPDATE");
+ self:RegisterEvent("SPELL_UPDATE_COOLDOWN");
+ self:RegisterEvent("UNIT_ENTERED_VEHICLE");
+ self:RegisterEvent("UNIT_EXITED_VEHICLE");
+ self:RegisterEvent("PET_SPELL_POWER_UPDATE");
+
+ PetPaperDollFrameCompanionFrame.mode = "CRITTER";
+ PetPaperDollFrameCompanionFrame.idMount = GetCompanionInfo("MOUNT", 1);
+ PetPaperDollFrameCompanionFrame.pageMount = 0;
+ PetPaperDollFrameCompanionFrame.idCritter = GetCompanionInfo("CRITTER", 1);
+ PetPaperDollFrameCompanionFrame.pageCritter = 0;
+
+ PetDamageFrameLabel:SetText(format(STAT_FORMAT, DAMAGE));
+ PetAttackPowerFrameLabel:SetText(format(STAT_FORMAT, ATTACK_POWER));
+ PetArmorFrameLabel:SetText(format(STAT_FORMAT, ARMOR));
+ SetTextStatusBarTextPrefix(PetPaperDollFrameExpBar, XP);
+ PetSpellDamageFrameLabel:SetText(format(STAT_FORMAT, SPELL_BONUS));
+end
+
+local tabPoints={
+ [1]={ point="TOPLEFT", relativeTo="PetPaperDollFrameCompanionFrame", relativePoint="TOPLEFT", xoffset=70, yoffset=-39},
+ [2]={ point="LEFT", relativePoint="RIGHT", xoffset=0, yoffset=0},
+ [3]={ point="LEFT", relativePoint="RIGHT", xoffset=0, yoffset=0},
+}
+
+function PetPaperDollFrame_UpdateIsAvailable()
+ if ( (not HasPetUI()) and (GetNumCompanions("CRITTER") == 0) and (GetNumCompanions("MOUNT") == 0) ) then
+ PetPaperDollFrame.hidden = true;
+ CharacterFrameTab2:Hide();
+ CharacterFrameTab3:SetPoint("LEFT", "CharacterFrameTab2", "LEFT", 0, 0);
+ if ( PetPaperDollFrame:IsVisible() ) then --We have the pet frame selected, but nothing to show on it
+ ToggleCharacter("PaperDollFrame");
+ end
+ else
+ PetPaperDollFrame.hidden = false;
+ CharacterFrameTab2:Show();
+ CharacterFrameTab3:SetPoint("LEFT", "CharacterFrameTab2", "RIGHT", -16, 0);
+ end
+end
+
+function PetPaperDollFrame_UpdateTabs()
+ if ( not PetPaperDollFrame:IsVisible() ) then
+ -- There's no need to run this when the frame isn't shown (i.e. we're zoning), it causes problems with the subtabs (bug 145137)
+ PetPaperDollFrame_UpdateIsAvailable(); --But we still need to update the tabs on the CharacterFrame (bug 150500)
+ return;
+ end
+
+ local currVal, currRef = 1, tabPoints[1];
+
+ --PetPaperDollFrameTab1:ClearAllPoints() --Never moved, just hidden
+ PetPaperDollFrameTab2:ClearAllPoints()
+ PetPaperDollFrameTab3:ClearAllPoints()
+ if ( HasPetUI() ) then
+ PetPaperDollFrameTab1:Show();
+ PetPaperDollFrameTab1:SetPoint(currRef.point, currRef.relativeTo, currRef.relativePoint, currRef.xoffset, currRef.yoffset)
+ currVal = currVal + 1;
+ currRef = tabPoints[currVal];
+ currRef.relativeTo = PetPaperDollFrameTab1;
+ else
+ PetPaperDollFrameTab1:Hide();
+ end
+
+ if ( GetNumCompanions("CRITTER") > 0 ) then
+ PetPaperDollFrameTab2:Show();
+ PetPaperDollFrameTab2:SetPoint(currRef.point, currRef.relativeTo, currRef.relativePoint, currRef.xoffset, currRef.yoffset);
+ currVal = currVal + 1;
+ currRef = tabPoints[currVal];
+ currRef.relativeTo = PetPaperDollFrameTab2;
+ else
+ PetPaperDollFrameTab2:Hide();
+ end
+
+ if ( GetNumCompanions("MOUNT") > 0 ) then
+ PetPaperDollFrameTab3:Show();
+ PetPaperDollFrameTab3:SetPoint(currRef.point, currRef.relativeTo, currRef.relativePoint, currRef.xoffset, currRef.yoffset);
+ currVal = currVal + 1;
+ else
+ PetPaperDollFrameTab3:Hide();
+ end
+
+ PetPaperDollFrame_UpdateIsAvailable();
+
+ local selectedTab = PanelTemplates_GetSelectedTab(PetPaperDollFrame);
+ if ( (not PetPaperDollFrame.selectedTab) or (not PetPaperDollFrame_BeenViewed) or (not _G["PetPaperDollFrameTab"..selectedTab]:IsShown()) ) then
+ if ( PetPaperDollFrameTab1:IsShown() ) then
+ PetPaperDollFrame_SetTab(1);
+ elseif ( PetPaperDollFrameTab2:IsShown() ) then
+ PetPaperDollFrame_SetTab(2);
+ elseif ( PetPaperDollFrameTab3:IsShown() ) then
+ PetPaperDollFrame_SetTab(3);
+ else
+ if ( PetPaperDollFrame:IsVisible() ) then
+ ToggleCharacter("PaperDollFrame");
+ end
+ end
+ end
+
+ if ( currVal == 2 ) then --Only 1 tab shown, so no reason to make it visible.
+ PetPaperDollFrameTab1:Hide();
+ PetPaperDollFrameTab2:Hide();
+ PetPaperDollFrameTab3:Hide();
+ end
+end
+
+function PetPaperDollFrame_OnEvent (self, event, ...)
+ local arg1 = ...;
+ if ( event == "PET_UI_UPDATE" or event == "PET_UI_CLOSE" or event == "PET_BAR_UPDATE" or (event == "UNIT_PET" and arg1 == "player") or
+ (event == "UNIT_NAME_UPDATE" and arg1 == "pet") ) then
+ PetPaperDollFrame_UpdateTabs();
+ PetPaperDollFrame_Update();
+ elseif ( event == "UNIT_PET_EXPERIENCE" ) then
+ PetExpBar_Update();
+ elseif ( event == "COMPANION_LEARNED" ) then
+ if ( not CharacterFrame:IsVisible() ) then
+ SetButtonPulse(CharacterMicroButton, 60, 1);
+ end
+ if ( not PetPaperDollFrame:IsVisible() ) then
+ SetButtonPulse(CharacterFrameTab2, 60, 1);
+ end
+ PetPaperDollFrame_UpdateTabs();
+ --PetPaperDollFrame_UpdateCompanions(); --This is called in SetCompanionPage
+ PetPaperDollFrame_SetCompanionPage((PetPaperDollFrameCompanionFrame.mode=="MOUNT") and PetPaperDollFrameCompanionFrame.pageMount or PetPaperDollFrameCompanionFrame.pageCritter);
+ elseif ( event == "COMPANION_UNLEARNED" ) then
+ local page;
+ local numCompanions = GetNumCompanions(PetPaperDollFrameCompanionFrame.mode);
+ if ( PetPaperDollFrameCompanionFrame.mode=="MOUNT" ) then
+ page = PetPaperDollFrameCompanionFrame.pageMount;
+ if ( numCompanions > 0 ) then
+ PetPaperDollFrameCompanionFrame.idMount = GetCompanionInfo("MOUNT", 1);
+ PetPaperDollFrame_UpdateCompanionPreview();
+ else
+ PetPaperDollFrameCompanionFrame.idMount = nil;
+ end
+ else
+ page = PetPaperDollFrameCompanionFrame.pageCritter;
+ if ( numCompanions > 0 ) then
+ PetPaperDollFrameCompanionFrame.idCritter = GetCompanionInfo("CRITTER", 1);
+ PetPaperDollFrame_UpdateCompanionPreview()
+ else
+ PetPaperDollFrameCompanionFrame.idCritter = nil;
+ end
+ end
+ page = min(ceil(numCompanions/NUM_COMPANIONS_PER_PAGE) - 1, page);
+ page = max(page, 0);
+ PetPaperDollFrame_SetCompanionPage(page); -- The pages are 0 based to make the mathematical calculations slightly faster.
+ PetPaperDollFrame_UpdateTabs();
+ elseif ( event == "COMPANION_UPDATE" ) then
+ if ( not PetPaperDollFrameCompanionFrame.idMount ) then
+ PetPaperDollFrameCompanionFrame.idMount = GetCompanionInfo("MOUNT", 1);
+ end
+ if ( not PetPaperDollFrameCompanionFrame.idCritter ) then
+ PetPaperDollFrameCompanionFrame.idCritter = GetCompanionInfo("CRITTER", 1);
+ end
+ PetPaperDollFrame_UpdateCompanions();
+ elseif ( event == "SPELL_UPDATE_COOLDOWN" ) then
+ if ( self:IsVisible() ) then
+ PetPaperDollFrame_UpdateCompanionCooldowns();
+ end
+ elseif( event == "PET_SPELL_POWER_UPDATE" ) then
+ PetPaperDollFrame_SetSpellBonusDamage();
+ elseif ( (event == "UNIT_ENTERED_VEHICLE" or event == "UNIT_EXITED_VEHICLE") and (arg1 == "player")) then
+ PetPaperDollFrame_UpdateCompanions();
+ elseif ( arg1 == "pet" ) then
+ PetPaperDollFrame_Update();
+ end
+end
+
+function PetPaperDollFrame_SetTab(id)
+ if ( (id == 1) and HasPetUI() ) then --Pet Tab
+ PetPaperDollFrame.selectedTab=1;
+ PetPaperDollFramePetFrame:Show();
+ PetPaperDollFrameCompanionFrame:Hide();
+ PetNameText:SetText(UnitName("pet"));
+ elseif ( (id == 2) and (GetNumCompanions("CRITTER") > 0) ) then --Critter Tab
+ PetPaperDollFrame.selectedTab=2;
+ PetPaperDollFrameCompanionFrame.mode="CRITTER";
+ PetPaperDollFramePetFrame:Hide();
+ PetPaperDollFrameCompanionFrame:Show();
+ PetPaperDollFrame_SetCompanionPage(PetPaperDollFrameCompanionFrame.pageCritter);
+ for i=1,NUM_COMPANIONS_PER_PAGE do
+ _G["CompanionButton"..i]:SetDisabledTexture([[Interface\PetPaperDollFrame\UI-PetFrame-Slots-Companions]])
+ end
+ PetPaperDollFrame_UpdateCompanions();
+ PetPaperDollFrame_UpdateCompanionPreview();
+ PetNameText:SetText(COMPANIONS);
+ elseif ( (id == 3) and (GetNumCompanions("MOUNT") > 0) ) then --Mount Tab
+ PetPaperDollFrame.selectedTab=3;
+ PetPaperDollFrameCompanionFrame.mode="MOUNT";
+ PetPaperDollFramePetFrame:Hide();
+ PetPaperDollFrameCompanionFrame:Show();
+ PetPaperDollFrame_SetCompanionPage(PetPaperDollFrameCompanionFrame.pageMount);
+ for i=1,NUM_COMPANIONS_PER_PAGE do
+ _G["CompanionButton"..i]:SetDisabledTexture([[Interface\PetPaperDollFrame\UI-PetFrame-Slots-Mounts]]);
+ end
+ PetPaperDollFrame_UpdateCompanions();
+ PetPaperDollFrame_UpdateCompanionPreview();
+ PetNameText:SetText(MOUNTS);
+ end
+
+ for i=1,3 do
+ if ( i == id ) then
+ PanelTemplates_SelectTab(_G["PetPaperDollFrameTab"..i]);
+ else
+ PanelTemplates_DeselectTab(_G["PetPaperDollFrameTab"..i]);
+ end
+ end
+end
+
+function PetPaperDollFrame_FindCompanionIndex(creatureID, mode)
+ if ( not mode ) then
+ mode = PetPaperDollFrameCompanionFrame.mode;
+ end
+ if (not creatureID ) then
+ creatureID = (PetPaperDollFrameCompanionFrame.mode=="MOUNT") and PetPaperDollFrameCompanionFrame.idMount or PetPaperDollFrameCompanionFrame.idCritter;
+ end
+ for i=1,GetNumCompanions(mode) do
+ if ( GetCompanionInfo(mode, i) == creatureID ) then
+ return i;
+ end
+ end
+ return 0
+end
+
+function CompanionSummonButton_OnClick()
+ local selected = PetPaperDollFrame_FindCompanionIndex();
+ local creatureID, creatureName, spellID, icon, active = GetCompanionInfo(PetPaperDollFrameCompanionFrame.mode, selected);
+ if ( active ) then
+ DismissCompanion(PetPaperDollFrameCompanionFrame.mode);
+ PlaySound("igMainMenuOptionCheckBoxOn");
+ else
+ CallCompanion(PetPaperDollFrameCompanionFrame.mode, selected);
+ PlaySound("igMainMenuOptionCheckBoxOff");
+ end
+end
+
+function CompanionButton_OnLoad(self)
+ self:RegisterForDrag("LeftButton");
+ self:RegisterForClicks("LeftButtonUp", "RightButtonUp");
+end
+
+function CompanionButton_OnDrag(self)
+ local offset;
+
+ if ( PetPaperDollFrameCompanionFrame.mode=="CRITTER" ) then
+ offset = (PetPaperDollFrameCompanionFrame.pageCritter or 0)*NUM_COMPANIONS_PER_PAGE;
+ elseif ( PetPaperDollFrameCompanionFrame.mode=="MOUNT" ) then
+ offset = (PetPaperDollFrameCompanionFrame.pageMount or 0)*NUM_COMPANIONS_PER_PAGE;
+ end
+ local dragged = self:GetID() + offset;
+ PickupCompanion( PetPaperDollFrameCompanionFrame.mode, dragged );
+end
+
+function CompanionButton_OnClick(self, button)
+ local selected, selectedID;
+ if ( PetPaperDollFrameCompanionFrame.mode == "CRITTER" ) then
+ selected = PetPaperDollFrame_FindCompanionIndex(PetPaperDollFrameCompanionFrame.idCritter);
+ selectedID = PetPaperDollFrameCompanionFrame.idCritter;
+ elseif ( PetPaperDollFrameCompanionFrame.mode == "MOUNT" ) then
+ selected = PetPaperDollFrame_FindCompanionIndex(PetPaperDollFrameCompanionFrame.idMount);
+ selectedID = PetPaperDollFrameCompanionFrame.idMount;
+ end
+ if ( button ~= "LeftButton" or ( selectedID == self.creatureID) ) then
+ local offset;
+ if ( PetPaperDollFrameCompanionFrame.mode == "CRITTER" ) then
+ offset = (PetPaperDollFrameCompanionFrame.pageCritter or 0) * NUM_COMPANIONS_PER_PAGE;
+ elseif ( PetPaperDollFrameCompanionFrame.mode == "MOUNT" ) then
+ offset = (PetPaperDollFrameCompanionFrame.pageMount or 0) * NUM_COMPANIONS_PER_PAGE;
+ end
+ local index = self:GetID() + offset;
+ if ( self.active ) then
+ DismissCompanion(PetPaperDollFrameCompanionFrame.mode);
+ else
+ CallCompanion(PetPaperDollFrameCompanionFrame.mode, index);
+ end
+ else
+ if ( PetPaperDollFrameCompanionFrame.mode == "CRITTER" ) then
+ PetPaperDollFrameCompanionFrame.idCritter = self.creatureID;
+ PetPaperDollFrame_UpdateCompanionPreview();
+ elseif ( PetPaperDollFrameCompanionFrame.mode == "MOUNT" ) then
+ PetPaperDollFrameCompanionFrame.idMount = self.creatureID;
+ PetPaperDollFrame_UpdateCompanionPreview();
+ end
+ end
+
+ PetPaperDollFrame_UpdateCompanions();
+end
+
+function CompanionButton_OnModifiedClick(self)
+ local id = self.spellID;
+ if ( IsModifiedClick("CHATLINK") ) then
+ if ( MacroFrame and MacroFrame:IsShown() ) then
+ local spellName = GetSpellInfo(id);
+ ChatEdit_InsertLink(spellName);
+ else
+ local spellLink = GetSpellLink(id)
+ ChatEdit_InsertLink(spellLink);
+ end
+ elseif ( IsModifiedClick("PICKUPACTION") ) then
+ CompanionButton_OnDrag(self);
+ end
+ PetPaperDollFrame_UpdateCompanions(); --Set up the highlights again
+end
+function CompanionButton_OnEnter(self)
+ if ( GetCVar("UberTooltips") == "1" ) then
+ GameTooltip_SetDefaultAnchor(GameTooltip, self);
+ else
+ GameTooltip:SetOwner(self, "ANCHOR_LEFT");
+ end
+
+ if ( GameTooltip:SetHyperlink("spell:"..self.spellID) ) then
+ self.UpdateTooltip = CompanionButton_OnEnter;
+ else
+ self.UpdateTooltip = nil;
+ end
+
+ GameTooltip:Show()
+end
+
+function PetPaperDollFrame_SetCompanionPage(num)
+ if ( PetPaperDollFrameCompanionFrame.mode == "CRITTER" ) then
+ PetPaperDollFrameCompanionFrame.pageCritter = num;
+ elseif ( PetPaperDollFrameCompanionFrame.mode == "MOUNT" ) then
+ PetPaperDollFrameCompanionFrame.pageMount = num;
+ end
+
+ num = num + 1; --For easier usage
+ local maxpage = ceil(GetNumCompanions(PetPaperDollFrameCompanionFrame.mode)/NUM_COMPANIONS_PER_PAGE);
+ CompanionPageNumber:SetFormattedText(MERCHANT_PAGE_NUMBER,num, maxpage);
+ if ( num <= 1 ) then
+ CompanionPrevPageButton:Disable();
+ else
+ CompanionPrevPageButton:Enable();
+ end
+ if ( num >= maxpage ) then
+ CompanionNextPageButton:Disable();
+ else
+ CompanionNextPageButton:Enable();
+ end
+ PetPaperDollFrame_UpdateCompanions();
+ PetPaperDollFrame_UpdateCompanionCooldowns();
+end
+
+function PetPaperDollFrame_UpdateCompanions()
+ local button, iconTexture, id;
+ local creatureID, creatureName, spellID, icon, active;
+ local offset, selected;
+
+ if ( PetPaperDollFrameCompanionFrame.mode == "CRITTER" ) then
+ offset = (PetPaperDollFrameCompanionFrame.pageCritter or 0)*NUM_COMPANIONS_PER_PAGE;
+ selected = PetPaperDollFrame_FindCompanionIndex(PetPaperDollFrameCompanionFrame.idCritter);
+ elseif ( PetPaperDollFrameCompanionFrame.mode == "MOUNT" ) then
+ offset = (PetPaperDollFrameCompanionFrame.pageMount or 0)*NUM_COMPANIONS_PER_PAGE;
+ selected = PetPaperDollFrame_FindCompanionIndex(PetPaperDollFrameCompanionFrame.idMount);
+ end
+
+ for i = 1, NUM_COMPANIONS_PER_PAGE do
+ button = _G["CompanionButton"..i];
+ id = i + (offset or 0);
+ creatureID, creatureName, spellID, icon, active = GetCompanionInfo(PetPaperDollFrameCompanionFrame.mode, id);
+ button.creatureID = creatureID;
+ button.spellID = spellID;
+ button.active = active;
+ if ( creatureID ) then
+ button:SetNormalTexture(icon);
+ button:Enable();
+ else
+ button:Disable();
+ end
+ if ( (id == selected) and creatureID ) then
+ button:SetChecked(true);
+ else
+ button:SetChecked(false);
+ end
+
+ if ( active ) then
+ _G["CompanionButton"..i.."ActiveTexture"]:Show();
+ else
+ _G["CompanionButton"..i.."ActiveTexture"]:Hide();
+ end
+ end
+
+ if ( selected > 0 ) then
+ creatureID, creatureName, spellID, icon, active = GetCompanionInfo(PetPaperDollFrameCompanionFrame.mode, selected);
+ if ( active and creatureID ) then
+ CompanionSummonButton:SetText(PetPaperDollFrameCompanionFrame.mode == "MOUNT" and BINDING_NAME_DISMOUNT or PET_DISMISS);
+ else
+ CompanionSummonButton:SetText(PetPaperDollFrameCompanionFrame.mode == "MOUNT" and MOUNT or SUMMON);
+ end
+ end
+end
+
+function PetPaperDollFrame_UpdateCompanionCooldowns()
+ local offset;
+ if ( PetPaperDollFrameCompanionFrame.mode == "CRITTER" ) then
+ offset = (PetPaperDollFrameCompanionFrame.pageCritter or 0)*NUM_COMPANIONS_PER_PAGE;
+ elseif ( PetPaperDollFrameCompanionFrame.mode == "MOUNT" ) then
+ offset = (PetPaperDollFrameCompanionFrame.pageMount or 0)*NUM_COMPANIONS_PER_PAGE;
+ end
+ for i = 1, NUM_COMPANIONS_PER_PAGE do
+ local button = _G["CompanionButton"..i];
+ local cooldown = _G[button:GetName().."Cooldown"];
+ if ( button.creatureID ) then
+ local start, duration, enable = GetCompanionCooldown(PetPaperDollFrameCompanionFrame.mode, offset + button:GetID());
+ if ( start and duration and enable ) then
+ CooldownFrame_SetTimer(cooldown, start, duration, enable);
+ end
+ else
+ cooldown:Hide();
+ end
+ end
+end
+
+function PetPaperDollFrame_UpdateCompanionPreview()
+ local selected = PetPaperDollFrame_FindCompanionIndex();
+
+ if (selected > 0) then
+ local creatureID, creatureName = GetCompanionInfo(PetPaperDollFrameCompanionFrame.mode, selected);
+ CompanionModelFrame:SetCreature(creatureID);
+ CompanionSelectedName:SetText(creatureName);
+ if ( creatureName == "Mountain Horse" or creatureName == "Swift Mountain Horse" ) then
+ CompanionModelFrame:SetPosition(0,-1,1.6);
+ end
+ end
+end
+
+PetPaperDollFrame_BeenViewed = false;
+function PetPaperDollFrame_OnShow(self)
+ if ( self:IsVisible() ) then
+ PetPaperDollFrame_BeenViewed = true;
+ end
+ SetButtonPulse(CharacterFrameTab2, 0, 1); --Stop the button pulse
+ CharacterNameText:Hide();
+ PetNameText:Show();
+ PetPaperDollFrame_Update();
+ PetPaperDollFrame_UpdateTabs();
+end
+
+function PetPaperDollFrame_OnHide()
+ CharacterNameText:Show();
+ PetNameText:Hide();
+end
+
+function PetPaperDollFrame_Update()
+ local hasPetUI, canGainXP = HasPetUI();
+ if ( not hasPetUI ) then
+ return;
+ end
+ PetModelFrame:SetUnit("pet");
+ if ( UnitCreatureFamily("pet") ) then
+ PetLevelText:SetFormattedText(UNIT_TYPE_LEVEL_TEMPLATE,UnitLevel("pet"),UnitCreatureFamily("pet"));
+ end
+ if ( PetPaperDollFramePetFrame:IsShown() ) then
+ PetNameText:SetText(UnitName("pet"));
+ end
+ PetExpBar_Update();
+ PetPaperDollFrame_SetResistances();
+ PetPaperDollFrame_SetStats();
+ PaperDollFrame_SetDamage(PetDamageFrame, "Pet");
+ PaperDollFrame_SetArmor(PetArmorFrame, "Pet");
+ PaperDollFrame_SetAttackPower(PetAttackPowerFrame, "Pet");
+ PetPaperDollFrame_SetSpellBonusDamage();
+
+ if ( canGainXP ) then
+ PetPaperDollPetInfo:Show();
+ else
+ PetPaperDollPetInfo:Hide();
+ end
+end
+
+function PetPaperDollFrame_SetResistances()
+ local resistance;
+ local positive;
+ local negative;
+ local base;
+ local index;
+ local text;
+ local frame;
+ for i=1, NUM_PET_RESISTANCE_TYPES, 1 do
+ index = i + 1;
+ if ( i == NUM_PET_RESISTANCE_TYPES ) then
+ index = 1;
+ end
+ text = _G["PetMagicResText"..i];
+ frame = _G["PetMagicResFrame"..i];
+
+ base, resistance, positive, negative = UnitResistance("pet", frame:GetID());
+
+ frame.tooltip = _G["RESISTANCE"..frame:GetID().."_NAME"];
+
+ -- resistances can now be negative. Show Red if negative, Green if positive, white otherwise
+ if( resistance < 0 ) then
+ text:SetText(RED_FONT_COLOR_CODE..resistance..FONT_COLOR_CODE_CLOSE);
+ elseif( resistance == 0 ) then
+ text:SetText(resistance);
+ else
+ text:SetText(GREEN_FONT_COLOR_CODE..resistance..FONT_COLOR_CODE_CLOSE);
+ end
+
+ if ( positive ~= 0 or negative ~= 0 ) then
+ -- Otherwise build up the formula
+ frame.tooltip = frame.tooltip.. " ( "..HIGHLIGHT_FONT_COLOR_CODE..base;
+ if( positive > 0 ) then
+ frame.tooltip = frame.tooltip..GREEN_FONT_COLOR_CODE.." +"..positive;
+ end
+ if( negative < 0 ) then
+ frame.tooltip = frame.tooltip.." "..RED_FONT_COLOR_CODE..negative;
+ end
+ frame.tooltip = frame.tooltip..FONT_COLOR_CODE_CLOSE.." )";
+ end
+ end
+end
+
+function PetPaperDollFrame_SetStats()
+ for i=1, NUM_PET_STATS, 1 do
+ local label = _G["PetStatFrame"..i.."Label"];
+ local text = _G["PetStatFrame"..i.."StatText"];
+ local frame = _G["PetStatFrame"..i];
+ local stat;
+ local effectiveStat;
+ local posBuff;
+ local negBuff;
+ label:SetText(format(STAT_FORMAT, _G["SPELL_STAT"..i.."_NAME"]));
+ stat, effectiveStat, posBuff, negBuff = UnitStat("pet", i);
+ -- Set the tooltip text
+ local tooltipText = HIGHLIGHT_FONT_COLOR_CODE..format(PAPERDOLLFRAME_TOOLTIP_FORMAT, _G["SPELL_STAT"..i.."_NAME"]).." ";
+
+ if ( ( posBuff == 0 ) and ( negBuff == 0 ) ) then
+ text:SetText(effectiveStat);
+ frame.tooltip = tooltipText..effectiveStat..FONT_COLOR_CODE_CLOSE;
+ else
+ tooltipText = tooltipText..effectiveStat;
+ if ( posBuff > 0 or negBuff < 0 ) then
+ tooltipText = tooltipText.." ("..(stat - posBuff - negBuff)..FONT_COLOR_CODE_CLOSE;
+ end
+ if ( posBuff > 0 ) then
+ tooltipText = tooltipText..FONT_COLOR_CODE_CLOSE..GREEN_FONT_COLOR_CODE.."+"..posBuff..FONT_COLOR_CODE_CLOSE;
+ end
+ if ( negBuff < 0 ) then
+ tooltipText = tooltipText..RED_FONT_COLOR_CODE.." "..negBuff..FONT_COLOR_CODE_CLOSE;
+ end
+ if ( posBuff > 0 or negBuff < 0 ) then
+ tooltipText = tooltipText..HIGHLIGHT_FONT_COLOR_CODE..")"..FONT_COLOR_CODE_CLOSE;
+ end
+ frame.tooltip = tooltipText;
+
+ -- If there are any negative buffs then show the main number in red even if there are
+ -- positive buffs. Otherwise show in green.
+ if ( negBuff < 0 ) then
+ text:SetText(RED_FONT_COLOR_CODE..effectiveStat..FONT_COLOR_CODE_CLOSE);
+ else
+ text:SetText(GREEN_FONT_COLOR_CODE..effectiveStat..FONT_COLOR_CODE_CLOSE);
+ end
+ end
+
+ -- Second tooltip line
+ frame.tooltip2 = _G["DEFAULT_STAT"..i.."_TOOLTIP"];
+ if ( i == 1 ) then
+ local attackPower = effectiveStat-20;
+ frame.tooltip2 = format(frame.tooltip2, attackPower);
+ elseif ( i == 2 ) then
+ local newLineIndex = strfind(frame.tooltip2, "|n")+1;
+ frame.tooltip2 = strsub(frame.tooltip2, 1, newLineIndex);
+ frame.tooltip2 = format(frame.tooltip2, GetCritChanceFromAgility("pet"));
+ elseif ( i == 3 ) then
+ local expectedHealthGain = (((stat - posBuff - negBuff)-20)*10+20)*GetUnitHealthModifier("pet");
+ local realHealthGain = ((effectiveStat-20)*10+20)*GetUnitHealthModifier("pet");
+ local healthGain = (realHealthGain - expectedHealthGain)*GetUnitMaxHealthModifier("pet");
+ frame.tooltip2 = format(frame.tooltip2, healthGain);
+ elseif ( i == 4 ) then
+ if ( UnitHasMana("pet") ) then
+ local manaGain = ((effectiveStat-20)*15+20)*GetUnitPowerModifier("pet");
+ frame.tooltip2 = format(frame.tooltip2, manaGain, GetSpellCritChanceFromIntellect("pet"));
+ else
+ local newLineIndex = strfind(frame.tooltip2, "|n")+2;
+ frame.tooltip2 = strsub(frame.tooltip2, newLineIndex);
+ frame.tooltip2 = format(frame.tooltip2, GetSpellCritChanceFromIntellect("pet"));
+ end
+ elseif ( i == 5 ) then
+ frame.tooltip2 = format(frame.tooltip2, GetUnitHealthRegenRateFromSpirit("pet"));
+ if ( UnitHasMana("pet") ) then
+ frame.tooltip2 = frame.tooltip2.."\n"..format(MANA_REGEN_FROM_SPIRIT, GetUnitManaRegenRateFromSpirit("pet"));
+ end
+ end
+ end
+end
+
+function PetPaperDollFrame_SetSpellBonusDamage()
+ local spellDamageBonus = GetPetSpellBonusDamage();
+ local spellDamageBonusText = format("%d",spellDamageBonus);
+
+ PetSpellDamageFrameLabel:SetText(format(STAT_FORMAT, SPELL_BONUS));
+ if ( spellDamageBonus > 0 ) then
+ spellDamageBonusText = GREEN_FONT_COLOR_CODE.."+"..spellDamageBonusText..FONT_COLOR_CODE_CLOSE;
+ elseif( spellDamageBonus < 0 ) then
+ spellDamageBonusText = RED_FONT_COLOR_CODE..spellDamageBonusText..FONT_COLOR_CODE_CLOSE;
+ end
+
+ PetSpellDamageFrameStatText:SetText(spellDamageBonusText);
+ PetSpellDamageFrame.tooltip = HIGHLIGHT_FONT_COLOR_CODE..format(PAPERDOLLFRAME_TOOLTIP_FORMAT, SPELL_BONUS)..FONT_COLOR_CODE_CLOSE.." "..spellDamageBonusText;
+ PetSpellDamageFrame.tooltip2 = DEFAULT_STATSPELLBONUS_TOOLTIP;
+
+ PetSpellDamageFrame:Show();
+end
+
+function PetExpBar_Update()
+ local currXP, nextXP = GetPetExperience();
+ PetPaperDollFrameExpBar:SetMinMaxValues(min(0, currXP), nextXP);
+ PetPaperDollFrameExpBar:SetValue(currXP);
+end
diff --git a/data/patch-hd/Interface/FrameXML/UIPanelTemplates.lua b/data/patch-hd/Interface/FrameXML/UIPanelTemplates.lua
new file mode 100644
index 00000000..468c50b2
--- /dev/null
+++ b/data/patch-hd/Interface/FrameXML/UIPanelTemplates.lua
@@ -0,0 +1,465 @@
+-- functions to manage tab interfaces where only one tab of a group may be selected
+function PanelTemplates_Tab_OnClick(self, frame)
+ PanelTemplates_SetTab(frame, self:GetID())
+end
+
+function PanelTemplates_SetTab(frame, id)
+ frame.selectedTab = id;
+ PanelTemplates_UpdateTabs(frame);
+end
+
+function PanelTemplates_GetSelectedTab(frame)
+ return frame.selectedTab;
+end
+
+function PanelTemplates_UpdateTabs(frame)
+ if ( frame.selectedTab ) then
+ local tab;
+ for i=1, frame.numTabs, 1 do
+ tab = _G[frame:GetName().."Tab"..i];
+ if ( tab.isDisabled ) then
+ PanelTemplates_SetDisabledTabState(tab);
+ elseif ( i == frame.selectedTab ) then
+ PanelTemplates_SelectTab(tab);
+ else
+ PanelTemplates_DeselectTab(tab);
+ end
+ end
+ end
+end
+
+function PanelTemplates_GetTabWidth(tab)
+ local tabName = tab:GetName();
+
+ local sideWidths = 2 * _G[tabName.."Left"]:GetWidth();
+ return tab:GetTextWidth() + sideWidths;
+end
+
+function PanelTemplates_TabResize(tab, padding, absoluteSize, maxWidth, absoluteTextSize)
+ local tabName = tab:GetName();
+
+ local buttonMiddle = _G[tabName.."Middle"];
+ local buttonMiddleDisabled = _G[tabName.."MiddleDisabled"];
+ local sideWidths = 2 * _G[tabName.."Left"]:GetWidth();
+ local tabText = _G[tab:GetName().."Text"];
+ local width, tabWidth;
+ local textWidth;
+ if ( absoluteTextSize ) then
+ textWidth = absoluteTextSize;
+ else
+ textWidth = tabText:GetWidth();
+ end
+ -- If there's an absolute size specified then use it
+ if ( absoluteSize ) then
+ if ( absoluteSize < sideWidths) then
+ width = 1;
+ tabWidth = sideWidths
+ else
+ width = absoluteSize - sideWidths;
+ tabWidth = absoluteSize
+ end
+ tabText:SetWidth(width);
+ else
+ -- Otherwise try to use padding
+ if ( padding ) then
+ width = textWidth + padding;
+ else
+ width = textWidth + 24;
+ end
+ -- If greater than the maxWidth then cap it
+ if ( maxWidth and width > maxWidth ) then
+ if ( padding ) then
+ width = maxWidth + padding;
+ else
+ width = maxWidth + 24;
+ end
+ tabText:SetWidth(width);
+ else
+ tabText:SetWidth(0);
+ end
+ tabWidth = width + sideWidths;
+ end
+
+ if ( buttonMiddle ) then
+ buttonMiddle:SetWidth(width);
+ end
+ if ( buttonMiddleDisabled ) then
+ buttonMiddleDisabled:SetWidth(width);
+ end
+
+ tab:SetWidth(tabWidth);
+ local highlightTexture = _G[tabName.."HighlightTexture"];
+ if ( highlightTexture ) then
+ highlightTexture:SetWidth(tabWidth);
+ end
+end
+
+function PanelTemplates_SetNumTabs(frame, numTabs)
+ frame.numTabs = numTabs;
+end
+
+function PanelTemplates_DisableTab(frame, index)
+ _G[frame:GetName().."Tab"..index].isDisabled = 1;
+ PanelTemplates_UpdateTabs(frame);
+end
+
+function PanelTemplates_EnableTab(frame, index)
+ local tab = _G[frame:GetName().."Tab"..index];
+ tab.isDisabled = nil;
+ -- Reset text color
+ tab:SetDisabledFontObject(GameFontHighlightSmall);
+ PanelTemplates_UpdateTabs(frame);
+end
+
+function PanelTemplates_DeselectTab(tab)
+ local name = tab:GetName();
+ _G[name.."Left"]:Show();
+ _G[name.."Middle"]:Show();
+ _G[name.."Right"]:Show();
+ --tab:UnlockHighlight();
+ tab:Enable();
+ _G[name.."LeftDisabled"]:Hide();
+ _G[name.."MiddleDisabled"]:Hide();
+ _G[name.."RightDisabled"]:Hide();
+end
+
+function PanelTemplates_SelectTab(tab)
+ local name = tab:GetName();
+ _G[name.."Left"]:Hide();
+ _G[name.."Middle"]:Hide();
+ _G[name.."Right"]:Hide();
+ --tab:LockHighlight();
+ tab:Disable();
+ tab:SetDisabledFontObject(GameFontHighlightSmall);
+ _G[name.."LeftDisabled"]:Show();
+ _G[name.."MiddleDisabled"]:Show();
+ _G[name.."RightDisabled"]:Show();
+
+ if ( GameTooltip:IsOwned(tab) ) then
+ GameTooltip:Hide();
+ end
+end
+
+function PanelTemplates_SetDisabledTabState(tab)
+ local name = tab:GetName();
+ _G[name.."Left"]:Show();
+ _G[name.."Middle"]:Show();
+ _G[name.."Right"]:Show();
+ --tab:UnlockHighlight();
+ tab:Disable();
+ tab.text = tab:GetText();
+ -- Gray out text
+ tab:SetDisabledFontObject(GameFontDisableSmall);
+ _G[name.."LeftDisabled"]:Hide();
+ _G[name.."MiddleDisabled"]:Hide();
+ _G[name.."RightDisabled"]:Hide();
+end
+
+function ScrollFrameTemplate_OnMouseWheel(self, value, scrollBar)
+ scrollBar = scrollBar or _G[self:GetName() .. "ScrollBar"];
+ if ( value > 0 ) then
+ scrollBar:SetValue(scrollBar:GetValue() - (scrollBar:GetHeight() / 2));
+ else
+ scrollBar:SetValue(scrollBar:GetValue() + (scrollBar:GetHeight() / 2));
+ end
+end
+
+-- Function to handle the update of manually calculated scrollframes. Used mostly for listings with an indeterminate number of items
+function FauxScrollFrame_Update(frame, numItems, numToDisplay, valueStep, button, smallWidth, bigWidth, highlightFrame, smallHighlightWidth, bigHighlightWidth, alwaysShowScrollBar )
+ -- If more than one screen full of skills then show the scrollbar
+ local frameName = frame:GetName();
+ local scrollBar = _G[ frameName.."ScrollBar" ];
+ local showScrollBar;
+ if ( numItems > numToDisplay or alwaysShowScrollBar ) then
+ frame:Show();
+ showScrollBar = 1;
+ else
+ scrollBar:SetValue(0);
+ frame:Hide();
+ end
+ if ( frame:IsShown() ) then
+ local scrollChildFrame = _G[ frameName.."ScrollChildFrame" ];
+ local scrollUpButton = _G[ frameName.."ScrollBarScrollUpButton" ];
+ local scrollDownButton = _G[ frameName.."ScrollBarScrollDownButton" ];
+ local scrollFrameHeight = 0;
+ local scrollChildHeight = 0;
+
+ if ( numItems > 0 ) then
+ scrollFrameHeight = (numItems - numToDisplay) * valueStep;
+ scrollChildHeight = numItems * valueStep;
+ if ( scrollFrameHeight < 0 ) then
+ scrollFrameHeight = 0;
+ end
+ scrollChildFrame:Show();
+ else
+ scrollChildFrame:Hide();
+ end
+ scrollBar:SetMinMaxValues(0, scrollFrameHeight);
+ scrollBar:SetValueStep(valueStep);
+ scrollChildFrame:SetHeight(scrollChildHeight);
+
+ -- Arrow button handling
+ if ( scrollBar:GetValue() == 0 ) then
+ scrollUpButton:Disable();
+ else
+ scrollUpButton:Enable();
+ end
+ if ((scrollBar:GetValue() - scrollFrameHeight) == 0) then
+ scrollDownButton:Disable();
+ else
+ scrollDownButton:Enable();
+ end
+
+ -- Shrink because scrollbar is shown
+ if ( highlightFrame ) then
+ highlightFrame:SetWidth(smallHighlightWidth);
+ end
+ if ( button ) then
+ for i=1, numToDisplay do
+ _G[button..i]:SetWidth(smallWidth);
+ end
+ end
+ else
+ -- Widen because scrollbar is hidden
+ if ( highlightFrame ) then
+ highlightFrame:SetWidth(bigHighlightWidth);
+ end
+ if ( button ) then
+ for i=1, numToDisplay do
+ _G[button..i]:SetWidth(bigWidth);
+ end
+ end
+ end
+ return showScrollBar;
+end
+
+function FauxScrollFrame_OnVerticalScroll(self, value, itemHeight, updateFunction)
+ local scrollbar = _G[self:GetName().."ScrollBar"];
+ scrollbar:SetValue(value);
+ self.offset = floor((value / itemHeight) + 0.5);
+ if ( updateFunction ) then
+ updateFunction(self);
+ end
+end
+
+function FauxScrollFrame_GetOffset(frame)
+ return frame.offset;
+end
+
+function FauxScrollFrame_SetOffset(frame, offset)
+ frame.offset = offset;
+end
+
+-- Scrollframe functions
+function ScrollFrame_OnLoad(self)
+ _G[self:GetName().."ScrollBarScrollDownButton"]:Disable();
+ _G[self:GetName().."ScrollBarScrollUpButton"]:Disable();
+
+ local scrollbar = _G[self:GetName().."ScrollBar"];
+ scrollbar:SetMinMaxValues(0, 0);
+ scrollbar:SetValue(0);
+ self.offset = 0;
+end
+
+function ScrollFrame_OnScrollRangeChanged(self, xrange, yrange)
+ local scrollbar = _G[self:GetName().."ScrollBar"];
+ if ( not yrange ) then
+ yrange = self:GetVerticalScrollRange();
+ end
+ local value = scrollbar:GetValue();
+ if ( value > yrange ) then
+ value = yrange;
+ end
+ scrollbar:SetMinMaxValues(0, yrange);
+ scrollbar:SetValue(value);
+ if ( floor(yrange) == 0 ) then
+ if ( self.scrollBarHideable ) then
+ _G[self:GetName().."ScrollBar"]:Hide();
+ _G[scrollbar:GetName().."ScrollDownButton"]:Hide();
+ _G[scrollbar:GetName().."ScrollUpButton"]:Hide();
+ else
+ _G[scrollbar:GetName().."ScrollDownButton"]:Disable();
+ _G[scrollbar:GetName().."ScrollUpButton"]:Disable();
+ _G[scrollbar:GetName().."ScrollDownButton"]:Show();
+ _G[scrollbar:GetName().."ScrollUpButton"]:Show();
+ end
+ _G[scrollbar:GetName().."ThumbTexture"]:Hide();
+ else
+ _G[scrollbar:GetName().."ScrollDownButton"]:Show();
+ _G[scrollbar:GetName().."ScrollUpButton"]:Show();
+ _G[self:GetName().."ScrollBar"]:Show();
+ _G[scrollbar:GetName().."ScrollDownButton"]:Enable();
+ _G[scrollbar:GetName().."ThumbTexture"]:Show();
+ end
+
+ -- Hide/show scrollframe borders
+ local top = _G[self:GetName().."Top"];
+ local bottom = _G[self:GetName().."Bottom"];
+ local middle = _G[self:GetName().."Middle"];
+ if ( top and bottom and self.scrollBarHideable ) then
+ if ( self:GetVerticalScrollRange() == 0 ) then
+ top:Hide();
+ bottom:Hide();
+ else
+ top:Show();
+ bottom:Show();
+ end
+ end
+ if ( middle and self.scrollBarHideable ) then
+ if ( self:GetVerticalScrollRange() == 0 ) then
+ middle:Hide();
+ else
+ middle:Show();
+ end
+ end
+end
+
+function ScrollingEdit_OnTextChanged(self, scrollFrame)
+ -- force an update when the text changes
+ self.handleCursorChange = true;
+ ScrollingEdit_OnUpdate(self, 0, scrollFrame);
+end
+
+function ScrollingEdit_OnCursorChanged(self, x, y, w, h)
+ self.cursorOffset = y;
+ self.cursorHeight = h;
+ self.handleCursorChange = true;
+end
+
+-- NOTE: If your edit box never shows partial lines of text, then this function will not work when you use
+-- your mouse to move the edit cursor. You need the edit box to cut lines of text so that you can use your
+-- mouse to highlight those partially-seen lines; otherwise you won't be able to use the mouse to move the
+-- cursor above or below the current scroll area of the edit box.
+function ScrollingEdit_OnUpdate(self, elapsed, scrollFrame)
+local height, range, scroll, size, cursorOffset;
+ if ( self.handleCursorChange ) then
+ if ( not scrollFrame ) then
+ scrollFrame = self:GetParent();
+ end
+ height = scrollFrame:GetHeight();
+ range = scrollFrame:GetVerticalScrollRange();
+ scroll = scrollFrame:GetVerticalScroll();
+ size = height + range;
+ cursorOffset = -self.cursorOffset;
+
+ if ( math.floor(height) <= 0 or math.floor(range) <= 0 ) then
+ --Frame has no area, nothing to calculate.
+ return;
+ end
+
+ while ( cursorOffset < scroll ) do
+ scroll = (scroll - (height / 2));
+ if ( scroll < 0 ) then
+ scroll = 0;
+ end
+ scrollFrame:SetVerticalScroll(scroll);
+ end
+
+ while ( (cursorOffset + self.cursorHeight) > (scroll + height) and scroll < range ) do
+ scroll = (scroll + (height / 2));
+ if ( scroll > range ) then
+ scroll = range;
+ end
+ scrollFrame:SetVerticalScroll(scroll);
+ end
+
+ self.handleCursorChange = false;
+ end
+end
+
+function EditBox_HandleTabbing(self, tabList)
+ local editboxName = self:GetName();
+ local index;
+ for i=1, #tabList do
+ if ( editboxName == tabList[i] ) then
+ index = i;
+ break;
+ end
+ end
+ if ( IsShiftKeyDown() ) then
+ index = index - 1;
+ else
+ index = index + 1;
+ end
+
+ if ( index == 0 ) then
+ index = #tabList;
+ elseif ( index > #tabList ) then
+ index = 1;
+ end
+
+ local target = tabList[index];
+ _G[target]:SetFocus();
+end
+
+function EditBox_ClearFocus (self)
+ self:ClearFocus();
+end
+
+function EditBox_SetFocus (self)
+ self:SetFocus();
+end
+
+function EditBox_HighlightText (self)
+ self:HighlightText();
+end
+
+function EditBox_ClearHighlight (self)
+ self:HighlightText(0, 0);
+end
+
+UIFrameCache = CreateFrame("FRAME");
+local caches = {};
+function UIFrameCache:New (frameType, baseName, parent, template)
+ if ( self ~= UIFrameCache ) then
+ error("Attempt to run factory method on class member");
+ end
+
+ local frameCache = {};
+
+ setmetatable(frameCache, self);
+ self.__index = self;
+
+ frameCache.frameType = frameType;
+ frameCache.baseName = baseName;
+ frameCache.parent = parent;
+ frameCache.template = template;
+ frameCache.frames = {};
+ frameCache.usedFrames = {};
+ frameCache.numFrames = 0;
+
+ tinsert(caches, frameCache);
+
+ return frameCache;
+end
+
+function UIFrameCache:GetFrame ()
+ local frame = self.frames[1];
+ if ( frame ) then
+ tremove(self.frames, 1);
+ tinsert(self.usedFrames, frame);
+ return frame;
+ end
+
+ frame = CreateFrame(self.frameType, self.baseName .. self.numFrames + 1, self.parent, self.template);
+ frame.frameCache = self;
+ self.numFrames = self.numFrames + 1;
+ tinsert(self.usedFrames, frame);
+ return frame;
+end
+
+function UIFrameCache:ReleaseFrame (frame)
+ for k, v in next, self.frames do
+ if ( v == frame ) then
+ return;
+ end
+ end
+
+ for k, v in next, self.usedFrames do
+ if ( v == frame ) then
+ tinsert(self.frames, frame);
+ tremove(self.usedFrames, k);
+ break;
+ end
+ end
+end
diff --git a/data/patch-hd/Interface/FrameXML/UIPanelTemplates.xml b/data/patch-hd/Interface/FrameXML/UIPanelTemplates.xml
new file mode 100644
index 00000000..e574138d
--- /dev/null
+++ b/data/patch-hd/Interface/FrameXML/UIPanelTemplates.xml
@@ -0,0 +1,1028 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:GetParent():SetVerticalScroll(value);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b, 0.5);
+
+
+
+
+
+
+ self:GetParent():SetVerticalScroll(value);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ScrollFrame_OnLoad(self);
+
+
+ ScrollFrame_OnScrollRangeChanged(self, xrange, yrange);
+
+
+
+ local scrollbar = _G[self:GetName().."ScrollBar"];
+ scrollbar:SetValue(offset);
+ local min;
+ local max;
+ min, max = scrollbar:GetMinMaxValues();
+ if ( offset == 0 ) then
+ _G[scrollbar:GetName().."ScrollUpButton"]:Disable();
+ else
+ _G[scrollbar:GetName().."ScrollUpButton"]:Enable();
+ end
+ if ((scrollbar:GetValue() - max) == 0) then
+ _G[scrollbar:GetName().."ScrollDownButton"]:Disable();
+ else
+ _G[scrollbar:GetName().."ScrollDownButton"]:Enable();
+ end
+
+
+ ScrollFrameTemplate_OnMouseWheel(self, delta);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ScrollFrame_OnLoad(self);
+ _G[self:GetName().."Top"]:SetPoint("TOPLEFT", _G[self:GetName().."ScrollBar".."ScrollUpButton"], "TOPLEFT", -8, 5);
+ _G[self:GetName().."Bottom"]:SetPoint("BOTTOMLEFT", _G[self:GetName().."ScrollBar".."ScrollDownButton"], "BOTTOMLEFT", -8, -2);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ScrollFrame_OnLoad(self);
+
+
+
+ local scrollbar = _G[self:GetName().."ScrollBar"];
+ scrollbar:SetValue(offset);
+ local min;
+ local max;
+ min, max = scrollbar:GetMinMaxValues();
+ if ( offset == 0 ) then
+ _G[scrollbar:GetName().."ScrollUpButton"]:Disable();
+ else
+ _G[scrollbar:GetName().."ScrollUpButton"]:Enable();
+ end
+ if ((scrollbar:GetValue() - max) == 0) then
+ _G[scrollbar:GetName().."ScrollDownButton"]:Disable();
+ else
+ _G[scrollbar:GetName().."ScrollDownButton"]:Enable();
+ end
+
+
+ ScrollFrameTemplate_OnMouseWheel(self, delta);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EditBox_ClearFocus(self);
+
+
+ EditBox_ClearHighlight(self);
+
+
+ EditBox_HighlightText(self);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AutoCastShine_OnLoad(self);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/patch-hd/Interface/FrameXML/UIParent.xml b/data/patch-hd/Interface/FrameXML/UIParent.xml
new file mode 100644
index 00000000..caa8345a
--- /dev/null
+++ b/data/patch-hd/Interface/FrameXML/UIParent.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UIParent_OnLoad(self);
+ self.firstTimeLoaded = 1;
+
+
+
+
+ FCF_OnUpdate(elapsed);
+ ButtonPulse_OnUpdate(elapsed);
+ UnitPopup_OnUpdate(elapsed);
+ RequestBattlefieldPositions(elapsed);
+ AnimatedShine_OnUpdate(elapsed);
+ AutoCastShine_OnUpdate(nil, elapsed);
+
+
+
+ if ( self.firstTimeLoaded ~= 1 ) then
+ CloseAllWindows();
+ self.firstTimeLoaded = nil;
+ end
+
+
+
+
+
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/AllianceLogo.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/AllianceLogo.blp
new file mode 100644
index 00000000..53d56bb0
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/AllianceLogo.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/AlternateForm.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/AlternateForm.blp
new file mode 100644
index 00000000..9d06921c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/AlternateForm.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/Glue_Random_Up.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/Glue_Random_Up.blp
new file mode 100644
index 00000000..23e67a27
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/Glue_Random_Up.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/HordeLogo.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/HordeLogo.blp
new file mode 100644
index 00000000..343898c9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/HordeLogo.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/MainShadow.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/MainShadow.blp
new file mode 100644
index 00000000..a4ac6f97
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/MainShadow.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/Shadowv.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/Shadowv.blp
new file mode 100644
index 00000000..45b5d037
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/Shadowv.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CHARACTERCREATE-CLASSES.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CHARACTERCREATE-CLASSES.blp
new file mode 100644
index 00000000..ff0d29a2
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CHARACTERCREATE-CLASSES.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CHARACTERCREATE-RACES.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CHARACTERCREATE-RACES.blp
new file mode 100644
index 00000000..16518f4a
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CHARACTERCREATE-RACES.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-Gender.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-Gender.blp
new file mode 100644
index 00000000..cfa991a3
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-Gender.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-Highlights.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-Highlights.blp
new file mode 100644
index 00000000..3c1ad69f
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-Highlights.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-IconShadow.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-IconShadow.blp
new file mode 100644
index 00000000..e0dd36d5
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-IconShadow.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-RacesRound.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-RacesRound.blp
new file mode 100644
index 00000000..a244f9ef
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreate-RacesRound.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreatePatchwerk.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreatePatchwerk.blp
new file mode 100644
index 00000000..edc50ff9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/UI-CharacterCreatePatchwerk.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/charactercreate.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/charactercreate.blp
new file mode 100644
index 00000000..3f4a357a
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/charactercreate.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/charactercreateclasstrial.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/charactercreateclasstrial.blp
new file mode 100644
index 00000000..e95c6eb0
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/charactercreateclasstrial.blp differ
diff --git a/data/patch-hd/Interface/GLUES/CHARACTERCREATE/charactercreatemetalframehorizontal.blp b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/charactercreatemetalframehorizontal.blp
new file mode 100644
index 00000000..25544d2a
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/CHARACTERCREATE/charactercreatemetalframehorizontal.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-LeftArrow-Button-Down.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-LeftArrow-Button-Down.blp
new file mode 100644
index 00000000..64317ddd
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-LeftArrow-Button-Down.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-LeftArrow-Button-Highlight.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-LeftArrow-Button-Highlight.blp
new file mode 100644
index 00000000..fe8833f1
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-LeftArrow-Button-Highlight.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-LeftArrow-Button-Up.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-LeftArrow-Button-Up.blp
new file mode 100644
index 00000000..63d30dd7
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-LeftArrow-Button-Up.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Disabled-Blue.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Disabled-Blue.blp
new file mode 100644
index 00000000..424ebe29
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Disabled-Blue.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Down.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Down.blp
new file mode 100644
index 00000000..e0dae75f
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Down.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Glow.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Glow.blp
new file mode 100644
index 00000000..39be8601
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Glow.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Highlight-Blue.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Highlight-Blue.blp
new file mode 100644
index 00000000..c6bd1245
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Highlight-Blue.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Up.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Up.blp
new file mode 100644
index 00000000..84b6b3e9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-Panel-Button-Up.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-RightArrow-Button-Down.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-RightArrow-Button-Down.blp
new file mode 100644
index 00000000..5e4493fc
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-RightArrow-Button-Down.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-RightArrow-Button-Highlight.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-RightArrow-Button-Highlight.blp
new file mode 100644
index 00000000..e9c8ae6e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-RightArrow-Button-Highlight.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-RightArrow-Button-Up.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-RightArrow-Button-Up.blp
new file mode 100644
index 00000000..52c0bf65
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-RightArrow-Button-Up.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-Tooltip-Background.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-Tooltip-Background.blp
new file mode 100644
index 00000000..27214bc9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-Tooltip-Background.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue-Tooltip-Border.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue-Tooltip-Border.blp
new file mode 100644
index 00000000..1b7fa62f
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue-Tooltip-Border.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glue_Random_Up.blp b/data/patch-hd/Interface/GLUES/COMMON/Glue_Random_Up.blp
new file mode 100644
index 00000000..23e67a27
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glue_Random_Up.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Down.blp b/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Down.blp
new file mode 100644
index 00000000..84b6b3e9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Down.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Glow.blp b/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Glow.blp
new file mode 100644
index 00000000..a14de65b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Glow.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Rays.blp b/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Rays.blp
new file mode 100644
index 00000000..c80c5b0d
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Rays.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Up.blp b/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Up.blp
new file mode 100644
index 00000000..1fc311c9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glues-BigButton-Up.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glues-WOW-WotlkLogo-.blp b/data/patch-hd/Interface/GLUES/COMMON/Glues-WOW-WotlkLogo-.blp
new file mode 100644
index 00000000..cccf6a19
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glues-WOW-WotlkLogo-.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/Glues-WoW-WotLKLogo.blp b/data/patch-hd/Interface/GLUES/COMMON/Glues-WoW-WotLKLogo.blp
new file mode 100644
index 00000000..76f47672
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/Glues-WoW-WotLKLogo.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/glue-panel-button-down-blue.blp b/data/patch-hd/Interface/GLUES/COMMON/glue-panel-button-down-blue.blp
new file mode 100644
index 00000000..33c5049d
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/glue-panel-button-down-blue.blp differ
diff --git a/data/patch-hd/Interface/GLUES/COMMON/glue-panel-button-up-blue.blp b/data/patch-hd/Interface/GLUES/COMMON/glue-panel-button-up-blue.blp
new file mode 100644
index 00000000..c9c36b25
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/COMMON/glue-panel-button-up-blue.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Background_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Background_01.blp
new file mode 100644
index 00000000..334806c6
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Background_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/CandleFlameOrange.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/CandleFlameOrange.blp
new file mode 100644
index 00000000..13e3d964
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/CandleFlameOrange.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Danath03.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Danath03.blp
new file mode 100644
index 00000000..28627fe3
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Danath03.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/DanathShoulder.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/DanathShoulder.blp
new file mode 100644
index 00000000..7767f853
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/DanathShoulder.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/ElwynnTreeCanopy_Leaves01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/ElwynnTreeCanopy_Leaves01.blp
new file mode 100644
index 00000000..e97155be
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/ElwynnTreeCanopy_Leaves01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/FlagAnim_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/FlagAnim_01.blp
new file mode 100644
index 00000000..921d4c8e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/FlagAnim_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/FlagAnim_AlpaColor_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/FlagAnim_AlpaColor_01.blp
new file mode 100644
index 00000000..0d04a546
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/FlagAnim_AlpaColor_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Glow32.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Glow32.blp
new file mode 100644
index 00000000..a45d4cff
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Glow32.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/GlowWhite32.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/GlowWhite32.blp
new file mode 100644
index 00000000..ca90d607
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/GlowWhite32.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Large_Window_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Large_Window_01.blp
new file mode 100644
index 00000000..8dd0148f
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Large_Window_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/LightGlass02.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/LightGlass02.blp
new file mode 100644
index 00000000..19e0b155
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/LightGlass02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Maelstrom_LightRays.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Maelstrom_LightRays.blp
new file mode 100644
index 00000000..a435b0d7
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Maelstrom_LightRays.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/RedFlag.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/RedFlag.blp
new file mode 100644
index 00000000..f8114c77
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/RedFlag.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/ScholomanceCandle01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/ScholomanceCandle01.blp
new file mode 100644
index 00000000..93b20224
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/ScholomanceCandle01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/ScholomanceCandleOff01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/ScholomanceCandleOff01.blp
new file mode 100644
index 00000000..45a01aa1
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/ScholomanceCandleOff01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Stormwind_Wall.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Stormwind_Wall.blp
new file mode 100644
index 00000000..9b01e481
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Stormwind_Wall.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Tournament_Banner_Human01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Tournament_Banner_Human01.blp
new file mode 100644
index 00000000..885f9556
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/Tournament_Banner_Human01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance.m2 b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance.m2
new file mode 100644
index 00000000..fee56263
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance.m2 differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance00.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance00.skin
new file mode 100644
index 00000000..3a2326de
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance00.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance01.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance01.skin
new file mode 100644
index 00000000..dedc5fdd
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance01.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance02.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance02.skin
new file mode 100644
index 00000000..10c95398
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance02.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance03.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance03.skin
new file mode 100644
index 00000000..1dd17aa7
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance03.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance2.m2 b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance2.m2
new file mode 100644
index 00000000..0d023cbe
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance2.m2 differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance200.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance200.skin
new file mode 100644
index 00000000..4f87cd65
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance200.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance201.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance201.skin
new file mode 100644
index 00000000..c680cf90
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance201.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance202.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance202.skin
new file mode 100644
index 00000000..a60382c0
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance202.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance203.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance203.skin
new file mode 100644
index 00000000..2837f358
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Alliance203.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Background_Sky_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Background_Sky_01.blp
new file mode 100644
index 00000000..fd3e5ba3
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Background_Sky_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Cwindows_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Cwindows_01.blp
new file mode 100644
index 00000000..85d322c0
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Cwindows_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_DanathShoulder.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_DanathShoulder.blp
new file mode 100644
index 00000000..8d86a1f2
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_DanathShoulder.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Fog.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Fog.blp
new file mode 100644
index 00000000..342720a6
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Fog.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_LampMetal_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_LampMetal_01.blp
new file mode 100644
index 00000000..507e4ada
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_LampMetal_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Rug_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Rug_01.blp
new file mode 100644
index 00000000..06b05409
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Rug_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Shadow.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Shadow.blp
new file mode 100644
index 00000000..0f9d304c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Shadow.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Shadow_Large.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Shadow_Large.blp
new file mode 100644
index 00000000..a409818b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Shadow_Large.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Troll_sunglare.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Troll_sunglare.blp
new file mode 100644
index 00000000..f8a6642d
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_Troll_sunglare.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_column_flat_middle_nosnow.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_column_flat_middle_nosnow.blp
new file mode 100644
index 00000000..88f40436
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_column_flat_middle_nosnow.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_wall_ionic.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_wall_ionic.blp
new file mode 100644
index 00000000..941352a4
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/UI_wall_ionic.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/bench02.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/bench02.blp
new file mode 100644
index 00000000..a99dff67
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/bench02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/bm_BRspire_trims09.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/bm_BRspire_trims09.blp
new file mode 100644
index 00000000..2b2c45df
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/bm_BRspire_trims09.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/gradient5Circle.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/gradient5Circle.blp
new file mode 100644
index 00000000..41b9f973
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/gradient5Circle.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/hanginglantern01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/hanginglantern01.blp
new file mode 100644
index 00000000..1e8aee1b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/hanginglantern01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_browndoor_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_browndoor_01.blp
new file mode 100644
index 00000000..f66f5339
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_browndoor_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_cathy_floor_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_cathy_floor_01.blp
new file mode 100644
index 00000000..641a1bbe
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_cathy_floor_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_krzn_int_ceiling_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_krzn_int_ceiling_01.blp
new file mode 100644
index 00000000..31e95911
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_krzn_int_ceiling_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd__throne_trim_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd__throne_trim_01.blp
new file mode 100644
index 00000000..b8919b1c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd__throne_trim_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_int_floor_02.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_int_floor_02.blp
new file mode 100644
index 00000000..9ab4adc5
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_int_floor_02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_arch_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_arch_01.blp
new file mode 100644
index 00000000..1ad38191
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_arch_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_ceiling_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_ceiling_01.blp
new file mode 100644
index 00000000..dad1daa8
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_ceiling_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_pillar_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_pillar_01.blp
new file mode 100644
index 00000000..c6ff61bd
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_pillar_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_wall_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_wall_01.blp
new file mode 100644
index 00000000..616a381c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Alliance/mm_strmwnd_throne_wall_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/Dark_shadow.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/Dark_shadow.blp
new file mode 100644
index 00000000..270b158b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/Dark_shadow.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/DeathKnight_FloorPath.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/DeathKnight_FloorPath.blp
new file mode 100644
index 00000000..c75a44fd
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/DeathKnight_FloorPath.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/IceCrown_Clouds_Unholy02.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/IceCrown_Clouds_Unholy02.blp
new file mode 100644
index 00000000..cbc70143
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/IceCrown_Clouds_Unholy02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/UI_DeathKnight.M2 b/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/UI_DeathKnight.M2
new file mode 100644
index 00000000..768ad22d
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_DeathKnight/UI_DeathKnight.M2 differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/HAZARDLIGHTSTANDINGALPHA.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/HAZARDLIGHTSTANDINGALPHA.BLP
new file mode 100644
index 00000000..3619d4da
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/HAZARDLIGHTSTANDINGALPHA.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/HazardLightBeam.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/HazardLightBeam.blp
new file mode 100644
index 00000000..eee5fe8a
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/HazardLightBeam.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/HazardLightStanding.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/HazardLightStanding.blp
new file mode 100644
index 00000000..ce6054b3
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/HazardLightStanding.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMECOLDBREATH01.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMECOLDBREATH01.BLP
new file mode 100644
index 00000000..edf2797d
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMECOLDBREATH01.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEHAZARDLIGHTSTANDFOG.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEHAZARDLIGHTSTANDFOG.BLP
new file mode 100644
index 00000000..8be58ddf
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEHAZARDLIGHTSTANDFOG.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEHAZARDLIGHTSTANDFOG2.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEHAZARDLIGHTSTANDFOG2.BLP
new file mode 100644
index 00000000..cc183f3b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEHAZARDLIGHTSTANDFOG2.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEIRONFORGETREETOP01.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEIRONFORGETREETOP01.BLP
new file mode 100644
index 00000000..b23dc1a9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEIRONFORGETREETOP01.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEIRONFORGETRUNK01.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEIRONFORGETRUNK01.BLP
new file mode 100644
index 00000000..a1c37e13
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEIRONFORGETRUNK01.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEMETALBITSB.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEMETALBITSB.BLP
new file mode 100644
index 00000000..87eff4f6
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMEMETALBITSB.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMESPARKLEMATIC.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMESPARKLEMATIC.BLP
new file mode 100644
index 00000000..1035b5f2
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOMESPARKLEMATIC.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG01.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG01.BLP
new file mode 100644
index 00000000..0ee9d24e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG01.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG02.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG02.BLP
new file mode 100644
index 00000000..89869fad
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG02.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG03.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG03.BLP
new file mode 100644
index 00000000..c65f2ab8
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG03.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG04.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG04.BLP
new file mode 100644
index 00000000..0c498766
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG04.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG05.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG05.BLP
new file mode 100644
index 00000000..1fcea1e9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG05.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG06.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG06.BLP
new file mode 100644
index 00000000..03fa848a
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_BG06.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_GLARE.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_GLARE.BLP
new file mode 100644
index 00000000..61eeebaa
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNOME_GLARE.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNONESNOW_WIND.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNONESNOW_WIND.BLP
new file mode 100644
index 00000000..fc192cfe
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GNONESNOW_WIND.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_Gnome.M2 b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_Gnome.M2
new file mode 100644
index 00000000..e07b6f32
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_Gnome.M2 differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GnomeWinterTreeBranch05.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GnomeWinterTreeBranch05.blp
new file mode 100644
index 00000000..a58dc941
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/UI_GnomeWinterTreeBranch05.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/gradient5Circle.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/gradient5Circle.blp
new file mode 100644
index 00000000..1d42e573
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/gradient5Circle.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/snow1.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/snow1.blp
new file mode 100644
index 00000000..107b813f
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/snow1.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/ui_gnome00.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/ui_gnome00.skin
new file mode 100644
index 00000000..13bd3484
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/ui_gnome00.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/ui_gnome01.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/ui_gnome01.skin
new file mode 100644
index 00000000..3e369add
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Gnome/ui_gnome01.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/BadCoconut2.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/BadCoconut2.blp
new file mode 100644
index 00000000..67cfdfa9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/BadCoconut2.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/BadPalmFrond01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/BadPalmFrond01.blp
new file mode 100644
index 00000000..29c890c2
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/BadPalmFrond01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/BadPalmFrond02.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/BadPalmFrond02.blp
new file mode 100644
index 00000000..ee7b1c23
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/BadPalmFrond02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/FlagAnim_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/FlagAnim_01.blp
new file mode 100644
index 00000000..9eba91d5
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/FlagAnim_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/FlagAnim_AlpaColor_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/FlagAnim_AlpaColor_01.blp
new file mode 100644
index 00000000..ea59a6df
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/FlagAnim_AlpaColor_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_01.blp
new file mode 100644
index 00000000..f5dad80e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_02.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_02.blp
new file mode 100644
index 00000000..8d0d223c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_03.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_03.blp
new file mode 100644
index 00000000..74f49814
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_03.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_04.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_04.blp
new file mode 100644
index 00000000..3baa1917
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_04.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_05.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_05.blp
new file mode 100644
index 00000000..0e90c5f4
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_05.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_06.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_06.blp
new file mode 100644
index 00000000..a15a5723
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_06.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_bottom.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_bottom.blp
new file mode 100644
index 00000000..a0b906ac
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_bottom.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_engine.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_engine.blp
new file mode 100644
index 00000000..e0975e37
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_engine.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_metal01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_metal01.blp
new file mode 100644
index 00000000..9dc4402d
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_metal01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_rocket.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_rocket.blp
new file mode 100644
index 00000000..6811d035
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_rocket.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_rope.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_rope.blp
new file mode 100644
index 00000000..be070af1
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_rope.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_trim01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_trim01.blp
new file mode 100644
index 00000000..5f864eb1
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_GoblinZep_trim01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimp1.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimp1.blp
new file mode 100644
index 00000000..b0548a11
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimp1.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimp2.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimp2.blp
new file mode 100644
index 00000000..edcb6bb2
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimp2.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimp3.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimp3.blp
new file mode 100644
index 00000000..6c289543
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimp3.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimpexterior copy.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimpexterior copy.blp
new file mode 100644
index 00000000..aafe2e6e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_blimpexterior copy.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_cloth01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_cloth01.blp
new file mode 100644
index 00000000..9a3bca5b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_cloth01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_fin.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_fin.blp
new file mode 100644
index 00000000..5be5499b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_fin.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_front.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_front.blp
new file mode 100644
index 00000000..657b9f50
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_front.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_gob_wall_03.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_gob_wall_03.blp
new file mode 100644
index 00000000..8e6cae8e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_gob_wall_03.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_stix.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_stix.blp
new file mode 100644
index 00000000..4df00f9b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Horde_stix.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/OrcSign_Post_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/OrcSign_Post_01.blp
new file mode 100644
index 00000000..c71f6e55
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/OrcSign_Post_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/T_VFX_DOOR_BLACK.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/T_VFX_DOOR_BLACK.blp
new file mode 100644
index 00000000..5909dc3a
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/T_VFX_DOOR_BLACK.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/T_VFX_FIRE_ANIM02_128_Full_DESAT.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/T_VFX_FIRE_ANIM02_128_Full_DESAT.blp
new file mode 100644
index 00000000..a1fa7b83
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/T_VFX_FIRE_ANIM02_128_Full_DESAT.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde.m2 b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde.m2
new file mode 100644
index 00000000..f9e09787
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde.m2 differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde00.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde00.skin
new file mode 100644
index 00000000..9bf08a30
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde00.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde01.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde01.skin
new file mode 100644
index 00000000..713970fa
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde01.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde02.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde02.skin
new file mode 100644
index 00000000..baeb7c31
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde02.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde03.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde03.skin
new file mode 100644
index 00000000..8e732577
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde03.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde_Sky_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde_Sky_01.blp
new file mode 100644
index 00000000..6d09c479
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde_Sky_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde_Tree_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde_Tree_01.blp
new file mode 100644
index 00000000..939e6e17
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Horde_Tree_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Troll_Trunk01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Troll_Trunk01.blp
new file mode 100644
index 00000000..7f2c2d28
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Troll_Trunk01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Troll_sunglare.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Troll_sunglare.blp
new file mode 100644
index 00000000..68c530df
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/UI_Troll_sunglare.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/WinterOrc_Brazier.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/WinterOrc_Brazier.blp
new file mode 100644
index 00000000..7e9ec23c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/WinterOrc_Brazier.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/WinterOrc_MetalCurb_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/WinterOrc_MetalCurb_01.blp
new file mode 100644
index 00000000..94e44cfe
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/WinterOrc_MetalCurb_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/WinterOrc_MetalCurb_02.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/WinterOrc_MetalCurb_02.blp
new file mode 100644
index 00000000..ae2c2a94
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/WinterOrc_MetalCurb_02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Zep_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Zep_01.blp
new file mode 100644
index 00000000..ca964b6e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Zep_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Zep_02.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Zep_02.blp
new file mode 100644
index 00000000..9e5d0b6b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Zep_02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Zep_03.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Zep_03.blp
new file mode 100644
index 00000000..385450a7
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/Zep_03.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/gradient5Circle.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/gradient5Circle.blp
new file mode 100644
index 00000000..1d42e573
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/gradient5Circle.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/jlo_GoblinZep_metal01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/jlo_GoblinZep_metal01.blp
new file mode 100644
index 00000000..3970713b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/jlo_GoblinZep_metal01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/jlo_WOrc_ChainsR.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/jlo_WOrc_ChainsR.blp
new file mode 100644
index 00000000..11179be3
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/jlo_WOrc_ChainsR.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/jlo_WOrc_envMap03.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/jlo_WOrc_envMap03.blp
new file mode 100644
index 00000000..d50f19aa
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Horde/jlo_WOrc_envMap03.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/BadCoconut2.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/BadCoconut2.blp
new file mode 100644
index 00000000..67cfdfa9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/BadCoconut2.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/BadPalmFrond01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/BadPalmFrond01.blp
new file mode 100644
index 00000000..29c890c2
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/BadPalmFrond01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/BadPalmFrond02.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/BadPalmFrond02.blp
new file mode 100644
index 00000000..ee7b1c23
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/BadPalmFrond02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/Club_1H_Torch_A_01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/Club_1H_Torch_A_01.blp
new file mode 100644
index 00000000..d43f7a15
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/Club_1H_Torch_A_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/GlowOrange32.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/GlowOrange32.blp
new file mode 100644
index 00000000..7d3be69f
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/GlowOrange32.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/Meal02.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/Meal02.blp
new file mode 100644
index 00000000..a4ed6dcf
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/Meal02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/Rope02.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/Rope02.blp
new file mode 100644
index 00000000..9ce51a39
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/Rope02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/T_VFX_DOOR_BLACK.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/T_VFX_DOOR_BLACK.blp
new file mode 100644
index 00000000..5909dc3a
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/T_VFX_DOOR_BLACK.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/T_VFX_FIRE_ANIM02_128_Full_DESAT.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/T_VFX_FIRE_ANIM02_128_Full_DESAT.blp
new file mode 100644
index 00000000..a1fa7b83
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/T_VFX_FIRE_ANIM02_128_Full_DESAT.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG01.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG01.BLP
new file mode 100644
index 00000000..0163b051
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG01.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG02.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG02.BLP
new file mode 100644
index 00000000..b98fe5ff
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG02.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG03.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG03.BLP
new file mode 100644
index 00000000..7a14ec4c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG03.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG04.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG04.BLP
new file mode 100644
index 00000000..485dff4e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG04.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG05.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG05.BLP
new file mode 100644
index 00000000..cfae3a39
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG05.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG06.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG06.BLP
new file mode 100644
index 00000000..4d7a0c90
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BG06.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BUSH01.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BUSH01.BLP
new file mode 100644
index 00000000..aec81b99
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BUSH01.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BUSH02.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BUSH02.BLP
new file mode 100644
index 00000000..baf295c3
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_BUSH02.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_SACK01.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_SACK01.BLP
new file mode 100644
index 00000000..ef593d9c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_SACK01.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_SUNGLARE.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_SUNGLARE.BLP
new file mode 100644
index 00000000..68c530df
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_SUNGLARE.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_TORCH01.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_TORCH01.BLP
new file mode 100644
index 00000000..7ea73cdb
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_TORCH01.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_TRUNK01.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_TRUNK01.BLP
new file mode 100644
index 00000000..7f2c2d28
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_TRUNK01.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_WATER01.BLP b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_WATER01.BLP
new file mode 100644
index 00000000..347536d1
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_TROLL_WATER01.BLP differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll.M2 b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll.M2
new file mode 100644
index 00000000..c634880f
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll.M2 differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll00.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll00.skin
new file mode 100644
index 00000000..b29d54c2
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll00.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll01.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll01.skin
new file mode 100644
index 00000000..dbe677e4
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll01.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll02.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll02.skin
new file mode 100644
index 00000000..0903934b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll02.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll03.skin b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll03.skin
new file mode 100644
index 00000000..5df732c7
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll03.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll_BG01a.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll_BG01a.blp
new file mode 100644
index 00000000..820c037b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/UI_Troll_BG01a.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/WovenBasket01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/WovenBasket01.blp
new file mode 100644
index 00000000..568840ea
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/WovenBasket01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/YellowBoneWRope.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/YellowBoneWRope.blp
new file mode 100644
index 00000000..94259b1c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/YellowBoneWRope.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/YellowSkull01.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/YellowSkull01.blp
new file mode 100644
index 00000000..39bb1802
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/YellowSkull01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/bm_troll_tiki03.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/bm_troll_tiki03.blp
new file mode 100644
index 00000000..2178f10f
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/bm_troll_tiki03.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/gradient5Circle.blp b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/gradient5Circle.blp
new file mode 100644
index 00000000..1d42e573
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/UI_Troll/gradient5Circle.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/firefly01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/firefly01.blp
new file mode 100644
index 00000000..b5ae784f
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/firefly01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/foliage.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/foliage.blp
new file mode 100644
index 00000000..e350b546
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/foliage.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/goblin_bamboo_brown.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/goblin_bamboo_brown.blp
new file mode 100644
index 00000000..2b71df54
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/goblin_bamboo_brown.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/goblin_lightglobe_01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/goblin_lightglobe_01.blp
new file mode 100644
index 00000000..3beda12e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/goblin_lightglobe_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/gradient5circle.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/gradient5circle.blp
new file mode 100644
index 00000000..bfb5da5e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/gradient5circle.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_aloe_01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_aloe_01.blp
new file mode 100644
index 00000000..071abdd1
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_aloe_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_detaildoodads.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_detaildoodads.blp
new file mode 100644
index 00000000..bcb4e840
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_detaildoodads.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_leavesfogged.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_leavesfogged.blp
new file mode 100644
index 00000000..49a98189
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_leavesfogged.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_leavesfoggy01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_leavesfoggy01.blp
new file mode 100644
index 00000000..74b51424
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_leavesfoggy01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_mammothtreefoggy01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_mammothtreefoggy01.blp
new file mode 100644
index 00000000..898dae98
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_mammothtreefoggy01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_mossyrock_01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_mossyrock_01.blp
new file mode 100644
index 00000000..e1dbe0fd
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_mossyrock_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_palmleaf_01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_palmleaf_01.blp
new file mode 100644
index 00000000..afbb21e4
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_palmleaf_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_trunkfogged.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_trunkfogged.blp
new file mode 100644
index 00000000..427921a3
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/lostisles_trunkfogged.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/seagull01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/seagull01.blp
new file mode 100644
index 00000000..72b40059
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/seagull01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin.m2 b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin.m2
new file mode 100644
index 00000000..0ab06539
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin.m2 differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin00.skin b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin00.skin
new file mode 100644
index 00000000..ecb5aab2
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin00.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin01.skin b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin01.skin
new file mode 100644
index 00000000..61b707ef
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin01.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin02.skin b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin02.skin
new file mode 100644
index 00000000..7878f516
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin02.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin03.skin b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin03.skin
new file mode 100644
index 00000000..8c213d8c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin03.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_aloedark.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_aloedark.blp
new file mode 100644
index 00000000..fbc205b5
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_aloedark.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_aloelight.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_aloelight.blp
new file mode 100644
index 00000000..207b752c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_aloelight.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bamboofogged.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bamboofogged.blp
new file mode 100644
index 00000000..bcbe99c5
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bamboofogged.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg01.blp
new file mode 100644
index 00000000..3b768ad9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg02.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg02.blp
new file mode 100644
index 00000000..b98c2a43
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg03.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg03.blp
new file mode 100644
index 00000000..85b234a4
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg03.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg04.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg04.blp
new file mode 100644
index 00000000..4d2a1d0c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg04.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg05.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg05.blp
new file mode 100644
index 00000000..57ade81c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg05.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg06.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg06.blp
new file mode 100644
index 00000000..0a13cad2
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bg06.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bgpalms.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bgpalms.blp
new file mode 100644
index 00000000..7e20616a
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_bgpalms.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_clouds01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_clouds01.blp
new file mode 100644
index 00000000..83069ac4
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_clouds01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_flowersdark.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_flowersdark.blp
new file mode 100644
index 00000000..12dc1033
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_flowersdark.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_godrays.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_godrays.blp
new file mode 100644
index 00000000..173d1b5d
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_godrays.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_godraysmask.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_godraysmask.blp
new file mode 100644
index 00000000..6c8aaf42
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_godraysmask.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_palmdark.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_palmdark.blp
new file mode 100644
index 00000000..140dacdf
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_palmdark.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_sky.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_sky.blp
new file mode 100644
index 00000000..ee89db57
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_sky.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_sunglare.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_sunglare.blp
new file mode 100644
index 00000000..1321a21f
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_goblin/ui_goblin_sunglare.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_bush_03.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_bush_03.blp
new file mode 100644
index 00000000..2608a393
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_bush_03.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_bush_04.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_bush_04.blp
new file mode 100644
index 00000000..ff80d3e3
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_bush_04.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_lumpygrass02.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_lumpygrass02.blp
new file mode 100644
index 00000000..eb05f174
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_lumpygrass02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_rose_green.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_rose_green.blp
new file mode 100644
index 00000000..9a775e48
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_rose_green.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_vines_01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_vines_01.blp
new file mode 100644
index 00000000..e639cfbf
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_vines_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_vines_02.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_vines_02.blp
new file mode 100644
index 00000000..27662fe7
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gilneas_vines_02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gradient5circle.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gradient5circle.blp
new file mode 100644
index 00000000..41b9f973
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/gradient5circle.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/pinetreeb.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/pinetreeb.blp
new file mode 100644
index 00000000..b16d9160
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/pinetreeb.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/pinetreebranchb.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/pinetreebranchb.blp
new file mode 100644
index 00000000..c38f5c1e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/pinetreebranchb.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/pinetreebranchc.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/pinetreebranchc.blp
new file mode 100644
index 00000000..0bf7d91e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/pinetreebranchc.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/t_vfx_smoke_c.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/t_vfx_smoke_c.blp
new file mode 100644
index 00000000..4a0b3547
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/t_vfx_smoke_c.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen.m2 b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen.m2
new file mode 100644
index 00000000..293ad5af
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen.m2 differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen00.skin b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen00.skin
new file mode 100644
index 00000000..90c0689a
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen00.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen01.skin b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen01.skin
new file mode 100644
index 00000000..6db335e4
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen01.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen02.skin b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen02.skin
new file mode 100644
index 00000000..8a612d0a
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen02.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen03.skin b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen03.skin
new file mode 100644
index 00000000..074913b7
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen03.skin differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg01.blp
new file mode 100644
index 00000000..e51b6358
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg01a.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg01a.blp
new file mode 100644
index 00000000..e382106c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg01a.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg02.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg02.blp
new file mode 100644
index 00000000..7a8c3f10
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg02.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg02a.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg02a.blp
new file mode 100644
index 00000000..3c411ab6
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg02a.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg03.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg03.blp
new file mode 100644
index 00000000..7f2967f2
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg03.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg03a.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg03a.blp
new file mode 100644
index 00000000..20d101df
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg03a.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg04.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg04.blp
new file mode 100644
index 00000000..f919a696
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg04.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg04a.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg04a.blp
new file mode 100644
index 00000000..6cd23b23
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg04a.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg04b.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg04b.blp
new file mode 100644
index 00000000..f9857e66
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg04b.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg05.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg05.blp
new file mode 100644
index 00000000..bb7a4d8d
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg05.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg05a.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg05a.blp
new file mode 100644
index 00000000..087bae9e
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg05a.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg05b.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg05b.blp
new file mode 100644
index 00000000..658e9d6d
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg05b.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg06.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg06.blp
new file mode 100644
index 00000000..2758c7f9
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg06.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg06a.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg06a.blp
new file mode 100644
index 00000000..b1415011
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_bg06a.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_crescentglow.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_crescentglow.blp
new file mode 100644
index 00000000..68dd935c
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_crescentglow.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_glow01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_glow01.blp
new file mode 100644
index 00000000..9c35d35a
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_glow01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_mist.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_mist.blp
new file mode 100644
index 00000000..ac22cdbd
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_mist.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_moonglow.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_moonglow.blp
new file mode 100644
index 00000000..10cafd97
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_moonglow.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_rain01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_rain01.blp
new file mode 100644
index 00000000..b4551aef
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_rain01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_silhouette01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_silhouette01.blp
new file mode 100644
index 00000000..655f76f1
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgen_silhouette01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgenclouds01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgenclouds01.blp
new file mode 100644
index 00000000..26ced396
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgenclouds01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgenraindropsplash.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgenraindropsplash.blp
new file mode 100644
index 00000000..9d1cbf02
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/ui_worgenraindropsplash.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_flame_01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_flame_01.blp
new file mode 100644
index 00000000..fda47607
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_flame_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_glass_01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_glass_01.blp
new file mode 100644
index 00000000..37ba59f3
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_glass_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_glass_ref_01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_glass_ref_01.blp
new file mode 100644
index 00000000..cc422013
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_glass_ref_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_glow_01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_glow_01.blp
new file mode 100644
index 00000000..d18e4cd8
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_glow_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_rocks_01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_rocks_01.blp
new file mode 100644
index 00000000..720ea39b
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_rocks_01.blp differ
diff --git a/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_smoke_01.blp b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_smoke_01.blp
new file mode 100644
index 00000000..f3a60cff
Binary files /dev/null and b/data/patch-hd/Interface/GLUES/MODELS/ui_worgen/worgen_smoke_01.blp differ
diff --git a/data/patch-hd/Interface/GlueXML/.vscode/settings.json b/data/patch-hd/Interface/GlueXML/.vscode/settings.json
new file mode 100644
index 00000000..c11245f5
--- /dev/null
+++ b/data/patch-hd/Interface/GlueXML/.vscode/settings.json
@@ -0,0 +1,26 @@
+{
+ "Lua.diagnostics.globals": [
+ "AddonTooltip",
+ "AddonList",
+ "DISABLE_ADDONS",
+ "OKAY",
+ "CANCEL",
+ "ALL",
+ "AddonDialogButton1",
+ "AddonDialogBackground",
+ "AddonCharacterDropDown",
+ "ADDON_DEPENDENCIES",
+ "AddonDialogText",
+ "AddonDialogButton2",
+ "ENABLED_FOR_SOME",
+ "enabled",
+ "message",
+ "LocalizeFrames",
+ "DAYS_ABBR",
+ "HOURS_ABBR",
+ "MINUTES_ABBR",
+ "SECONDS_ABBR",
+ "MALE",
+ "FEMALE"
+ ]
+}
\ No newline at end of file
diff --git a/data/patch-hd/Interface/GlueXML/AddonList.lua b/data/patch-hd/Interface/GlueXML/AddonList.lua
new file mode 100644
index 00000000..21edb0a5
--- /dev/null
+++ b/data/patch-hd/Interface/GlueXML/AddonList.lua
@@ -0,0 +1,425 @@
+ADDON_BUTTON_HEIGHT = 16;
+MAX_ADDONS_DISPLAYED = 19;
+
+function UpdateAddonButton()
+ if ( GetNumAddOns() > 0 ) then
+ -- Check to see if any of them are out of date and not disabled
+ if ( IsAddonVersionCheckEnabled() and AddonList_HasOutOfDate() and not HasShownAddonOutOfDateDialog ) then
+ AddonDialog_Show("ADDONS_OUT_OF_DATE");
+ HasShownAddonOutOfDateDialog = true;
+ end
+ if ( AddonList_HasNewVersion() ) then
+ CharacterSelectAddonsButtonGlow:Show();
+ else
+ CharacterSelectAddonsButtonGlow:Hide();
+ end
+ CharacterSelectAddonsButton:Show();
+ else
+ CharacterSelectAddonsButton:Hide();
+ end
+end
+
+function AddonList_OnLoad(self)
+ self.offset = 0;
+end
+
+function AddonList_Update()
+ local numEntrys = GetNumAddOns();
+ local name, title, notes, url, loadable, reason, security, newVersion;
+ local addonIndex;
+ local entry, checkbox, string, status, urlButton, securityIcon, versionButton;
+
+ -- Get the character from the current list (nil is all characters)
+ local character = GlueDropDownMenu_GetSelectedValue(AddonCharacterDropDown);
+ if ( character == ALL ) then
+ character = nil;
+ end
+ local enabled, checkboxState;
+
+ for i=1, MAX_ADDONS_DISPLAYED do
+ addonIndex = AddonList.offset + i;
+ entry = getglobal("AddonListEntry"..i);
+ if ( addonIndex > numEntrys ) then
+ entry:Hide();
+ else
+ name, title, notes, url, loadable, reason, security, newVersion = GetAddOnInfo(addonIndex);
+ -- GetAddOnEnableState() returns 0, 1, 2 (disabled, enabled for some, enabled for all)
+ checkboxState = GetAddOnEnableState(character, addonIndex);
+ enabled = (checkboxState > 0);
+
+ checkbox = getglobal("AddonListEntry"..i.."Enabled");
+ -- If some are enabled then set the checkbox to be gray
+ TriStateCheckbox_SetState(checkboxState, checkbox);
+ if ( checkboxState == 1 ) then
+ checkbox.tooltip = ENABLED_FOR_SOME;
+ else
+ checkbox.tooltip = nil;
+ end
+
+ string = getglobal("AddonListEntry"..i.."Title");
+ if ( loadable ) then
+ string:SetTextColor(1.0, 0.78, 0.0);
+ elseif ( enabled and reason ~= "DEP_DISABLED" ) then
+ string:SetTextColor(1.0, 0.1, 0.1);
+ else
+ string:SetTextColor(0.5, 0.5, 0.5);
+ end
+ if ( title ) then
+ string:SetText(title);
+ else
+ string:SetText(name);
+ end
+ urlButton = getglobal("AddonListEntry"..i.."URL");
+ versionButton = getglobal("AddonListEntry"..i.."Update");
+ if ( url ) then
+ if ( newVersion ) then
+ versionButton.tooltip = ADDON_UPDATE_AVAILABLE..CLICK_TO_LAUNCH_ADDON_URL..url;
+ versionButton.url = url;
+ versionButton:Show();
+ urlButton:Hide();
+ else
+ versionButton:Hide();
+ urlButton.tooltip = CLICK_TO_LAUNCH_ADDON_URL..url;
+ urlButton.url = url;
+ urlButton:Show();
+ end
+
+ else
+ versionButton:Hide();
+ urlButton:Hide();
+ end
+ securityIcon = getglobal("AddonListEntry"..i.."SecurityIcon");
+ if ( security == "SECURE" ) then
+ AddonList_SetSecurityIcon(securityIcon, 1);
+ elseif ( security == "INSECURE" ) then
+ AddonList_SetSecurityIcon(securityIcon, 2);
+ elseif ( security == "BANNED" ) then
+ AddonList_SetSecurityIcon(securityIcon, 3);
+ end
+ getglobal("AddonListEntry"..i.."Security").tooltip = getglobal("ADDON_"..security);
+ string = getglobal("AddonListEntry"..i.."Status");
+ if ( reason ) then
+ string:SetText(getglobal("ADDON_"..reason));
+ else
+ string:SetText("");
+ end
+
+ entry:SetID(addonIndex);
+
+ -- AIO Always enable
+ if(title ~= "AIO") then
+ entry:Show();
+ else -- If addon is AIO
+
+ local character = GlueDropDownMenu_GetSelectedValue(AddonCharacterDropDown);
+ if ( character == ALL ) then
+ character = nil;
+ end
+ EnableAddOn(character, i);
+
+ local checkbox = getglobal("AddonListEntry"..i.."Enabled")
+ checkbox:SetChecked(true)
+ string = getglobal("AddonListEntry"..i.."Title");
+ string:SetTextColor(1.0, 0.78, 0.0);
+ local status = getglobal("AddonListEntry"..i.."Status")
+ status:SetText("Addon required! disable blocked")
+ status:SetTextColor(1.0, 0.78, 0.0)
+
+ -- Add padlock
+
+ if( not _G['AddonListEntry'..i.."Padlock"] ) then
+
+ local padlock = CreateFrame("Frame", "AddonListEntry"..i.."Padlock", entry, "")
+ padlock:SetSize(16, 19)
+ padlock:SetPoint("TOPLEFT", checkbox, "TOPLEFT", 7, -6)
+ padlock:SetFrameStrata("FULLSCREEN")
+
+
+ checkbox:SetCheckedTexture("")
+
+ padlock.texture = padlock:CreateTexture()
+ padlock.texture:SetAllPoints(padlock)
+ padlock.texture:SetTexture("Interface\\GLUES\\CharacterSelect\\Glues-AddOn-Icons")
+ padlock.texture:SetTexCoord(0, 0.234375, 0, 1)
+
+ end
+
+ entry:Show();
+
+ end
+ end
+ end
+
+ -- ScrollFrame stuff
+ GlueScrollFrame_Update(AddonListScrollFrame, numEntrys, MAX_ADDONS_DISPLAYED, ADDON_BUTTON_HEIGHT);
+end
+
+function AddonTooltip_BuildDeps(...)
+ local deps = "";
+ for i=1, select("#", ...) do
+ if ( i == 1 ) then
+ deps = ADDON_DEPENDENCIES;
+ end
+ deps = deps..", "..select(i, ...);
+ end
+ return deps;
+end
+
+function AddonTooltip_Update(owner)
+ AddonTooltip.owner = owner;
+ local name, title, notes = GetAddOnInfo(owner:GetID());
+ if ( title ) then
+ AddonTooltipTitle:SetText(title);
+ else
+ AddonTooltipTitle:SetText(name);
+ end
+ AddonTooltipNotes:SetText(notes);
+ AddonTooltipDeps:SetText(AddonTooltip_BuildDeps(GetAddOnDependencies(owner:GetID())));
+
+ local titleHeight = AddonTooltipTitle:GetHeight();
+ local notesHeight = AddonTooltipNotes:GetHeight();
+ local depsHeight = AddonTooltipDeps:GetHeight();
+ AddonTooltip:SetHeight(10+titleHeight+2+notesHeight+2+depsHeight+10);
+end
+
+function AddonList_OnKeyDown(key)
+ if ( key == "ESCAPE" ) then
+ AddonList_OnCancel();
+ elseif ( key == "ENTER" ) then
+ AddonList_OnOk();
+ elseif ( key == "PRINTSCREEN" ) then
+ Screenshot();
+ end
+end
+
+function AddonList_Enable(index, enabled)
+ local character = GlueDropDownMenu_GetSelectedValue(AddonCharacterDropDown);
+ if ( character == ALL ) then
+ character = nil;
+ end
+
+ -- AIO Always enable
+ local name, title, notes, url, loadable, reason, security, newVersion = GetAddOnInfo(index);
+ if( title == "AIO" ) then
+ EnableAddOn(character, index);
+ else
+ if ( enabled ) then
+ EnableAddOn(character, index);
+ else
+ DisableAddOn(character, index);
+ end
+ end
+
+ AddonList_Update();
+end
+
+function AddonList_OnOk()
+ PlaySound("gsLoginChangeRealmOK");
+ SaveAddOns();
+ AddonList:Hide();
+end
+
+function AddonList_OnCancel()
+ PlaySound("gsLoginChangeRealmCancel");
+ ResetAddOns();
+ AddonList:Hide();
+end
+
+function AddonListScrollFrame_OnVerticalScroll(self, offset)
+ local scrollbar = getglobal(self:GetName().."ScrollBar");
+ scrollbar:SetValue(offset);
+ AddonList.offset = floor((offset / ADDON_BUTTON_HEIGHT) + 0.5);
+ AddonList_Update();
+ if ( AddonTooltip:IsShown() ) then
+ AddonTooltip_Update(AddonTooltip.owner);
+ end
+end
+
+function AddonList_OnShow()
+ AddonList_Update();
+end
+
+function AddonList_HasOutOfDate()
+ local hasOutOfDate = false;
+ for i=1, GetNumAddOns() do
+ local name, title, notes, url, loadable, reason = GetAddOnInfo(i);
+ if ( enabled and not loadable and reason == "INTERFACE_VERSION" ) then
+ hasOutOfDate = true;
+ break;
+ end
+ end
+ return hasOutOfDate;
+end
+
+function AddonList_SetSecurityIcon(texture, index)
+ local width = 64;
+ local height = 16;
+ local iconWidth = 16;
+ local increment = iconWidth/width;
+ local left = (index - 1) * increment;
+ local right = index * increment;
+ texture:SetTexCoord( left, right, 0, 1.0);
+end
+
+function AddonList_DisableOutOfDate()
+ for i=1, GetNumAddOns() do
+ local name, title, notes, url, loadable, reason = GetAddOnInfo(i);
+ if ( enabled and not loadable and reason == "INTERFACE_VERSION" ) then
+ DisableAddOn(i);
+ end
+ end
+end
+
+function AddonList_HasNewVersion()
+ local hasNewVersion = false;
+ for i=1, GetNumAddOns() do
+ local name, title, notes, url, loadable, reason, security, newVersion = GetAddOnInfo(i);
+ if ( newVersion ) then
+ hasNewVersion = true;
+ break;
+ end
+ end
+ return hasNewVersion;
+end
+
+AddonDialogTypes = { };
+
+AddonDialogTypes["ADDONS_OUT_OF_DATE"] = {
+ text = ADDONS_OUT_OF_DATE,
+ button1 = DISABLE_ADDONS,
+ button2 = LOAD_ADDONS,
+ OnAccept = function()
+ AddonDialog_Show("CONFIRM_DISABLE_ADDONS");
+ end,
+ OnCancel = function()
+ AddonDialog_Show("CONFIRM_LOAD_ADDONS");
+ end,
+}
+
+AddonDialogTypes["CONFIRM_LOAD_ADDONS"] = {
+ text = CONFIRM_LOAD_ADDONS,
+ button1 = OKAY,
+ button2 = CANCEL,
+ OnAccept = function()
+ SetAddonVersionCheck(0);
+ end,
+ OnCancel = function()
+ AddonDialog_Show("ADDONS_OUT_OF_DATE");
+ end,
+}
+
+AddonDialogTypes["CONFIRM_DISABLE_ADDONS"] = {
+ text = CONFIRM_DISABLE_ADDONS,
+ button1 = OKAY,
+ button2 = CANCEL,
+ OnAccept = function()
+ AddonList_DisableOutOfDate();
+ end,
+ OnCancel = function()
+ AddonDialog_Show("ADDONS_OUT_OF_DATE");
+ end,
+}
+
+AddonDialogTypes["CONFIRM_LAUNCH_ADDON_URL"] = {
+ text = CONFIRM_LAUNCH_ADDON_URL,
+ button1 = OKAY,
+ button2 = CANCEL,
+ OnAccept = function()
+ LaunchAddOnURL(AddonList.selectedID);
+ end
+}
+
+function AddonDialog_Show(which, arg1)
+ -- Set the text of the dialog
+ if ( arg1 ) then
+ AddonDialogText:SetFormattedText(AddonDialogTypes[which].text, arg1);
+ else
+ AddonDialogText:SetText(AddonDialogTypes[which].text);
+ end
+
+ -- Set the buttons of the dialog
+ if ( AddonDialogTypes[which].button2 ) then
+ AddonDialogButton1:ClearAllPoints();
+ AddonDialogButton1:SetPoint("BOTTOMRIGHT", "AddonDialogBackground", "BOTTOM", -6, 16);
+ AddonDialogButton2:ClearAllPoints();
+ AddonDialogButton2:SetPoint("LEFT", "AddonDialogButton1", "RIGHT", 13, 0);
+ AddonDialogButton2:SetText(AddonDialogTypes[which].button2);
+ AddonDialogButton2:Show();
+ else
+ AddonDialogButton1:ClearAllPoints();
+ AddonDialogButton1:SetPoint("BOTTOM", "AddonDialogBackground", "BOTTOM", 0, 16);
+ AddonDialogButton2:Hide();
+ end
+
+ AddonDialogButton1:SetText(AddonDialogTypes[which].button1);
+
+ -- Set the miscellaneous variables for the dialog
+ AddonDialog.which = which;
+
+ -- Finally size and show the dialog
+ AddonDialogBackground:SetHeight(16 + AddonDialogText:GetHeight() + 8 + AddonDialogButton1:GetHeight() + 16);
+ AddonDialog:Show();
+end
+
+function AddonDialog_OnClick(index)
+ AddonDialog:Hide();
+ if ( index == 1 ) then
+ local OnAccept = AddonDialogTypes[AddonDialog.which].OnAccept;
+ if ( OnAccept ) then
+ OnAccept();
+ end
+ else
+ local OnCancel = AddonDialogTypes[AddonDialog.which].OnCancel;
+ if ( OnCancel ) then
+ OnCancel();
+ end
+ end
+end
+
+function AddonDialog_OnKeyDown(key)
+ if ( key == "PRINTSCREEN" ) then
+ Screenshot();
+ return;
+ end
+
+ if ( key == "ESCAPE" ) then
+ if ( AddonDialogButton2:IsShown() ) then
+ AddonDialogButton2:Click();
+ else
+ AddonDialogButton1:Click();
+ end
+ elseif (key == "ENTER" ) then
+ AddonDialogButton1:Click();
+ end
+end
+
+function AddonListCharacterDropDown_OnClick(self)
+ GlueDropDownMenu_SetSelectedValue(AddonCharacterDropDown, self.value);
+ AddonList_Update();
+end
+
+function AddonListCharacterDropDown_Initialize()
+ local selectedValue = GlueDropDownMenu_GetSelectedValue(AddonCharacterDropDown);
+ local info;
+
+ info = {};
+ info.text = ALL;
+ info.value = ALL;
+ info.func = AddonListCharacterDropDown_OnClick;
+ if ( not selectedValue ) then
+ info.checked = 1;
+ end
+ GlueDropDownMenu_AddButton(info);
+
+ for i=1, GetNumCharacters() do
+ info.text = GetCharacterInfo(i);
+ info.value = GetCharacterInfo(i);
+ info.func = AddonListCharacterDropDown_OnClick;
+ if ( selectedValue == info.value ) then
+ info.checked = 1;
+ else
+ info.checked = nil;
+ end
+ GlueDropDownMenu_AddButton(info);
+ end
+end
diff --git a/data/patch-hd/Interface/GlueXML/AddonList.xml b/data/patch-hd/Interface/GlueXML/AddonList.xml
new file mode 100644
index 00000000..d97b36e3
--- /dev/null
+++ b/data/patch-hd/Interface/GlueXML/AddonList.xml
@@ -0,0 +1,898 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GlueDropDownMenu_Initialize(self, AddonListCharacterDropDown_Initialize);
+ GlueDropDownMenu_SetSelectedValue(self, ALL);
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AddonList_OnCancel();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if ( IsAddonVersionCheckEnabled() ) then
+ self:SetChecked(0);
+ else
+ self:SetChecked(1);
+ end
+
+
+ if ( self:GetChecked() ) then
+ SetAddonVersionCheck(0);
+ else
+ SetAddonVersionCheck(1);
+ end
+ AddonList_Update();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AddonListScrollFrame_OnVerticalScroll(self, offset);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ local character = GlueDropDownMenu_GetSelectedValue(AddonCharacterDropDown);
+ if ( character == ALL ) then
+ character = nil;
+ end
+ DisableAllAddOns(character);
+ AddonList_Update();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ local character = GlueDropDownMenu_GetSelectedValue(AddonCharacterDropDown);
+ if ( character == ALL ) then
+ character = nil;
+ end
+ EnableAllAddOns(character);
+ AddonList_Update();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AddonList_OnCancel();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AddonList_OnOk();
+
+
+
+
+
+
+
+
+ AddonList_OnLoad(self);
+
+
+ AddonList_OnKeyDown(key);
+
+
+ AddonList_OnShow();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:SetBackdropBorderColor(1.0, 1.0, 1.0);
+ self:SetBackdropColor(0.09, 0.09, 0.19 );
+
+
+
+
+
+
+
+
+
+ AddonDialog_OnClick(self:GetID());
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:Raise();
+
+
+ AddonDialog_OnKeyDown(key);
+
+
+
+
diff --git a/data/patch-hd/Interface/GlueXML/CharacterCreate.lua b/data/patch-hd/Interface/GlueXML/CharacterCreate.lua
new file mode 100644
index 00000000..17f8bf4c
--- /dev/null
+++ b/data/patch-hd/Interface/GlueXML/CharacterCreate.lua
@@ -0,0 +1,1370 @@
+CLASS_DISABLED = "You must choose a different race to be this class";
+CUSTOMIZE = "Appearance";
+NEXT = "Appearance";
+FINISH = "Finish";
+
+
+CHARACTER_FACING_INCREMENT = 2;
+MAX_RACES = 12;
+MAX_CLASSES_PER_RACE = 11;
+NUM_CHAR_CUSTOMIZATIONS = 5;
+MIN_CHAR_NAME_LENGTH = 2;
+CHARACTER_CREATE_ROTATION_START_X = nil;
+CHARACTER_CREATE_INITIAL_FACING = nil;
+NUM_PREVIEW_FRAMES = 14;
+WORGEN_RACE_ID = 6;
+TUSKARR_RACE_ID = 6;
+local featureIndex = 1
+local FeatureType = 1
+
+PAID_CHARACTER_CUSTOMIZATION = 1;
+PAID_RACE_CHANGE = 3;
+PAID_FACTION_CHANGE = 2;
+PAID_SERVICE_CHARACTER_ID = nil;
+PAID_SERVICE_TYPE = nil;
+
+PREVIEW_FRAME_HEIGHT = 130;
+PREVIEW_FRAME_X_OFFSET = 19;
+PREVIEW_FRAME_Y_OFFSET = -7;
+
+FACTION_BACKDROP_COLOR_TABLE = {
+ ["Alliance"] = {0.5, 0.5, 0.5, 0.09, 0.09, 0.19, 0, 0, 0.2, 0.29, 0.33, 0.91},
+ ["Horde"] = {0.5, 0.2, 0.2, 0.19, 0.05, 0.05, 0.2, 0, 0, 0.90, 0.05, 0.07},
+ ["Player"] = {0.2, 0.5, 0.2, 0.05, 0.2, 0.05, 0.05, 0.2, 0.05, 1, 1, 1},
+};
+FRAMES_TO_BACKDROP_COLOR = {
+ "CharacterCreateCharacterRace",
+ "CharacterCreateCharacterClass",
+-- "CharacterCreateCharacterFaction",
+ "CharacterCreateNameEdit",
+};
+RACE_ICON_TCOORDS = {
+ ["HUMAN_MALE"] = {0, 0.125, 0, 0.25},
+ ["DWARF_MALE"] = {0.125, 0.25, 0, 0.25},
+ ["GNOME_MALE"] = {0.25, 0.375, 0, 0.25},
+ ["NIGHTELF_MALE"] = {0.375, 0.5, 0, 0.25},
+
+ ["TAUREN_MALE"] = {0, 0.125, 0.25, 0.5},
+ ["SCOURGE_MALE"] = {0.125, 0.25, 0.25, 0.5},
+ ["TROLL_MALE"] = {0.25, 0.375, 0.25, 0.5},
+ ["ORC_MALE"] = {0.375, 0.5, 0.25, 0.5},
+
+ ["HUMAN_FEMALE"] = {0, 0.125, 0.5, 0.75},
+ ["DWARF_FEMALE"] = {0.125, 0.25, 0.5, 0.75},
+ ["GNOME_FEMALE"] = {0.25, 0.375, 0.5, 0.75},
+ ["NIGHTELF_FEMALE"] = {0.375, 0.5, 0.5, 0.75},
+
+ ["TAUREN_FEMALE"] = {0, 0.125, 0.75, 1.0},
+ ["SCOURGE_FEMALE"] = {0.125, 0.25, 0.75, 1.0},
+ ["TROLL_FEMALE"] = {0.25, 0.375, 0.75, 1.0},
+ ["ORC_FEMALE"] = {0.375, 0.5, 0.75, 1.0},
+
+ ["BLOODELF_MALE"] = {0.5, 0.625, 0.25, 0.5},
+ ["BLOODELF_FEMALE"] = {0.5, 0.625, 0.75, 1.0},
+
+ ["DRAENEI_MALE"] = {0.5, 0.625, 0, 0.25},
+ ["DRAENEI_FEMALE"] = {0.5, 0.625, 0.5, 0.75},
+
+ ["WORGEN_MALE"] = {0.625, 0.75, 0, 0.25},
+ ["WORGEN_FEMALE"] = {0.625, 0.75, 0.5, 0.75},
+
+ ["GOBLIN_MALE"] = {0.625, 0.75, 0.25, 0.5},
+ ["GOBLIN_FEMALE"] = {0.625, 0.75, 0.75, 1.0},
+};
+CLASS_ICON_TCOORDS = {
+ ["WARRIOR"] = {0, 0.25, 0, 0.25},
+ ["MAGE"] = {0.25, 0.49609375, 0, 0.25},
+ ["ROGUE"] = {0.49609375, 0.7421875, 0, 0.25},
+ ["DRUID"] = {0.7421875, 0.98828125, 0, 0.25},
+ ["HUNTER"] = {0, 0.25, 0.25, 0.5},
+ ["SHAMAN"] = {0.25, 0.49609375, 0.25, 0.5},
+ ["PRIEST"] = {0.49609375, 0.7421875, 0.25, 0.5},
+ ["WARLOCK"] = {0.7421875, 0.98828125, 0.25, 0.5},
+ ["PALADIN"] = {0, 0.25, 0.5, 0.75},
+ ["DEATHKNIGHT"] = {0.25, 0.49609375, 0.5, 0.75},
+ -- ["ENGINEER"] = {0.25, 0.49609375, 0.5, 0.75}
+};
+
+BANNER_DEFAULT_TEXTURE_COORDS = {0.109375, 0.890625, 0.201171875, 0.80078125};
+BANNER_DEFAULT_SIZE = {200, 308};
+
+CHAR_CUSTOMIZE_HAIR_COLOR = 4;
+
+function CharacterCreate_OnLoad(self)
+ self:RegisterEvent("RANDOM_CHARACTER_NAME_RESULT");
+ self:RegisterEvent("GLUE_UPDATE_EXPANSION_LEVEL");
+
+ self:SetSequence(0);
+ self:SetCamera(0);
+
+ CharacterCreate.numRaces = 0;
+ CharacterCreate.selectedRace = 0;
+ CharacterCreate.numClasses = 0;
+ CharacterCreate.selectedClass = 0;
+ CharacterCreate.selectedGender = 0;
+
+ SetCharCustomizeFrame("CharacterCreate");
+
+ for i=1, NUM_CHAR_CUSTOMIZATIONS, 1 do
+ _G["CharCreateCustomizationButton"..i].text:SetText(_G["CHAR_CUSTOMIZATION"..i.."_DESC"]);
+ end
+
+ -- Color edit box backdrop
+ local backdropColor = FACTION_BACKDROP_COLOR_TABLE["Alliance"];
+ CharacterCreateNameEdit:SetBackdropBorderColor(backdropColor[1], backdropColor[2], backdropColor[3]);
+ CharacterCreateNameEdit:SetBackdropColor(backdropColor[4], backdropColor[5], backdropColor[6]);
+ --[[CharacterCreateNameEdit:SetParent(CharacterCreateFrame)
+ CharacterCreateNameEdit:SetPoint("TOPLEFT", CharacterCreateFrame, 635, -30)]]--
+ CharCreateCustomizationFrame:SetPoint("RIGHT", CharacterCreateFrame, -50, -10)
+
+ CharacterCreateFrame.state = "CLASSRACE";
+
+ CharCreatePreviewFrame.previews = { };
+
+ CustomizationBG = CharacterCreateFrame:CreateTexture("CustomizationBG", "BACKGROUND")
+ CustomizationBG:SetSize(-5, GlueParent:GetHeight())
+ CustomizationBG:SetTexture("Interface\\Glues\\CharacterCreate\\Shadowv")
+ CustomizationBG:SetPoint("RIGHT")
+ CustomizationBG:Hide()
+
+ CustomizationBG2 = CharacterCreateFrame:CreateTexture("CustomizationBG2", "BACKGROUND")
+ CustomizationBG2:SetSize(-5, GlueParent:GetHeight())
+ CustomizationBG2:SetTexture("Interface\\Glues\\CharacterCreate\\MainShadow")
+ CustomizationBG2:SetPoint("CENTER")
+ CustomizationBG2:SetAlpha(1)
+
+ CustomizationLogoAlliance = CharacterCreateFrame:CreateTexture("CustomizationLogoAlliance", "ARTWORK")
+ CustomizationLogoAlliance:SetSize(100, 100)
+ CustomizationLogoAlliance:SetTexture("Interface\\Glues\\CharacterCreate\\AllianceLogo")
+ CustomizationLogoAlliance:SetPoint("TOPLEFT", -16, 16)
+
+ CustomizationTextAlliance = CharacterCreateFrame:CreateFontString("CustomizationTextAlliance", "OVERLAY")
+ CustomizationTextAlliance:SetFontObject(GlueFontNormal)
+ CustomizationTextAlliance:SetFont("Fonts\\FRIZQT__.TTF", 16)
+ CustomizationTextAlliance:SetText(string.upper(ALLIANCE))
+ CustomizationTextAlliance:SetPoint("LEFT", CustomizationLogoAlliance, "RIGHT", -24, 0)
+
+ CustomizationLogoHorde = CharacterCreateFrame:CreateTexture("CustomizationLogoHorde", "ARTWORK")
+ CustomizationLogoHorde:SetSize(100, 100)
+ CustomizationLogoHorde:SetTexture("Interface\\Glues\\CharacterCreate\\HordeLogo")
+ CustomizationLogoHorde:SetPoint("TOPRIGHT", 16, 16)
+
+ CustomizationTextHorde = CharacterCreateFrame:CreateFontString("CustomizationTextHorde", "OVERLAY")
+ CustomizationTextHorde:SetFontObject(GlueFontNormal)
+ CustomizationTextHorde:SetFont("Fonts\\FRIZQT__.TTF", 16)
+ CustomizationTextHorde:SetText(string.upper(HORDE))
+ CustomizationTextHorde:SetPoint("RIGHT", CustomizationLogoHorde, "LEFT", 24, 0)
+
+
+end
+
+function CharCustomizeButtonClick(id, button)
+ if (button == 'LeftButton') then
+ for i = 1, math.random(1, 5) do
+ CharacterCustomization_Left(id)
+ end
+ elseif (button == 'RightButton') then
+ for i = 1, math.random(1, 5) do
+ CharacterCustomization_Right(id)
+ end
+ end
+ -- CycleCharCustomization(id, 1);
+ --[[FeatureType = id
+ for i=1,5 do
+ _G["CharCreateCustomizationButton"..i]:SetChecked(0);
+ end
+ _G["CharCreateCustomizationButton"..id]:SetChecked(1);]]
+
+end
+
+function CharacterCreate_OnShow()
+ for i=1, MAX_CLASSES_PER_RACE, 1 do
+ local button = _G["CharCreateClassButton"..i];
+ button:Enable();
+ --button:SetScale(0.8)
+ SetButtonDesaturated(button, false)
+ end
+
+ for i=1, MAX_RACES, 1 do
+ local button = _G["CharCreateRaceButton"..i];
+ button:Enable();
+ --button:SetScale(0.8)
+ SetButtonDesaturated(button, false)
+ end
+
+ if ( PAID_SERVICE_TYPE ) then
+ CustomizeExistingCharacter( PAID_SERVICE_CHARACTER_ID );
+ CharacterCreateNameEdit:SetText( PaidChange_GetName() );
+ else
+ --randomly selects a combination
+ ResetCharCustomize();
+ CharacterCreateNameEdit:SetText("");
+ CharCreateRandomizeButton:Show();
+ end
+
+ CharacterCreateEnumerateRaces(GetAvailableRaces());
+ SetCharacterRace(GetSelectedRace());
+
+ CharacterCreateEnumerateClasses(GetAvailableClasses());
+ local_,_,index = GetSelectedClass();
+ SetCharacterClass(index);
+
+ --[[if ( GetSelectedRace() == TUSKARR_RACE_ID ) then
+ SetCharacterGender(SEX_MALE);
+ CharCreateMaleButton:SetChecked(1);
+ CharCreateFemaleButton:SetChecked(0);
+ else]]
+ SetCharacterGender(GetSelectedSex());
+ --end
+
+ -- Hair customization stuff
+ CharacterCreate_UpdateHairCustomization();
+
+ SetCharacterCreateFacing(-15);
+
+ -- setup customization
+ CharacterChangeFixup();
+
+ --SetFaceCustomizeCamera(false);
+end
+
+function CharacterCreate_OnHide()
+ PAID_SERVICE_CHARACTER_ID = nil;
+ PAID_SERVICE_TYPE = nil;
+ if ( CharacterCreateFrame.state == "CUSTOMIZATION" ) then
+ CharacterCreate_Back();
+ end
+ -- character previews will need to be redone if coming back to character create. One reason is all the memory used for
+ -- tracking the frames (on the c side) will get released if the user returns to the login screen
+ CharCreatePreviewFrame.rebuildPreviews = true;
+end
+
+function CharacterCreate_OnEvent(event, arg1, arg2, arg3)
+ if ( event == "RANDOM_CHARACTER_NAME_RESULT" ) then
+ if ( arg1 == 0 ) then
+ -- Failed. Generate a random name locally.
+ CharacterCreateNameEdit:SetText(GenerateRandomName());
+ else
+ -- Succeeded. Use what the server sent.
+ CharacterCreateNameEdit:SetText(arg2);
+ end
+ CharacterCreateRandomName:Enable();
+ CharCreateOkayButton:Enable();
+ PlaySound("gsCharacterCreationLook");
+ elseif ( event == "GLUE_UPDATE_EXPANSION_LEVEL" ) then
+ -- Expansion level changed while online, so enable buttons as needed
+ if ( CharacterCreateFrame:IsShown() ) then
+ CharacterCreateEnumerateRaces(GetAvailableRaces());
+ CharacterCreateEnumerateClasses(GetAvailableClasses());
+ end
+ end
+end
+
+function CharacterCreateFrame_OnMouseDown(button)
+ if ( button == "LeftButton" ) then
+ CHARACTER_CREATE_ROTATION_START_X = GetCursorPosition();
+ CHARACTER_CREATE_INITIAL_FACING = GetCharacterCreateFacing();
+ end
+end
+
+function CharacterCreateFrame_OnMouseUp(button)
+ if ( button == "LeftButton" ) then
+ CHARACTER_CREATE_ROTATION_START_X = nil
+ end
+end
+
+function CharacterCreateFrame_OnUpdate(self, elapsed)
+ if ( CHARACTER_CREATE_ROTATION_START_X ) then
+ local x = GetCursorPosition();
+ local diff = (x - CHARACTER_CREATE_ROTATION_START_X) * CHARACTER_ROTATION_CONSTANT;
+ CHARACTER_CREATE_ROTATION_START_X = GetCursorPosition();
+ SetCharacterCreateFacing(GetCharacterCreateFacing() + diff);
+ CharCreate_RotatePreviews();
+ end
+ CharacterCreateWhileMouseDown_Update(elapsed);
+end
+
+function CharacterCreateEnumerateRaces(...)
+ CharacterCreate.numRaces = select("#", ...)/3;
+ if ( CharacterCreate.numRaces > MAX_RACES ) then
+ message("Too many races! Update MAX_RACES");
+ return;
+ end
+ local coords;
+ local index = 1;
+ local button;
+ local gender;
+ local selectedSex = GetSelectedSex();
+ if ( selectedSex == SEX_MALE ) then
+ gender = "MALE";
+ else
+ gender = "FEMALE";
+ end
+ for i=1, select("#", ...), 3 do
+ local name = select(i, ...);
+ local unlocalizedname = strupper(select(i+1, ...))
+
+ coords = RACE_ICON_TCOORDS[strupper(select(i+1, ...).."_"..gender)];
+ _G["CharCreateRaceButton"..index.."NormalTexture"]:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
+ _G["CharCreateRaceButton"..index.."PushedTexture"]:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
+ button = _G["CharCreateRaceButton"..index];
+ if ( not button ) then
+ return;
+ end
+
+ button.nameFrame.text:SetText(name);
+ if ( select(i+2, ...) == 1 ) then
+ button:Enable();
+ SetButtonDesaturated(button);
+ button.name = name;
+ button.tooltip = name;
+ else
+ button:Disable();
+ SetButtonDesaturated(button, 1);
+ button.name = name;
+ local disabledReason = _G[strupper(select(i+1, ...).."_".."DISABLED")];
+ if ( disabledReason ) then
+ button.tooltip = name.."|n"..disabledReason;
+ else
+ button.tooltip = nil;
+ end
+ end
+
+ local abilityIndex = 1;
+ local tempText = _G["ABILITY_INFO_"..unlocalizedname..abilityIndex];
+ abilityText = "";
+ while ( tempText ) do
+ abilityText = abilityText..tempText.."\n\n";
+ abilityIndex = abilityIndex + 1;
+ tempText = _G["ABILITY_INFO_"..unlocalizedname..abilityIndex];
+ end
+
+ text = GetFlavorText("RACE_INFO_"..unlocalizedname, gender)
+ button.tooltip = "|r"..text
+ button.tooltip = button.tooltip.."\n\n|cffFFFFFF"..abilityText
+
+
+ index = index + 1;
+ end
+ for i=CharacterCreate.numRaces + 1, MAX_RACES, 1 do
+ _G["CharCreateRaceButton"..i]:Hide();
+ end
+end
+
+function CharacterCreateEnumerateClasses(...)
+ CharacterCreate.numClasses = select("#", ...)/3;
+ if ( CharacterCreate.numClasses > MAX_CLASSES_PER_RACE ) then
+ message("Too many classes! Update MAX_CLASSES_PER_RACE");
+ return;
+ end
+ local coords;
+ local index = 1;
+ local button;
+ for i=1, select("#", ...), 3 do
+ local unlocalizedname = strupper(select(i+1, ...))
+
+ coords = CLASS_ICON_TCOORDS[strupper(select(i+1, ...))];
+ _G["CharCreateClassButton"..index.."NormalTexture"]:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
+ _G["CharCreateClassButton"..index.."PushedTexture"]:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
+ button = _G["CharCreateClassButton"..index];
+ button:Show();
+ button.nameFrame.text:SetText(select(i, ...));
+ button.tooltip = ""
+ button.tooltip = button.nameFrame.text:GetText()
+
+ local abilityIndex = 0;
+ local tempText = _G["CLASS_INFO_"..unlocalizedname..abilityIndex];
+ abilityText = "";
+ while ( tempText ) do
+ abilityText = abilityText..tempText.."\n\n";
+ abilityIndex = abilityIndex + 1;
+ tempText = _G["CLASS_INFO_"..unlocalizedname..abilityIndex];
+ end
+
+ if ( select(i+2, ...) == 1 ) then
+ if (IsRaceClassValid(CharacterCreate.selectedRace, index)) then
+ button:Enable();
+ SetButtonDesaturated(button);
+ text = GetFlavorText("CLASS_"..strupper(unlocalizedname), "MALE").."|n|n"
+ button.tooltip = "|r"..text
+ button.tooltip = button.tooltip.."\n\n|cffFFFFFF"..abilityText
+ --button.tooltip = nil;
+ -- _G["CharCreateClassButton"..index.."DisableTexture"]:Hide();
+ else
+ button:Disable();
+ SetButtonDesaturated(button, 1);
+ button.tooltip = CLASS_DISABLED;
+ text = GetFlavorText("CLASS_"..strupper(unlocalizedname), "MALE").."|n|n"
+ button.tooltip = "|cffFFFFFF"..button.tooltip.."|r\n\n"
+ _G["CharCreateClassButton"..index.."DisableTexture"]:Show();
+ end
+ else
+ button:Disable();
+ SetButtonDesaturated(button, 1);
+ _G["CharCreateClassButton"..index.."DisableTexture"]:Show();
+ end
+
+ index = index + 1;
+ end
+ for i=CharacterCreate.numClasses + 1, MAX_CLASSES_PER_RACE, 1 do
+ _G["CharCreateClassButton"..i]:Hide();
+ end
+end
+
+function SetCharacterRace(id)
+
+ CharacterCreate.selectedRace = id;
+ for i=1, CharacterCreate.numRaces, 1 do
+ local button = _G["CharCreateRaceButton"..i];
+ if ( i == id ) then
+ button:SetChecked(1);
+ else
+ button:SetChecked(0);
+ end
+ end
+
+ local name, faction = GetFactionForRace(CharacterCreate.selectedRace);
+
+ if faction == nil then
+ faction = "Alliance";
+ end
+
+ -- during a paid service we have to set alliance/horde for neutral races
+ -- hard-coded for Pandaren because of alliance/horde pseudo buttons
+ local canProceed = true;
+ -- if ( id == TUSKARR_RACE_ID and PAID_SERVICE_TYPE ) then
+ -- --[[
+ -- --local currentFaction = PaidChange_GetCurrentFaction();
+ -- if ( PaidChange_GetCurrentRaceIndex() == TUSKARR_RACE_ID and PAID_SERVICE_TYPE == PAID_FACTION_CHANGE ) then
+ -- -- this is an original pandaren staying or becoming selected
+ -- -- check the pseudo-buttons
+ -- faction = PandarenFactionButtons_GetSelectedFaction();
+ -- --if ( faction == currentFaction ) then
+ -- canProceed = false;
+ -- --end
+ -- else
+ -- -- for faction change use the opposite faction of current character
+ -- if ( PAID_SERVICE_TYPE == PAID_FACTION_CHANGE ) then
+ -- --if ( currentFaction == "Horde" ) then
+ -- faction = "Alliance";
+ -- --elseif ( currentFaction == "Alliance" ) then
+ -- -- faction = "Horde";
+ -- --end
+ -- -- for race change and customization use the same faction as current character
+ -- else
+ -- faction = "Alliance";
+ -- end
+ -- end
+ -- ]]
+ -- else
+ -- PandarenFactionButtons_ClearSelection();
+ -- end
+ CharCreate_EnableNextButton(canProceed);
+
+ -- Set background
+ local backgroundFilename = GetCreateBackgroundModel(faction);
+ --[[if CharacterCreate.selectedClass == 11 then
+ backgroundFilename = "DEMONHUNTER"
+ end]]
+
+ if (faction == "Alliance") then
+ SetBackgroundModel(CharacterCreate, "HUMAN");
+ else
+ SetBackgroundModel(CharacterCreate, "ORC");
+ end
+
+ -- Set backdrop colors based on faction
+ local backdropColor = FACTION_BACKDROP_COLOR_TABLE[faction];
+ --CharCreateRaceFrame.factionBg:SetGradient("VERTICAL", 0, 0, 0, backdropColor[7], backdropColor[8], backdropColor[9]);
+ --CharCreateClassFrame.factionBg:SetGradient("VERTICAL", 0, 0, 0, backdropColor[7], backdropColor[8], backdropColor[9]);
+ --CharCreateCustomizationFrame.factionBg:SetGradient("VERTICAL", 0, 0, 0, backdropColor[7], backdropColor[8], backdropColor[9]);
+ --harCreatePreviewFrame.factionBg:SetGradient("VERTICAL", 0, 0, 0, backdropColor[7], backdropColor[8], backdropColor[9]);
+ CharCreateCustomizationFrameBanner:SetVertexColor(backdropColor[10], backdropColor[11], backdropColor[12]);
+ CharacterCreateNameEdit:SetBackdropColor(backdropColor[4], backdropColor[5], backdropColor[6]);
+ --CharCreateRaceInfoFrame.factionBg:SetGradient("VERTICAL", 0, 0, 0, backdropColor[7], backdropColor[8], backdropColor[9]);
+ --CharCreateClassInfoFrame.factionBg:SetGradient("VERTICAL", 0, 0, 0, backdropColor[7], backdropColor[8], backdropColor[9]);
+
+ -- race info
+ local frame = CharCreateRaceInfoFrame;
+ local race, fileString = GetNameForRace();
+ frame.title:SetText(race);
+ fileString = strupper(fileString);
+ local gender;
+ if ( GetSelectedSex() == SEX_MALE ) then
+ gender = "MALE";
+ else
+ gender = "FEMALE";
+ end
+ local raceText = _G["RACE_INFO_"..fileString];
+ local abilityIndex = 1;
+ local tempText = _G["ABILITY_INFO_"..fileString..abilityIndex];
+ abilityText = "";
+ while ( tempText ) do
+ abilityText = abilityText..tempText.."\n\n";
+ abilityIndex = abilityIndex + 1;
+ tempText = _G["ABILITY_INFO_"..fileString..abilityIndex];
+ end
+ CharCreateRaceInfoFrameScrollFrameScrollBar:SetValue(0);
+ local text
+ text = GetFlavorText("RACE_INFO_"..strupper(fileString), GetSelectedSex())
+ if not text then
+ text = "Not in GlueXML."
+ end
+ CharCreateRaceInfoFrame.scrollFrame.scrollChild.infoText:SetText(text.."|n|n");
+ if ( abilityText and abilityText ~= "" ) then
+ CharCreateRaceInfoFrame.scrollFrame.scrollChild.bulletText:SetText(abilityText);
+ else
+ CharCreateRaceInfoFrame.scrollFrame.scrollChild.bulletText:SetText("");
+ end
+
+ -- Altered form
+ --[[if (HasAlteredForm()) then
+ SetPortraitTexture(CharacterCreateAlternateFormTopPortrait, 22, GetSelectedSex());
+ SetPortraitTexture(CharacterCreateAlternateFormBottomPortrait, 23, GetSelectedSex());
+ CharacterCreateAlternateFormTop:Show();
+ CharacterCreateAlternateFormBottom:Show();
+ if( IsViewingAlteredForm() ) then
+ CharacterCreateAlternateFormTop:SetChecked(false);
+ CharacterCreateAlternateFormBottom:SetChecked(true);
+ else
+ CharacterCreateAlternateFormTop:SetChecked(true);
+ CharacterCreateAlternateFormBottom:SetChecked(false);
+ end
+ else
+ CharacterCreateAlternateFormTop:Hide();
+ CharacterCreateAlternateFormBottom:Hide();
+ end]]
+end
+
+function SetCharacterClass(id)
+ if id == 11 then
+ return
+ end
+ CharacterCreate.selectedClass = id;
+ for i=1, CharacterCreate.numClasses, 1 do
+ local button = _G["CharCreateClassButton"..i];
+ if ( i == id ) then
+ button:SetChecked(1);
+ else
+ button:SetChecked(0);
+ button.selection:Hide();
+ end
+ end
+
+ -- class info
+ local frame = CharCreateClassInfoFrame;
+ local className, classFileName, _, tank, healer, damage = GetSelectedClass();
+ local abilityIndex = 0;
+ if not classFileName then
+ classFileName = "WARRIOR"
+ end
+ local tempText = _G["CLASS_INFO_"..classFileName..abilityIndex];
+ abilityText = "";
+ while ( tempText ) do
+ abilityText = abilityText..tempText.."\n\n";
+ abilityIndex = abilityIndex + 1;
+ tempText = _G["CLASS_INFO_"..classFileName..abilityIndex];
+ end
+ CharCreateClassInfoFrame.title:SetText(className);
+ CharCreateClassInfoFrame.scrollFrame.scrollChild.bulletText:SetText(abilityText);
+ CharCreateClassInfoFrame.scrollFrame.scrollChild.infoText:SetText(GetFlavorText("CLASS_"..strupper(classFileName), GetSelectedSex()).."|n|n");
+ CharCreateClassInfoFrameScrollFrameScrollBar:SetValue(0);
+end
+
+function CharacterCreate_OnChar()
+end
+
+function CharacterCreate_OnKeyDown(key)
+ if ( key == "ESCAPE" ) then
+ CharacterCreate_Back();
+ elseif ( key == "ENTER" ) then
+ CharacterCreate_Forward();
+ elseif ( key == "PRINTSCREEN" ) then
+ Screenshot();
+ end
+end
+
+function CharacterCreate_UpdateModel(self)
+ UpdateCustomizationScene();
+ self:AdvanceTime();
+end
+
+function CharacterCreate_Finish()
+ PlaySound("gsCharacterCreationCreateChar");
+
+ -- If something disabled this button, ignore this message.
+ -- This can happen if you press enter while it's disabled, for example.
+ if ( not CharCreateOkayButton:IsEnabled() ) then
+ return;
+ end
+
+ if ( PAID_SERVICE_TYPE ) then
+ GlueDialog_Show("CONFIRM_PAID_SERVICE");
+ else
+ -- if using templates, pandaren must pick a faction
+ local _, faction = GetFactionForRace(CharacterCreate.selectedRace);
+ --if ( IsUsingCharacterTemplate() and ( faction ~= "Alliance" and faction ~= "Horde" ) ) then
+ -- CharacterTemplateConfirmDialog:Show();
+ --else
+ CreateCharacter(CharacterCreateNameEdit:GetText());
+ --end
+ end
+end
+
+function CharacterCreate_Back()
+ if ( CharacterCreateFrame.state == "CUSTOMIZATION" ) then
+ PlaySound("gsCharacterCreationCancel");
+ CharacterCreateFrame.state = "CLASSRACE"
+ CharCreateClassFrame:Show();
+ CharCreateRaceFrame:Show();
+ CharCreateMaleButton:Show()
+ CharCreateFemaleButton:Show()
+ -- CharCreateMoreInfoButton:Show();
+ CharCreateCustomizationFrame:Hide();
+ CharCreatePreviewFrame:Hide();
+ CharCreateOkayButton:SetText(NEXT);
+ CharacterCreateNameEdit:Hide();
+ CharacterCreateRandomName:Hide();
+ CustomizationBG:Hide()
+ CharCreateRandomizeButton:Hide()
+ CustomizationLogoAlliance:Show()
+ CustomizationTextAlliance:Show()
+ CustomizationLogoHorde:Show()
+ CustomizationTextHorde:Show()
+
+ --back to awesome gear
+ --SetSelectedPreviewGearType(1);
+
+ -- back to normal camera
+ --SetFaceCustomizeCamera(false);
+
+ return;
+ end
+
+ PlaySound("gsCharacterCreationCancel");
+ CHARACTER_SELECT_BACK_FROM_CREATE = true;
+ SetGlueScreen("charselect");
+end
+
+function CharacterCreate_UpdateFacialHairCustomization()
+ if ( GetFacialHairCustomization() == "NONE" ) then
+ CharacterCustomizationButtonFrame5:Hide();
+ --CharCreateRandomizeButton:SetPoint("TOP", "CharacterCustomizationButtonFrame5", "BOTTOM", 0, -5);
+ else
+ CharacterCustomizationButtonFrame5Text:SetText(_G["FACIAL_HAIR_"..GetFacialHairCustomization()]);
+ CharacterCustomizationButtonFrame5:Show();
+ --CharCreateRandomizeButton:SetPoint("TOP", "CharacterCustomizationButtonFrame5", "BOTTOM", 0, -5);
+ end
+end
+
+function CharacterCreate_UpdateHairCustomization()
+ if not _G["HAIR_"..GetHairCustomization().."_STYLE"] or _G["HAIR_"..GetHairCustomization().."_STYLE"] == "" then
+ CharCreateCustomizationButton3:Hide()
+ CharCreateCustomizationButton4:SetPoint("TOP", CharCreateCustomizationButton2, "BOTTOM", 0, -20)
+ else
+ CharCreateCustomizationButton3:Show()
+ CharCreateCustomizationButton3.text:SetText(_G["HAIR_"..GetHairCustomization().."_STYLE"])
+ --CharCreateCustomizationButton4:SetPoint("TOP", CharCreateCustomizationButton3, "BOTTOM", 0, -20)
+ end
+
+ if not _G["HAIR_"..GetHairCustomization().."_COLOR"] or _G["HAIR_"..GetHairCustomization().."_COLOR"] == "" then
+ CharCreateCustomizationButton4:Hide()
+ if CharCreateCustomizationButton3:IsShown() then
+ CharCreateCustomizationButton5:SetPoint("TOP", CharCreateCustomizationButton4, "BOTTOM", 0, 0)
+ else
+ CharCreateCustomizationButton5:SetPoint("TOP", CharCreateCustomizationButton3, "BOTTOM", 0, 0)
+ end
+ else
+ CharCreateCustomizationButton4:Show()
+ CharCreateCustomizationButton4.text:SetText(_G["HAIR_"..GetHairCustomization().."_COLOR"])
+ CharCreateCustomizationButton5:SetPoint("TOP", CharCreateCustomizationButton4, "BOTTOM", 0, 0)
+ end
+
+ if not _G["FACIAL_HAIR_"..GetFacialHairCustomization()] or _G["FACIAL_HAIR_"..GetFacialHairCustomization()] == "" then
+ CharCreateCustomizationButton5:Hide()
+ else
+ CharCreateCustomizationButton5:Show()
+ CharCreateCustomizationButton5.text:SetText(_G["FACIAL_HAIR_"..GetFacialHairCustomization()])
+ end
+
+end
+
+function CharacterCreate_Forward()
+ if ( CharacterCreateFrame.state == "CLASSRACE" ) then
+ CharacterCreateFrame.state = "CUSTOMIZATION"
+ PlaySound("gsCharacterSelectionCreateNew");
+ CharCreateClassFrame:Hide();
+ CharCreateRaceFrame:Hide();
+ -- CharCreateMoreInfoButton:Hide();
+ CharCreateCustomizationFrame:Show();
+ CharacterCreate_UpdateHairCustomization()
+ --CharCreatePreviewFrame:Show();
+ CharacterTemplateConfirmDialog:Hide();
+
+ CharCreate_PrepPreviewModels();
+ if ( CharacterCreateFrame.customizationType ) then
+ CharCreate_ResetFeaturesDisplay();
+ else
+ CharCreateSelectCustomizationType(1);
+ end
+
+ CharCreateOkayButton:SetText(FINISH);
+ CharacterCreateNameEdit:Show();
+ if ( ALLOW_RANDOM_NAME_BUTTON ) then
+ CharacterCreateRandomName:Show();
+ end
+
+ CharCreateMaleButton:Hide()
+ CharCreateFemaleButton:Hide()
+ CustomizationBG:Show()
+ CharCreateRandomizeButton:Show()
+ CustomizationLogoAlliance:Hide()
+ CustomizationTextAlliance:Hide()
+ CustomizationLogoHorde:Hide()
+ CustomizationTextHorde:Hide()
+
+ -- Custom Part.
+
+ -- set cam
+ --[[if (CharacterCreateFrame.customizationType and CharacterCreateFrame.customizationType > 1) then
+ SetFaceCustomizeCamera(true);
+ else
+ SetFaceCustomizeCamera(false);
+ end]]
+ else
+ CharacterCreate_Finish();
+ end
+end
+
+function CharCreateCustomizationFrame_OnShow ()
+ -- reset size/tex coord to default to facilitate switching between genders for Pandaren
+ CharCreateCustomizationFrameBanner:SetSize(BANNER_DEFAULT_SIZE[1], BANNER_DEFAULT_SIZE[2]);
+ CharCreateCustomizationFrameBanner:SetTexCoord(BANNER_DEFAULT_TEXTURE_COORDS[1], BANNER_DEFAULT_TEXTURE_COORDS[2], BANNER_DEFAULT_TEXTURE_COORDS[3], BANNER_DEFAULT_TEXTURE_COORDS[4]);
+
+ -- check each button and hide it if there are no values select
+ local resize = 0;
+ local lastGood = 0;
+ local isSkinVariantHair = false --GetSkinVariationIsHairColor(CharacterCreate.selectedRace);
+ local isDefaultSet = 0;
+ local checkedButton = 1;
+
+ -- check if this was set, if not, default to 1
+ if ( CharacterCreateFrame.customizationType == 0 or CharacterCreateFrame.customizationType == nil ) then
+ CharacterCreateFrame.customizationType = 1;
+ end
+ for i=1, NUM_CHAR_CUSTOMIZATIONS, 1 do
+ if ( ( --[[GetNumFeatureVariationsForType(i)]]5 <= 1 ) or ( isSkinVariantHair and i == CHAR_CUSTOMIZE_HAIR_COLOR ) ) then
+ resize = resize + 1;
+ _G["CharCreateCustomizationButton"..i]:Hide();
+ else
+ _G["CharCreateCustomizationButton"..i]:Show();
+ --_G["CharCreateCustomizationButton"..i]:SetChecked(0); -- we will handle default selection
+ -- this must be done since a selected button can 'disappear' when swapping genders
+ if ( isDefaultSet == 0 and CharacterCreateFrame.customizationType == i) then
+ isDefaultSet = 1;
+ checkedButton = i;
+ end
+ -- set your anchor to be the last good, this currently means button 1 HAS to be shown
+ if (i > 1) then
+ _G["CharCreateCustomizationButton"..i]:SetPoint( "TOP",_G["CharCreateCustomizationButton"..lastGood]:GetName() , "BOTTOM");
+ end
+ lastGood = i;
+ end
+ end
+
+ if (isDefaultSet == 0) then
+ CharacterCreateFrame.customizationType = lastGood;
+ checkedButton = lastGood;
+ end
+ --_G["CharCreateCustomizationButton"..checkedButton]:SetChecked(1);
+
+ if (resize > 0) then
+ -- we need to resize and remap the banner texture
+ local buttonx, buttony = CharCreateCustomizationButton1:GetSize()
+ local screenamount = resize*buttony;
+ print(screenamount);
+ local frameX, frameY = CharCreateCustomizationFrameBanner:GetSize();
+ local pctShrink = .2*resize;
+ local uvXDefaultSize = BANNER_DEFAULT_TEXTURE_COORDS[2] - BANNER_DEFAULT_TEXTURE_COORDS[1];
+ local uvYDefaultSize = BANNER_DEFAULT_TEXTURE_COORDS[4] - BANNER_DEFAULT_TEXTURE_COORDS[3];
+ local newYUV = pctShrink*uvYDefaultSize + BANNER_DEFAULT_TEXTURE_COORDS[3];
+ -- end coord stay the same
+ CharCreateCustomizationFrameBanner:SetTexCoord(BANNER_DEFAULT_TEXTURE_COORDS[1], BANNER_DEFAULT_TEXTURE_COORDS[2], newYUV, BANNER_DEFAULT_TEXTURE_COORDS[4]);
+ print(pctShrink);
+ CharCreateCustomizationFrameBanner:SetSize(frameX, frameY - screenamount);
+ print(CharCreateCustomizationFrameBanner:GetTexCoord());
+ end
+
+ --CharCreateRandomizeButton:SetPoint("TOP", _G["CharCreateCustomizationButton"..lastGood]:GetName(), "BOTTOM", 0, 0);
+end
+
+function CharacterClass_OnClick(self, id)
+ if( self:IsEnabled() ) then
+ PlaySound("gsCharacterCreationClass");
+ local _,_,currClass = GetSelectedClass();
+ if ( currClass ~= id ) then
+ SetSelectedClass(id);
+ SetCharacterClass(id);
+ SetCharacterRace(GetSelectedRace());
+ CharacterChangeFixup();
+ else
+ self:SetChecked(1);
+ end
+ else
+ self:SetChecked(0);
+ end
+end
+
+function CharacterRace_OnClick(self, id, forceSelect)
+ if( self:IsEnabled() ) then
+ PlaySound("gsCharacterCreationClass");
+ if ( GetSelectedRace() ~= id or forceSelect ) then
+ SetSelectedRace(id);
+ SetCharacterRace(id);
+ --[[if ( id == TUSKARR_RACE_ID ) then
+ SetCharacterGender(SEX_MALE);
+ else]]
+ SetCharacterGender(GetSelectedSex());
+ --end
+ SetCharacterCreateFacing(-15);
+ CharacterCreateEnumerateClasses(GetAvailableClasses());
+ local _,_,classIndex = GetSelectedClass();
+ if ( PAID_SERVICE_TYPE ) then
+ classIndex = PaidChange_GetCurrentClassIndex();
+ SetSelectedClass(classIndex); -- selecting a race would have changed class to default
+ end
+ SetCharacterClass(classIndex);
+
+ -- Hair customization stuff
+ CharacterCreate_UpdateHairCustomization();
+
+ CharacterChangeFixup();
+ else
+ self:SetChecked(1);
+ end
+ else
+ self:SetChecked(0);
+ end
+end
+
+function SetCharacterGender(sex)
+ local gender;
+
+ if ( sex == SEX_MALE ) then
+ CharCreateMaleButton:SetChecked(1);
+ CharCreateFemaleButton:SetChecked(0);
+ else
+ CharCreateMaleButton:SetChecked(0);
+ CharCreateFemaleButton:SetChecked(1);
+ end
+ SetSelectedSex(sex);
+
+ -- Update race images to reflect gender
+ CharacterCreateEnumerateRaces(GetAvailableRaces());
+ CharacterCreateEnumerateClasses(GetAvailableClasses());
+ SetCharacterRace(GetSelectedRace());
+
+ local _,_,classIndex = GetSelectedClass();
+ if ( PAID_SERVICE_TYPE ) then
+ classIndex = PaidChange_GetCurrentClassIndex();
+ -- PandarenFactionButtons_SetTextures();
+ end
+ SetCharacterClass(classIndex);
+
+ CharacterCreate_UpdateHairCustomization();
+ CharacterChangeFixup();
+
+ -- Update preview models if on customization step
+ if ( CharCreatePreviewFrame:IsShown() ) then
+ CharCreateCustomizationFrame_OnShow(); -- buttons may need to reset for dirty Pandarens
+ CharCreate_PrepPreviewModels();
+ CharCreate_ResetFeaturesDisplay();
+ end
+end
+
+function CharacterCustomization_Left(id)
+ PlaySound("gsCharacterCreationLook");
+ CycleCharCustomization(id, -1);
+end
+
+function CharacterCustomization_Right(id)
+ PlaySound("gsCharacterCreationLook");
+ CycleCharCustomization(id, 1);
+end
+
+function CharacterCreate_GenerateRandomName(button)
+ CharacterCreateNameEdit:SetText(GetRandomName());
+end
+
+function CharacterCreate_Randomize()
+ PlaySound("gsCharacterCreationLook");
+ RandomizeCharCustomization();
+ CharCreate_ResetFeaturesDisplay();
+end
+
+function CharacterCreateRotateRight_OnUpdate(self)
+ if ( self:GetButtonState() == "PUSHED" ) then
+ SetCharacterCreateFacing(GetCharacterCreateFacing() + CHARACTER_FACING_INCREMENT);
+ CharCreate_RotatePreviews();
+ end
+end
+
+function CharacterCreateRotateLeft_OnUpdate(self)
+ if ( self:GetButtonState() == "PUSHED" ) then
+ SetCharacterCreateFacing(GetCharacterCreateFacing() - CHARACTER_FACING_INCREMENT);
+ CharCreate_RotatePreviews();
+ end
+end
+
+function SetButtonDesaturated(button, desaturated)
+ if ( not button ) then
+ return;
+ end
+ local icon = button:GetNormalTexture();
+ if ( not icon ) then
+ return;
+ end
+
+ icon:SetDesaturated(desaturated);
+end
+
+function GetFlavorText(tagname, sex)
+ local primary, secondary;
+ if ( sex == SEX_MALE ) then
+ primary = "";
+ secondary = "_FEMALE";
+ else
+ primary = "_FEMALE";
+ secondary = "";
+ end
+ local text = _G[tagname..primary];
+ if ( (text == nil) or (text == "") ) then
+ text = _G[tagname..secondary];
+ end
+ return text;
+end
+
+function CharacterChangeFixup()
+ if ( PAID_SERVICE_TYPE ) then
+ -- no class changing as a paid service
+ CharCreateClassFrame:SetAlpha(0.5);
+ for i=1, MAX_CLASSES_PER_RACE, 1 do
+ if (CharacterCreate.selectedClass ~= i) then
+ local button = _G["CharCreateClassButton"..i];
+ button:Disable();
+ SetButtonDesaturated(button, true);
+ end
+ end
+
+ local numAllowedRaces = 0;
+ for i=1, MAX_RACES, 1 do
+ local allow = false;
+ if ( PAID_SERVICE_TYPE == PAID_FACTION_CHANGE ) then
+ --[[local faction = PaidChange_GetCurrentFaction();
+ if ( (i == PaidChange_GetCurrentRaceIndex()) or ((GetFactionForRace(i) ~= faction) and (IsRaceClassValid(i,CharacterCreate.selectedClass))) ) then
+ allow = true;
+ end]]
+ for i=1,MAX_RACES do
+ allow = true
+ end
+ elseif ( PAID_SERVICE_TYPE == PAID_RACE_CHANGE ) then
+ --[[local faction = PaidChange_GetCurrentFaction();
+ if ( (i == PaidChange_GetCurrentRaceIndex()) or ((GetFactionForRace(i) == faction or IsNeutralRace(i)) and (IsRaceClassValid(i,CharacterCreate.selectedClass))) ) then
+ allow = true
+ end]]
+ local fact = CharacterCreate.selectedRace
+ --local str = tostring(fact)..": "
+ for i=1,MAX_RACES do
+ if (fact < MAX_RACES and i < MAX_RACES) or (fact > (MAX_RACES-1) and i > (MAX_RACES-1)) then
+ allow = true
+ local button = _G["CharCreateRaceButton"..i];
+ button:Enable();
+ SetButtonDesaturated(button, false);
+ else
+ allow = false
+ --str = str..tostring(i)..", "
+ local button = _G["CharCreateRaceButton"..i];
+ button:Disable();
+ SetButtonDesaturated(button, true);
+ end
+ end
+ --message(str)
+ elseif ( PAID_SERVICE_TYPE == PAID_CHARACTER_CUSTOMIZATION ) then
+ if ( i == CharacterCreate.selectedRace ) then
+ allow = true
+ end
+ end
+ if (not allow) then
+ --local button = _G["CharCreateRaceButton"..i];
+ --button:Disable();
+ --SetButtonDesaturated(button, true);
+ else
+ numAllowedRaces = numAllowedRaces + 1;
+ end
+ end
+ if ( numAllowedRaces > 1 ) then
+ CharCreateRaceButtonsFrame:SetAlpha(1);
+ else
+ CharCreateRaceButtonsFrame:SetAlpha(0.5);
+ end
+ else
+ CharCreateRaceButtonsFrame:SetAlpha(1);
+ CharCreateClassFrame:SetAlpha(1);
+ end
+end
+
+function CharCreateSelectCustomizationType(newType)
+ -- deselect previous type selection
+ if ( CharacterCreateFrame.customizationType and CharacterCreateFrame.customizationType ~= newType ) then
+ --_G["CharCreateCustomizationButton"..CharacterCreateFrame.customizationType]:SetChecked(0);
+ end
+ --_G["CharCreateCustomizationButton"..newType]:SetChecked(1);
+ CharacterCreateFrame.customizationType = newType;
+ CharCreate_ResetFeaturesDisplay();
+
+ --[[if (newType > 1) then
+ SetFaceCustomizeCamera(true);
+ else
+ SetFaceCustomizeCamera(false);
+ end]]
+end
+
+function CharCreate_ResetFeaturesDisplay()
+ --SetPreviewFramesFeature(CharacterCreateFrame.customizationType);
+ -- set the previews scrollframe container height
+ -- since the first and the last previews need to be in the center position when scrolled all the way
+ -- to the top or to the bottom, there will be gaps of height equal to 2 previews on each side
+ local numTotalButtons = 4--GetNumFeatureVariations() + 4;
+ CharCreatePreviewFrame.scrollFrame.container:SetHeight(numTotalButtons * PREVIEW_FRAME_HEIGHT - PREVIEW_FRAME_Y_OFFSET);
+
+ for _, previewFrame in pairs(CharCreatePreviewFrame.previews) do
+ previewFrame.featureType = 0;
+ end
+
+ CharCreate_DisplayPreviewModels();
+end
+
+function CharCreate_PrepPreviewModels(reloadModels)
+ local displayFrame = CharCreatePreviewFrame;
+
+ -- clear models if rebuildPreviews got flagged
+ local rebuildPreviews = displayFrame.rebuildPreviews;
+ displayFrame.rebuildPreviews = nil;
+
+ -- need to reload models class was swapped to or from DK
+ local classSwap = false;
+ local _, class = GetSelectedClass();
+ --[[if ( class == "DEATHKNIGHT" or displayFrame.lastClass == "DEATHKNIGHT" ) and ( class ~= displayFrame.lastClass ) then
+ classSwap = true;
+ end]]
+
+ -- always clear the featureType
+ for index, previewFrame in pairs(displayFrame.previews) do
+ previewFrame.featureType = 0;
+ -- force model reload if class changed
+ if ( classSwap ) then
+ previewFrame.race = nil;
+ previewFrame.gender = nil;
+ end
+ if ( rebuildPreviews ) then
+ --SetPreviewFrame(previewFrame.model:GetName(), index);
+ end
+ end
+end
+
+function CharCreate_DisplayPreviewModels(selectionIndex)
+ if ( not selectionIndex ) then
+ selectionIndex = featureIndex--GetSelectedFeatureVariation();
+ end
+
+ local displayFrame = CharCreatePreviewFrame;
+ local previews = displayFrame.previews;
+ local numVariations = 8--GetNumFeatureVariations();
+ local currentFeatureType = CharacterCreateFrame.customizationType;
+
+ local race = GetSelectedRace();
+ local gender = GetSelectedSex();
+
+ -- selection index is the center preview
+ -- there are 2 previews above and 2 below, and will pad it out to 1 more on each side, for a total of 7 previews to set up
+ for index = selectionIndex - 3, selectionIndex + 3 do
+ -- there is empty space both at the beginning and at end of the list, each gap the height of 2 previews
+ if ( index > 0 and index <= numVariations ) then
+ local previewFrame = previews[index];
+ -- create button if we don't have it yet
+ if ( not previewFrame ) then
+ previewFrame = CreateFrame("BUTTON", "PreviewFrame"..index, displayFrame.scrollFrame.container, "CharCreatePreviewFrameTemplate");
+ -- index + 1 because of 2 gaps at the top and -1 for the current preview
+ previewFrame:SetPoint("TOPLEFT", PREVIEW_FRAME_X_OFFSET, (index + 1) * -PREVIEW_FRAME_HEIGHT + PREVIEW_FRAME_Y_OFFSET);
+ previewFrame.button.index = index;
+ previews[index] = previewFrame;
+ --SetPreviewFrame(previewFrame.model:GetName(), index);
+ -- no texture as of yet
+ --previewFrame:SetNormalTexture("Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Classes")
+ end
+ -- load model if needed, may have been cleared by different race/gender selection
+ if ( previewFrame.race ~= race or previewFrame.gender ~= gender ) then
+ --SetPreviewFrameModel(index);
+ previewFrame.race = race;
+ previewFrame.gender = gender;
+ -- apply settings
+ local model = previewFrame.model;
+ --model:SetCustomCamera(cameraID);
+ local scale = 1--model:GetWorldScale();
+ --model:SetCameraTarget(config.tx * scale, config.ty * scale, config.tz * scale);
+ --model:SetCameraDistance(config.distance * scale);
+ local cx, cy, cz = model:GetPosition();
+ -- model:SetPosition(cx-15, cy, cz)
+ --model:SetCameraPosition(cx, cy, config.cz * scale);
+ previewFrame.model:SetLight(1, 0, 0, 0, 0, 1, 1.0, 1.0, 1.0);
+ end
+ -- need to reset the model if it was last used to preview a different feature
+ if ( previewFrame.featureType ~= currentFeatureType ) then
+ --ResetPreviewFrameModel(index);
+ --ShowPreviewFrameVariation(index);
+ previewFrame.featureType = currentFeatureType;
+ end
+ previewFrame:Show();
+ else
+ -- need to hide tail previews when going to features with fewer styles
+ if ( previews[index] ) then
+ previews[index]:Hide();
+ end
+ end
+ end
+ displayFrame.border.number:SetText("Option "..selectionIndex.." ");
+ displayFrame.selectionIndex = selectionIndex;
+ CharCreate_RotatePreviews();
+ CharCreatePreviewFrame_UpdateStyleButtons();
+ -- scroll to center the selection
+ if ( not displayFrame.animating ) then
+ displayFrame.scrollFrame:SetVerticalScroll((selectionIndex - 1) * PREVIEW_FRAME_HEIGHT);
+ end
+end
+
+
+function CharCreate_RotatePreviews()
+ if ( CharCreatePreviewFrame:IsShown() ) then
+ local facing = ((GetCharacterCreateFacing())/ -180) * math.pi;
+ local previews = CharCreatePreviewFrame.previews;
+ --CharCreatePreviewFrame.selectionIndex = 0;
+ for index = CharCreatePreviewFrame.selectionIndex - 3, CharCreatePreviewFrame.selectionIndex + 3 do
+ local previewFrame = previews[index];
+ if ( previewFrame ) then -- and previewFrame.model:HasCustomCamera()
+ --previewFrame.model:SetCameraFacing(facing);
+ end
+ end
+ end
+end
+
+function CharCreate_ChangeFeatureVariation(delta)
+ local numVariations = 8--GetNumFeatureVariations();
+ local startIndex = featureIndex--GetSelectedFeatureVariation();
+ local endIndex = startIndex + delta;
+ if ( endIndex < 1 or endIndex > numVariations ) then
+ return;
+ end
+ PlaySound("gsCharacterCreationClass");
+ featureIndex = endIndex
+ CharCreatePreviewFrame_SelectFeatureVariation(endIndex);
+end
+
+function CharCreatePreviewFrameButton_OnClick(self)
+ PlaySound("gsCharacterCreationClass");
+ CharCreatePreviewFrame_SelectFeatureVariation(self.index);
+end
+
+function CharCreatePreviewFrame_SelectFeatureVariation(endIndex)
+ local self = CharCreatePreviewFrame;
+ if ( self.animating ) then
+ if ( not self.queuedIndex ) then
+ self.queuedIndex = endIndex;
+ end
+ else
+ local startIndex = featureIndex--GetSelectedFeatureVariation();
+ --SelectFeatureVariation(endIndex);
+ for i=1,endIndex do
+ CycleCharCustomization(FeatureType, 1);
+ end
+ CharCreatePreviewFrame_UpdateStyleButtons();
+ featureIndex = endIndex
+ CharCreatePreviewFrame_StartAnimating(startIndex, endIndex);
+ end
+end
+
+function CharCreatePreviewFrame_StartAnimating(startIndex, endIndex)
+ local self = CharCreatePreviewFrame;
+ if ( self.animating ) then
+ return;
+ else
+ self.startIndex = startIndex;
+ self.currentIndex = startIndex;
+ self.endIndex = endIndex;
+ self.queuedIndex = nil;
+ self.direction = 1;
+ if ( self.startIndex > self.endIndex ) then
+ self.direction = -1;
+ end
+ self.movedTotal = 0;
+ self.moveUntilUpdate = PREVIEW_FRAME_HEIGHT;
+ self.animating = true;
+ end
+end
+
+function CharCreatePreviewFrame_StopAnimating()
+ local self = CharCreatePreviewFrame;
+ if ( self.animating ) then
+ self.animating = false;
+ end
+end
+
+local ANIMATION_SPEED = 5;
+function CharCreatePreviewFrame_OnUpdate(self, elapsed)
+ if ( self.animating ) then
+ local moveIncrement = PREVIEW_FRAME_HEIGHT * elapsed * ANIMATION_SPEED;
+ self.movedTotal = self.movedTotal + moveIncrement;
+ self.scrollFrame:SetVerticalScroll((self.startIndex - 1) * PREVIEW_FRAME_HEIGHT + self.movedTotal * self.direction);
+ self.moveUntilUpdate = self.moveUntilUpdate - moveIncrement;
+ if ( self.moveUntilUpdate <= 0 ) then
+ self.currentIndex = self.currentIndex + self.direction;
+ self.moveUntilUpdate = PREVIEW_FRAME_HEIGHT;
+ -- reset movedTotal to account for rounding errors
+ self.movedTotal = abs(self.startIndex - self.currentIndex) * PREVIEW_FRAME_HEIGHT;
+ CharCreate_DisplayPreviewModels(self.currentIndex);
+ end
+ if ( self.currentIndex == self.endIndex ) then
+ self.animating = false;
+ CharCreate_DisplayPreviewModels();
+ if ( self.queuedIndex ) then
+ local newIndex = self.queuedIndex;
+ self.queuedIndex = nil;
+ --SelectFeatureVariation(newIndex);
+ featureIndex = newIndex
+ CycleCharCustomization(FeatureType, featureIndex);
+ CharCreatePreviewFrame_UpdateStyleButtons();
+ CharCreatePreviewFrame_StartAnimating(self.endIndex, newIndex);
+ end
+ end
+ end
+end
+
+function CharCreatePreviewFrame_UpdateStyleButtons()
+ local selectionIndex = math.random(1,5)--GetSelectedFeatureVariation();
+ local numVariations = 8--GetNumFeatureVariations();
+ if ( selectionIndex == 1 ) then
+ CharCreateStyleUpButton:Enable();
+ CharCreateStyleUpButton.arrow:SetDesaturated(true);
+ else
+ CharCreateStyleUpButton:Enable();
+ CharCreateStyleUpButton.arrow:SetDesaturated(false);
+ end
+ if ( selectionIndex == numVariations ) then
+ CharCreateStyleDownButton:Disable();
+ CharCreateStyleDownButton.arrow:SetDesaturated(true);
+ else
+ CharCreateStyleDownButton:Disable(true);
+ CharCreateStyleDownButton.arrow:SetDesaturated(false);
+ end
+end
+
+local TotalTime = 0;
+local KeepScrolling = nil;
+local TIME_TO_SCROLL = 0.5;
+function CharacterCreateWhileMouseDown_OnMouseDown(direction)
+ TIME_TO_SCROLL = 0.5;
+ TotalTime = 0;
+ KeepScrolling = direction;
+end
+function CharacterCreateWhileMouseDown_OnMouseUp()
+ KeepScrolling = nil;
+end
+function CharacterCreateWhileMouseDown_Update(elapsed)
+ if ( KeepScrolling ) then
+ TotalTime = TotalTime + elapsed;
+ if ( TotalTime >= TIME_TO_SCROLL ) then
+ CharCreate_ChangeFeatureVariation(KeepScrolling);
+ TIME_TO_SCROLL = 0.25;
+ TotalTime = 0;
+ end
+ end
+end
+
+-- pandaren stuff related to faction change
+function CharCreate_EnableNextButton(enabled)
+ local button = CharCreateOkayButton;
+ if enabled then
+ button:Enable();
+ else
+ button:Disable();
+ end
+ button.Arrow:SetDesaturated(not enabled);
+ if enabled then
+ button.TopGlow:Hide();
+ button.BottomGlow:Hide();
+ else
+ button.TopGlow:Show();
+ button.BottomGlow:Show();
+ end
+end
+
+-- -- function PandarenFactionButtons_OnLoad(self)
+-- -- self.PandarenButton = CharCreateRaceButton6;
+-- -- end
+-- --
+-- -- function PandarenFactionButtons_OnLoad(self)
+-- -- self.PandarenButton = CharCreateRaceButton6;
+-- -- end
+--
+-- function PandarenFactionButtons_Show()
+-- local frame = CharCreatePandarenFactionFrame;
+-- -- set the name
+-- local raceName = GetNameForRace();
+-- frame.AllianceButton.nameFrame.text:SetText(raceName);
+-- frame.AllianceButton.tooltip = raceName;
+-- frame.HordeButton.nameFrame.text:SetText(raceName);
+-- frame.HordeButton.tooltip = raceName;
+-- -- set the texture
+-- PandarenFactionButtons_SetTextures();
+-- -- set selected button
+-- local faction = PaidChange_GetCurrentFaction();
+-- -- deselect first in case of multiple pandaren faction changes
+-- PandarenFactionButtons_ClearSelection();
+-- frame[faction.."Button"]:SetChecked(1);
+-- -- show the frame on top of the normal pandaren button
+-- frame:Show();
+-- frame:SetFrameLevel(frame.PandarenButton:GetFrameLevel() + 2);
+-- CharCreate_EnableNextButton(false);
+-- end
+--
+-- function PandarenFactionButtons_Hide()
+-- CharCreatePandarenFactionFrame:Hide();
+-- CharCreate_EnableNextButton(true);
+-- end
+--
+-- function PandarenFactionButtons_SetTextures()
+-- --[[local gender = "MALE";
+-- local coords = RACE_ICON_TCOORDS["TUSKARR_"..gender];
+-- CharCreatePandarenFactionFrameAllianceButtonNormalTexture:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
+-- CharCreatePandarenFactionFrameAllianceButtonPushedTexture:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
+-- CharCreatePandarenFactionFrameHordeButtonNormalTexture:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
+-- CharCreatePandarenFactionFrameHordeButtonPushedTexture:SetTexCoord(coords[1], coords[2], coords[3], coords[4]); ]]
+-- end
+--
+-- function PandarenFactionButtons_ClearSelection()
+-- CharCreatePandarenFactionFrame.AllianceButton:SetChecked(0);
+-- CharCreatePandarenFactionFrame.HordeButton:SetChecked(0);
+-- end
+--
+-- function PandarenFactionButtons_GetSelectedFaction()
+-- if ( CharCreatePandarenFactionFrame.AllianceButton:GetChecked() ) then
+-- return "Alliance";
+-- elseif ( CharCreatePandarenFactionFrame.HordeButton:GetChecked() ) then
+-- return "Horde";
+-- end
+-- end
+--
+-- function PandarenFactionButton_OnClick(self)
+-- PandarenFactionButtons_ClearSelection();
+-- self:SetChecked(1);
+-- CharacterRace_OnClick(CharCreatePandarenFactionFrame.PandarenButton, CharCreatePandarenFactionFrame.PandarenButton:GetID(), true);
+-- end
\ No newline at end of file
diff --git a/data/patch-hd/Interface/GlueXML/CharacterCreate.xml b/data/patch-hd/Interface/GlueXML/CharacterCreate.xml
new file mode 100644
index 00000000..e9abd1cd
--- /dev/null
+++ b/data/patch-hd/Interface/GlueXML/CharacterCreate.xml
@@ -0,0 +1,2104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:SetBackdropBorderColor(1.0, 1.0, 1.0);
+ self:SetBackdropColor(0.09, 0.09, 0.19 );
+ local name = self:GetName();
+
+ -- setup text lines
+ self.lines = {
+ _G[name .. "Text1"],
+ _G[name .. "Text2"],
+ };
+
+ -- setup tooltip functions
+ self.SetOwner =
+ function (self, owner, ownerPoint, myPoint, xOffset, yOffset)
+ self:Hide();
+ self:ClearAllPoints();
+ self:SetParent(owner);
+ -- HACK: bumping the frame level up seems to get around a bug where frames on the same frame
+ -- level are drawing as if they were on the same frame strata as the tooltip, even when their
+ -- frame strata is lower than the tooltip
+ self:SetFrameLevel(owner:GetFrameLevel() + 2);
+ ownerPoint = ownerPoint or "TOPRIGHT";
+ myPoint = myPoint or "BOTTOMLEFT";
+ xOffset = xOffset or 8;
+ yOffset = yOffset or 8;
+ self:SetPoint(myPoint, owner, ownerPoint, xOffset, yOffset);
+ end
+ self.Clear =
+ function (self)
+ for _, line in next, self.lines do
+ line:SetText("");
+ line:SetTextColor(1, .82, 0, 1);
+ line:Hide();
+ end
+ end
+ self.AddLine =
+ function (self, text, r, g, b, a)
+ r = r or 1;
+ g = g or .82;
+ b = b or 0;
+ a = a or 1;
+ -- find a free line
+ local freeLine;
+ for _, line in next, self.lines do
+ if ( not line:IsShown() ) then
+ freeLine = line;
+ break;
+ end
+ end
+ freeLine:SetTextColor(r, g, b, a);
+ freeLine:SetText(text);
+ freeLine:Show();
+ if ( self:IsShown() ) then
+ local height = 0;
+ for _, line in next, self.lines do
+ height = height + line:GetHeight();
+ end
+ self:SetHeight(height + 22);
+ else
+ self:Show();
+ end
+ end
+ self.SetText =
+ function (self, text, r, g, b, a)
+ self:Clear();
+ self:AddLine(text, r, g, b, a);
+ end
+
+
+ local height = 0;
+ for _, line in next, self.lines do
+ height = height + line:GetHeight();
+ end
+ self:SetHeight(height + 22);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:SetBackdropBorderColor(1.0, 1.0, 1.0);
+ self:SetBackdropColor(0.09, 0.09, 0.19 );
+ local name = self:GetName();
+
+ -- setup text lines
+ self.lines = {
+ _G[name .. "Text1"],
+ _G[name .. "Text2"],
+ };
+
+ -- setup tooltip functions
+ self.SetOwner =
+ function (self, owner, ownerPoint, myPoint, xOffset, yOffset)
+ self:Hide();
+ self:ClearAllPoints();
+ self:SetParent(owner);
+ -- HACK: bumping the frame level up seems to get around a bug where frames on the same frame
+ -- level are drawing as if they were on the same frame strata as the tooltip, even when their
+ -- frame strata is lower than the tooltip
+ self:SetFrameLevel(owner:GetFrameLevel() + 2);
+ ownerPoint = ownerPoint or "TOPRIGHT";
+ myPoint = myPoint or "BOTTOMLEFT";
+ xOffset = xOffset or 8;
+ yOffset = yOffset or 8;
+ self:SetPoint(myPoint, owner, ownerPoint, xOffset, yOffset);
+ end
+ self.Clear =
+ function (self)
+ for _, line in next, self.lines do
+ line:SetText("");
+ line:SetTextColor(1, .82, 0, 1);
+ line:Hide();
+ end
+ end
+ self.AddLine =
+ function (self, text, r, g, b, a)
+ r = r or 1;
+ g = g or .82;
+ b = b or 0;
+ a = a or 1;
+ -- find a free line
+ local freeLine;
+ for _, line in next, self.lines do
+ if ( not line:IsShown() ) then
+ freeLine = line;
+ break;
+ end
+ end
+ freeLine:SetTextColor(r, g, b, a);
+ freeLine:SetText(text);
+ freeLine:Show();
+ if ( self:IsShown() ) then
+ local height = 0;
+ for _, line in next, self.lines do
+ height = height + line:GetHeight();
+ end
+ self:SetHeight(height + 22);
+ else
+ self:Show();
+ end
+ end
+ self.SetText =
+ function (self, text, r, g, b, a)
+ self:Clear();
+ self:AddLine(text, r, g, b, a);
+ end
+
+
+ local height = 0;
+ for _, line in next, self.lines do
+ height = height + line:GetHeight();
+ end
+ self:SetHeight(height + 22);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterCreateTooltip:Hide();
+
+
+
+
+
+
+ CharacterRace_OnClick(self, self:GetID());
+
+
+ if ( self.tooltip ) then
+ CharacterCreateTooltip:SetOwner(self);
+ CharacterCreateTooltip:SetText(self.tooltip);
+ end
+
+
+ CharacterCreateTooltip:Hide();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterClass_OnClick(self, self:GetID());
+
+
+ if ( self.tooltip ) then
+ CharacterCreateTooltip:SetOwner(self);
+ CharacterCreateTooltip:SetText(self.tooltip);
+ end
+
+
+ CharacterCreateTooltip:Hide();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --CharacterCreate_DeathKnightSwap(self);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if ( self:IsEnabled() ) then
+ self.arrow:SetPoint("CENTER", 1, 2);
+ end
+
+
+ self.arrow:SetPoint("CENTER", 0, 3);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self.text:SetPoint("CENTER", 1, -1);
+
+
+ self.text:SetPoint("CENTER", 0, 0);
+
+
+ PlaySound("gsCharacterCreationClass");
+ CharCreateSelectCustomizationType(self:GetID());
+
+
+
+
+
+
+
+
+
+
+ CharacterCustomization_Right(self:GetParent():GetID());
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterCustomization_Left(self:GetParent():GetID());
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ local scrollBar = _G[self:GetName().."ScrollBar"];
+ scrollBar:ClearAllPoints();
+ scrollBar:SetPoint("TOPLEFT", self, "TOPRIGHT", 11, 10);
+ scrollBar:SetPoint("BOTTOMLEFT", self, "BOTTOMRIGHT", 11, 12);
+ GlueScrollFrame_OnScrollRangeChanged(self, yrange);
+
+
+ GlueScrollFrame_OnScrollRangeChanged(self, yrange);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterCustomization_Right(self:GetParent():GetID());
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterCustomization_Left(self:GetParent():GetID());
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if( self:IsEnabled() == 1 ) then
+
+
+ end
+
+
+ if( self:IsEnabled() == 1 ) then
+
+
+ end
+
+
+ CharacterCreateTooltip2:Hide();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self.highlight:Show();
+
+
+ self.highlight:Hide();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharCreateBackButton:SetFrameLevel(1000);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterCreate_Back();
+
+
+ CharacterCreate_Forward();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterCreate_GenerateRandomName(self);
+
+
+ --CharacterCreate_DeathKnightSwap(self);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterRace_OnClick(self, self:GetID());
+
+
+ if ( self.tooltip ) then
+ CharacterCreateTooltip:SetOwner(self, "TOPLEFT", "BOTTOMRIGHT", -8, 0);
+ CharacterCreateTooltip:SetText(self.tooltip);
+ end
+
+
+ CharacterCreateTooltip:Hide();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterRace_OnClick(self, self:GetID());
+
+
+ if ( self.tooltip ) then
+ CharacterCreateTooltip:SetOwner(self, "TOPLEFT", "BOTTOMRIGHT", -8, 0);
+ CharacterCreateTooltip:SetText(self.tooltip);
+ end
+
+
+ CharacterCreateTooltip:Hide();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterRace_OnClick(self, self:GetID());
+
+
+ if ( self.tooltip ) then
+ CharacterCreateTooltip:SetOwner(self, "TOPLEFT", "BOTTOMRIGHT", -8, 0);
+ CharacterCreateTooltip:SetText(self.tooltip);
+ end
+
+
+ CharacterCreateTooltip:Hide();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterRace_OnClick(self, self:GetID());
+
+
+ if ( self.tooltip ) then
+ CharacterCreateTooltip:SetOwner(self, "TOPLEFT", "BOTTOMRIGHT", -8, 0);
+ CharacterCreateTooltip:SetText(self.tooltip);
+ end
+
+
+ CharacterCreateTooltip:Hide();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterRace_OnClick(self, self:GetID());
+
+
+ if ( self.tooltip ) then
+ CharacterCreateTooltip:SetOwner(self, "TOPLEFT", "BOTTOMRIGHT", -8, 0);
+ CharacterCreateTooltip:SetText(self.tooltip);
+ end
+
+
+ CharacterCreateTooltip:Hide();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharCreateRaceFrame.factionBg = self.factionBg;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharCreateCustomizationFrame_OnShow();
+ CharacterCreateRandomName:Show();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:RegisterForClicks("LeftButtonDown", "RightButtonDown");
+
+
+ CharCustomizeButtonClick(1, button);
+
+
+
+
+
+
+
+
+
+ self:RegisterForClicks("LeftButtonDown", "RightButtonDown");
+
+
+ CharCustomizeButtonClick(2, button);
+
+
+
+
+
+
+
+
+
+ self:RegisterForClicks("LeftButtonDown", "RightButtonDown");
+
+
+ CharCustomizeButtonClick(3, button);
+
+
+
+
+
+
+
+
+
+ self:RegisterForClicks("LeftButtonDown", "RightButtonDown");
+
+
+ CharCustomizeButtonClick(4, button);
+
+
+
+
+
+
+
+
+
+ self:RegisterForClicks("LeftButtonDown", "RightButtonDown");
+
+
+ CharCustomizeButtonClick(5, button);
+
+
+
+
+
+
+
+
+
+
+ CharacterCreate_Randomize();
+
+
+ --CharacterCreate_DeathKnightSwap(self);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterCreateAlternateFormTop:SetChecked(true);
+ CharacterCreateAlternateFormBottom:SetChecked(false);
+ if ( IsViewingAlteredForm() ) then
+ PlaySound("gsCharacterCreationClass");
+ SetViewingAlteredForm(false);
+ CharCreate_PrepPreviewModels(true);
+ CharCreate_ResetFeaturesDisplay();
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterCreateAlternateFormTop:SetChecked(false);
+ CharacterCreateAlternateFormBottom:SetChecked(true);
+ if ( not IsViewingAlteredForm() ) then
+ PlaySound("gsCharacterCreationClass");
+ SetViewingAlteredForm(true);
+ CharCreate_PrepPreviewModels(true);
+ CharCreate_ResetFeaturesDisplay();
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --SetClampedTextureRotation(self.arrow, 90);
+
+
+ CharCreate_ChangeFeatureVariation(-1);
+ CharacterCreateWhileMouseDown_OnMouseDown(-1);
+
+
+ CharacterCreateWhileMouseDown_OnMouseUp()
+
+
+
+
+
+
+
+
+
+ --SetClampedTextureRotation(self.arrow, 270);
+
+
+ CharCreate_ChangeFeatureVariation(1);
+ CharacterCreateWhileMouseDown_OnMouseDown(1);
+
+
+ CharacterCreateWhileMouseDown_OnMouseUp()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharCreatePreviewFrame_StopAnimating();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ _G[self:GetName().."NormalTexture"]:SetTexCoord(0, 0.5, 0, 1.0);
+ _G[self:GetName().."PushedTexture"]:SetTexCoord(0, 0.5, 0, 1.0);
+
+
+ PlaySound("gsCharacterCreationClass");
+ if ( GetSelectedSex() ~= SEX_MALE ) then
+ SetCharacterGender(SEX_MALE);
+ else
+ self:SetChecked(1);
+ end
+
+
+ CharacterCreateTooltip2:SetOwner(self, "BOTTOMRIGHT", "TOPLEFT", -60, 0);
+ CharacterCreateTooltip2:SetText(MALE);
+
+
+
+
+
+
+
+
+
+ _G[self:GetName().."NormalTexture"]:SetTexCoord(0.5, 1.0, 0, 1.0);
+ _G[self:GetName().."PushedTexture"]:SetTexCoord(0.5, 1.0, 0, 1.0);
+
+
+ PlaySound("gsCharacterCreationClass");
+ if ( GetSelectedSex() ~= SEX_FEMALE ) then
+ SetCharacterGender(SEX_FEMALE);
+ else
+ self:SetChecked(1);
+ end
+
+
+ CharacterCreateTooltip2:SetOwner(self, "BOTTOMRIGHT", "TOPLEFT", -60, 0);
+ CharacterCreateTooltip2:SetText(FEMALE);
+
+
+
+
+
+
+ CharacterCreateFrame_OnMouseDown(button);
+
+
+ CharacterCreateFrame_OnMouseUp(button);
+
+
+ CharacterCreateFrame_OnUpdate(self, elapsed);
+
+
+ if ( CharCreatePreviewFrame:IsShown() ) then
+ CharCreate_ChangeFeatureVariation(delta * -1);
+ end
+
+
+
+
+
+
+ CharacterCreate_OnLoad(self);
+
+
+ CharacterCreate_OnShow();
+
+
+ CharacterCreate_OnHide();
+
+
+ CharacterCreate_OnEvent(event, ...);
+
+
+ CharacterCreate_OnChar();
+
+
+ CharacterCreate_OnKeyDown(key);
+
+
+ CharacterCreate_UpdateModel(self);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CharacterTemplateConfirmDialog:Hide();
+ CreateCharacter(CharacterCreateNameEdit:GetText(), 0);
+
+
+ --CharacterSelect_DeathKnightSwap(self);
+
+
+
+
+
+
+
+
+
+
+ CharacterTemplateConfirmDialog:Hide();
+ CreateCharacter(CharacterCreateNameEdit:GetText(), 1);
+
+
+ CharacterSelect_DeathKnightSwap(self);
+
+
+
+
+
+
+
+
+
+
+ CharacterTemplateConfirmDialog:Hide();
+ PlaySound("gsTitleOptionExit");
+
+
+ CharacterSelect_DeathKnightSwap(self);
+
+
+
+
+
+
+
+
+ -- block keys
+
+
+ -- block keys
+
+
+
+
diff --git a/data/patch-hd/Interface/GlueXML/GlueParent.lua b/data/patch-hd/Interface/GlueXML/GlueParent.lua
new file mode 100644
index 00000000..712cc237
--- /dev/null
+++ b/data/patch-hd/Interface/GlueXML/GlueParent.lua
@@ -0,0 +1,506 @@
+
+CurrentGlueMusic = "GS_LichKing";
+
+GlueCreditsSoundKits = { };
+GlueCreditsSoundKits[1] = "Menu-Credits01";
+GlueCreditsSoundKits[2] = "Menu-Credits02";
+GlueCreditsSoundKits[3] = "Menu-Credits03";
+
+
+GlueScreenInfo = { };
+GlueScreenInfo["login"] = "AccountLogin";
+GlueScreenInfo["charselect"] = "CharacterSelect";
+GlueScreenInfo["realmwizard"] = "RealmWizard";
+GlueScreenInfo["charcreate"] = "CharacterCreate";
+GlueScreenInfo["patchdownload"] = "PatchDownload";
+GlueScreenInfo["trialconvert"] = "TrialConvert";
+GlueScreenInfo["movie"] = "MovieFrame";
+GlueScreenInfo["credits"] = "CreditsFrame";
+GlueScreenInfo["options"] = "OptionsFrame";
+
+CharModelFogInfo = { };
+CharModelFogInfo["HUMAN"] = { r=0.8, g=0.65, b=0.73, far=222 };
+CharModelFogInfo["ORC"] = { r=0.5, g=0.5, b=0.5, far=270 };
+CharModelFogInfo["DWARF"] = { r=0.85, g=0.88, b=1.0, far=500 };
+CharModelFogInfo["NIGHTELF"] = { r=0.25, g=0.22, b=0.55, far=611 };
+CharModelFogInfo["TAUREN"] = { r=1.0, g=0.61, b=0.42, far=153 };
+CharModelFogInfo["SCOURGE"] = { r=0, g=0.22, b=0.22, far=26 };
+CharModelFogInfo["CHARACTERSELECT"] = { r=0.8, g=0.65, b=0.73, far=222 };
+
+CharModelGlowInfo = { };
+CharModelGlowInfo["WORGEN"] = 0.0;
+CharModelGlowInfo["GOBLIN"] = 0.0;
+CharModelGlowInfo["HUMAN"] = 0.15;
+CharModelGlowInfo["DWARF"] = 0.15;
+CharModelGlowInfo["CHARACTERSELECT"] = 0.3;
+
+GlueAmbienceTracks = { };
+GlueAmbienceTracks["ALLIANCE"] = "GlueScreenHuman";
+GlueAmbienceTracks["HORDE"] = "GlueScreenOrcTroll";
+GlueAmbienceTracks["HUMAN"] = "GlueScreenHuman";
+GlueAmbienceTracks["ORC"] = "GlueScreenOrcTroll";
+GlueAmbienceTracks["TROLL"] = "GlueScreenOrcTroll";
+GlueAmbienceTracks["DWARF"] = "GlueScreenDwarfGnome";
+GlueAmbienceTracks["GNOME"] = "GlueScreenDwarfGnome";
+GlueAmbienceTracks["TAUREN"] = "GlueScreenTauren";
+GlueAmbienceTracks["SCOURGE"] = "GlueScreenUndead";
+GlueAmbienceTracks["NIGHTELF"] = "GlueScreenNightElf";
+GlueAmbienceTracks["DRAENEI"] = "GlueScreenDraenei";
+GlueAmbienceTracks["BLOODELF"] = "GlueScreenBloodElf";
+GlueAmbienceTracks["GOBLIN"] = "GlueScreenTroll";
+GlueAmbienceTracks["WORGEN"] = "GlueScreenNightElf";
+GlueAmbienceTracks["DARKPORTAL"] = "GlueScreenIntro";
+GlueAmbienceTracks["DEATHKNIGHT"] = "GlueScreenIntro";
+GlueAmbienceTracks["DEATHKNIGH2"] = "GlueScreenIntro";
+GlueAmbienceTracks["CHARACTERSELECT"] = "GlueScreenIntro";
+
+-- RaceLights[] duplicates the 3.2.2 color values in the models. Henceforth, the models no longer contain directional lights
+RaceLights = {
+ HUMAN = {
+ {1, 0, 0.000000, 0.000000, -1.000000, 1.0, 0.27, 0.27, .27, 1.0, 0, 0, 0},
+ {1, 0, -0.45756075, -0.58900136, -0.66611975, 1.0, 0.000000, 0.000000, 0.000000, 1.0, 0.19882353, 0.34921569, 0.43588236 },
+ {1, 0, -0.64623469, 0.57582057, -0.50081086, 1.0, 0.000000, 0.000000, 0.000000, 2.0, 0.52196085, 0.44, 0.29764709 },
+ },
+ ORC = {
+ {1, 0, 0.00000, 0.00000, -1.00000, 1.0, 0.15000, 0.15000, 0.15000, 1.0, 0.00000, 0.00000, 0.00000},
+ {1, 0, -0.74919, 0.35208, -0.56103, 1.0, 0.00000, 0.00000, 0.00000, 1.0, 0.44706, 0.54510, 0.73725},
+ {1, 0, 0.53162, -0.84340, 0.07780, 1.0, 0.00000, 0.00000, 0.00000, 2.0, 0.55, 0.338625, 0.148825},
+ },
+ TROLL = {
+ {1, 0, 0.00000, 0.00000, -1.00000, 1.0, 0.15000, 0.15000, 0.15000, 1.0, 0.00000, 0.00000, 0.00000},
+ {1, 0, -0.74919, 0.35208, -0.56103, 1.0, 0.00000, 0.00000, 0.00000, 1.0, 0.44706, 0.54510, 0.73725},
+ {1, 0, 0.53162, -0.84340, 0.07780, 1.0, 0.00000, 0.00000, 0.00000, 2.0, 0.55, 0.338625, 0.148825},
+ },
+ DWARF = {
+ {1, 0, -0.00000, -0.00000, -1.00000, 1.0, 0.30000, 0.30000, 0.30000, 0.0, 0.00000, 0.00000, 0.00000},
+ {1, 0, -0.88314, 0.42916, -0.18945, 1.0, 0.00000, 0.00000, 0.00000, 2.0, 0.44706, 0.67451, 0.760785},
+ },
+ GNOME = {
+ {1, 0, -0.00000, -0.00000, -1.00000, 1.0, 0.30000, 0.30000, 0.30000, 0.0, 0.00000, 0.00000, 0.00000},
+ {1, 0, -0.88314, 0.42916, -0.18945, 1.0, 0.00000, 0.00000, 0.00000, 2.0, 0.44706, 0.67451, 0.760785},
+ },
+ TAUREN = {
+ {1, 0, -0.48073, 0.71827, -0.50297, 1.0, 0.00000, 0.00000, 0.00000, 2.0, 0.65, 0.397645, 0.2727},
+ {1, 0, -0.49767, -0.78677, 0.36513, 1.0, 0.00000, 0.00000, 0.00000, 1.0, 0.60000, 0.47059, 0.32471},
+ },
+ SCOURGE = {
+ {1, 0, 0.00000, 0.00000, -1.00000, 1.0, 0.20000, 0.20000, 0.20000, 1.0, 0.00000, 0.00000, 0.00000},
+ },
+ NIGHTELF = {
+ {1, 0, -0.00000, -0.00000, -1.00000, 1.0, 0.09020, 0.09020, 0.17020, 1.0, 0.00000, 0.00000, 0.00000},
+ },
+ DRAENEI = {
+ {1, 0, 0.61185, 0.62942, -0.47903, 1.0, 0.00000, 0.00000, 0.00000, 1.0, 0.56941, 0.52000, 0.60000},
+ {1, 0, -0.64345, -0.31052, -0.69968, 1.0, 0.00000, 0.00000, 0.00000, 1.0, 0.60941, 0.60392, 0.70000},
+ {1, 0, -0.46481, -0.14320, 0.87376, 1.0, 0.00000, 0.00000, 0.00000, 2.0, 0.5835, 0.48941, 0.60000},
+ },
+ BLOODELF = {
+ {1, 0, -0.82249, -0.54912, -0.14822, 1.0, 0.00000, 0.00000, 0.00000, 2.0, 0.581175, 0.50588, 0.42588},
+ {1, 0, 0.00000, -0.00000, -1.00000, 1.0, 0.60392, 0.61490, 0.70000, 1.0, 0.00000, 0.00000, 0.00000},
+ {1, 0, 0.02575, 0.86518, -0.50081, 1.0, 0.00000, 0.00000, 0.00000, 1.0, 0.59137, 0.51745, 0.63471},
+ },
+ DEATHKNIGHT = {
+ {1, 0, 0.00000, 0.00000, -1.00000, 1.0, 0.38824, 0.66353, 0.76941, 1.0, 0.00000, 0.00000, 0.00000},
+ },
+ DEATHKNIGH2 = {
+ {1, 0, 0.00000, 0.00000, -1.00000, 1.0, 0.38824, 0.66353, 0.76941, 1.0, 0.00000, 0.00000, 0.00000},
+ },
+ CHARACTERSELECT = {
+ {1, 0, 0.00000, 0.00000, -1.00000, 1.0, 0.15000, 0.15000, 0.15000, 1.0, 0.00000, 0.00000, 0.00000},
+ {1, 0, -0.74919, 0.35208, -0.56103, 1.0, 0.00000, 0.00000, 0.00000, 1.0, 0.44706, 0.54510, 0.73725},
+ {1, 0, 0.53162, -0.84340, 0.07780, 1.0, 0.00000, 0.00000, 0.00000, 2.0, 0.55, 0.338625, 0.148825},
+ },
+}
+
+-- indicies for adding lights ModelFFX:Add*Light
+LIGHT_LIVE = 0;
+LIGHT_GHOST = 1;
+
+-- Alpha animation stuff
+FADEFRAMES = {};
+CURRENT_GLUE_SCREEN = nil;
+PENDING_GLUE_SCREEN = nil;
+-- Time in seconds to fade
+LOGIN_FADE_IN = 1.5;
+LOGIN_FADE_OUT = 0.5;
+CHARACTER_SELECT_FADE_IN = 0.75;
+RACE_SELECT_INFO_FADE_IN = .5;
+RACE_SELECT_INFO_FADE_OUT = .5;
+
+-- Realm Split info
+SERVER_SPLIT_SHOW_DIALOG = false;
+SERVER_SPLIT_CLIENT_STATE = -1; -- -1 uninitialized; 0 - no choice; 1 - realm 1; 2 - realm 2
+SERVER_SPLIT_STATE_PENDING = -1; -- -1 uninitialized; 0 - no server split; 1 - server split (choice mode); 2 - server split (no choice mode)
+SERVER_SPLIT_DATE = nil;
+
+-- Account Messaging info
+ACCOUNT_MSG_NUM_AVAILABLE = 0;
+ACCOUNT_MSG_PRIORITY = 0;
+ACCOUNT_MSG_HEADERS_LOADED = false;
+ACCOUNT_MSG_BODY_LOADED = false;
+ACCOUNT_MSG_CURRENT_INDEX = nil;
+
+-- Gender Constants
+SEX_NONE = 1;
+SEX_MALE = 2;
+SEX_FEMALE = 3;
+
+
+function SetGlueScreen(name)
+ local newFrame;
+ for index, value in pairs(GlueScreenInfo) do
+ local frame = _G[value];
+ if ( frame ) then
+ frame:Hide();
+ if ( index == name ) then
+ newFrame = frame;
+ end
+ end
+ end
+
+ if ( newFrame ) then
+ newFrame:Show();
+ SetCurrentScreen(name);
+ SetCurrentGlueScreenName(name);
+ if ( name == "credits" ) then
+ PlayCreditsMusic( GlueCreditsSoundKits[CreditsFrame.creditsType] );
+ StopGlueAmbience();
+ elseif ( name ~= "movie" ) then
+ --PlayGlueMusic(CurrentGlueMusic);
+ if (name == "login") then
+ --PlayGlueAmbience(GlueAmbienceTracks["DARKPORTAL"], 4.0);
+ end
+ end
+ end
+end
+
+function SetCurrentGlueScreenName(name)
+ CURRENT_GLUE_SCREEN = name;
+end
+
+function GetCurrentGlueScreenName()
+ return CURRENT_GLUE_SCREEN;
+end
+
+function SetPendingGlueScreenName(name)
+ PENDING_GLUE_SCREEN = name;
+end
+
+function GetPendingGlueScreenName()
+ return PENDING_GLUE_SCREEN;
+end
+
+function GlueParent_OnLoad(self)
+ local width = GetScreenWidth();
+ local height = GetScreenHeight();
+
+ if ( width / height > 16 / 9) then
+ local maxWidth = height * 16 / 9;
+ local barWidth = ( width - maxWidth ) / 2;
+ self:ClearAllPoints();
+ self:SetPoint("TOPLEFT", barWidth, 0);
+ self:SetPoint("BOTTOMRIGHT", -barWidth, 0);
+ end
+
+ self:RegisterEvent("FRAMES_LOADED");
+ self:RegisterEvent("SET_GLUE_SCREEN");
+ self:RegisterEvent("START_GLUE_MUSIC");
+ self:RegisterEvent("DISCONNECTED_FROM_SERVER");
+ self:RegisterEvent("GET_PREFERRED_REALM_INFO");
+ self:RegisterEvent("SERVER_SPLIT_NOTICE");
+ self:RegisterEvent("ACCOUNT_MESSAGES_AVAILABLE");
+ self:RegisterEvent("ACCOUNT_MESSAGES_HEADERS_LOADED");
+ self:RegisterEvent("ACCOUNT_MESSAGES_BODY_LOADED");
+end
+
+function GlueParent_OnEvent(event, arg1, arg2, arg3)
+ if ( event == "FRAMES_LOADED" ) then
+ LocalizeFrames();
+ elseif ( event == "SET_GLUE_SCREEN" ) then
+ GlueScreenExit(GetCurrentGlueScreenName(), arg1);
+ --[[elseif ( event == "START_GLUE_MUSIC" ) then
+ PlayGlueMusic(CurrentGlueMusic);
+ PlayGlueAmbience(GlueAmbienceTracks["DARKPORTAL"], 4.0);]]
+ elseif ( event == "DISCONNECTED_FROM_SERVER" ) then
+ TokenEntry_Cancel(TokenEnterDialog);
+ SetGlueScreen("login");
+ if ( arg1 == 4 ) then
+ GlueDialog_Show("PARENTAL_CONTROL");
+ else
+ GlueDialog_Show("DISCONNECTED");
+ end
+ AddonList:Hide();
+ elseif ( event == "GET_PREFERRED_REALM_INFO" ) then
+ if( arg1 == 1) then
+ SetPreferredInfo(1);
+ else
+ SetGlueScreen("realmwizard");
+ --PlayGlueAmbience(GlueAmbienceTracks["DARKPORTAL"], 4.0);
+ end
+ elseif ( event == "SERVER_SPLIT_NOTICE" ) then
+ CharacterSelectRealmSplitButton:Show();
+ if ( SERVER_SPLIT_STATE_PENDING == -1 and arg1 == 0 and arg2 == 1 ) then
+ SERVER_SPLIT_SHOW_DIALOG = true;
+ end
+ SERVER_SPLIT_CLIENT_STATE = arg1;
+ SERVER_SPLIT_STATE_PENDING = arg2;
+ SERVER_SPLIT_DATE = arg3;
+ elseif ( event == "ACCOUNT_MESSAGES_AVAILABLE" ) then
+-- ACCOUNT_MSG_NUM_AVAILABLE = arg1;
+ ACCOUNT_MSG_HEADERS_LOADED = false;
+ ACCOUNT_MSG_BODY_LOADED = false;
+ ACCOUNT_MSG_CURRENT_INDEX = nil;
+ AccountMsg_LoadHeaders();
+ elseif ( event == "ACCOUNT_MESSAGES_HEADERS_LOADED" ) then
+ ACCOUNT_MSG_HEADERS_LOADED = true;
+ ACCOUNT_MSG_NUM_AVAILABLE = AccountMsg_GetNumUnreadMsgs();
+ ACCOUNT_MSG_CURRENT_INDEX = AccountMsg_GetIndexNextUnreadMsg();
+ if ( ACCOUNT_MSG_NUM_AVAILABLE > 0 ) then
+ AccountMsg_LoadBody( ACCOUNT_MSG_CURRENT_INDEX );
+ end
+ elseif ( event == "ACCOUNT_MESSAGES_BODY_LOADED" ) then
+ ACCOUNT_MSG_BODY_LOADED = true;
+ end
+end
+
+-- Glue screen animation handling
+function GlueScreenExit(currentFrame, pendingFrame)
+ if ( currentFrame == "login" and pendingFrame == "charselect" ) then
+ GlueFrameFadeOut(AccountLoginUI, LOGIN_FADE_OUT, GoToPendingGlueScreen);
+ SetPendingGlueScreenName(pendingFrame);
+ else
+ SetGlueScreen(pendingFrame);
+ end
+end
+
+function GoToPendingGlueScreen()
+ SetGlueScreen(GetPendingGlueScreenName());
+end
+
+-- Generic fade function
+function GlueFrameFade(frame, timeToFade, mode, finishedFunction)
+ if ( frame ) then
+ frame.fadeTimer = 0;
+ frame.timeToFade = timeToFade;
+ frame.mode = mode;
+ -- finishedFunction is an optional function that is called when the animation is complete
+ if ( finishedFunction ) then
+ frame.finishedFunction = finishedFunction;
+ end
+ tinsert(FADEFRAMES, frame);
+ end
+end
+
+-- Fade in function
+function GlueFrameFadeIn(frame, timeToFade, finishedFunction)
+ GlueFrameFade(frame, timeToFade, "IN", finishedFunction);
+end
+
+-- Fade out function
+function GlueFrameFadeOut(frame, timeToFade, finishedFunction)
+ GlueFrameFade(frame, timeToFade, "OUT", finishedFunction);
+end
+
+-- Function that actually performs the alpha change
+function GlueFrameFadeUpdate(elapsed)
+ local index = 1;
+ while FADEFRAMES[index] do
+ local frame = FADEFRAMES[index];
+ frame.fadeTimer = frame.fadeTimer + elapsed;
+ if ( frame.fadeTimer < frame.timeToFade ) then
+ if ( frame.mode == "IN" ) then
+ frame:SetAlpha(frame.fadeTimer / frame.timeToFade);
+ elseif ( frame.mode == "OUT" ) then
+ frame:SetAlpha((frame.timeToFade - frame.fadeTimer) / frame.timeToFade);
+ end
+ else
+ if ( frame.mode == "IN" ) then
+ frame:SetAlpha(1.0);
+ elseif ( frame.mode == "OUT" ) then
+ frame:SetAlpha(0);
+ end
+ GlueFrameFadeRemoveFrame(frame);
+ if ( frame.finishedFunction ) then
+ if ( frame.finishedFunction == "HIDE" ) then
+ frame:Hide();
+ frame.finishedFunction = nil;
+ else
+ frame.finishedFunction();
+ frame.finishedFunction = nil;
+ end
+ end
+ end
+ index = index + 1;
+ end
+end
+
+function GlueFrameRemoveFrame(frame, list)
+ local index = 1;
+ while list[index] do
+ if ( frame == list[index] ) then
+ tremove(list, index);
+ end
+ index = index + 1;
+ end
+end
+
+function GlueFrameFadeRemoveFrame(frame)
+ GlueFrameRemoveFrame(frame, FADEFRAMES);
+end
+
+function SetLighting(model, race)
+ model:SetSequence(0);
+ model:SetCamera(0);
+ local fogInfo = CharModelFogInfo[race];
+ if ( fogInfo ) then
+ model:SetFogColor(fogInfo.r, fogInfo.g, fogInfo.b);
+ model:SetFogNear(0);
+ model:SetFogFar(fogInfo.far);
+ else
+ model:ClearFog();
+ end
+
+ local glowInfo = CharModelGlowInfo[race];
+ if ( glowInfo ) then
+ model:SetGlow(glowInfo);
+ else
+ model:SetGlow(0.3);
+ end
+
+ model:ResetLights();
+ --[[
+ ResetLights() sets all 6 light sets to default for the background. The six sets are:
+
+ background - live
+ background - ghost
+ character - live
+ character - ghost
+ pet - live
+ pet - ghost
+
+ If you add a light to any one of these, NONE of the default lights are used for that set (most backgrounds have 3).
+
+ You can add up to four lights per light set in the current version. They are merged in the engine.
+
+ The current version only supports setting directional lights, and pulls the default point lights from the models.
+ ]]
+ local LightValues = RaceLights[race];
+ if(LightValues) then
+ for index, Array in pairs (LightValues) do
+ if (Array[1]==1) then -- is this light enabled?
+ for j, f in pairs ({model.AddCharacterLight, model.AddLight, model.AddPetLight }) do
+ f(model, LIGHT_LIVE, unpack(Array));
+ end
+ end
+ end
+ end
+end
+
+-- Function to set the background model for character select and create screens
+function SetBackgroundModel(model, name)
+ local nameupper = strupper(name);
+ local path = "Interface\\Glues\\Models\\UI_"..name.."\\UI_"..name..".m2";
+ if ( model == CharacterCreate ) then
+ SetCharCustomizeBackground(path);
+ else
+ SetCharSelectBackground(path);
+ end
+ -- PlayGlueAmbience(GlueAmbienceTracks[nameupper], 4.0);
+ SetLighting(model, nameupper)
+end
+
+function SecondsToTime(seconds, noSeconds)
+ local time = "";
+ local count = 0;
+ local tempTime;
+ seconds = floor(seconds);
+ if ( seconds >= 86400 ) then
+ tempTime = floor(seconds / 86400);
+ time = tempTime.." "..DAYS_ABBR.." ";
+ seconds = mod(seconds, 86400);
+ count = count + 1;
+ end
+ if ( seconds >= 3600 ) then
+ tempTime = floor(seconds / 3600);
+ time = time..tempTime.." "..HOURS_ABBR.." ";
+ seconds = mod(seconds, 3600);
+ count = count + 1;
+ end
+ if ( count < 2 and seconds >= 60 ) then
+ tempTime = floor(seconds / 60);
+ time = time..tempTime.." "..MINUTES_ABBR.." ";
+ seconds = mod(seconds, 60);
+ count = count + 1;
+ end
+ if ( count < 2 and seconds > 0 and not noSeconds ) then
+ seconds = format("%d", seconds);
+ time = time..seconds.." "..SECONDS_ABBR.." ";
+ end
+ return time;
+end
+
+function MinutesToTime(mins, hideDays)
+ local time = "";
+ local count = 0;
+ local tempTime;
+ -- only show days if hideDays is false
+ if ( mins > 1440 and not hideDays ) then
+ tempTime = floor(mins / 1440);
+ time = tempTime.." "..DAYS_ABBR.." ";
+ mins = mod(mins, 1440);
+ count = count + 1;
+ end
+ if ( mins > 60 ) then
+ tempTime = floor(mins / 60);
+ time = time..tempTime.." "..HOURS_ABBR.." ";
+ mins = mod(mins, 60);
+ count = count + 1;
+ end
+ if ( count < 2 ) then
+ tempTime = mins;
+ time = time..tempTime.." "..MINUTES_ABBR.." ";
+ count = count + 1;
+ end
+ return time;
+end
+
+function TriStateCheckbox_SetState(checked, checkButton)
+ local checkedTexture = _G[checkButton:GetName().."CheckedTexture"];
+ if ( not checkedTexture ) then
+ message("Can't find checked texture");
+ end
+ if ( not checked or checked == 0 ) then
+ -- nil or 0 means not checked
+ checkButton:SetChecked(nil);
+ checkButton.state = 0;
+ elseif ( checked == 2 ) then
+ -- 2 is a normal
+ checkButton:SetChecked(1);
+ checkedTexture:SetVertexColor(1, 1, 1);
+ checkedTexture:SetDesaturated(0);
+ checkButton.state = 2;
+ else
+ -- 1 is a gray check
+ checkButton:SetChecked(1);
+ local shaderSupported = checkedTexture:SetDesaturated(1);
+ if ( not shaderSupported ) then
+ checkedTexture:SetVertexColor(0.5, 0.5, 0.5);
+ end
+ checkButton.state = 1;
+ end
+end
+
+function SetStateRequestInfo( choice )
+ if ( SERVER_SPLIT_CLIENT_STATE ~= choice ) then
+ SERVER_SPLIT_CLIENT_STATE = choice;
+ SetRealmSplitState(choice);
+ RealmSplit_SetChoiceText();
+-- RequestRealmSplitInfo();
+ end
+end
+
+function UpgradeAccount()
+ PlaySound("gsLoginNewAccount");
+ LaunchURL(AUTH_NO_TIME_URL);
+end
+
diff --git a/data/patch-hd/Interface/GlueXML/GlueStrings.lua b/data/patch-hd/Interface/GlueXML/GlueStrings.lua
new file mode 100644
index 00000000..5f471f47
--- /dev/null
+++ b/data/patch-hd/Interface/GlueXML/GlueStrings.lua
@@ -0,0 +1,893 @@
+-- AUTOMATICALLY GENERATED -- DO NOT EDIT!
+
+ABILITY_INFO_GOBLIN1 = "- Always receive the best possible gold discount, regardless of faction.";
+ABILITY_INFO_GOBLIN2 = "- Alchemy skill increased by 15.";
+ABILITY_INFO_GOBLIN3 = "- Calls in your friend, Gobber, allowing you bank access for 1 min.";
+ABILITY_INFO_GOBLIN4 = "- Launches your belt rockets at an enemy, dealing fire damage.";
+ABILITY_INFO_GOBLIN5 = "- Activates your rocket belt to jump forward. Other effects which slow the rate of falling cannot be used within 10 sec after using this ability.";
+ABILITY_INFO_GOBLIN6 = "- Cash in on a 1% increase to attack and casting speed.";
+ABILITY_INFO_WORGEN1 = "- Increases your resistance to harmful Nature and Shadow effects.";
+ABILITY_INFO_WORGEN2 = "- Activates your true form, increasing current movement speed by an additional 40% for 10 sec.";
+ABILITY_INFO_WORGEN3 = "- Enables Worgen to switch between human and Worgen forms.";
+ABILITY_INFO_WORGEN4 = "- Skinning skill increased by 15 and allows you to skin faster.";
+ABILITY_INFO_WORGEN5 = "- Drop to all fours to run as fast as a wild animal.";
+ABILITY_INFO_WORGEN6 = "- Turn into your currently inactive form.";
+ABILITY_INFO_WORGEN7 = "- Increases critical strike chance by 1%.";
+ABILITY_INFO_BLOODELF1 = "- Enchanting skill increased.";
+ABILITY_INFO_BLOODELF2 = "- May restore mana, energy, or runic power.";
+ABILITY_INFO_BLOODELF3 = "- May silence nearby opponents.";
+ABILITY_INFO_BLOODELF4 = "- Resistant to magical damage.";
+ABILITY_INFO_DRAENEI1 = "- Jewelcrafting skill increased.";
+ABILITY_INFO_DRAENEI2 = "- May heal self or others over time.";
+ABILITY_INFO_DRAENEI3 = "- Party members' chance to hit with melee and spells increased.";
+ABILITY_INFO_DRAENEI4 = "- Resistant to Shadow damage.";
+ABILITY_INFO_DWARF1 = "- May take on a stone form.";
+ABILITY_INFO_DWARF2 = "- Increased critical chance with Guns.";
+ABILITY_INFO_DWARF3 = "- Resistant to Frost.";
+ABILITY_INFO_DWARF4 = "- Treasure finding.";
+ABILITY_INFO_DWARF5 = "- Increased expertise with Maces.";
+ABILITY_INFO_GNOME1 = "- May escape from speed altering effects.";
+ABILITY_INFO_GNOME2 = "- Increased Intelligence.";
+ABILITY_INFO_GNOME3 = "- Resistant to Arcane damage.";
+ABILITY_INFO_GNOME4 = "- Engineering skill increased.";
+ABILITY_INFO_HUMAN1 = "- Stealth detection increased.";
+ABILITY_INFO_HUMAN2 = "- Increased Spirit.";
+ABILITY_INFO_HUMAN3 = "- Bonus to reputation gains.";
+ABILITY_INFO_HUMAN4 = "- Increased expertise with Swords and Maces.";
+ABILITY_INFO_HUMAN5 = "- Can break out of speed altering and trapping effects.";
+ABILITY_INFO_NIGHTELF1 = "- May fade into the shadows.";
+ABILITY_INFO_NIGHTELF2 = "- More difficult to hit.";
+ABILITY_INFO_NIGHTELF3 = "- Wisp form while dead for faster movement.";
+ABILITY_INFO_NIGHTELF4 = "- Resistant to Nature damage.";
+ABILITY_INFO_ORC1 = "- May enrage to increase damage.";
+ABILITY_INFO_ORC2 = "- Resistant to stun effects.";
+ABILITY_INFO_ORC3 = "- Damage done by pets increased.";
+ABILITY_INFO_ORC4 = "- Increased expertise with Axes and Fist weapons.";
+ABILITY_INFO_SCOURGE1 = "- Can remove fear, sleep, and charm.";
+ABILITY_INFO_SCOURGE2 = "- May consume corpses to regain health.";
+ABILITY_INFO_SCOURGE3 = "- Underwater breathing increased.";
+ABILITY_INFO_SCOURGE4 = "- Resistant to Shadow damage.";
+ABILITY_INFO_TAUREN1 = "- May stomp, stunning nearby opponents.";
+ABILITY_INFO_TAUREN2 = "- Maximum health increased.";
+ABILITY_INFO_TAUREN3 = "- Herbalism skill increased.";
+ABILITY_INFO_TAUREN4 = "- Resistant to Nature damage.";
+ABILITY_INFO_TROLL1 = "- Berserk, increasing attack and casting speed.";
+ABILITY_INFO_TROLL2 = "- Regeneration increased.";
+ABILITY_INFO_TROLL3 = "- Damage increased versus beasts.";
+ABILITY_INFO_TROLL4 = "- Increased critical chance with Throwing Weapons and Bows.";
+ABILITY_INFO_TROLL5 = "- Reduced duration of movement reducing effects.";
+ACCEPT = "Accept";
+ACCOUNT_CREATE_FAILED = "Account creation failed";
+ACCOUNT_CREATE_IN_PROGRESS = "Creating account";
+ACCOUNT_CREATE_SUCCESS = "Account created";
+ACCOUNT_CREATE_URL = "http://signup.worldofwarcraft.com";
+ACCOUNT_MESSAGE_BODY_NO_READ_URL = "http://support.worldofwarcraft.com/accountmessaging/getMessageBodyUnread.xml";
+ACCOUNT_MESSAGE_BODY_URL = "http://support.worldofwarcraft.com/accountmessaging/getMessageBody.xml";
+ACCOUNT_MESSAGE_BUTTON_READ = "Mark as read";
+ACCOUNT_MESSAGE_HEADERS_URL = "http://support.worldofwarcraft.com/accountmessaging/getMessageHeaders.xml";
+ACCOUNT_MESSAGE_READ_URL = "http://support.worldofwarcraft.com/accountmessaging/markMessageAsRead.xml";
+ACCOUNT_NAME = "Battle.net Account Name";
+ACCOUNT_OPTIONS = "Account Options";
+ADDONS = "AddOns";
+ADDONS_OUT_OF_DATE = "You are running a new version of the game and have interface modifications which are out of date. Disabling them is recommended.";
+ADDON_BANNED = "Disabled";
+ADDON_BANNED_TOOLTIP = "This addon has been disabled. You should install an updated version.";
+ADDON_CORRUPT = "Corrupt";
+ADDON_DEPENDENCIES = "Dependencies: ";
+ADDON_DEP_BANNED = "Dependency banned";
+ADDON_DEP_CORRUPT = "Dependency corrupt";
+ADDON_DEP_DISABLED = "Dependency disabled";
+ADDON_DEP_INCOMPATIBLE = "Dependency incompatible";
+ADDON_DEP_INSECURE = "Dependency insecure";
+ADDON_DEP_INTERFACE_VERSION = "Dependency out of date";
+ADDON_DEP_MISSING = "Dependency missing";
+ADDON_DISABLED = "Disabled";
+ADDON_FORCE_LOAD = "Load out of date AddOns";
+ADDON_INCOMPATIBLE = "Incompatible";
+ADDON_INSECURE = "Insecure";
+ADDON_INTERFACE_VERSION = "Out of date";
+ADDON_LIST = "AddOn List";
+ADDON_SECURE = "Secure";
+ADDON_UPDATE_AVAILABLE = "New version is available\n";
+AGI = "AGI";
+ALL = "All";
+ALLIANCE = "Alliance";
+ALL_SETTINGS = "All Settings";
+ALPHA_BUILD = "Alpha version";
+AMBIENCE_VOLUME = "Ambience";
+AMMO = "AMMO %d";
+ANISOTROPIC = "Texture Filtering";
+APPLY = "Apply";
+ARM = "ARM";
+ARMOR = "Armor";
+ASSERTIONS_ENABLED_BUILD = "Release Assertions Enabled";
+AUTHENTICATOR = "Authenticator";
+AUTH_ALREADY_LOGGING_IN = "Already Logging In";
+AUTH_ALREADY_ONLINE = "This character is still logged on. If this character is not logged in and you continue to experience this issue for more than 15 minutes, please contact our Technical Support Department at wowtech@blizzard.com";
+AUTH_BAD_SERVER_PROOF = "Server is not valid";
+AUTH_BANNED = "This account has been banned for violating the Terms of Use Agreement - www.worldofwarcraft.com/termsofuse.shtml. Please contact our GM department via Email at wowaccountadmin@blizzard.com for more information.";
+AUTH_BANNED_URL = "http://www.worldofwarcraft.com/termsofuse.shtml";
+AUTH_BILLING_ERROR = "Billing system error";
+AUTH_BILLING_EXPIRED = "Account billing has expired";
+AUTH_DB_BUSY = "This session has timed out. Please try again at a later time or check the status of our WoW servers at www.worldofwarcraft.com/serverstatus";
+AUTH_DB_BUSY_URL = "http://www.worldofwarcraft.com/serverstatus";
+AUTH_FAILED = "Authentication failed";
+AUTH_INCORRECT_PASSWORD = "Incorrect Password";
+AUTH_LOCALE_MISMATCH = "Wrong client language";
+AUTH_LOCKED_ENFORCED = "You have applied a lock to your account. You can change your locked status by calling your account lock phone number.";
+AUTH_LOGIN_SERVER_NOT_FOUND = "Invalid Login Server";
+AUTH_NO_TIME = "Your World of Warcraft subscription has expired. You will need to reactivate your account. To do so, please visit www.worldofwarcraft.com/account for more information.";
+AUTH_NO_TIME_URL = "http://www.worldofwarcraft.com/account";
+AUTH_OK = "Authentication Successful";
+AUTH_PARENTAL_CONTROL = "Access to this account is currently restricted by parental controls. You can change your control settings from your online account management.";
+AUTH_PARENTAL_CONTROL_URL = "http://www.worldofwarcraft.com/account";
+AUTH_REJECT = "Login unavailable - Please contact Technical Support at WoWTech@Blizzard.com";
+AUTH_SERVER_SHUTTING_DOWN = "Server Shutting Down";
+AUTH_SESSION_EXPIRED = "Session Expired";
+AUTH_SUSPENDED = "This account has been temporarily suspended for violating the Terms of Use Agreement - www.worldofwarcraft.com/termsofuse.shtml. Please contact our GM department via Email at wowaccountadmin@blizzard.com for more information.";
+AUTH_SUSPENDED_URL = "http://www.worldofwarcraft.com/termsofuse.shtml";
+AUTH_SYSTEM_ERROR = "System Error";
+AUTH_UNAVAILABLE = "System unavailable - Please try again later";
+AUTH_UNKNOWN_ACCOUNT = "Unknown account";
+AUTH_VERSION_MISMATCH = "Wrong client version";
+AUTH_WAIT_QUEUE = "Position in Queue: %d";
+AVAILABLE_CLASSES = "Available Classes";
+BACK = "Back";
+BAG_SLOTS = "SLOTS %d";
+BATTLEFIELD_ALERT = "You are eligible to enter %s You will be removed from the queue in %s";
+BETA_BUILD = "Beta";
+BF_DEATHS = "Deaths";
+BF_HONOR_KILLS = "Honorable Kills";
+BF_HONOR_POINTS = "hnr";
+BF_KILLBLOWS = "Killing Blows";
+BF_RANK = "Rank";
+BILLING_FIXED_IGR = "You are currently using a fixed IGR plan. Your personal time will not be deducted. The IGR plan will expire in %s.";
+BILLING_FIXED_LASTDAY = "Your fixed plan account will expire in less than a day. Please go to the billing pages and purchase another plan.";
+BILLING_FREE_TIME_EXPIRE = "Free account is about to expire. Once expired, you will be disconnected.\nThe remaining time is %s.";
+BILLING_GAMEROOM_EXPIRE = "IGR account in use is about to expire. Once expired, you may get disconnected.\nPlease contact the manager on duty in your IGR.";
+BILLING_HAS_FALLBACK_PAYMENT = "There may be additional time on your account from other payment plans.";
+BILLING_IGR_USAGE = "You are currently using an IGR usage plan. Your personal time will not be deducted.";
+BILLING_IGR_USAGE_TIME_LEFT_30_MINS = "This IGR usage plan has 30 minutes or less of play time left on it.";
+BILLING_TEXT1 = "You are using a subscription to play this account. You will be notified when you have one day or less on your account.";
+BILLING_TEXT2 = "You are currently in your free trial period and will not be charged.";
+BILLING_TEXT3 = "You are using a personal fixed plan. Your plan will expire in %s.";
+BILLING_TEXT4 = "You are now using your personal time to play this account. You currently have %d minutes left on the current subscription. You will be notified 30 minutes before you will run out of time.";
+BILLING_TIME_LEFT_30_MINS = "You currently have 30 minutes or less left on your account. If you have not already done so, please go to the billing pages and purchase more time.";
+BILLING_TIME_LEFT_DAYS = "You have %d days of play time remaining.";
+BILLING_TIME_LEFT_LAST_DAY = "Your play time will expire in less than 1 day.";
+BLIZZ_DISCLAIMER = "Copyright 2004-2010 Blizzard Entertainment. All Rights Reserved.";
+BLOCK = "BLOCK %.2f";
+BLOODELF_DISABLED = "Blood Elf\nRequires The Burning Crusade";
+BONUS_DAMAGE = "B.DMG %d";
+BONUS_HEALING = "B.HEAL %d";
+BURNING_CRUSADE = "The Burning Crusade";
+CALCULATING = "Calculating...";
+CANCEL = "Cancel";
+CANCEL_RESET = "Cancel Reset";
+CANCEL_RESET_SETTINGS = "Are you sure you want to cancel resetting user options the next time you login?";
+CATEGORY_DESCRIPTION = "Realm Category";
+CATEGORY_DESCRIPTION_TEXT = "A realm category refers to its geographical location. Players should generally choose the realm that is closest to them. This ensures the lowest amount of latency and provides the best possible game experience.";
+CHANGE = "Change";
+CHANGED_OPTIONS_WARNING_TITLE = "NOTE:";
+CHANGE_REALM = "Change Realm";
+CHARACTER_CREATE_ACCEPT = "Accept";
+CHARACTER_NAME = "Character Name";
+CHARACTER_SELECT_INFO = "Level %d %s";
+CHARACTER_SELECT_INFO_GHOST = "Level %d %s (Ghost)";
+CHAR_CREATE_ACCOUNT_LIMIT = "You already have the maximum number of characters allowed on this account.";
+CHAR_CREATE_CHARACTER_IN_GUILD = "Faction change failed, character in guild.";
+CHAR_CREATE_DISABLED = "Character creation on this realm is currently disabled. Please try again at a later date or create a character on a different realm.";
+CHAR_CREATE_ERROR = "Error creating character";
+CHAR_CREATE_EXPANSION = "Creation of that race requires an account that has been upgraded to the appropriate expansion.";
+CHAR_CREATE_EXPANSION_CLASS = "Creation of that class requires an account that has been upgraded to the appropriate expansion.";
+CHAR_CREATE_FAILED = "Character creation failed";
+CHAR_CREATE_INVALID_NAME = "Invalid character name";
+CHAR_CREATE_IN_PROGRESS = "Creating character";
+CHAR_CREATE_LEVEL_REQUIREMENT = "You must have an existing character of at least level 55 on any realm to create a Death Knight.";
+CHAR_CREATE_NAME_IN_USE = "That name is unavailable";
+CHAR_CREATE_ONLY_EXISTING = "Only players who already have characters on this realm are currently allowed to create characters.";
+CHAR_CREATE_PVP_TEAMS_VIOLATION = "You cannot have both a Horde and an Alliance character on the same PvP server";
+CHAR_CREATE_SERVER_LIMIT = "You already have the maximum number of characters allowed on this realm.";
+CHAR_CREATE_SERVER_QUEUE = "This server is currently queued and new character creation is temporarily disabled. Please try again during off peak hours.";
+CHAR_CREATE_SUCCESS = "Character created";
+CHAR_CREATE_UNIQUE_CLASS_LIMIT = "You may only have one Death Knight Hero Class character on this realm.";
+CHAR_CREATE_UNKNOWN = "Unknown error";
+CHAR_CUSTOMIZATION0_DESC = "Gender";
+CHAR_CUSTOMIZATION1_DESC = "Skin Color";
+CHAR_CUSTOMIZATION2_DESC = "Face";
+CHAR_CUSTOMIZATION3_DESC = "Hair Style";
+CHAR_CUSTOMIZATION4_DESC = "Hair Color";
+CHAR_CUSTOMIZATION5_DESC = "Facial Hair";
+CHAR_CUSTOMIZATION6_DESC = "Outfit";
+CHAR_CUSTOMIZE_FAILED = "Could not customize character.";
+CHAR_CUSTOMIZE_IN_PROGRESS = "Customizing Character...";
+CHAR_DECLINE_FAILED = "Character name declension failed";
+CHAR_DECLINE_IN_PROGRESS = "Updating Character...";
+CHAR_DELETE_FAILED = "Character deletion failed";
+CHAR_DELETE_FAILED_ARENA_CAPTAIN = "This character is an Arena Captain and cannot be deleted until the rank is transfered to another character.";
+CHAR_DELETE_FAILED_GUILD_LEADER = "This character is a Guild Master and cannot be deleted until the rank is transfered to another character.";
+CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = "You cannot log in until the character update process you recently initiated is complete. ";
+CHAR_DELETE_IN_PROGRESS = "Deleting character";
+CHAR_DELETE_SUCCESS = "Character deleted";
+CHAR_FACTION_CHANGE_ARENA_LEADER = "You may not change race or faction while still the captain of an arena team.";
+CHAR_FACTION_CHANGE_CHOOSE_RACE = "You must change your race.";
+CHAR_FACTION_CHANGE_DELETE_MAIL = "Please remove all mail before changing race or faction.";
+CHAR_FACTION_CHANGE_FAILED = "Could not change race for character.";
+CHAR_FACTION_CHANGE_FORCE_LOGIN = "You must login to complete your previous race or faction change before doing another race or faction change.";
+CHAR_FACTION_CHANGE_GOLD_LIMIT = "You have exceeded the gold limit for faction transfer.";
+CHAR_FACTION_CHANGE_RACECLASS_RESTRICTED = "This race and class combination is restricted from the race change service.";
+CHAR_FACTION_CHANGE_RACE_ONLY = "You must choose a new race from your current faction.";
+CHAR_FACTION_CHANGE_STILL_IN_ARENA = "You may not change race or faction while still a member of an arena team.";
+CHAR_FACTION_CHANGE_STILL_IN_GUILD = "You may not change race or faction while still a member of a guild.";
+CHAR_FACTION_CHANGE_SWAP_FACTION = "You must choose a race from the opposing faction.";
+CHAR_LIST_FAILED = "Error retrieving character list";
+CHAR_LIST_RETRIEVED = "Character list retrieved";
+CHAR_LIST_RETRIEVING = "Retrieving character list";
+CHAR_LOGIN_DISABLED = "Login for that race, class, or character is currently disabled.";
+CHAR_LOGIN_DUPLICATE_CHARACTER = "A character with that name already exists";
+CHAR_LOGIN_FAILED = "Login failed";
+CHAR_LOGIN_IN_PROGRESS = "Entering the World of Warcraft";
+CHAR_LOGIN_LOCKED_BY_BILLING = "Character locked. Contact Billing for more information.";
+CHAR_LOGIN_LOCKED_BY_MOBILE_AH = "You cannot log in while using World of Warcraft Remote.";
+CHAR_LOGIN_LOCKED_FOR_TRANSFER = "You cannot log in until the character update process you recently initiated is complete. ";
+CHAR_LOGIN_NO_CHARACTER = "Character not found";
+CHAR_LOGIN_NO_INSTANCES = "No instance servers are available";
+CHAR_LOGIN_NO_WORLD = "World server is down";
+CHAR_LOGIN_SUCCESS = "Login successful";
+CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = "Your declensions must match your original name.";
+CHAR_NAME_FAILURE = "Invalid character name";
+CHAR_NAME_INVALID_APOSTROPHE = "You cannot use an apostrophe as the first or last character of your name";
+CHAR_NAME_INVALID_CHARACTER = "Names can only contain letters";
+CHAR_NAME_INVALID_SPACE = "You cannot use a space as the first or last character of your name";
+CHAR_NAME_MIXED_LANGUAGES = "Names must contain only one language";
+CHAR_NAME_MULTIPLE_APOSTROPHES = "You can only have one apostrophe";
+CHAR_NAME_NO_NAME = "Enter a name for your character";
+CHAR_NAME_PROFANE = "That name contains mature language";
+CHAR_NAME_RESERVED = "That name is unavailable";
+CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = "Can not have two silent symbols in a row.";
+CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = "Silent characters are now allowed at the beginning or end of a name.";
+CHAR_NAME_THREE_CONSECUTIVE = "You cannot use the same letter three times consecutively";
+CHAR_NAME_TOO_LONG = "Names must be no more than 12 characters";
+CHAR_NAME_TOO_SHORT = "Names must be at least 2 characters";
+CHAR_RENAME_DESCRIPTION = "Your name has been flagged for rename";
+CHAR_RENAME_FAILED = "Character rename failed";
+CHAR_RENAME_INSTRUCTIONS = "Please enter a new name";
+CHAR_RENAME_IN_PROGRESS = "Renaming Character...";
+CHOOSE_CLASS = "Choose your class:";
+CHOOSE_GENDER = "Choose your gender:";
+CHOOSE_LOCATION = "Choose your preferred location:";
+CHOOSE_LOCATION_DESCRIPTION = "(for best results choose the region closest to you)";
+CHOOSE_RACE = "Choose your race:";
+CHOOSE_REALM_STYLE = "Choose your realm style:";
+CINEMATICS = "Cinematics";
+CINEMATIC_SUBTITLES = "Cinematic Subtitles";
+CLASS = "Class";
+CLASS_DEATHKNIGHT = "These former agents of the Scourge have now allied themselves with the Alliance or Horde. Death knights are a hero class, which means they start at high level. Death knights use runes as their primary resource. Each of the three types of rune is used for different abilities.|n|nDeath knights have more ranged capabilities than most melee classes with an emphasis on causing diseases and doing damage with their undead pets. Their primary stat is Strength and also Stamina if tanking.";
+CLASS_DEATHKNIGHT_FEMALE = "These former agents of the Scourge have now allied themselves with the Alliance or Horde. Death knights are a hero class, which means they start at high level. Death knights use runes as their primary resource. Each of the three types of rune is used for different abilities.|n|nDeath knights have more ranged capabilities than most melee classes with an emphasis on causing diseases and doing damage with their undead pets. Their primary stat is Strength and also Stamina if tanking.";
+CLASS_DRUID = "Druids are shape-shifters with an affinity for the plant and animal kingdoms. There are three types of druids: Balance druids who cast Nature or Arcane spells at range, Feral druids who can take on the form of a cat or bear to fight in melee, or Restoration druids who can heal their allies with an emphasis on heal-over-time spells. Druid primary stats depend on their role.";
+CLASS_DRUID_FEMALE = "Druids are shape-shifters with an affinity for the plant and animal kingdoms. There are three types of druids: Balance druids who cast Nature or Arcane spells at range, Feral druids who can take on the form of a cat or bear to fight in melee, or Restoration druids who can heal their allies with an emphasis on heal-over-time spells. Druid primary stats depend on their role.";
+CLASS_HUNTER = "Hunters are at home in the wilderness and have a special affinity for beasts. They use ranged weapons, such as bows or guns, and their pet to deal damage. They can use traps to cause damage or keep an enemy at bay. The hunter's primary stats are Attack Power and Agility.";
+CLASS_HUNTER_FEMALE = "Hunters are at home in the wilderness and have a special affinity for beasts. They use ranged weapons, such as bows or guns, and their pet to deal damage. They can use traps to cause damage or keep an enemy at bay. The hunter's primary stats are Attack Power and Agility.";
+CLASS_INFO_DEATHKNIGHT0 = "- Role: Tank, Damage";
+CLASS_INFO_DEATHKNIGHT1 = "- Heavy Armor (Plate)";
+CLASS_INFO_DEATHKNIGHT2 = "- Former servants of the Lich King.";
+CLASS_INFO_DEATHKNIGHT3 = "- Start at level 55.";
+CLASS_INFO_DEATHKNIGHT4 = "- Combine melee combat with spells, diseases and undead minions.";
+CLASS_INFO_DEATHKNIGHT5 = "- Uses runes as a resource.";
+CLASS_INFO_DRUID0 = "- Role: Tank, Healer, Damage";
+CLASS_INFO_DRUID1 = "- Medium Armor (Leather)";
+CLASS_INFO_DRUID2 = "- Shape-shifts into animal forms.";
+CLASS_INFO_DRUID3 = "- Versatile: can fill a healing, tanking, melee or caster role.";
+CLASS_INFO_DRUID4 = "- Uses mana, rage or energy as a resource depending on form.";
+CLASS_INFO_HUNTER0 = "- Role: Damage";
+CLASS_INFO_HUNTER1 = "- Medium Armor (Leather / Mail)";
+CLASS_INFO_HUNTER2 = "- Emphasis on ranged damage and traps.";
+CLASS_INFO_HUNTER3 = "- Gains a beast of your choice as a lifelong companion.";
+CLASS_INFO_HUNTER4 = "- Good at leveling and soloing.";
+CLASS_INFO_MAGE0 = "- Role: Damage";
+CLASS_INFO_MAGE1 = "- Light Armor (Cloth)";
+CLASS_INFO_MAGE2 = "- Deals Frost, Fire or Arcane magic damage.";
+CLASS_INFO_MAGE3 = "- Can polymorph enemies or freeze them to the ground.";
+CLASS_INFO_MAGE4 = "- Can teleport to cities and conjure food and water.";
+CLASS_INFO_MAGE5 = "- Uses mana as a resource.";
+CLASS_INFO_PALADIN0 = "- Role: Tank, Healer, Damage";
+CLASS_INFO_PALADIN1 = "- Heavy Armor (Mail / Plate and Shield)";
+CLASS_INFO_PALADIN2 = "- Righteous vanquishers of evil.";
+CLASS_INFO_PALADIN3 = "- Deals Holy and melee damage.";
+CLASS_INFO_PALADIN4 = "- Has a variety of defensive spells.";
+CLASS_INFO_PALADIN5 = "- Uses mana as a resource.";
+CLASS_INFO_PRIEST0 = "- Role: Healer, Damage";
+CLASS_INFO_PRIEST1 = "- Light Armor (Cloth)";
+CLASS_INFO_PRIEST2 = "- Heal damage with Holy magic.";
+CLASS_INFO_PRIEST3 = "- Cause damage with Shadow magic.";
+CLASS_INFO_PRIEST4 = "- Uses mana as a resource.";
+CLASS_INFO_ROGUE0 = "- Role: Damage";
+CLASS_INFO_ROGUE1 = "- Medium Armor (Leather)";
+CLASS_INFO_ROGUE2 = "- Wields a weapon in each hand.";
+CLASS_INFO_ROGUE3 = "- Emphasizes stealth, poisons and control.";
+CLASS_INFO_ROGUE4 = "- Build up 5 combo points to unleash finishing moves.";
+CLASS_INFO_ROGUE5 = "- Uses energy as a resource.";
+CLASS_INFO_SHAMAN0 = "- Role: Healer, Damage";
+CLASS_INFO_SHAMAN1 = "- Medium Armor (Leather / Mail and Shield)";
+CLASS_INFO_SHAMAN2 = "- Invokes the power of the four elements.";
+CLASS_INFO_SHAMAN3 = "- Uses totems to buff, heal or deal damage.";
+CLASS_INFO_SHAMAN4 = "- Temporarily enchants weapons with spells.";
+CLASS_INFO_SHAMAN5 = "- Uses mana as a resource.";
+CLASS_INFO_WARLOCK0 = "- Role: Damage";
+CLASS_INFO_WARLOCK1 = "- Light Armor (Cloth)";
+CLASS_INFO_WARLOCK2 = "- Summons demons as servants.";
+CLASS_INFO_WARLOCK3 = "- Emphasis on curses, drains and damage-over-time spells.";
+CLASS_INFO_WARLOCK4 = "- Can consume a Soul Shard for special abilities.";
+CLASS_INFO_WARLOCK5 = "- Uses mana as a resource.";
+CLASS_INFO_WARRIOR0 = "- Role: Tank, Damage";
+CLASS_INFO_WARRIOR1 = "- Heavy Armor (Mail / Plate and Shield)";
+CLASS_INFO_WARRIOR2 = "- Deals damage with melee weapons.";
+CLASS_INFO_WARRIOR3 = "- Has 3 fighting stances with different benefits.";
+CLASS_INFO_WARRIOR4 = "- Uses rage as a resource.";
+CLASS_MAGE = "Mages are the iconic magic-users of Azeroth and learn their craft through intense research and study. They make up for their light armor with a potent array of offensive and defensive spells. Their primary stats are Spell Power and Intellect.";
+CLASS_MAGE_FEMALE = "Mages are the iconic magic-users of Azeroth and learn their craft through intense research and study. They make up for their light armor with a potent array of offensive and defensive spells. Their primary stats are Spell Power and Intellect.";
+CLASS_PALADIN = "Paladins are heavily-armored fighters and defenders who use Holy magic to heal wounds and combat evil. Paladins are relatively self-sufficient and have many abilities targeted at death prevention. They can focus on two-handed weapons, shields or healing. Their primary stats depend on their role.";
+CLASS_PALADIN_FEMALE = "Paladins are heavily-armored fighters and defenders who use Holy magic to heal wounds and combat evil. Paladins are relatively self-sufficient and have many abilities targeted at death prevention. They can focus on two-handed weapons, shields or healing. Their primary stats depend on their role.";
+CLASS_PRIEST = "Priests are well-rounded healers with a variety of tools. However, they can also sacrifice their healing to deal damage with Shadow magic. Within society, priests act as the spiritual leaders of their respective races. The priest's primary stats are Spell Power, Intellect, and Spirit if healing.";
+CLASS_PRIEST_FEMALE = "Priests are well-rounded healers with a variety of tools. However, they can also sacrifice their healing to deal damage with Shadow magic. Within society, priests act as the spiritual leaders of their respective races. The priest's primary stats are Spell Power, Intellect, and Spirit if healing.";
+CLASS_ROGUE = "Rogues often serve as assassins or scouts, though many are lone wolves as well. Rogues specialize in dual-wielding a variety of weapons, though the iconic rogue weapon is the dagger.|n|nRogues can often sneak around enemies or attack an opponent from behind to try and finish them off quickly. Their primary stats are Attack Power and Agility.";
+CLASS_ROGUE_FEMALE = "Rogues often serve as assassins or scouts, though many are lone wolves as well. Rogues specialize in dual-wielding a variety of weapons, though the iconic rogue weapon is the dagger.|n|nRogues can often sneak around enemies or attack an opponent from behind to try and finish them off quickly. Their primary stats are Attack Power and Agility.";
+CLASS_SHAMAN = "Shaman use the power of the elements to enhance their weapon damage or spells. Shaman summon totems in combat, small objects that buff, heal or cause damage to enemies. Shaman often act as spiritual leaders in tribal communities. Their primary stats depend on their role.";
+CLASS_SHAMAN_FEMALE = "Shaman use the power of the elements to enhance their weapon damage or spells. Shaman summon totems in combat, small objects that buff, heal or cause damage to enemies. Shaman often act as spiritual leaders in tribal communities. Their primary stats depend on their role.";
+CLASS_WARLOCK = "Warlocks deal Fire or Shadow magic to damage, drain or curse their enemy. They can drain souls to power their spells. Warlocks can convert their health into mana or summon group members to their locations.|n|nWarlocks are feared in some Alliance societies while considered great leaders in some Horde societies. As casters, the warlock's primary stats are Spell Power and Intellect.";
+CLASS_WARLOCK_FEMALE = "Warlocks deal Fire or Shadow magic to damage, drain or curse their enemy. They can drain souls to power their spells. Warlocks can convert their health into mana or summon group members to their locations.|n|nWarlocks are feared in some Alliance societies while considered great leaders in some Horde societies. As casters, the warlock's primary stats are Spell Power and Intellect.";
+CLASS_WARRIOR = "Warriors are plate-wearing fighters who strive for perfection in armed combat. As warriors deal or take damage, they generate rage, which is used to power their special attacks.|n|nWarriors can choose to focus on a two-handed weapon, dual-wielding or using a sword and shield. Warriors have several abilities that let them move quickly around the battlefield. Their primary stat is Strength, though tanking warriors desire Stamina as well.";
+CLASS_WARRIOR_FEMALE = "Warriors are plate-wearing fighters who strive for perfection in armed combat. As warriors deal or take damage, they generate rage, which is used to power their special attacks.|n|nWarriors can choose to focus on a two-handed weapon, dual-wielding or using a sword and shield. Warriors have several abilities that let them move quickly around the battlefield. Their primary stat is Strength, though tanking warriors desire Stamina as well.";
+CLEAR = "Clear";
+CLEARMATRIX = "Clear";
+CLICK_TO_LAUNCH_ADDON_URL = "Click to launch addon website\n";
+CLIENT_ACCOUNT_MISMATCH_BC = "
Your account is authorized for the Burning Crusade expansion, but the computer you are playing on does not contain Burning Crusade data. To play on this machine with this account, you must install the Burning Crusade. Additional data is available at:www.worldofwarcraft.com/burningcrusade/download/
";
+CLIENT_ACCOUNT_MISMATCH_LK = "
Your account is authorized for the Wrath of the Lich King expansion, but the computer you are playing on does not contain Wrath of the Lich King data. To play on this machine with this account, you must install the Wrath of the Lich King. Additional data is available at:www.worldofwarcraft.com/lichking/download/
";
+CLIENT_CONVERTED_TEXT = "Thank you for buying World of Warcraft. Please click the restart button to begin downloading the full version of World of Warcraft.";
+CLIENT_CONVERTED_TITLE = "Welcome to the World of Warcraft.";
+CLIENT_RESTART_ALERT = "Some of your settings will not take effect until you restart the game.";
+CLIENT_TRIAL = "
Your account is a full retail account, and is not compatible with the World of Warcraft Trial version. Please install the retail version of World of Warcraft. If you need more help, see https://www.worldofwarcraft.com/account/download_wow.html
";
+CLOSE = "Close";
+COMMUNITY_SITE = "Community Site";
+COMMUNITY_URL = "http://www.worldofwarcraft.com";
+CONFIGURE_MODS_FOR = "Configure AddOns For:";
+CONFIRM_CHAR_DELETE = "Do you want to delete\n|cffffffff%s Level %d %s|r?";
+CONFIRM_CHAR_DELETE_INSTRUCTIONS = "Type \"DELETE\" into the field to confirm.";
+CONFIRM_COMPLETE_EXPENSIVE_QUEST = "Completing this quest requires spending the following amount of money. Do you still want to complete the quest?";
+CONFIRM_DISABLE_ADDONS = "You will need to re-enable your modifications once you install updated versions. Are you sure you want to disable them?\n\n|cffffffffYou can re-enable them by using the \"Addons\" button in the lower left.|r";
+CONFIRM_LAUNCH_ADDON_URL = "Clicking \"Okay\" will take you out of the game and open the following link in a web browser:\n%s";
+CONFIRM_LOAD_ADDONS = "The game may not work correctly unless you have updated all your modifications. Are you sure you want to try to load them?\n\n|cffffffffChanges can be made by using the \"Addons\" button in the lower left.|r";
+CONFIRM_PAID_SERVICE = "Are you sure you are done changing your character?";
+CONFIRM_PFC = "Are you sure you are done changing your character?";
+CONFIRM_RESET_SETTINGS = "Do you want to reset all settings to their defaults? This will immediately apply all settings.";
+CONFIRM_TEMP = "Are you sure you are done?";
+CONNECTION_HELP_FRAME_TITLE = "Connection Help";
+CONTEST_FRAME_TITLE = "Contest Rules";
+CONTEST_NOTICE = "The contest rules have changed. Please scroll down and review the changes before accepting the agreement.";
+CREATE_ACCOUNT = "Create Account";
+CREATE_CHARACTER = "Create Character";
+CREATE_NEW_CHARACTER = "Create New Character";
+CREDITS = "Credits";
+CREDITS_WOW_BC = "Burning Crusade Credits";
+CREDITS_WOW_CLASSIC = "World of Warcraft Credits";
+CREDITS_WOW_LK = "Wrath of the Lich King Credits";
+CRIT = "CRIT";
+CSTATUS_AUTHENTICATING = "Authenticating";
+CSTATUS_CONNECTING = "Connecting to server...";
+CSTATUS_NEGOTIATING_SECURITY = "Negotiating security";
+CSTATUS_NEGOTIATION_COMPLETE = "Security negotiation complete";
+CSTATUS_NEGOTIATION_FAILED = "Security negotiation failed";
+CURRENT_SETTINGS = "These Settings";
+CUSTOM = "Custom";
+CUSTOMIZE_CHARACTER = "Customize character:";
+DAYS_ABBR = "|4Day:Days;";
+DEATHKNIGHT_DISABLED = "Death Knight\nRequires Wrath of the Lich King\nand a level 55 character";
+DEATH_EFFECT = "Death Effect";
+DEBUG_BUILD = "Debug";
+DECLENSION_SET = "%s of %s";
+DECLINE = "Decline";
+DEFAULTS = "Defaults";
+DEFENSE = "DEF %d";
+DELETE_CHARACTER = "Delete Character";
+DELETE_CONFIRM_STRING = "DELETE";
+DEPTH_CONVERGENCE = "Screen Depth";
+DESKTOP_GAMMA = "Use desktop gamma";
+DISABLE_ADDONS = "Disable";
+DISABLE_ALL_ADDONS = "Disable All";
+DISCONNECTED = "You have been disconnected from the server.";
+DISPLAY = "Display";
+DMG = "DMG";
+DODGE = "DODGE %.2f";
+DONE = "Done";
+DOWNLOADING_UPDATE = "Downloading Update";
+DOWNLOAD_SUCCESSFUL = "Patch Required";
+DOWNLOAD_SUCCESSFUL_TEXT = "Press the restart button below to exit World of\nWarcraft and download the patch.";
+DPS = "DPS";
+DRAENEI_DISABLED = "Draenei\nRequires The Burning Crusade";
+DRUID_DISABLED = "Druid\nYou must choose a different race to be this class.";
+DURABILITY = "DURA %d";
+EFFECTS_LABEL = "Effects";
+EFFECTS_SUBTEXT = "These controls allow you to modify specific detail levels for many game elements and effects.";
+EMAIL_ADDRESS = "E-Mail Address";
+ENABLED_FOR_SOME = "This addon is only enabled for some characters.";
+ENABLE_ALL_ADDONS = "Enable All";
+ENABLE_AMBIENCE = "Ambient Sounds";
+ENABLE_BGSOUND = "Sound in Background";
+ENABLE_DSP_EFFECTS = "Death Knight Voices";
+ENABLE_EMOTE_SOUNDS = "Emote Sounds";
+ENABLE_ERROR_SPEECH = "Error Speech";
+ENABLE_HARDWARE = "Use Hardware";
+ENABLE_MUSIC = "Music";
+ENABLE_MUSIC_LOOPING = "Loop Music";
+ENABLE_PET_SOUNDS = "Enable Pet Sounds";
+ENABLE_REVERB = "Enable Reverb";
+ENABLE_SOFTWARE_HRTF = "Headphone Mode";
+ENABLE_SOUND = "Enable Sound";
+ENABLE_SOUNDFX = "Sound Effects";
+ENABLE_SOUND_AT_CHARACTER = "Sound at Character";
+ENABLE_STEREO_VIDEO = "Enable Stereo Video";
+ENTER_AUTHCODE_INFO = "Enter the generated digital code.";
+ENTER_AUTHCODE_TITLE = "Authenticator Code";
+ENTER_EMAIL = "Enter your email address";
+ENTER_PIN_NUMBER = "Enter Your PIN";
+ENTER_WORLD = "Enter World";
+ENVIRONMENT_DETAIL = "Environment Detail";
+ENVIRONMENT_LABEL = "Environment";
+ENVIRONMENT_SUBTEXT = "These options control the ranges and levels of detail used to draw effects and objects in the game environment.";
+EULA_FRAME_TITLE = "End User License Agreement";
+EULA_NOTICE = "The End User License Agreement has changed. Please scroll down and review the changes before accepting the agreement.";
+EXIT_GAME = "Exit Game";
+EYE_SEPARATION = "Depth Amount";
+FACIAL_HAIR_EARRINGS = "Earrings";
+FACIAL_HAIR_FEATURES = "Features";
+FACIAL_HAIR_HAIR = "Hair";
+FACIAL_HAIR_HORNS = "Horn Style";
+FACIAL_HAIR_MARKINGS = "Markings";
+FACIAL_HAIR_NORMAL = "Facial Hair";
+FACIAL_HAIR_PIERCINGS = "Piercings";
+FACIAL_HAIR_TUSKS = "Tusks";
+FACTION = "Faction";
+FACTION_CHANGE_IN_PROGRESS = "Updating Faction...";
+FACTION_INFO_ALLIANCE = " The Alliance consists of five races: the noble humans, the adventurous dwarves, the enigmatic night elves, the ingenious gnomes, and the honorable draenei. Bound by a loathing for all things demonic, they fight to restore order in this war-torn world.";
+FACTION_INFO_HORDE = " Five races comprise the Horde: the brutal orcs, the shadowy undead, the spiritual tauren, the quick-witted trolls, and the driven blood elves. Beset by enemies on all sides, these outcasts have forged a union they hope will ensure their mutual survival.";
+FAR = "Far";
+FARCLIP = "View Distance";
+FEMALE = "Female";
+FIX_LAG = "Reduce Input Lag";
+FRIENDS = "Friends";
+FULL_SCREEN_GLOW = "Full-Screen Glow Effect";
+GAMETYPE_NORMAL = "Normal";
+GAMETYPE_PVE = "Normal";
+GAMETYPE_PVE_TEXT = "These realms allow you to focus on adventuring and fighting monsters while allowing you to fight other players at your own discretion.";
+GAMETYPE_PVP = "Player Versus Player |cffff0000(PVP)|r";
+GAMETYPE_PVP_TEXT = "These realms allow you to focus on player combat; you are always at risk of being attacked by opposing players except in starting areas and cities.";
+GAMETYPE_RP = "Roleplaying |cff00ff00(RP)|r";
+GAMETYPE_RPPVP = "Roleplaying PVP |cffff0000(RPPVP)|r";
+GAMETYPE_RPPVP_TEXT = "These realms have strict naming conventions and behavior rules for players interested in immersing themselves as a character in a fantasy-based world. They also focus on player combat; you are always at risk of being attacked by opposing players except in starting areas and cities.";
+GAMETYPE_RP_TEXT = "These realms have strict naming conventions and behavior rules for players interested in immersing themselves as a character in a fantasy-based world.";
+GAME_SERVER_LOGIN = "Logging in to game server";
+GAME_SOUND_OUTPUT = "Game Sound Output";
+GAME_UPDATES = "Game Updates";
+GAMMA = "Gamma";
+GENERAL_LABEL = "General";
+GM_BUILD = "GM";
+GROUND_DENSITY = "Ground Clutter Density";
+GROUND_RADIUS = "Ground Clutter Radius";
+HAIR_HORNS_COLOR = "Horn Color";
+HAIR_HORNS_STYLE = "Horn Style";
+HAIR_NORMAL_COLOR = "Hair Color";
+HAIR_NORMAL_STYLE = "Hair Style";
+HARDWARE = "Hardware";
+HARDWARE_CURSOR = "Hardware Cursor";
+HARDWARE_SURVEY_AGREE = "I consent";
+HARDWARE_SURVEY_DISAGREE = "I don't consent";
+HARDWARE_SURVEY_TITLE = "Hardware Survey Notification";
+HELP = "Help";
+HERTZ = "Hz";
+HIGH = "High";
+HIT = "HIT";
+HORDE = "Horde";
+HOURS_ABBR = "|4Hr:Hrs;";
+HUNTER_DISABLED = "Hunter\nYou must choose a different race to be this class.";
+IDLE_LOGOUT_WARNING = "You will be logged out soon";
+INT = "INT";
+LATEST_AGREEMENTS_URL = "http://launcher.worldofwarcraft.com/legal/agreements.mpq";
+LATEST_EULA_URL = "http://launcher.worldofwarcraft.com/legal/eula.htm";
+LATEST_TERMINATION_WITHOUT_NOTICE_URL = "http://launcher.worldofwarcraft.com/legal/notice.htm";
+LATEST_TOS_URL = "http://launcher.worldofwarcraft.com/legal/tos.htm";
+LAUNCH_FAILED = "Could not launch World of Warcraft.";
+LAUNCH_MAC_SYSTEM_REQUIRED = "World of Warcraft requires Mac OS X version %s.";
+LAUNCH_QUICKTIME_REQUIRED = "World of Warcraft requires QuickTime version %s.";
+LAUNCH_USE_SOFTWARE_UPDATE = "Please use Software Update in System Preferences to upgrade your system software.";
+LAUNCH_VIDEO_CARD_UNSUPPORTED = "World of Warcraft cannot run on your video card.";
+LEVEL = "Level";
+LOAD_ADDONS = "Load Anyway";
+LOAD_FULL = "Full";
+LOAD_HIGH = "High";
+LOAD_LOW = "Low";
+LOAD_MEDIUM = "Medium";
+LOAD_NEW = "New";
+LOAD_RECOMMENDED = "New Players";
+LOGIN = "Login";
+LOGIN_ACCOUNT_CONVERTED = "This account is now attached to a Battle.net account. Please log in with your Battle.net account email address (example: john.doe@blizzard.com) and password.";
+LOGIN_ACCOUNT_LOCKED = "
Due to suspicious activity, this account is locked.|nA message has been sent to this account's email address containing details on how to resolve this issue.|nVisit us.battle.net/wow/account-locked/en-us for more information.
";
+LOGIN_ALREADYONLINE = "This account is already logged into World of Warcraft. Please check the spelling and try again.";
+LOGIN_ANTI_INDULGENCE = "Your game account is locked by anti-indulgence controls.";
+LOGIN_AUTH_OUTAGE = "
Unable to validate game version. This may be caused by file corruption or the interference of another program. Please visit http://us.blizzard.com/support/article.xml?articleId=21031 for more information and possible solutions to this issue.
";
+LOGIN_DBBUSY = "Could not log in to World of Warcraft at this time. Please try again later.";
+LOGIN_ENTER_NAME = "Please enter your account name.";
+LOGIN_ENTER_PASSWORD = "Please enter your password.";
+LOGIN_ERROR = "Error";
+LOGIN_EXPIRED = "
In order to log in to World of Warcraft using IGR time, this World of Warcraft account must first be merged with a Battle.net account. Please visit http://us.battle.net/ to merge this account.
";
+LOGIN_INCORRECT_PASSWORD = "Incorrect Password";
+LOGIN_INVALID_CHALLENGE_MESSAGE = "Invalid Challenge";
+LOGIN_INVALID_PROOF_MESSAGE = "Invalid Proof Message";
+LOGIN_INVALID_RECODE_MESSAGE = "Invalid Recode Message";
+LOGIN_LOCALE_MISMATCH = "Wrong client language";
+LOGIN_LOCKED_ENFORCED = "You have applied a lock to your account. You can change your locked status by calling your account lock phone number.";
+LOGIN_MALFORMED_ACCOUNT_NAME = "
The information you have entered is not valid. Please check the spelling of the account name and password. If you need help in retrieving a lost or stolen password and account, see www.worldofwarcraft.com/loginsupport for more information.
";
+LOGIN_NOTIME = "
You have used up your prepaid time for this account. Please visit www.worldofwarcraft.com/account to purchase more to continue playing.
";
+LOGIN_NO_GAME_ACCOUNT = "There was a problem logging in with this account.|nYou may not have a World of Warcraft game attached to your account, or you may be logging into a region different from the one you created the account in. If you continue having trouble, please contact Customer Support.";
+LOGIN_NO_GAME_ACCOUNTS_IN_REGION_NONE = "
You have no game accounts in this region.
";
+LOGIN_PARENTALCONTROL = "Access to this account is currently restricted by parental controls. You can change your control settings from your online account management.";
+LOGIN_SERVER_DOWN = "Login Server Down";
+LOGIN_SRP_ERROR = "Authentication Error";
+LOGIN_STATE_AUTHENTICATED = "Success!";
+LOGIN_STATE_AUTHENTICATING = "Authenticating";
+LOGIN_STATE_CHECKINGVERSIONS = "Validating Version";
+LOGIN_STATE_CONNECTING = "Connecting";
+LOGIN_STATE_DOWNLOADFILE = "Downloading";
+LOGIN_STATE_HANDSHAKING = "Handshaking";
+LOGIN_STATE_INITIALIZED = "Initialized";
+LOGIN_STATE_SURVEY = "Submitting non-personal system specification";
+LOGIN_SUSPENDED = "
The information you have entered is not valid. Please check the spelling of the account name and password. If you need help in retrieving a lost or stolen password and account, see www.worldofwarcraft.com/loginsupport for more information.
The information you have entered is not valid. Please check the spelling of the account name, password, and PIN. If you need help in retrieving a lost or stolen password, account, or PIN see www.worldofwarcraft.com/loginsupport for more information.
";
+LOGIN_UNLOCKABLE_LOCK = "This account has been locked but can be unlocked.";
+LOGIN_USE_GRUNT = "Please use your World of Warcraft account name and password instead of your Battle.net account.";
+LOW = "Low";
+MAGE_DISABLED = "Mage\nYou must choose a different race to be this class.";
+MALE = "Male";
+MANAGE_ACCOUNT = "Manage Account";
+MASTER_VOLUME = "Master Volume";
+MELEE_CRIT = "CRIT %.2f";
+MENU_ABOUT = "About World of Warcraft...";
+MENU_EDIT = "Edit";
+MENU_EDIT_COPY = "Copy";
+MENU_EDIT_CUT = "Cut";
+MENU_EDIT_PASTE = "Paste";
+MENU_EDIT_SELECT_ALL = "Select All";
+MENU_EDIT_UNDO = "Undo";
+MENU_SWITCH_TO_FULLSCREEN = "Switch to Full Screen Mode";
+MINUTES = "%d |4min:mins;";
+MINUTES_ABBR = "|4Min:Mins;";
+MISCELLANEOUS = "Miscellaneous";
+MULTISAMPLE = "Multisampling";
+MULTISAMPLING_FORMAT_STRING = "%d-bit color %d-bit depth %dx multisample";
+MUSIC_VOLUME = "Music";
+NAME = "Name";
+NAME_AND_REST_STATE = "%s - %s";
+NEAR = "Near";
+NEWS = "News";
+NEW_REALM = "New";
+NO = "No";
+NONE_CAPS = "NONE";
+NORMAL_BUILD = "Version";
+OKAY = "Okay";
+OPTIONS = "Options";
+OPTIONS_BRIGHTNESS = "Brightness";
+OPTIONS_SHADERS = "Shaders";
+OPTION_RESTART_REQUIREMENT = "Requires game restart to take effect.";
+OPTION_STEREO_CONVERGENCE = "Changes the 3D depth of the screen.";
+OPTION_STEREO_SEPARATION = "Changes the amount of separation created by 3D depth.";
+OPTION_TOOLTIP_AMBIENCE_VOLUME = "Adjusts the ambient sound volume.";
+OPTION_TOOLTIP_AMBIENT_VOLUME = "Adjusts the ambient sound volume.";
+OPTION_TOOLTIP_ANISOTROPIC = "Increases texture sharpness, particularly for textures viewed at an angle. Decrease to improve performance.";
+OPTION_TOOLTIP_CINEMATIC_SUBTITLES = "Enables subtitles during the intro cinematic.";
+OPTION_TOOLTIP_DEATH_EFFECT = "Uncheck to disable glowing effect while in ghost form. Disabling this can sometimes improve performance.";
+OPTION_TOOLTIP_DESKTOP_GAMMA = "Use the same gamma settings as your desktop.";
+OPTION_TOOLTIP_ENABLE_AMBIENCE = "Enable ambient sounds.";
+OPTION_TOOLTIP_ENABLE_BGSOUND = "Enable to allow sounds to play even when World of Warcraft is in the background.";
+OPTION_TOOLTIP_ENABLE_DSP_EFFECTS = "Enables special voice modulation effects for Death Knights.";
+OPTION_TOOLTIP_ENABLE_EMOTE_SOUNDS = "Toggles emote sounds on and off.";
+OPTION_TOOLTIP_ENABLE_ERROR_SPEECH = "Enables speech from errors (e.g. \"Target out of range\").";
+OPTION_TOOLTIP_ENABLE_HARDWARE = "Enables the use of hardware for 3D sound management. This may alter your sound performance.";
+OPTION_TOOLTIP_ENABLE_MUSIC = "Enable background music.";
+OPTION_TOOLTIP_ENABLE_MUSIC_LOOPING = "Enable to continuously play background music.";
+OPTION_TOOLTIP_ENABLE_PET_SOUNDS = "Toggles pet idle and aggro sounds on and off.";
+OPTION_TOOLTIP_ENABLE_REVERB = "Enables reverb sound effects. This will affect performance.";
+OPTION_TOOLTIP_ENABLE_SOFTWARE_HRTF = "Enables software emulation for headphone surround sound.";
+OPTION_TOOLTIP_ENABLE_SOUND = "Enables or disables all sound.";
+OPTION_TOOLTIP_ENABLE_SOUNDFX = "Enables or disables game sound effects.";
+OPTION_TOOLTIP_ENABLE_SOUND_AT_CHARACTER = "Listen to sound from the character's point of view rather than the camera.";
+OPTION_TOOLTIP_ENABLE_STEREO_VIDEO = "Enables stereoscopic (3D) video.";
+OPTION_TOOLTIP_ENVIRONMENT_DETAIL = "Controls how far you can see objects. Decrease to improve performance.";
+OPTION_TOOLTIP_FARCLIP = "Changes how far you can see. Decreasing this may greatly improve performance.";
+OPTION_TOOLTIP_FIX_LAG = "Enabling this reduces user interface lag, but may drastically reduce frame rates.";
+OPTION_TOOLTIP_FULL_SCREEN_GLOW = "Enables a full screen effect that softens edges and lighting. Disabling this can sometimes improve performance.";
+OPTION_TOOLTIP_GAMMA = "Controls the brightness of the game. Increase brightness until you can clearly see all 21 levels of gray bars below.";
+OPTION_TOOLTIP_GROUND_DENSITY = "Controls the number of ground clutter items, like grass and foliage. Decrease to improve performance.";
+OPTION_TOOLTIP_GROUND_RADIUS = "Controls the draw distance of ground clutter items like grass and foliage. Decrease to improve performance.";
+OPTION_TOOLTIP_HARDWARE_CURSOR = "Enable this option for a more responsive cursor unless you have cursor problems.";
+OPTION_TOOLTIP_MASTER_VOLUME = "Adjusts the master sound volume.";
+OPTION_TOOLTIP_MULTISAMPLING = "Increase multisampling to smooth out model edges. Increasing multisampling can severely reduce performance.";
+OPTION_TOOLTIP_MUSIC_VOLUME = "Adjusts the background music volume.";
+OPTION_TOOLTIP_PARTICLE_DENSITY = "Controls the number of particles used in effects caused by spells, fires, etc. Decrease to improve performance.";
+OPTION_TOOLTIP_PLAYER_DETAIL = "Controls the resolution of player textures. Decreasing this may slightly improve performance.";
+OPTION_TOOLTIP_PROJECTED_TEXTURES = "Enables the projecting of textures to the environment. Disabling this may greatly improve performance.";
+OPTION_TOOLTIP_SHADOW_QUALITY = "Controls the quality of rendered character and environment shadows. Decrease to improve performance.";
+OPTION_TOOLTIP_SOUND_CHANNELS = "Changes the number of active software sound channels.";
+OPTION_TOOLTIP_SOUND_OUTPUT = "Selects where you would like to hear your game sounds.";
+OPTION_TOOLTIP_SOUND_QUALITY = "Adjusts the quality of game sounds.\nDecrease to improve performance.";
+OPTION_TOOLTIP_SOUND_VOLUME = "Adjusts the sound effect volume.";
+OPTION_TOOLTIP_SPELL_DETAIL = "Controls the detail level of spell effects. Decrease to improve performance.";
+OPTION_TOOLTIP_STEREO_HARDWARE_CURSOR = "While enabling this option may improve performance, the 3D cursor functionality will not work with it enabled.";
+OPTION_TOOLTIP_TERRAIN_HIGHLIGHTS = "Enables specular highlights on terrain. Disabling this can sometimes improve performance.";
+OPTION_TOOLTIP_TERRAIN_TEXTURE = "Sets the rate at which one type of terrain blends to another.";
+OPTION_TOOLTIP_TEXTURE_DETAIL = "Controls the level of all texture detail. Decreasing this may slightly improve performance.";
+OPTION_TOOLTIP_TRIPLE_BUFFER = "Enables triple buffering of frames when vertical sync is enabled. Selecting triple buffering may even out frame rate spikes, but may also cause slight input lag.";
+OPTION_TOOLTIP_USE_REFRESH = "Changes the monitor refresh rates. Higher rates flicker less.";
+OPTION_TOOLTIP_USE_RESOLUTION = "Changes the screen resolution of the game. Decrease to improve performance.";
+OPTION_TOOLTIP_VERTICAL_SYNC = "Synchronizes your framerate to some fraction of your monitor's refresh rate. Enable this if you see excessive screen tearing in game.";
+OPTION_TOOLTIP_WEATHER_DETAIL = "Controls the intensity of weather effects. Decrease to improve performance.";
+OPTION_TOOLTIP_WINDOWED_MAXIMIZED = "Check to maximize window and remove borders.";
+OPTION_TOOLTIP_WINDOWED_MODE = "Check to play in a non-fullscreen window.\n\nIf this is checked the game will use your desktop gamma and you will not be able to adjust it via the slider below.";
+OPTION_TOOLTIP_WINDOW_LOCK = "Enable this to prevent resizing the game window.";
+OPTION_TOOLTIP_WORLD_LOD = "Check this to enable dynamic reduction of terrain polygon detail. Check to increase performance.";
+OPTION_UI_DEPTH = "Changes the base depth of the UI.";
+OUTBID_ON_SHORT = "Outbid on %s";
+PAID_CHARACTER_CUSTOMIZE_TOOLTIP = "Click to customize your character";
+PAID_FACTION_CHANGE_TOOLTIP = "Click to change your character's faction";
+PAID_RACE_CHANGE_TOOLTIP = "Click to change your character's race";
+PALADIN_DISABLED = "Paladin\nYou must choose a different race to be this class.";
+PARRY = "PARRY %.2f";
+PARTICLE_DENSITY = "Particle Density";
+PASSWORD = "Password";
+PATCH_FAILED_DISK_FULL = "There is not enough disk space available to download the patch. Please make %d megabytes available and then try again. Please note that additional space will be required to apply the patch.";
+PATCH_FAILED_MESSAGE = "Failed to apply patch. Please try again later. If this problem persists you may need to reinstall or contact technical support.";
+PENETRATION = "PENET %d";
+PIXEL_SHADERS = "Special Effects";
+PLAYBACK = "Playback";
+PLAYER_DETAIL = "Player Textures";
+POWER = "PWR";
+PRIEST_DISABLED = "Priest\nYou must choose a different race to be this class.";
+PROJECTED_TEXTURES = "Projected Textures";
+PTR_AE_BUILD = "PTR - Assertions Enabled";
+PTR_RELEASE_BUILD = "PTR - Release";
+PVP_PARENTHESES = "(PVP)";
+QUEUE_FCM = "Free character migration is available for this realm. Click the button below for more information.";
+QUEUE_FCM_BUTTON = "Character Migration";
+QUEUE_FCM_URL = "http://www.worldofwarcraft.com/account";
+QUEUE_NAME_TIME_LEFT = "%s is Full\nPosition in queue: %d\nEstimated time: %d min";
+QUEUE_NAME_TIME_LEFT_SECONDS = "%s is Full\nPosition in queue: %d\nEstimated time: < 1 minute";
+QUEUE_NAME_TIME_LEFT_UNKNOWN = "%s is Full\nPosition in queue: %d\nEstimated time: Calculating...";
+QUEUE_TIME_LEFT = "Realm is Full\nPosition in queue: %d\nEstimated time: %d min";
+QUEUE_TIME_LEFT_SECONDS = "Realm is Full\nPosition in queue: %d\nEstimated time: < 1 minute";
+QUEUE_TIME_LEFT_UNKNOWN = "Realm is Full\nPosition in queue: %d\nEstimated time: Calculating...";
+QUIT = "Quit";
+RACE = "Race";
+RACE_CHANGE_IN_PROGRESS = "Updating Race...";
+RACE_INFO_GOBLIN = "Originally the slaves of jungle trolls on the Isle of Kezan, goblins were forced to mine kaja’mite ore out of the volcanic bowels of Mount Kajaro. The trolls used this potent mineral for their voodoo rituals, but it had an unexpected effect on the slaves who were in constant contact with it: kaja’mite generated a startling new cunning and intelligence in the goblin race.";
+RACE_INFO_GOBLIN_FEMALE = "Originally the slaves of jungle trolls on the Isle of Kezan, goblins were forced to mine kaja’mite ore out of the volcanic bowels of Mount Kajaro. The trolls used this potent mineral for their voodoo rituals, but it had an unexpected effect on the slaves who were in constant contact with it: kaja’mite generated a startling new cunning and intelligence in the goblin race.";
+RACE_INFO_WORGEN = "Behind the formidable Greymane Wall, a terrible curse has spread throughout the isolated human nation of Gilneas, transforming many of its stalwart citizens into nightmarish beasts known as worgen. The origins of this curse have been fiercely debated, but only recently has the startling truth come to light.";
+RACE_INFO_WORGEN_FEMALE = "Behind the formidable Greymane Wall, a terrible curse has spread throughout the isolated human nation of Gilneas, transforming many of its stalwart citizens into nightmarish beasts known as worgen. The origins of this curse have been fiercely debated, but only recently has the startling truth come to light.";
+RACE_INFO_BLOODELF = "Long ago the exiled high elves founded Quel'Thalas, where they created a magical fount called the Sunwell. Though they were strengthened by its powers, they also grew increasingly dependent on them.|n|nAges later the undead Scourge destroyed the Sunwell and most of the high elf population. Now called blood elves, these scattered refugees are rebuilding Quel'Thalas as they search for a new magic source to satisfy their painful addiction.";
+RACE_INFO_BLOODELF_FEMALE = "Long ago the exiled high elves founded Quel'Thalas, where they created a magical fount called the Sunwell. Though they were strengthened by its powers, they also grew increasingly dependent on them.|n|nAges later the undead Scourge destroyed the Sunwell and most of the high elf population. Now called blood elves, these scattered refugees are rebuilding Quel'Thalas as they search for a new magic source to satisfy their painful addiction.";
+RACE_INFO_DRAENEI = "Driven from their home world of Argus, the honorable draenei fled the Burning Legion for eons before finding a remote planet to settle on. They shared this world with the shamanistic orcs and named it Draenor. In time the Legion corrupted the orcs, who waged war and nearly exterminated the peaceful draenei. A lucky few fled to Azeroth, where they now seek allies in their battle against the Burning Legion.";
+RACE_INFO_DRAENEI_FEMALE = "Driven from their home world of Argus, the honorable draenei fled the Burning Legion for eons before finding a remote planet to settle on. They shared this world with the shamanistic orcs and named it Draenor. In time the Legion corrupted the orcs, who waged war and nearly exterminated the peaceful draenei. A lucky few fled to Azeroth, where they now seek allies in their battle against the Burning Legion.";
+RACE_INFO_DWARF = "In ages past, the dwarves cared only for riches taken from the earth's depths. Then records surfaced of a god-like race said to have given the dwarves life... and an enchanted birthright. Driven to learn more, the dwarves devoted themselves to the pursuit of lost artifacts and ancient knowledge. Today dwarven archaeologists are scattered throughout the globe.";
+RACE_INFO_DWARF_FEMALE = "In ages past, the dwarves cared only for riches taken from the earth's depths. Then records surfaced of a god-like race said to have given the dwarves life... and an enchanted birthright. Driven to learn more, the dwarves devoted themselves to the pursuit of lost artifacts and ancient knowledge. Today dwarven archaeologists are scattered throughout the globe.";
+RACE_INFO_GNOME = "Though small in stature, the gnomes of Khaz Modan have used their great intellect to secure a place in history. Indeed, their subterranean kingdom, Gnomeregan, was once a marvel of steam-driven technology. Even so, due to a massive trogg invasion, the city was lost. Now its builders are vagabonds in the dwarven lands, aiding their allies as best they can.";
+RACE_INFO_GNOME_FEMALE = "Though small in stature, the gnomes of Khaz Modan have used their great intellect to secure a place in history. Indeed, their subterranean kingdom, Gnomeregan, was once a marvel of steam-driven technology. Even so, due to a massive trogg invasion, the city was lost. Now its builders are vagabonds in the dwarven lands, aiding their allies as best they can.";
+RACE_INFO_HUMAN = "Humans are a young race, and thus highly versatile, mastering the arts of combat, craftsmanship, and magic with stunning efficiency. The humans’ valor and optimism have led them to build some of the world’s greatest kingdoms. In this troubled era, after generations of conflict, humanity seeks to rekindle its former glory and forge a shining new future.";
+RACE_INFO_HUMAN_FEMALE = "Humans are a young race, and thus highly versatile, mastering the arts of combat, craftsmanship, and magic with stunning efficiency. The humans’ valor and optimism have led them to build some of the world’s greatest kingdoms. In this troubled era, after generations of conflict, humanity seeks to rekindle its former glory and forge a shining new future.";
+RACE_INFO_NIGHTELF = "Ten thousand years ago, the night elves founded a vast empire, but their reckless use of primal magic brought them to ruin. In grief, they withdrew to the forests and remained isolated there until the return of their ancient enemy, the Burning Legion. With no other choice, the night elves emerged at last from their seclusion to fight for their place in the new world.";
+RACE_INFO_NIGHTELF_FEMALE = "Ten thousand years ago, the night elves founded a vast empire, but their reckless use of primal magic brought them to ruin. In grief, they withdrew to the forests and remained isolated there until the return of their ancient enemy, the Burning Legion. With no other choice, the night elves emerged at last from their seclusion to fight for their place in the new world.";
+RACE_INFO_ORC = "The orc race originated on the planet Draenor. A peaceful people with shamanic beliefs, they were enslaved by the Burning Legion and forced into war with the humans of Azeroth. Although it took many years, the orcs finally escaped the demons' corruption and won their freedom. To this day they fight for honor in an alien world that hates and reviles them.";
+RACE_INFO_ORC_FEMALE = "The orc race originated on the planet Draenor. A peaceful people with shamanic beliefs, they were enslaved by the Burning Legion and forced into war with the humans of Azeroth. Although it took many years, the orcs finally escaped the demons' corruption and won their freedom. To this day they fight for honor in an alien world that hates and reviles them.";
+RACE_INFO_SCOURGE = "Free of the Lich King's grasp, the Forsaken seek to overthrow his rule. Led by the banshee Sylvanas, they hunger for vengeance against the Scourge. Humans, too, have become the enemy, relentless in their drive to purge all undead from the land. The Forsaken care little even for their allies; to them the Horde is merely a tool that may further their dark schemes.";
+RACE_INFO_SCOURGE_FEMALE = "Free of the Lich King's grasp, the Forsaken seek to overthrow his rule. Led by the banshee Sylvanas, they hunger for vengeance against the Scourge. Humans, too, have become the enemy, relentless in their drive to purge all undead from the land. The Forsaken care little even for their allies; to them the Horde is merely a tool that may further their dark schemes.";
+RACE_INFO_TAUREN = "Always the tauren strive to preserve the balance of nature and heed the will of their goddess, the Earth Mother. Recently attacked by murderous centaur, the tauren would have been wiped out, save for a chance encounter with the orcs, who helped defeat the interlopers. To honor this blood-debt, the tauren joined the Horde, solidifying the two races' friendship.";
+RACE_INFO_TAUREN_FEMALE = "Always the tauren strive to preserve the balance of nature and heed the will of their goddess, the Earth Mother. Recently attacked by murderous centaur, the tauren would have been wiped out, save for a chance encounter with the orcs, who helped defeat the interlopers. To honor this blood-debt, the tauren joined the Horde, solidifying the two races' friendship.";
+RACE_INFO_TROLL = "Once at home in the jungles of Stranglethorn Vale, the fierce trolls of the Darkspear tribe were pushed out by warring factions. Eventually the trolls befriended the orcish Horde, and Thrall, the orcs' young warchief, convinced the trolls to travel with him to Kalimdor. Though they cling to their shadowy heritage, the Darkspear trolls hold a place of honor in the Horde.";
+RACE_INFO_TROLL_FEMALE = "Once at home in the jungles of Stranglethorn Vale, the fierce trolls of the Darkspear tribe were pushed out by warring factions. Eventually the trolls befriended the orcish Horde, and Thrall, the orcs' young warchief, convinced the trolls to travel with him to Kalimdor. Though they cling to their shadowy heritage, the Darkspear trolls hold a place of honor in the Horde.";
+RACIAL_ABILITIES = "Racial Abilities";
+RANDOMIZE = "Randomize";
+RATINGS_TEXT = "This is the placeholder for the Korean Ratings information";
+REALMLIST_NUMCHARACTERS_TOOLTIP = "The number of characters\nyou have created on this realm.";
+REALMLIST_POPULATION_TOOLTIP = "\"New Players\" realms will give you the best play experience.\n\"Full\" realms are the most crowded, and you will often\nexperience a wait time to play.";
+REALMLIST_REALMNAME_TOOLTIP = "Make sure you check which realm your friends are playing on!";
+REALMLIST_TYPE_TOOLTIP = "Normal = No special rules on this realm.\nPvP = Player versus Player.\nRP = Roleplaying realm.\nRPPvP = Roleplaying, Player versus Player realm.";
+REALM_CHARACTERS = "Characters";
+REALM_DESCRIPTION = "Choosing a Realm";
+REALM_DESCRIPTION_TEXT = "A realm is a discrete game world that exists only for the players within it. You can interact with all the players in your realm, but not with players in other realms. You cannot move your characters between realms. Realms are differentiated by location and play style.";
+REALM_DOWN = "Offline";
+REALM_HELP_FRAME_TEXT = "This account is currently not flagged to participate in the tournament realms. For more information regarding the World of Warcraft Arena Tournament, please visit: %s.";
+REALM_HELP_FRAME_TITLE = "Realms Unavailable";
+REALM_HELP_FRAME_URL = "www.worldofwarcraft.com";
+REALM_INFO_TEMPLATE = "%-32.32s %4d";
+REALM_IS_FULL_WARNING = "You have selected a full server which can result in a wait to play. You should consider selecting a server with a low population.\n\nDo you really want to select this server?";
+REALM_LIST_FAILED = "Unable to connect to realm list server";
+REALM_LIST_INVALID = "Invalid realm list";
+REALM_LIST_IN_PROGRESS = "Retrieving realm list";
+REALM_LIST_REALM_NOT_FOUND = "The game server you have chosen is currently down. Use the Change Realm button to choose another Realm. Check www.worldofwarcraft.com/serverstatus for current server status.";
+REALM_LIST_SUCCESS = "Realm list retrieved";
+REALM_LOAD = "Population";
+REALM_LOCKED = "Locked";
+REALM_NAME = "Realm Name";
+REALM_TYPE = "Type";
+REALM_TYPE_LOCALE_WARNING = "You are trying to play on a realm with a different language.";
+REALM_TYPE_TOURNAMENT_WARNING = "This account is currently not flagged to participate in the tournament realms.\n\nFor more information regarding the World of Warcraft Arena Tournament, please visit: www.worldofwarcraft.com.";
+REFRESH_RATE = "Refresh";
+REGEN = "REGEN %.0f";
+RELEASE_BUILD = "Release";
+RESET_SERVER_SETTINGS = "Are you sure you want to reset all user options to their defaults the next time you login?";
+RESET_SETTINGS = "Reset User Options";
+RESET_WARNING = "All user options will be reset the next time you log in!";
+RESILIENCE = "RESIL %d";
+RESOLUTION = "Resolution";
+RESOLUTION_LABEL = "Resolution";
+RESOLUTION_SUBTEXT = "These options allow you to change the size and detail in which your video hardware renders the game.";
+RESPONSE_CANCELLED = "Cancelled";
+RESPONSE_CONNECTED = "Connected";
+RESPONSE_DISCONNECTED = "Disconnected from server";
+RESPONSE_FAILED_TO_CONNECT = "Failed to connect. Please be sure that your computer is currently connected to the internet, and that no security features on your system might be blocking traffic. See www.blizzard.com/support/wow/ for more information.";
+RESPONSE_FAILURE = "Failure";
+RESPONSE_SUCCESS = "Success";
+RESPONSE_VERSION_MISMATCH = "Wrong client version";
+RESTART = "Restart";
+RETURN_TO_LOGIN = "Return to Login";
+ROGUE_DISABLED = "Rogue\nYou must choose a different race to be this class.";
+ROLE_DAMAGER = "Damager";
+ROLE_HEALER = "Healer";
+ROLE_TANK = "Tank";
+RPPVP_PARENTHESES = "(RPPVP)";
+RP_PARENTHESES = "(RP)";
+RUSSIAN_DECLENSION = "Declensions";
+RUSSIAN_DECLENSION_1 = "Genitive Case";
+RUSSIAN_DECLENSION_2 = "Dative Case";
+RUSSIAN_DECLENSION_3 = "Accusative Case";
+RUSSIAN_DECLENSION_4 = "Instrumental Case";
+RUSSIAN_DECLENSION_5 = "Prepositional Case";
+RUSSIAN_DECLENSION_EXAMPLE_1 = "I always travel with %s.";
+RUSSIAN_DECLENSION_EXAMPLE_2 = "First thing yesterday I bonked %s on the head.";
+RUSSIAN_DECLENSION_EXAMPLE_3 = "Today I met %s again.";
+RUSSIAN_DECLENSION_EXAMPLE_4 = "Now I am friends with %s.";
+RUSSIAN_DECLENSION_EXAMPLE_5 = "Although I know nothing about %s.";
+SAVE_ACCOUNT_NAME = "Remember Account Name";
+SCANDLL_BUTTON_CONTINUEANYWAY = "Continue Anyway";
+SCANDLL_BUTTON_MOREINFO = "More Info";
+SCANDLL_MESSAGE_DOWNLOADING = "[TEMPORARY] Downloading Blizzard Scan";
+SCANDLL_MESSAGE_ERROR = "[TEMPORARY] |cFFFF0000Blizzard Scan failed to complete|r\n\nNEED WORDING";
+SCANDLL_MESSAGE_HACK = "
\"%1$s\" has been detected on your computer. Running this program may compromise the security of your computer and jeopardize your ability to play World of Warcraft. It is highly advised that you correct this problem before playing the game.
As stated, \"%1$s\" has been detected on your computer. Running this program may compromise the security of your computer and jeopardize your ability to play World of Warcraft. It is highly advised that you correct this problem before playing the game.
\"%1$s\" has been detected. This program may be a security risk and/or violate the Terms of Use for World of Warcraft. You must restart your computer and ensure that this program is not active in order to continue.
";
+SCANDLL_MESSAGE_SCANNING = "[TEMPORARY] Scanning for Trojans";
+SCANDLL_MESSAGE_TROJAN = "
\"%1$s\" has been detected on your computer. Running this program may compromise the security of your computer and jeopardize your ability to play World of Warcraft. It is highly advised that you correct this problem before playing the game.
As stated, \"%1$s\" has been detected on your computer. Running this program may compromise the security of your computer and jeopardize your ability to play World of Warcraft. It is highly advised that you correct this problem before playing the game.
";
+SCANDLL_URL_HACK = "http://us.blizzard.com/support/article.xml?articleId=21583";
+SCANDLL_URL_LAUNCHER_TXT = "http://us.scan.worldofwarcraft.com/update/Launcher.txt";
+SCANDLL_URL_TROJAN = "http://us.blizzard.com/support/article.xml?articleId=21370";
+SCANDLL_URL_WIN32_SCAN_DLL = "http://us.scan.worldofwarcraft.com/update/Scan.dll";
+SCANNING_NOTICE = "The scanning aggreement has changed. Please scroll down and review the changes before accepting the agreement.";
+SCAN_FRAME_TITLE = "Scanning Agreement";
+SECONDS = "%d |4sec:secs;";
+SECONDS_ABBR = "|4Sec:Secs;";
+SECURITYMATRIX_DIRECTIONS = "In order to complete logging into World of Warcraft you must enter values from your matrix card.";
+SECURITYMATRIX_ENTER_CELL = "Enter the cell value |cFF00FF00%s%s|r then select OK. If you make a mistake, select Clear.";
+SELECT_ACCOUNT = "Select an account";
+SELECT_CHARACTER = "Select A Character";
+SELECT_RACE = "Select your race";
+SERVER_ALERT_BETA_URL = "http://beta.worldofwarcraft.com/alert";
+SERVER_ALERT_BUTTON_TEXT = "More Info";
+SERVER_ALERT_PTR_URL = "";
+SERVER_ALERT_TITLE = "Breaking News";
+SERVER_ALERT_URL = "http://launcher.worldofwarcraft.com/alert";
+SERVER_DOWN = "Server down";
+SERVER_SELECTION = "Realm Selection";
+SERVER_SPLIT = "This realm has exceeded maximum capacity, and will be undergoing a realm split with players divided between two new realms. You will be able to select which of the two new realms you prefer up until |cffffffff%s|r when the split lockout occurs. If you do not make a selection, you will be assigned to one of the new realms. For more information, visit www.worldofwarcraft.com.\n\nPlease select your new realm preference below. You may change your selection at any time until the lockout date.";
+SERVER_SPLIT_BUTTON = "Realm Split";
+SERVER_SPLIT_CHOOSE_BY = "Choose by:";
+SERVER_SPLIT_CURRENT_CHOICE = "Current Choice:\n%s";
+SERVER_SPLIT_DONT_CHANGE = "Clear Choice";
+SERVER_SPLIT_NOT_NOW = "Decide Later";
+SERVER_SPLIT_PENDING = "Realm Split Pending...";
+SERVER_SPLIT_REALM_CHOICE = "Your current choice is '|cffffffff%s|r'";
+SERVER_SPLIT_SERVER_ONE = "Realm 1";
+SERVER_SPLIT_SERVER_TWO = "Realm 2";
+SHADOW_QUALITY = "Shadow Quality";
+SHAMAN_DISABLED = "Shaman\nYou must choose a different race to be this class.";
+SHOW_LAUNCHER = "Show Launcher";
+SKILLLINES = "Skill Lines";
+SOUL_SHARD = "SHRDS %d";
+SOUNDOPTIONS_MENU = "Sound";
+SOUND_CHANNELS = "Sound Channels";
+SOUND_LABEL = "Sound";
+SOUND_QUALITY = "Sound Quality";
+SOUND_SUBTEXT = "These options control sound hardware and the types and volumes of sounds within the game.";
+SOUND_VOLUME = "Sound";
+SPD = "SPD %d";
+SPEED = "SPD";
+SPELL_DETAIL = "Spell Detail";
+SPI = "SPI";
+STA = "STA";
+STEREO_HARDWARE_CURSOR = "Hardware Cursor";
+STEREO_VIDEO_LABEL = "Stereo";
+STEREO_VIDEO_SUBTEXT = "These options allow you to change details having to do with stereoscopic (3D) viewing.";
+STR = "STR";
+STREAMING_BUILD = "Streaming";
+SUGGESTED_REALM_TEXT = "|cffffffffYou have been assigned to the|r %s |cffffffffRealm.|r";
+SUGGEST_REALM = "Suggest Realm";
+SYSTEM_DEFAULT = "System Default";
+SYSTEM_INCOMPATIBLE_SSE = "