Files
2023-06-21 00:26:27 -07:00

3165 lines
108 KiB
Lua

local E, L, V, P, G = unpack(ElvUI)
local module = E:NewModule("Enhanced_CharacterFrame", "AceHook-3.0", "AceEvent-3.0")
local S = E:GetModule("Skins")
local _G = _G
local select, next, ipairs, pairs, tonumber, getmetatable = select, next, ipairs, pairs, tonumber, getmetatable
local abs, floor, max, min = math.abs, math.floor, math.max, math.min
local find, format, gmatch, lower, sub, trim = string.find, string.format, string.gmatch, string.lower, string.sub, string.trim
local tconcat, tinsert, tremove, sort, wipe = table.concat, table.insert, table.remove, table.sort, table.wipe
local CreateFrame = CreateFrame
local GetActiveTalentGroup = GetActiveTalentGroup
local GetAttackPowerForStat = GetAttackPowerForStat
local GetBlockChance = GetBlockChance
local GetCombatRating = GetCombatRating
local GetCombatRatingBonus = GetCombatRatingBonus
local GetCompanionCooldown = GetCompanionCooldown
local GetCompanionInfo = GetCompanionInfo
local GetCritChance = GetCritChance
local GetCritChanceFromAgility = GetCritChanceFromAgility
local GetCurrentTitle = GetCurrentTitle
local GetCursorPosition = GetCursorPosition
local GetDodgeChance = GetDodgeChance
local GetEquipmentSetInfo = GetEquipmentSetInfo
local GetEquipmentSetInfoByName = GetEquipmentSetInfoByName
local GetInventoryItemLink = GetInventoryItemLink
local GetItemInfo = GetItemInfo
local GetMaxCombatRatingBonus = GetMaxCombatRatingBonus
local GetNumCompanions = GetNumCompanions
local GetNumEquipmentSets = GetNumEquipmentSets
local GetNumTitles = GetNumTitles
local GetParryChance = GetParryChance
local GetScreenHeightScale = GetScreenHeightScale
local GetShieldBlock = GetShieldBlock
local GetSpellCritChanceFromIntellect = GetSpellCritChanceFromIntellect
local GetTitleName = GetTitleName
local GetUnitHealthModifier = GetUnitHealthModifier
local GetUnitHealthRegenRateFromSpirit = GetUnitHealthRegenRateFromSpirit
local GetUnitManaRegenRateFromSpirit = GetUnitManaRegenRateFromSpirit
local GetUnitMaxHealthModifier = GetUnitMaxHealthModifier
local GetUnitPowerModifier = GetUnitPowerModifier
local HasPetUI = HasPetUI
local IsTitleKnown = IsTitleKnown
local PlaySound = PlaySound
local SetPortraitTexture = SetPortraitTexture
local UnitAttackSpeed = UnitAttackSpeed
local UnitClass = UnitClass
local UnitDamage = UnitDamage
local UnitHasMana = UnitHasMana
local UnitHasRelicSlot = UnitHasRelicSlot
local UnitLevel = UnitLevel
local UnitRace = UnitRace
local UnitResistance = UnitResistance
local UnitStat = UnitStat
local CharacterRangedDamageFrame_OnEnter = CharacterRangedDamageFrame_OnEnter
local CharacterSpellCritChance_OnEnter = CharacterSpellCritChance_OnEnter
local CooldownFrame_SetTimer = CooldownFrame_SetTimer
local GameTooltip_Hide = GameTooltip_Hide
local GearManagerDialogSaveSet_OnClick = GearManagerDialogSaveSet_OnClick
local PaperDollFrameItemPopoutButton_HideAll = PaperDollFrameItemPopoutButton_HideAll
local PaperDollFrameItemPopoutButton_ShowAll = PaperDollFrameItemPopoutButton_ShowAll
local PaperDollFrame_ClearIgnoredSlots = PaperDollFrame_ClearIgnoredSlots
local PaperDollFrame_SetArmor = PaperDollFrame_SetArmor
local PaperDollFrame_SetAttackPower = PaperDollFrame_SetAttackPower
local PaperDollFrame_SetAttackSpeed = PaperDollFrame_SetAttackSpeed
local PaperDollFrame_SetDamage = PaperDollFrame_SetDamage
local PaperDollFrame_SetDefense = PaperDollFrame_SetDefense
local PaperDollFrame_SetExpertise = PaperDollFrame_SetExpertise
local PaperDollFrame_SetManaRegen = PaperDollFrame_SetManaRegen
local PaperDollFrame_SetRangedAttackPower = PaperDollFrame_SetRangedAttackPower
local PaperDollFrame_SetRangedAttackSpeed = PaperDollFrame_SetRangedAttackSpeed
local PaperDollFrame_SetRangedCritChance = PaperDollFrame_SetRangedCritChance
local PaperDollFrame_SetRangedDamage = PaperDollFrame_SetRangedDamage
local PaperDollFrame_SetRating = PaperDollFrame_SetRating
local PaperDollFrame_SetSpellBonusDamage = PaperDollFrame_SetSpellBonusDamage
local PaperDollFrame_SetSpellBonusHealing = PaperDollFrame_SetSpellBonusHealing
local PaperDollFrame_SetSpellCritChance = PaperDollFrame_SetSpellCritChance
local PaperDollFrame_SetSpellHaste = PaperDollFrame_SetSpellHaste
local PetPaperDollFrameCompanionFrame = PetPaperDollFrameCompanionFrame
local PetPaperDollFrame_FindCompanionIndex = PetPaperDollFrame_FindCompanionIndex
local GearManagerDialog = GearManagerDialog
local ARMOR_PER_AGILITY = ARMOR_PER_AGILITY
local BLOCK_CHANCE = BLOCK_CHANCE
local BLOCK_PER_STRENGTH = BLOCK_PER_STRENGTH
local CR_BLOCK = CR_BLOCK
local CR_BLOCK_TOOLTIP = CR_BLOCK_TOOLTIP
local CR_CRIT_MELEE = CR_CRIT_MELEE
local CR_CRIT_MELEE_TOOLTIP = CR_CRIT_MELEE_TOOLTIP
local CR_CRIT_TAKEN_MELEE = CR_CRIT_TAKEN_MELEE
local CR_CRIT_TAKEN_RANGED = CR_CRIT_TAKEN_RANGED
local CR_CRIT_TAKEN_SPELL = CR_CRIT_TAKEN_SPELL
local CR_DODGE = CR_DODGE
local CR_DODGE_TOOLTIP = CR_DODGE_TOOLTIP
local CR_HIT_MELEE = CR_HIT_MELEE
local CR_HIT_RANGED = CR_HIT_RANGED
local CR_HIT_SPELL = CR_HIT_SPELL
local CR_PARRY = CR_PARRY
local CR_PARRY_TOOLTIP = CR_PARRY_TOOLTIP
local DAMAGE_PER_SECOND = DAMAGE_PER_SECOND
local DEFENSE = DEFENSE
local DODGE_CHANCE = DODGE_CHANCE
local FONT_COLOR_CODE_CLOSE = FONT_COLOR_CODE_CLOSE
local GREEN_FONT_COLOR = GREEN_FONT_COLOR
local GREEN_FONT_COLOR_CODE = GREEN_FONT_COLOR_CODE
local HEALTH_PER_STAMINA = HEALTH_PER_STAMINA
local HIGHLIGHT_FONT_COLOR_CODE = HIGHLIGHT_FONT_COLOR_CODE
local INVSLOT_BODY = INVSLOT_BODY
local INVSLOT_RANGED = INVSLOT_RANGED
local INVSLOT_MAINHAND = INVSLOT_MAINHAND
local MANA_PER_INTELLECT = MANA_PER_INTELLECT
local MANA_REGEN_FROM_SPIRIT = MANA_REGEN_FROM_SPIRIT
local MAX_EQUIPMENT_SETS_PER_PLAYER = MAX_EQUIPMENT_SETS_PER_PLAYER
local MELEE_CRIT_CHANCE = MELEE_CRIT_CHANCE
local NONE = NONE
local NORMAL_FONT_COLOR = NORMAL_FONT_COLOR
local PAPERDOLLFRAME_TOOLTIP_FORMAT = PAPERDOLLFRAME_TOOLTIP_FORMAT
local PARRY_CHANCE = PARRY_CHANCE
local PET_BONUS_TOOLTIP_INTELLECT = PET_BONUS_TOOLTIP_INTELLECT
local PET_BONUS_TOOLTIP_RESISTANCE = PET_BONUS_TOOLTIP_RESISTANCE
local PET_BONUS_TOOLTIP_STAMINA = PET_BONUS_TOOLTIP_STAMINA
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
local RED_FONT_COLOR_CODE = RED_FONT_COLOR_CODE
local RESILIENCE_CRIT_CHANCE_TO_CONSTANT_DAMAGE_REDUCTION_MULTIPLIER = RESILIENCE_CRIT_CHANCE_TO_CONSTANT_DAMAGE_REDUCTION_MULTIPLIER
local RESILIENCE_CRIT_CHANCE_TO_DAMAGE_REDUCTION_MULTIPLIER = RESILIENCE_CRIT_CHANCE_TO_DAMAGE_REDUCTION_MULTIPLIER
local RESILIENCE_TOOLTIP = RESILIENCE_TOOLTIP
local RESISTANCE_EXCELLENT = RESISTANCE_EXCELLENT
local RESISTANCE_FAIR = RESISTANCE_FAIR
local RESISTANCE_GOOD = RESISTANCE_GOOD
local RESISTANCE_NONE = RESISTANCE_NONE
local RESISTANCE_POOR = RESISTANCE_POOR
local RESISTANCE_TOOLTIP_SUBTEXT = RESISTANCE_TOOLTIP_SUBTEXT
local RESISTANCE_VERYGOOD = RESISTANCE_VERYGOOD
local STAT_ATTACK_POWER = STAT_ATTACK_POWER
local STAT_BLOCK = STAT_BLOCK
local STAT_BLOCK_TOOLTIP = STAT_BLOCK_TOOLTIP
local STAT_DODGE = STAT_DODGE
local STAT_FORMAT = STAT_FORMAT
local STAT_PARRY = STAT_PARRY
local STAT_RESILIENCE = STAT_RESILIENCE
-- GLOBALS: CharacterAmmoSlot, CharacterAttributesFrame, CharacterDamageFrame_OnEnter, CharacterFrame, CharacterFrameCloseButton, CharacterFrameExpandButton, CharacterFrameTab2
-- GLOBALS: CharacterLevelText, CharacterMicroButton, CharacterModelFrame, CharacterNameFrame, CharacterNameText, CharacterResistanceFrame, CharacterSpellBonusDamage_OnEnter
-- GLOBALS: CharacterStatsPane, CharacterStatsPaneScrollBar, CharacterStatsPaneScrollBarScrollDownButton, CharacterStatsPaneScrollBarScrollUpButton, CharacterStatsPaneScrollChild
-- GLOBALS: CompanionModelFrame, CompanionModelFrameRotateLeftButton, CompanionNextPageButton, CompanionPageNumber, CompanionPrevPageButton, CompanionSelectedName
-- GLOBALS: CompanionSummonButton, ComputePetBonus, CreateAnimationGroup, EquipmentManager_EquipSet, GS_Data, GameTooltip, GearManagerDialogPopup, GearManagerToggleButton
-- GLOBALS: GearScore2, GearScore_GetQuality, GearScore_GetScore, HybridScrollFrame_CreateButtons, HybridScrollFrame_GetOffset, HybridScrollFrame_OnLoad, HybridScrollFrame_Update
-- GLOBALS: InspectFrame, InspectModelFrame, PaperDollEquipmentManagerPane, PaperDollEquipmentManagerPaneEquipSet, PaperDollEquipmentManagerPaneSaveSet, PaperDollFormatStat
-- GLOBALS: PaperDollFrame, PaperDollSidebarTab1, PaperDollSidebarTabs, PaperDollStatTooltip, PaperDollTitlesPane, PersonalGearScore, PetAttributesFrame, PetExpBar_Update
-- GLOBALS: PetLevelText, PetModelFrame, PetModelFrameRotateLeftButton, PetNameText, PetPaperDollCloseButton, PetPaperDollCompanionPane, PetPaperDollFrame, PetPaperDollFrameExpBar
-- GLOBALS: PetPaperDollFramePetFrame, PetPaperDollFrame_Update, PetPaperDollFrame_UpdateCompanionCooldowns, PetPaperDollFrame_UpdateTabs, PetResistanceFrame, PlayerTitleFrame
-- GLOBALS: PlayerTitlePickerFrame, SetButtonPulse, SetCVar, StaticPopup_Hide, UIFrameFadeIn, UIFrameFadeOut, hooksecurefunc, table
-- GLOBALS: EQUIPSET_EQUIP, SAVE
local CHARACTERFRAME_EXPANDED_WIDTH = 197
local STATCATEGORY_MOVING_INDENT = 4
local MOVING_STAT_CATEGORY
local PAPERDOLL_SIDEBARS = {
{
name = L["Character Stats"],
frame = "CharacterStatsPane",
icon = nil,
texCoords = {0.109375, 0.890625, 0.09375, 0.90625}
},
{
name = L["Titles"],
frame = "PaperDollTitlesPane",
icon = "Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\PaperDollSidebarTabs",
texCoords = {0.01562500, 0.53125000, 0.32421875, 0.46093750}
},
{
name = L["Equipment Manager"],
frame = "PaperDollEquipmentManagerPane",
icon = "Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\PaperDollSidebarTabs",
texCoords = {0.01562500, 0.53125000, 0.46875000, 0.60546875}
},
{
name = "Mystic Enchants",
frame = "PaperDollMysticEnchantPane",
icon = "Interface\\Icons\\inv_custom_ReforgeToken",
texCoords = {0.1, 0.9, 0.1, 0.9}
}
}
local PAPERDOLL_STATINFO = {
["ITEM_LEVEL"] = {
updateFunc = function(statFrame, unit) module:ItemLevel(statFrame, unit) end
},
["PRIMARY_STAT"] = {
updateFunc = function(statFrame, unit) module:PrimaryStat(statFrame, unit) end
},
["PVE_POWER"] = {
updateFunc = function(statFrame, unit) module:PvEPower(statFrame, unit) end
},
["PVP_POWER"] = {
updateFunc = function(statFrame, unit) module:PvPPower(statFrame, unit) end
},
["FEL_COMM"] = {
updateFunc = function(statFrame, unit) module:FelComm(statFrame, unit) end
},
["STRENGTH"] = {
updateFunc = function(statFrame, unit) module:SetStat(statFrame, unit, 1) end
},
["AGILITY"] = {
updateFunc = function(statFrame, unit) module:SetStat(statFrame, unit, 2) end
},
["STAMINA"] = {
updateFunc = function(statFrame, unit) module:SetStat(statFrame, unit, 3) end
},
["INTELLECT"] = {
updateFunc = function(statFrame, unit) module:SetStat(statFrame, unit, 4) end
},
["SPIRIT"] = {
updateFunc = function(statFrame, unit) module:SetStat(statFrame, unit, 5) end
},
["MELEE_DAMAGE"] = {
updateFunc = function(statFrame, unit) PaperDollFrame_SetDamage(statFrame, unit) end,
updateFunc2 = function(statFrame) CharacterDamageFrame_OnEnter(statFrame) end
},
["MELEE_DPS"] = {
updateFunc = function(statFrame, unit) module:SetMeleeDPS(statFrame, unit) end
},
["MELEE_AP"] = {
updateFunc = function(statFrame, unit) PaperDollFrame_SetAttackPower(statFrame, unit) end
},
["MELEE_ATTACKSPEED"] = {
updateFunc = function(statFrame, unit) PaperDollFrame_SetAttackSpeed(statFrame, unit) end
},
["HITCHANCE"] = {
updateFunc = function(statFrame, unit) if unit ~= "player" then statFrame:Hide() return end PaperDollFrame_SetRating(statFrame, CR_HIT_MELEE) end
},
["CRITCHANCE"] = {
updateFunc = function(statFrame, unit) module:SetMeleeCritChance(statFrame, unit) end
},
["EXPERTISE"] = {
updateFunc = function(statFrame, unit) if unit ~= "player" then statFrame:Hide() return end PaperDollFrame_SetExpertise(statFrame, unit) end
},
["RANGED_COMBAT1"] = {
updateFunc = function(statFrame, unit) PaperDollFrame_SetRangedDamage(statFrame, unit) end,
updateFunc2 = function(statFrame) CharacterRangedDamageFrame_OnEnter(statFrame) end
},
["RANGED_COMBAT2"] = {
updateFunc = function(statFrame, unit) PaperDollFrame_SetRangedAttackSpeed(statFrame, unit) end
},
["RANGED_COMBAT3"] = {
updateFunc = function(statFrame, unit) PaperDollFrame_SetRangedAttackPower(statFrame, unit) end
},
["RANGED_COMBAT4"] = {
updateFunc = function(statFrame) PaperDollFrame_SetRating(statFrame, CR_HIT_RANGED) end
},
["RANGED_COMBAT5"] = {
updateFunc = function(statFrame, unit) PaperDollFrame_SetRangedCritChance(statFrame, unit) end
},
["SPELL_COMBAT1"] = {
updateFunc = function(statFrame, unit) PaperDollFrame_SetSpellBonusDamage(statFrame, unit) end,
updateFunc2 = function(statFrame) CharacterSpellBonusDamage_OnEnter(statFrame) end
},
["SPELL_COMBAT2"] = {
updateFunc = function(statFrame, unit) if unit ~= "player" then statFrame:Hide() return end PaperDollFrame_SetSpellBonusHealing(statFrame, unit) end
},
["SPELL_COMBAT3"] = {
updateFunc = function(statFrame, unit) if unit ~= "player" then statFrame:Hide() return end PaperDollFrame_SetRating(statFrame, CR_HIT_SPELL) end
},
["SPELL_COMBAT4"] = {
updateFunc = function(statFrame, unit) PaperDollFrame_SetSpellCritChance(statFrame, unit) end,
updateFunc2 = function(statFrame) CharacterSpellCritChance_OnEnter(statFrame) end
},
["SPELL_COMBAT5"] = {
updateFunc = function(statFrame, unit) if unit ~= "player" then statFrame:Hide() return end PaperDollFrame_SetSpellHaste(statFrame, unit) end
},
["SPELL_COMBAT6"] = {
updateFunc = function(statFrame, unit) if unit ~= "player" then statFrame:Hide() return end PaperDollFrame_SetManaRegen(statFrame, unit) end
},
["DEFENSES1"] = {
updateFunc = function(statFrame, unit) PaperDollFrame_SetArmor(statFrame, unit) end
},
["DEFENSES2"] = {
updateFunc = function(statFrame, unit) if unit ~= "player" then statFrame:Hide() return end PaperDollFrame_SetDefense(statFrame, unit) end
},
["DEFENSES3"] = {
updateFunc = function(statFrame, unit) module:SetDodge(statFrame, unit) end
},
["DEFENSES4"] = {
updateFunc = function(statFrame, unit) module:SetParry(statFrame, unit) end
},
["DEFENSES5"] = {
updateFunc = function(statFrame, unit) module:SetBlock(statFrame, unit) end
},
["DEFENSES6"] = {
updateFunc = function(statFrame, unit) module:SetResilience(statFrame, unit) end
},
["ARCANE"] = {
updateFunc = function(statFrame, unit) module:SetResistance(statFrame, unit, 6) end
},
["FIRE"] = {
updateFunc = function(statFrame, unit) module:SetResistance(statFrame, unit, 2) end
},
["FROST"] = {
updateFunc = function(statFrame, unit) module:SetResistance(statFrame, unit, 4) end
},
["NATURE"] = {
updateFunc = function(statFrame, unit) module:SetResistance(statFrame, unit, 3) end
},
["SHADOW"] = {
updateFunc = function(statFrame, unit) module:SetResistance(statFrame, unit, 5) end
}
}
local PAPERDOLL_STATCATEGORIES = {
["ITEM_LEVEL"] = {
id = 1,
stats = {
"ITEM_LEVEL"
}
},
["PRIMARY_STAT"] = {
id = 2,
stats = {
"PRIMARY_STAT"
}
},
["PVE_POWER"] = {
id = 3,
stats = {
"PVE_POWER"
}
},
["PVP_POWER"] = {
id = 4,
stats = {
"PVP_POWER"
}
},
["FEL_COMM"] = {
id = 5,
stats = {
"FEL_COMM"
}
},
["BASE_STATS"] = {
id = 6,
stats = {
"STRENGTH",
"AGILITY",
"STAMINA",
"INTELLECT",
"SPIRIT"
}
},
["MELEE_COMBAT"] = {
id = 7,
stats = {
"MELEE_DAMAGE",
"MELEE_DPS",
"MELEE_AP",
"MELEE_ATTACKSPEED",
"HITCHANCE",
"CRITCHANCE",
"EXPERTISE"
}
},
["RANGED_COMBAT"] = {
id = 8,
stats = {
"RANGED_COMBAT1",
"RANGED_COMBAT2",
"RANGED_COMBAT3",
"RANGED_COMBAT4",
"RANGED_COMBAT5"
}
},
["SPELL_COMBAT"] = {
id = 9,
stats = {
"SPELL_COMBAT1",
"SPELL_COMBAT2",
"SPELL_COMBAT3",
"SPELL_COMBAT4",
"SPELL_COMBAT5",
"SPELL_COMBAT6"
}
},
["DEFENSES"] = {
id = 10,
stats = {
"DEFENSES1",
"DEFENSES2",
"DEFENSES3",
"DEFENSES4",
"DEFENSES5",
"DEFENSES6"
}
},
["RESISTANCE"] = {
id = 11,
stats = {
"ARCANE",
"FIRE",
"FROST",
"NATURE",
"SHADOW"
}
}
}
local PAPERDOLL_STATCATEGORY_DEFAULTORDER = {
"ITEM_LEVEL",
"PRIMARY_STAT",
"PVE_POWER",
"PVP_POWER",
"FEL_COMM",
"BASE_STATS",
"MELEE_COMBAT",
"RANGED_COMBAT",
"SPELL_COMBAT",
"DEFENSES",
"RESISTANCE"
}
local PETPAPERDOLL_STATCATEGORY_DEFAULTORDER = {
"BASE_STATS",
"MELEE_COMBAT",
-- "RANGED_COMBAT",
"SPELL_COMBAT",
"DEFENSES",
"RESISTANCE"
}
local _PLAYER_LEVEL, _PLAYER_LEVEL_NO_SPEC
do
local locale = GetLocale()
if locale == "deDE" then
_PLAYER_LEVEL = "Stufe %s, |c%s%s-%s|r"
_PLAYER_LEVEL_NO_SPEC = "Stufe %s, |c%s%s|r"
elseif locale == "esES" or locale == "esMX" then
_PLAYER_LEVEL = "|c%2$s%4$s %3$s|r de nivel %1$s"
_PLAYER_LEVEL_NO_SPEC = "|c%2$s%3$s|r de nivel %1$s"
elseif locale == "frFR" then
_PLAYER_LEVEL = "|c%2$s%4$s %3$s|r de niveau %1$s"
_PLAYER_LEVEL_NO_SPEC = "|c%2$s%3$s|r de niveau %1$s"
elseif locale == "koKR" then
_PLAYER_LEVEL = "%s 레벨 |c%s%s %s|r"
_PLAYER_LEVEL_NO_SPEC = "%s 레벨 |c%s%s|r"
elseif locale == "ruRU" then
_PLAYER_LEVEL = "|c%2$s%4$s (%3$s)|r %1$s-го уровня"
_PLAYER_LEVEL_NO_SPEC = "|c%2$s%3$s|r %1$s-го уровня"
elseif locale == "zhCN" then
_PLAYER_LEVEL = "等级%s |c%s%s %s|r"
_PLAYER_LEVEL_NO_SPEC = "等级%s |c%s%s|r"
elseif locale == "zhTW" then
_PLAYER_LEVEL = "等級%s|c%s%s%s|r"
_PLAYER_LEVEL_NO_SPEC = "等級%s|c%s%s|r"
else
_PLAYER_LEVEL = "Level %s |c%s%s %s|r"
_PLAYER_LEVEL_NO_SPEC = "Level %s |c%s%s|r"
end
end
function module:PaperDollFrame_SetLevel()
local specName = NONE
local classColor = RAID_CLASS_COLORS[E.myclass]
local classColorString = format("FF%02x%02x%02x", classColor.r*255, classColor.g*255, classColor.b*255)
if specName == NONE then
CharacterLevelText:SetFormattedText(_PLAYER_LEVEL_NO_SPEC, E.mylevel, classColorString, E.myLocalizedClass)
else
CharacterLevelText:SetFormattedText(_PLAYER_LEVEL, E.mylevel, classColorString, specName, E.myLocalizedClass)
end
if CharacterLevelText:GetWidth() > 205 then
if PaperDollSidebarTab1:IsVisible() then
CharacterLevelText:Point("TOP", CharacterNameText, "BOTTOM", -10, -6)
else
CharacterLevelText:Point("TOP", CharacterNameText, "BOTTOM", 10, -6)
end
else
CharacterLevelText:Point("TOP", CharacterNameText, "BOTTOM", 0, -6)
end
end
function module:PaperDollSidebarTab(button)
button:Size(33, 35)
button:SetTemplate("Default")
button.Icon = button:CreateTexture(nil, "ARTWORK")
button.Icon:SetInside()
button.Icon:SetTexture(PAPERDOLL_SIDEBARS[button:GetID()].icon)
local tcoords = PAPERDOLL_SIDEBARS[button:GetID()].texCoords
button.Icon:SetTexCoord(tcoords[1], tcoords[2], tcoords[3], tcoords[4])
button.Hider = button:CreateTexture(nil, "OVERLAY")
button.Hider:SetTexture(0, 0, 0, 0.8)
button.Hider:SetInside()
button.Highlight = button:CreateTexture(nil, "HIGHLIGHT")
button.Highlight:SetTexture(1, 1, 1, 0.3)
button.Highlight:SetInside()
button:SetScript("OnClick", function(self)
module:PaperDollFrame_SetSidebar(self, self:GetID())
PlaySound("igMainMenuOption")
end)
button:SetScript("OnEnter", function(self)
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip:SetText(PAPERDOLL_SIDEBARS[self:GetID()].name, 1, 1, 1)
end)
button:SetScript("OnLeave", function(self)
GameTooltip:Hide()
end)
end
function module:CharacterFrame_Collapse(sizeOnly)
if self.skinEnabled then
CharacterFrame.backdrop:Width(341)
S:SetBackdropHitRect(PaperDollFrame, CharacterFrame.backdrop)
S:SetBackdropHitRect(PetPaperDollFrame, CharacterFrame.backdrop)
else
CharacterFrame:Width(384)
S:SetBackdropHitRect(PaperDollFrame)
S:SetBackdropHitRect(PetPaperDollFrame)
end
S:SetUIPanelWindowInfo(CharacterFrame, "width")
if sizeOnly then return end
CharacterFrame.Expanded = false
S:SetNextPrevButtonDirection(CharacterFrameExpandButton, "right")
for i = 1, #PAPERDOLL_SIDEBARS do
_G[PAPERDOLL_SIDEBARS[i].frame]:Hide()
end
PaperDollSidebarTabs:Hide()
end
function module:CharacterFrame_Expand(sizeOnly)
if self.skinEnabled then
CharacterFrame.backdrop:Width(341 + CHARACTERFRAME_EXPANDED_WIDTH)
S:SetBackdropHitRect(PaperDollFrame, CharacterFrame.backdrop)
S:SetBackdropHitRect(PetPaperDollFrame, CharacterFrame.backdrop)
else
CharacterFrame:Width(352 + CHARACTERFRAME_EXPANDED_WIDTH)
S:SetBackdropHitRect(PaperDollFrame)
S:SetBackdropHitRect(PetPaperDollFrame)
end
S:SetUIPanelWindowInfo(CharacterFrame, "width")
if sizeOnly then return end
CharacterFrame.Expanded = true
S:SetNextPrevButtonDirection(CharacterFrameExpandButton, "left")
if PaperDollFrame:IsShown() and PaperDollFrame.currentSideBar then
CharacterStatsPane:Hide()
PaperDollFrame.currentSideBar:Show()
else
CharacterStatsPane:Show()
end
self:PaperDollFrame_UpdateSidebarTabs()
PaperDollSidebarTabs:Show()
end
local StatCategoryFrames = {}
local titanGrip
local qualityColors = {}
do
for i = 0, 7 do
qualityColors[i] = {GetItemQualityColor(i)}
end
if E.myclass == "WARRIOR" then
local GetTalentInfo = GetTalentInfo
local titanGripCheck = CreateFrame("Frame")
titanGripCheck:RegisterEvent("PLAYER_ENTERING_WORLD")
titanGripCheck:RegisterEvent("SPELL_UPDATE_USABLE")
titanGripCheck:RegisterEvent("CHARACTER_POINTS_CHANGED")
titanGripCheck:SetScript("OnEvent", function(self, event, ...)
titanGrip = CA_IsSpellKnown(46917)
if event == "PLAYER_ENTERING_WORLD" or event == "SPELL_UPDATE_USABLE" then
self:UnregisterEvent(event)
end
end)
end
end
--[[
local function OnEvent(event, bagID, slotID)
if event == "ITEM_UNLOCKED" then
if not slotID then
-- equiped item removed
else
-- bag item removed
end
end
end
local slots = {
["HeadSlot"] = "INVTYPE_HEAD",
["NeckSlot"] = "INVTYPE_NECK",
["ShoulderSlot"] = "INVTYPE_SHOULDER",
["BackSlot"] = "INVTYPE_CLOAK",
["ChestSlot"] = "INVTYPE_ROBE",
["WristSlot"] = "INVTYPE_WRIST",
["HandsSlot"] = "INVTYPE_HAND",
["WaistSlot"] = "INVTYPE_WAIST",
["LegsSlot"] = "INVTYPE_LEGS",
["FeetSlot"] = "INVTYPE_FEET",
["Finger0Slot"] = "INVTYPE_FINGER",
["Finger1Slot"] = "INVTYPE_FINGER",
["Trinket0Slot"] = "INVTYPE_TRINKET",
["Trinket1Slot"] = "INVTYPE_TRINKET",
["MainHandSlot"] = {"INVTYPE_WEAPONMAINHAND", "INVTYPE_2HWEAPON", "INVTYPE_WEAPON"},
["SecondaryHandSlot"] = {"INVTYPE_WEAPONOFFHAND", "INVTYPE_SHIELD", "INVTYPE_HOLDABLE", "INVTYPE_WEAPON"},
["RangedSlot"] = {"INVTYPE_RANGED", "INVTYPE_RANGEDRIGHT", "INVTYPE_THROWN", "INVTYPE_RELIC"}
}
local bagsTable = {}
local function sortItemLevel(a, b)
return a > b
end
local function GetAverageItemLevel()
local _, itemLink, itemLevel, itemEquipLoc, slotID
local totalItemLevel, totalEquippedItemLevel = 0, 0
local items = 16
for bag = 0, 4 do
for slot = 1, GetContainerNumSlots(bag) do
itemLink = GetContainerItemLink(bag, slot)
if itemLink then
_, _, _, itemLevel, _, _, _, _, itemEquipLoc = GetItemInfo(itemLink)
if itemEquipLoc and itemEquipLoc ~= "" then
if itemEquipLoc == "INVTYPE_WEAPON" or (titanGrip and itemEquipLoc == "INVTYPE_2HWEAPON") then
if not bagsTable[itemEquipLoc] then
bagsTable[itemEquipLoc] = {itemLevel}
elseif #bagsTable[itemEquipLoc] == 1 then
bagsTable[itemEquipLoc][2] = itemLevel
sort(bagsTable[itemEquipLoc], sortItemLevel)
elseif itemLevel > bagsTable[itemEquipLoc][1] then
bagsTable[itemEquipLoc][2] = bagsTable[itemEquipLoc][1]
bagsTable[itemEquipLoc][1] = itemLevel
elseif itemLevel > bagsTable[itemEquipLoc][2] then
bagsTable[itemEquipLoc][2] = itemLevel
end
else
if not bagsTable[itemEquipLoc] then
bagsTable[itemEquipLoc] = itemLevel
elseif itemLevel > bagsTable[itemEquipLoc] then
bagsTable[itemEquipLoc] = itemLevel
end
end
end
end
end
end
local hasMainHandBag, maxBagItemLevel, countBagOffhand
local hasTwoHandBag = bagsTable["INVTYPE_2HWEAPON"]
for slotName, itemLoc in pairs(slots) do
slotID = GetInventorySlotInfo(slotName)
itemLink = GetInventoryItemLink("player", slotID)
if itemLink then
_, _, _, itemLevel, _, _, _, _, itemEquipLoc = GetItemInfo(itemLink)
if itemLevel and itemLevel > 0 then
if type(itemLoc) == "table" then
local maxLocItemLevel = 0
for _, bagItemLoc in ipairs(itemLoc) do
maxBagItemLevel = bagsTable[bagItemLoc]
if maxBagItemLevel and maxBagItemLevel > maxLocItemLevel then
maxLocItemLevel = maxBagItemLevel
end
end
maxBagItemLevel = maxLocItemLevel ~= 0 and maxLocItemLevel
else
maxBagItemLevel = bagsTable[itemEquipLoc]
end
if maxBagItemLevel and maxBagItemLevel > itemLevel then
totalItemLevel = totalItemLevel + maxBagItemLevel
else
totalItemLevel = totalItemLevel + itemLevel
end
totalEquippedItemLevel = totalEquippedItemLevel + itemLevel
if slotName == "MainHandSlot" and (itemEquipLoc ~= "INVTYPE_2HWEAPON" or titanGrip) then
items = 17
countBagOffhand = true
end
end
else
if type(itemLoc) == "table" then
local maxLocItemLevel = 0
if slotName == "SecondaryHandSlot" then
if titanGrip then
maxLocItemLevel = bagsTable["INVTYPE_2HWEAPON"]
end
if not titanGrip or maxLocItemLevel < bagsTable["INVTYPE_WEAPON"] then
maxLocItemLevel = bagsTable["INVTYPE_WEAPON"]
end
end
for _, bagItemLoc in ipairs(itemLoc) do
maxBagItemLevel = bagsTable[bagItemLoc]
if maxBagItemLevel and maxBagItemLevel > maxLocItemLevel then
maxLocItemLevel = maxBagItemLevel
end
end
maxBagItemLevel = maxLocItemLevel ~= 0 and maxLocItemLevel
else
maxBagItemLevel = bagsTable[itemLoc]
end
if maxBagItemLevel and (slotName ~= "SecondaryHandSlot" or countBagOffhand) then
totalItemLevel = totalItemLevel + maxBagItemLevel
end
if slotName == "MainHandSlot" then
if hasTwoHandBag then
if maxBagItemLevel then
if hasTwoHandBag > maxBagItemLevel then
hasMainHandBag = hasTwoHandBag
end
else
hasMainHandBag = hasTwoHandBag
end
end
end
end
end
wipe(bagsTable)
if hasMainHandBag then
totalItemLevel = totalItemLevel + hasMainHandBag
end
return (totalItemLevel / 17), (totalEquippedItemLevel / items)
end
local function GetItemLevelColor(unit)
if not unit then unit = "player" end
local i = 0
local sumR, sumG, sumB = 0, 0, 0
for slotName in pairs(slots) do
local slotID = GetInventorySlotInfo(slotName)
if GetInventoryItemTexture(unit, slotID) then
local itemLink = GetInventoryItemLink(unit, slotID)
if itemLink then
local quality = select(3, GetItemInfo(itemLink))
if quality then
i = i + 1
local r, g, b = GetItemQualityColor(quality)
sumR = sumR + r
sumG = sumG + g
sumB = sumB + b
end
end
end
end
if i > 0 then
return (sumR / i), (sumG / i), (sumB / i)
else
return 1, 1, 1
end
end
]]
local function GetAverageItemLevel()
local items = 15
local ilvl = 0
local colorCount, sumR, sumG, sumB = 0, 0, 0, 0
-- same ilvl calculation as C_Player:GetAverageItemLevel()
for slot = INVSLOT_FIRST_EQUIPPED, INVSLOT_LAST_EQUIPPED do
if slot ~= INVSLOT_BODY and slot ~= INVSLOT_TABARD then
local itemLink = GetInventoryItemLink("player", slot)
if itemLink then
local _, _, quality, itemLevel, _, _, _, _, itemEquipLoc = GetItemInfo(itemLink)
if itemLevel then
if slot == INVSLOT_RANGED or slot == INVSLOT_OFFHAND then
items = items + 1
end
ilvl = ilvl + itemLevel
colorCount = colorCount + 1
sumR = sumR + qualityColors[quality][1]
sumG = sumG + qualityColors[quality][2]
sumB = sumB + qualityColors[quality][3]
end
end
end
end
if colorCount == 0 then
return ilvl / items, 1, 1, 1
else
return ilvl / items, (sumR / colorCount), (sumG / colorCount), (sumB / colorCount)
end
end
function module:SetLabelAndText(statFrame, label, text, isPercentage)
statFrame.Label:SetFormattedText(STAT_FORMAT, label)
if isPercentage then
statFrame.Value:SetFormattedText("%.2F%%", text)
else
statFrame.Value:SetText(text)
end
end
function module:ItemLevel(statFrame, unit)
if not self.Initialized then return end
if GearScore_GetScore then
if not self.gearScore or not GS_PlayerIsInCombat then
local gearScore = GearScore_GetScore(E.myname, "player")
if not gearScore then
if GS_Data and GS_Data[E.myrealm] then
gearScore = GS_Data[E.myrealm].Players[E.myname].GearScore
end
end
if gearScore then
local r, b, g = GearScore_GetQuality(gearScore)
self.gearScore = gearScore
self.gearScoreR = r
self.gearScoreG = g
self.gearScoreB = b
statFrame.Label:SetText(gearScore)
statFrame.Label:SetTextColor(r, g, b)
return
end
else
statFrame.Label:SetText(self.gearScore)
statFrame.Label:SetTextColor(self.gearScoreR, self.gearScoreG, self.gearScoreB)
return
end
end
-- local avgItemLevel, avgItemLevelEquipped = GetAverageItemLevel()
-- if avgItemLevelEquipped == avgItemLevel then
-- statFrame.Label:SetFormattedText("%.2f", avgItemLevelEquipped)
-- else
-- statFrame.Label:SetFormattedText("%.2f / %.2f", avgItemLevelEquipped, avgItemLevel)
-- end
-- statFrame.Label:SetTextColor(GetItemLevelColor())
local avgItemLevel, r, g, b = GetAverageItemLevel()
statFrame.Label:SetFormattedText("%.1f", avgItemLevel)
statFrame.Label:SetTextColor(r, g, b)
end
function module:PvEPower(statFrame, unit)
if not self.Initialized then return end
statFrame.Label:SetText(PVE_POWER)
statFrame.Label:SetTextColor(ColorUtil:Lerp(ITEM_QUALITY_COLORS[1], ITEM_QUALITY_COLORS[4], PVE_POWER/PVE_POWER_CAP):GetRGB())
statFrame.tooltip = "PvE Power"
local text = format("Increases damage against creatures by: |cffFFFFFF%s%%|r", PVE_POWER * PVE_POWER_DAMAGE_MULTIPLIER)
text = text .. format("\nReduces damage taken from creatures by: |cffFFFFFF%s%%|r", PVE_POWER * PVE_POWER_DAMAGE_TAKEN_MULTIPLIER)
text = text .. format("\nIncreases healing done and absorption in |cffFFFFFFinstances|r by: |cffFFFFFF%s%%|r", PVE_POWER * PVE_POWER_HEALING_MULTIPLIER)
if UnitLevel("player") < GetMaxLevel() then
text = text .. "\n" .. format("|cffFF0000Does not apply below level: %d|r", GetMaxLevel())
end
statFrame.tooltip2 = text
end
function module:PvPPower(statFrame, unit)
if not self.Initialized then return end
statFrame.Label:SetText(PVP_POWER)
statFrame.Label:SetTextColor(ColorUtil:Lerp(ITEM_QUALITY_COLORS[1], ITEM_QUALITY_COLORS[5], PVP_POWER/PVP_POWER_CAP):GetRGB())
statFrame.tooltip = "PvE Power"
local text = format("Increases damage against players by: |cffFFFFFF%s%%|r", PVP_POWER * PVP_POWER_DAMAGE_MULTIPLIER)
text = text .. format("\nWhile your Primary Stat is |cffFFFFFFSpirit|r your healing and absorption in |cffFFFFFFArenas and Battlegrounds|r is increased by: |cffFFFFFF%s%%|r", PVP_POWER * PVP_POWER_DAMAGE_MULTIPLIER)
if UnitLevel("player") < GetMaxLevel() then
text = text .. "\n" .. format("|cffFF0000Does not apply below level: %d|r", GetMaxLevel())
end
statFrame.tooltip2 = text
end
local felCommText = AscensionUI.CharacterFrame.Extension.StatPanel.FelCommutation.Content.CostText
function module:FelComm(statFrame, unit)
if not self.Initialized then return end
if felCommText:GetText() then
statFrame.Label:SetText(felCommText:GetText())
else
statFrame.Label:SetText(GetMoneyString(0))
end
statFrame.tooltip = "Fel Commutation"
statFrame.tooltip2 = "Maximum gold lost on death.\n|cffFF8888Only applies in High Risk|r"
end
function module:PrimaryStat(statFrame, unit)
if not self.Initialized then return end
local statID = C_PrimaryStat:GetActivePrimaryStat()
if not statID then
statFrame.Label:SetFormattedText("No Primary Stat")
statFrame.Label:SetTextColor(0.5, 0.5, 0.5)
statFrame.tooltip = nil
return
end
local _, _, _, name, tooltip = C_PrimaryStat:GetPrimaryStatInfo(statID)
statFrame.Label:SetFormattedText(name)
statFrame.Label:SetTextColor(STAT_COLORS[statID]:GetRGBA())
statFrame.tooltip = name
statFrame.tooltip2 = tooltip
end
function module:SetStat(statFrame, unit, statIndex)
local stat, effectiveStat, posBuff, negBuff = UnitStat(unit, statIndex)
local statName = _G["SPELL_STAT"..statIndex.."_NAME"]
statFrame.Label:SetFormattedText(STAT_FORMAT, statName)
local tooltipText = HIGHLIGHT_FONT_COLOR_CODE..format(PAPERDOLLFRAME_TOOLTIP_FORMAT, statName).." "
if posBuff == 0 and negBuff == 0 then
statFrame.Value:SetText(effectiveStat)
statFrame.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
statFrame.tooltip = tooltipText
if negBuff < 0 then
statFrame.Value:SetText(RED_FONT_COLOR_CODE..effectiveStat..FONT_COLOR_CODE_CLOSE)
else
statFrame.Value:SetText(GREEN_FONT_COLOR_CODE..effectiveStat..FONT_COLOR_CODE_CLOSE)
end
end
statFrame.tooltip2 = _G["DEFAULT_STAT"..statIndex.."_TOOLTIP"]
if unit == "player" then
local _, unitClass = UnitClass("player")
if statIndex == 1 then
local attackPower = GetAttackPowerForStat(statIndex, effectiveStat)
statFrame.tooltip2 = format(statFrame.tooltip2, attackPower)
if unitClass == "WARRIOR" or unitClass == "SHAMAN" or unitClass == "PALADIN" then
statFrame.tooltip2 = statFrame.tooltip2.."\n"..format(STAT_BLOCK_TOOLTIP, max(0, effectiveStat * BLOCK_PER_STRENGTH - 10))
end
elseif statIndex == 3 then
local baseStam = min(20, effectiveStat)
local moreStam = effectiveStat - baseStam
statFrame.tooltip2 = format(statFrame.tooltip2, (baseStam + (moreStam * HEALTH_PER_STAMINA)) * GetUnitMaxHealthModifier("player"))
local petStam = ComputePetBonus("PET_BONUS_STAM", effectiveStat)
if petStam > 0 then
statFrame.tooltip2 = statFrame.tooltip2.."\n"..format(PET_BONUS_TOOLTIP_STAMINA, petStam)
end
elseif statIndex == 2 then
local attackPower = GetAttackPowerForStat(statIndex, effectiveStat)
local meleeCrit = GetCritChanceFromAgility("player")
if attackPower > 0 then
statFrame.tooltip2 = format(STAT_ATTACK_POWER, attackPower)..format(statFrame.tooltip2, meleeCrit, effectiveStat * ARMOR_PER_AGILITY)
else
statFrame.tooltip2 = format(statFrame.tooltip2, meleeCrit, effectiveStat * ARMOR_PER_AGILITY)
end
statFrame.tooltip2 = statFrame.tooltip2 .. "\n" .. format(_G["DEFAULT_STAT"..statIndex.."_EXTRA"], meleeCrit*AGI_TO_SPELL_CRIT_PCT)
elseif statIndex == 4 then
local baseInt = min(20, effectiveStat)
local moreInt = effectiveStat - baseInt
local spellCrit = GetSpellCritChanceFromIntellect("player")
if UnitHasMana("player") then
statFrame.tooltip2 = format(statFrame.tooltip2, baseInt + moreInt * MANA_PER_INTELLECT, spellCrit, (baseInt + moreInt) * INT_TO_MELEE_CRIT_PCT)
statFrame.tooltip2 = statFrame.tooltip2 .. "\n" .. format(_G["DEFAULT_STAT"..statIndex.."_EXTRA"], spellCrit * INT_TO_MELEE_CRIT_PCT)
else
statFrame.tooltip2 = nil
end
local petInt = ComputePetBonus("PET_BONUS_INT", effectiveStat)
if petInt > 0 then
if not statFrame.tooltip2 then
statFrame.tooltip2 = ""
end
statFrame.tooltip2 = statFrame.tooltip2.."\n"..format(PET_BONUS_TOOLTIP_INTELLECT, petInt)
end
elseif statIndex == 5 then
statFrame.tooltip2 = format(statFrame.tooltip2, GetUnitHealthRegenRateFromSpirit("player"))
if UnitHasMana("player") then
local regen = GetUnitManaRegenRateFromSpirit("player")
regen = floor(regen * 5.0)
statFrame.tooltip2 = statFrame.tooltip2.."\n"..format(MANA_REGEN_FROM_SPIRIT, regen)
end
end
elseif unit == "pet" then
if statIndex == 1 then
local attackPower = effectiveStat - 20
statFrame.tooltip2 = format(statFrame.tooltip2, attackPower)
elseif statIndex == 2 then
local newLineIndex = find(statFrame.tooltip2, "|n") + 1
statFrame.tooltip2 = sub(statFrame.tooltip2, 1, newLineIndex)
statFrame.tooltip2 = format(statFrame.tooltip2, GetCritChanceFromAgility("pet"))
elseif statIndex == 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")
statFrame.tooltip2 = format(statFrame.tooltip2, healthGain)
elseif statIndex == 4 then
if UnitHasMana("pet") then
local manaGain = ((effectiveStat - 20) * 15 + 20) * GetUnitPowerModifier("pet")
statFrame.tooltip2 = format(statFrame.tooltip2, manaGain, GetSpellCritChanceFromIntellect("pet"))
else
local newLineIndex = find(statFrame.tooltip2, "|n") + 2
statFrame.tooltip2 = sub(statFrame.tooltip2, newLineIndex)
statFrame.tooltip2 = format(statFrame.tooltip2, GetSpellCritChanceFromIntellect("pet"))
end
elseif statIndex == 5 then
statFrame.tooltip2 = format(statFrame.tooltip2, GetUnitHealthRegenRateFromSpirit("pet"))
if UnitHasMana("pet") then
statFrame.tooltip2 = statFrame.tooltip2.."\n"..format(MANA_REGEN_FROM_SPIRIT, GetUnitManaRegenRateFromSpirit("pet"))
end
end
end
statFrame:Show()
end
function module:SetResistance(statFrame, unit, resistanceIndex)
local base, resistance, positive, negative = UnitResistance(unit, resistanceIndex)
local petBonus = ComputePetBonus("PET_BONUS_RES", resistance)
local resistanceNameShort = _G["SPELL_SCHOOL"..resistanceIndex.."_CAP"]
local resistanceName = _G["RESISTANCE"..resistanceIndex.."_NAME"]
local resistanceIconCode = "|TInterface\\PaperDollInfoFrame\\SpellSchoolIcon"..(resistanceIndex + 1)..":14:14:2:2:16:16:2:14:2:14|t"
statFrame.Label:SetText(resistanceIconCode.." "..format(STAT_FORMAT, resistanceNameShort))
local text = _G[statFrame:GetName().."StatText"]
PaperDollFormatStat(resistanceName, base, positive, negative, statFrame, text)
statFrame.tooltip = resistanceIconCode.." "..HIGHLIGHT_FONT_COLOR_CODE..format(PAPERDOLLFRAME_TOOLTIP_FORMAT, resistanceName).." "..resistance..FONT_COLOR_CODE_CLOSE
if positive ~= 0 or negative ~= 0 then
statFrame.tooltip = statFrame.tooltip.." ( "..HIGHLIGHT_FONT_COLOR_CODE..base
if positive > 0 then
statFrame.tooltip = statFrame.tooltip..GREEN_FONT_COLOR_CODE.." +"..positive
end
if negative < 0 then
statFrame.tooltip = statFrame.tooltip.." "..RED_FONT_COLOR_CODE..negative
end
statFrame.tooltip = statFrame.tooltip..FONT_COLOR_CODE_CLOSE.." )"
end
local resistanceLevel
local unitLevel = UnitLevel(unit)
unitLevel = max(unitLevel, 20)
local magicResistanceNumber = resistance / unitLevel
if magicResistanceNumber > 5 then
resistanceLevel = RESISTANCE_EXCELLENT
elseif magicResistanceNumber > 3.75 then
resistanceLevel = RESISTANCE_VERYGOOD
elseif magicResistanceNumber > 2.5 then
resistanceLevel = RESISTANCE_GOOD
elseif magicResistanceNumber > 1.25 then
resistanceLevel = RESISTANCE_FAIR
elseif magicResistanceNumber > 0 then
resistanceLevel = RESISTANCE_POOR
else
resistanceLevel = RESISTANCE_NONE
end
statFrame.tooltip2 = format(RESISTANCE_TOOLTIP_SUBTEXT, _G["RESISTANCE_TYPE"..resistanceIndex], unitLevel, resistanceLevel)
if petBonus > 0 then
statFrame.tooltip2 = statFrame.tooltip2.."\n"..format(PET_BONUS_TOOLTIP_RESISTANCE, petBonus)
end
end
function module:SetDodge(statFrame, unit)
if unit ~= "player" then
statFrame:Hide()
return
end
local chance = GetDodgeChance()
module:SetLabelAndText(statFrame, STAT_DODGE, chance, 1)
statFrame.tooltip = HIGHLIGHT_FONT_COLOR_CODE..format(PAPERDOLLFRAME_TOOLTIP_FORMAT, DODGE_CHANCE).." "..format("%.02f", chance).."%"..FONT_COLOR_CODE_CLOSE
statFrame.tooltip2 = format(CR_DODGE_TOOLTIP, GetCombatRating(CR_DODGE), GetCombatRatingBonus(CR_DODGE))
statFrame:Show()
end
function module:SetBlock(statFrame, unit)
if unit ~= "player" then
statFrame:Hide()
return
end
local chance = GetBlockChance()
module:SetLabelAndText(statFrame, STAT_BLOCK, chance, 1)
statFrame.tooltip = HIGHLIGHT_FONT_COLOR_CODE..format(PAPERDOLLFRAME_TOOLTIP_FORMAT, BLOCK_CHANCE).." "..format("%.02f", chance).."%"..FONT_COLOR_CODE_CLOSE
statFrame.tooltip2 = format(CR_BLOCK_TOOLTIP, GetCombatRating(CR_BLOCK), GetCombatRatingBonus(CR_BLOCK), GetShieldBlock())
statFrame:Show()
end
function module:SetParry(statFrame, unit)
if unit ~= "player" then
statFrame:Hide()
return
end
local chance = GetParryChance()
module:SetLabelAndText(statFrame, STAT_PARRY, chance, 1)
statFrame.tooltip = HIGHLIGHT_FONT_COLOR_CODE..format(PAPERDOLLFRAME_TOOLTIP_FORMAT, PARRY_CHANCE).." "..format("%.02f", chance).."%"..FONT_COLOR_CODE_CLOSE
statFrame.tooltip2 = format(CR_PARRY_TOOLTIP, GetCombatRating(CR_PARRY), GetCombatRatingBonus(CR_PARRY))
statFrame:Show()
end
function module:SetResilience(statFrame, unit)
if unit ~= "player" then
statFrame:Hide()
return
end
local melee = GetCombatRating(CR_CRIT_TAKEN_MELEE)
local ranged = GetCombatRating(CR_CRIT_TAKEN_RANGED)
local spell = GetCombatRating(CR_CRIT_TAKEN_SPELL)
local minResilience = min(melee, ranged)
minResilience = min(minResilience, spell)
local lowestRating
if melee == minResilience then
lowestRating = CR_CRIT_TAKEN_MELEE
elseif ranged == minResilience then
lowestRating = CR_CRIT_TAKEN_RANGED
else
lowestRating = CR_CRIT_TAKEN_SPELL
end
local maxRatingBonus = GetMaxCombatRatingBonus(lowestRating)
local lowestRatingBonus = GetCombatRatingBonus(lowestRating)
module:SetLabelAndText(statFrame, STAT_RESILIENCE, minResilience)
statFrame.tooltip = HIGHLIGHT_FONT_COLOR_CODE..format(PAPERDOLLFRAME_TOOLTIP_FORMAT, STAT_RESILIENCE).." "..minResilience..FONT_COLOR_CODE_CLOSE
statFrame.tooltip2 = format(RESILIENCE_TOOLTIP, min(lowestRatingBonus * RESILIENCE_CRIT_CHANCE_TO_CONSTANT_DAMAGE_REDUCTION_MULTIPLIER,maxRatingBonus))
statFrame:Show()
end
function module:SetMeleeDPS(statFrame, unit)
statFrame.Label:SetFormattedText(STAT_FORMAT, L["Damage Per Second"])
local speed, offhandSpeed = UnitAttackSpeed(unit)
local minDamage, maxDamage, minOffHandDamage, maxOffHandDamage, physicalBonusPos, physicalBonusNeg, percent = UnitDamage(unit)
minDamage = (minDamage / percent) - physicalBonusPos - physicalBonusNeg
maxDamage = (maxDamage / percent) - physicalBonusPos - physicalBonusNeg
local baseDamage = (minDamage + maxDamage) * 0.5
local fullDamage = (baseDamage + physicalBonusPos + physicalBonusNeg) * percent
local totalBonus = (fullDamage - baseDamage)
local damagePerSecond = (max(fullDamage, 1) / speed)
local colorPos = "|cff20ff20"
local colorNeg = "|cffff2020"
local text
if totalBonus < 0.1 and totalBonus > -0.1 then
totalBonus = 0.0
end
if totalBonus == 0 then
text = format("%.1F", damagePerSecond)
else
local color
if totalBonus > 0 then
color = colorPos
else
color = colorNeg
end
text = color..format("%.1F", damagePerSecond).."|r"
end
if offhandSpeed then
minOffHandDamage = (minOffHandDamage / percent) - physicalBonusPos - physicalBonusNeg
maxOffHandDamage = (maxOffHandDamage / percent) - physicalBonusPos - physicalBonusNeg
local offhandBaseDamage = (minOffHandDamage + maxOffHandDamage) * 0.5
local offhandFullDamage = (offhandBaseDamage + physicalBonusPos + physicalBonusNeg) * percent
local offhandDamagePerSecond = (max(offhandFullDamage, 1) / offhandSpeed)
local offhandTotalBonus = (offhandFullDamage - offhandBaseDamage)
if offhandTotalBonus < 0.1 and offhandTotalBonus > -0.1 then
offhandTotalBonus = 0.0
end
local separator = " / "
if damagePerSecond > 1000 and offhandDamagePerSecond > 1000 then
separator = "/"
end
if offhandTotalBonus == 0 then
text = text..separator..format("%.1F", offhandDamagePerSecond)
else
local color
if offhandTotalBonus > 0 then
color = colorPos
else
color = colorNeg
end
text = text..separator..color..format("%.1F", offhandDamagePerSecond).."|r"
end
end
statFrame.Value:SetText(text)
statFrame.tooltip = HIGHLIGHT_FONT_COLOR_CODE..DAMAGE_PER_SECOND..FONT_COLOR_CODE_CLOSE
statFrame:Show()
end
function module:SetMeleeCritChance(statFrame, unit)
if unit ~= "player" then
statFrame:Hide()
return
end
statFrame.Label:SetFormattedText(STAT_FORMAT, MELEE_CRIT_CHANCE)
local critChance = GetCritChance()
statFrame.Value:SetFormattedText("%.2F%%", critChance)
statFrame.tooltip = HIGHLIGHT_FONT_COLOR_CODE..format(PAPERDOLLFRAME_TOOLTIP_FORMAT, MELEE_CRIT_CHANCE).." "..format("%.2F%%", critChance)..FONT_COLOR_CODE_CLOSE
statFrame.tooltip2 = format(CR_CRIT_MELEE_TOOLTIP, GetCombatRating(CR_CRIT_MELEE), GetCombatRatingBonus(CR_CRIT_MELEE))
end
local function PaperDollFrame_CollapseStatCategory(categoryFrame)
if not categoryFrame.collapsed then
categoryFrame.collapsed = true
--categoryFrame.Toolbar:SetTemplate("NoBackdrop")
categoryFrame.Toolbar:SetAlpha(0.4)
local index = 1
while categoryFrame.Stats[index] do
categoryFrame.Stats[index]:Hide()
index = index + 1
end
categoryFrame:Height(18)
module:PaperDollFrame_UpdateStatScrollChildHeight()
end
end
local function PaperDollFrame_ExpandStatCategory(categoryFrame)
if categoryFrame.collapsed then
categoryFrame.collapsed = false
--categoryFrame.Toolbar:SetTemplate("Default", true)
categoryFrame.Toolbar:SetAlpha(1)
module:PaperDollFrame_UpdateStatCategory(categoryFrame)
module:PaperDollFrame_UpdateStatScrollChildHeight()
end
end
local function PaperDollFrame_QueuedUpdate(self)
module:PaperDollFrame_UpdateStats()
self:SetScript("OnUpdate", nil)
end
local function PetPaperDollFrame_QueuedUpdate(self)
PetPaperDollFrame_Update()
self:SetScript("OnUpdate", nil)
end
function module:PaperDollFrame_UpdateStatCategory(categoryFrame)
if not categoryFrame.Category then categoryFrame:Hide() return end
local category = categoryFrame.Category
local categoryInfo = PAPERDOLL_STATCATEGORIES[category]
if category == "ITEM_LEVEL" then
if PersonalGearScore then
categoryFrame.NameText:SetText("Gear Score")
else
categoryFrame.NameText:SetText(L["Item Level"])
end
elseif category == "PRIMARY_STAT" then
categoryFrame.NameText:SetText("Primary Stat")
elseif category == "FEL_COMM" then
categoryFrame.NameText:SetText("Fel Comm Cost")
elseif category == "PVE_POWER" then
categoryFrame.NameText:SetText("PvE Power")
elseif category == "PVP_POWER" then
categoryFrame.NameText:SetText("PvP Power")
elseif category == "RESISTANCE" then
categoryFrame.NameText:SetText(L["Resistance"])
elseif category == "DEFENSES" then
categoryFrame.NameText:SetText(DEFENSE)
else
categoryFrame.NameText:SetText(_G["PLAYERSTAT_"..category])
end
if categoryFrame.collapsed then return end
local totalHeight = categoryFrame.NameText:GetHeight() + 10
local numVisible = 0
if categoryInfo then
local prevStatFrame = nil
for _, stat in next, categoryInfo.stats do
local statInfo = PAPERDOLL_STATINFO[stat]
if statInfo then
local statFrame = categoryFrame.Stats[numVisible + 1]
if not statFrame then
statFrame = CreateFrame("Frame", "$parentStat"..numVisible + 1, categoryFrame, "CharacterStatFrameTemplate")
if prevStatFrame then
statFrame:SetPoint("TOPLEFT", prevStatFrame, "BOTTOMLEFT")
statFrame:SetPoint("TOPRIGHT", prevStatFrame, "BOTTOMRIGHT")
end
categoryFrame.Stats[numVisible + 1] = statFrame
end
statFrame:Show()
if stat == "ITEM_LEVEL" or stat == "PVP_POWER" or stat == "PVE_POWER" then
statFrame:Height(30)
local label = statFrame.Label
label:Width(187)
label:ClearAllPoints()
label:SetPoint("CENTER")
label:FontTemplate(nil, 20, "NONE")
label:SetJustifyH("CENTER")
statFrame.Value:SetText("")
if statFrame.leftGrad then
statFrame.leftGrad:Show()
statFrame.rightGrad:Show()
end
elseif stat == "FEL_COMM" or stat == "PRIMARY_STAT" then
statFrame:Height(30)
local label = statFrame.Label
label:Width(187)
label:ClearAllPoints()
label:SetPoint("CENTER")
label:FontTemplate(nil, 16, "NONE")
label:SetJustifyH("CENTER")
statFrame.Value:SetText("")
if statFrame.leftGrad then
statFrame.leftGrad:Show()
statFrame.rightGrad:Show()
end
elseif statFrame:GetHeight() > 22 then
statFrame:Height(15)
local label = statFrame.Label
label:Width(122)
label:ClearAllPoints()
label:Point("LEFT", 7, 0)
label:FontTemplate(nil, nil, "NONE")
label:SetJustifyH("LEFT")
label:SetTextColor(1, 0.82, 0)
if statFrame.leftGrad then
statFrame.leftGrad:Hide()
statFrame.rightGrad:Hide()
end
end
if statInfo.updateFunc2 then
statFrame:SetScript("OnEnter", PaperDollStatTooltip)
statFrame:SetScript("OnEnter", statInfo.updateFunc2)
else
statFrame:SetScript("OnEnter", PaperDollStatTooltip)
end
statFrame.tooltip = nil
statFrame.tooltip2 = nil
statFrame.UpdateTooltip = nil
statFrame:SetScript("OnUpdate", nil)
statInfo.updateFunc(statFrame, CharacterStatsPane.unit)
if statFrame:IsShown() then
numVisible = numVisible + 1
totalHeight = totalHeight + statFrame:GetHeight()
prevStatFrame = statFrame
if GameTooltip:GetOwner() == statFrame then
statFrame:GetScript("OnEnter")(statFrame)
end
end
end
end
end
for index = 1, numVisible do
local isSpecial = categoryInfo == PAPERDOLL_STATCATEGORIES["ITEM_LEVEL"] or
categoryInfo == PAPERDOLL_STATCATEGORIES["PVE_POWER"] or
categoryInfo == PAPERDOLL_STATCATEGORIES["FEL_COMM"]
if index % 2 == 0 or isSpecial then
local statFrame = categoryFrame.Stats[index]
if not statFrame.leftGrad then
statFrame.leftGrad = statFrame:CreateTexture(nil, "BACKGROUND")
statFrame.leftGrad:Size(80, statFrame:GetHeight())
statFrame.leftGrad:SetPoint("LEFT", statFrame, "CENTER")
statFrame.leftGrad:SetTexture(E.media.blankTex)
statFrame.leftGrad:SetGradientAlpha("Horizontal", 0.8,0.8,0.8,0.35, 0.8,0.8,0.8,0)
statFrame.rightGrad = statFrame:CreateTexture(nil, "BACKGROUND")
statFrame.rightGrad:Size(80, statFrame:GetHeight())
statFrame.rightGrad:SetPoint("RIGHT", statFrame, "CENTER")
statFrame.rightGrad:SetTexture(E.media.blankTex)
statFrame.rightGrad:SetGradientAlpha("Horizontal", 0.8,0.8,0.8,0, 0.8,0.8,0.8,0.35)
end
end
end
local index = numVisible + 1
while categoryFrame.Stats[index] do
categoryFrame.Stats[index]:Hide()
index = index + 1
end
categoryFrame:Height(totalHeight)
end
function module:PaperDollFrame_UpdateStats()
local index = 1
while CharacterStatsPane.Categories[index] do
self:PaperDollFrame_UpdateStatCategory(CharacterStatsPane.Categories[index])
index = index + 1
end
self:PaperDollFrame_UpdateStatScrollChildHeight()
end
function module:PaperDollFrame_UpdateStatScrollChildHeight()
local index = 1
local totalHeight = 0
while CharacterStatsPane.Categories[index] do
if CharacterStatsPane.Categories[index]:IsShown() then
totalHeight = totalHeight + CharacterStatsPane.Categories[index]:GetHeight() + 4
end
index = index + 1
end
CharacterStatsPaneScrollChild:Height(totalHeight + 10 -(CharacterStatsPane.initialOffsetY or 0))
end
local function FindCategoryById(id)
for categoryName, category in pairs(PAPERDOLL_STATCATEGORIES) do
if category.id == id then
return categoryName
end
end
end
function module:PaperDoll_InitStatCategories(defaultOrder, orderData, collapsedData, unit)
local order = defaultOrder
local orderString = orderData
local savedOrder = {}
if orderString and orderString ~= "" then
for i in gmatch(orderString, "(%d+),?") do
i = tonumber(i)
if i then
local categoryName = FindCategoryById(i)
if categoryName then
tinsert(savedOrder, categoryName)
end
end
end
local valid = true
if #savedOrder == #defaultOrder then
for _, category1 in ipairs(defaultOrder) do
local found = false
for _, category2 in ipairs(savedOrder) do
if category1 == category2 then
found = true
break
end
end
if not found then
valid = false
break
end
end
else
valid = false
end
if valid then
order = savedOrder
else
orderData = ""
end
end
wipe(StatCategoryFrames)
for index = 1, #order do
local frame = CharacterStatsPane.Categories[index]
tinsert(StatCategoryFrames, frame)
frame.Category = order[index]
frame:Show()
local categoryInfo = PAPERDOLL_STATCATEGORIES[frame.Category]
if categoryInfo and collapsedData[frame.Category] then
PaperDollFrame_CollapseStatCategory(frame)
else
PaperDollFrame_ExpandStatCategory(frame)
end
end
local index = #order + 1
while CharacterStatsPane.Categories[index] do
CharacterStatsPane.Categories[index]:Hide()
CharacterStatsPane.Categories[index].Category = nil
index = index + 1
end
CharacterStatsPane.defaultOrder = defaultOrder
CharacterStatsPane.orderData = orderData
CharacterStatsPane.collapsedData = collapsedData
CharacterStatsPane.unit = unit
self:PaperDoll_UpdateCategoryPositions()
self:PaperDollFrame_UpdateStats()
end
local function PaperDoll_SaveStatCategoryOrder()
if CharacterStatsPane.defaultOrder and #CharacterStatsPane.defaultOrder == #StatCategoryFrames then
local same = true
for index = 1, #StatCategoryFrames do
if StatCategoryFrames[index].Category ~= CharacterStatsPane.defaultOrder[index] then
same = false
break
end
end
if same then
E.private.enhanced.character[CharacterStatsPane.unit].orderName = ""
return
end
end
local order = {}
for index = 1, #StatCategoryFrames do
order[index] = PAPERDOLL_STATCATEGORIES[StatCategoryFrames[index].Category].id
end
E.private.enhanced.character[CharacterStatsPane.unit].orderName = tconcat(order, ",")
end
function module:PaperDoll_UpdateCategoryPositions()
local prevFrame
for index = 1, #StatCategoryFrames do
local frame = StatCategoryFrames[index]
local xOffset = 0
if frame == MOVING_STAT_CATEGORY then
xOffset = STATCATEGORY_MOVING_INDENT
elseif prevFrame and prevFrame == MOVING_STAT_CATEGORY then
xOffset = -STATCATEGORY_MOVING_INDENT
end
frame:ClearAllPoints()
if prevFrame then
frame:Point("TOPLEFT", prevFrame, "BOTTOMLEFT", 0 + xOffset, -4)
else
frame:Point("TOPLEFT", 1 + xOffset, -4 + (CharacterStatsPane.initialOffsetY or 0))
end
prevFrame = frame
end
end
local function StatCategory_OnDragUpdate(self)
local _, cursorY = GetCursorPosition()
cursorY = cursorY * GetScreenHeightScale()
local myIndex, insertIndex, closestPos
for index = 1, #StatCategoryFrames + 1 do
if StatCategoryFrames[index] == self then
myIndex = index
end
local frameY
if index <= #StatCategoryFrames then
frameY = StatCategoryFrames[index]:GetTop()
else
frameY = StatCategoryFrames[#StatCategoryFrames]:GetBottom()
end
frameY = frameY - 8
if myIndex and index > myIndex then
frameY = frameY + self:GetHeight()
end
if not closestPos or abs(cursorY - frameY) < closestPos then
insertIndex = index
closestPos = abs(cursorY - frameY)
end
end
if insertIndex > myIndex then
insertIndex = insertIndex - 1
end
if myIndex ~= insertIndex then
tremove(StatCategoryFrames, myIndex)
tinsert(StatCategoryFrames, insertIndex, self)
module:PaperDoll_UpdateCategoryPositions()
end
end
local function PaperDollStatCategory_OnDragStart(self)
MOVING_STAT_CATEGORY = self
module:PaperDoll_UpdateCategoryPositions()
GameTooltip:Hide()
self:SetScript("OnUpdate", StatCategory_OnDragUpdate)
for i, frame in next, StatCategoryFrames do
if frame ~= self then
if E.db.enhanced.character.animations then
UIFrameFadeIn(frame, 0.2, 1, 0.6)
else
frame:SetAlpha(0.6)
end
end
end
end
local function PaperDollStatCategory_OnDragStop(self)
MOVING_STAT_CATEGORY = nil
module:PaperDoll_UpdateCategoryPositions()
self:SetScript("OnUpdate", nil)
for i, frame in next, StatCategoryFrames do
if frame ~= self then
if E.db.enhanced.character.animations then
UIFrameFadeOut(frame, 0.2, 0.6, 1)
else
frame:SetAlpha(1)
end
end
end
PaperDoll_SaveStatCategoryOrder()
end
function module:PaperDollFrame_UpdateSidebarTabs()
for i = 1, #PAPERDOLL_SIDEBARS do
local tab = _G["PaperDollSidebarTab"..i]
if _G[PAPERDOLL_SIDEBARS[i].frame]:IsShown() then
tab.Hider:Hide()
tab.Highlight:Hide()
else
tab.Hider:Show()
tab.Highlight:Show()
end
end
end
function module:PaperDollFrame_SetSidebar(button, index)
if not _G[PAPERDOLL_SIDEBARS[index].frame]:IsShown() then
for i = 1, #PAPERDOLL_SIDEBARS do
if _G[PAPERDOLL_SIDEBARS[i].frame]:IsShown() then
if E.db.enhanced.character.animations then
UIFrameFadeOut(_G[PAPERDOLL_SIDEBARS[i].frame], 0.2, 1, 0)
_G[PAPERDOLL_SIDEBARS[i].frame].fadeInfo.finishedFunc = function()
_G[PAPERDOLL_SIDEBARS[i].frame]:Hide()
end
else
_G[PAPERDOLL_SIDEBARS[i].frame]:Hide()
end
_G["PaperDollSidebarTab"..i].Hider:Show()
_G["PaperDollSidebarTab"..i].Highlight:Show()
end
end
_G[PAPERDOLL_SIDEBARS[index].frame]:Show()
if E.db.enhanced.character.animations then
UIFrameFadeIn(_G[PAPERDOLL_SIDEBARS[index].frame], 0.2, 0, 1)
end
PaperDollFrame.currentSideBar = _G[PAPERDOLL_SIDEBARS[index].frame]
PaperDollFrame.currentSideBarID = index
_G["PaperDollSidebarTab"..index].Hider:Hide()
_G["PaperDollSidebarTab"..index].Highlight:Hide()
end
end
function module:PaperDollTitlesPane_UpdateScrollFrame()
local buttons = PaperDollTitlesPane.buttons
local playerTitles = PaperDollTitlesPane.titles
local numButtons = #buttons
local scrollOffset = HybridScrollFrame_GetOffset(PaperDollTitlesPane)
local button, playerTitle
for i = 1, numButtons do
button = buttons[i]
playerTitle = playerTitles[i + scrollOffset]
if playerTitle then
button:Show()
button.text:SetText(playerTitle.name)
button.titleId = playerTitle.id
local highlight = button:GetHighlightTexture()
highlight:SetTexture(E.Media.Textures.Highlight)
highlight:SetInside()
highlight:SetVertexColor(1, 1, 1, 0.35)
if PaperDollTitlesPane.selected == playerTitle.id then
button.Check:SetAlpha(1)
button.SelectedBar:SetTexture(E.Media.Textures.Highlight)
button.SelectedBar:SetVertexColor(1, 0.80, 0.10, 0.3)
button.SelectedBar:SetInside()
button.SelectedBar:Show()
else
button.Check:SetAlpha(0)
button.SelectedBar:Hide()
end
if (i + scrollOffset) % 2 == 0 then
button.Stripe:SetTexture(0.9, 0.9, 1, 0.1)
button.Stripe:Show()
else
button.Stripe:Hide()
end
else
button:Hide()
end
end
end
local function PlayerTitleSort(a, b) return a.name < b.name end
function module:PaperDollTitlesPane_Update()
local playerTitles = {}
local currentTitle = GetCurrentTitle()
local titleCount = 1
local buttons = PaperDollTitlesPane.buttons
local fontstringText = buttons[1].text
PaperDollTitlesPane.selected = -1
playerTitles[1] = {}
playerTitles[1].name = " "
playerTitles[1].id = -1
for i = 1, GetNumTitles() do
if IsTitleKnown(i) ~= 0 then
titleCount = titleCount + 1
playerTitles[titleCount] = playerTitles[titleCount] or {}
playerTitles[titleCount].name = trim(GetTitleName(i))
playerTitles[titleCount].id = i
if i == currentTitle then
PaperDollTitlesPane.selected = i
end
fontstringText:SetText(playerTitles[titleCount].name)
end
end
sort(playerTitles, PlayerTitleSort)
playerTitles[1].name = NONE
PaperDollTitlesPane.titles = playerTitles
HybridScrollFrame_Update(PaperDollTitlesPane, (titleCount * 22) + 20 , PaperDollTitlesPane:GetHeight())
if not PaperDollTitlesPane.scrollBar.thumbTexture:IsShown() then
PaperDollTitlesPane.scrollBar.thumbTexture:Show()
end
self:PaperDollTitlesPane_UpdateScrollFrame()
end
function module:PaperDollEquipmentManagerPane_Update()
local _, setID = GetEquipmentSetInfoByName(PaperDollEquipmentManagerPane.selectedSetName or "")
if setID then
PaperDollEquipmentManagerPaneSaveSet:Enable()
PaperDollEquipmentManagerPaneEquipSet:Enable()
else
PaperDollEquipmentManagerPaneSaveSet:Disable()
PaperDollEquipmentManagerPaneEquipSet:Disable()
if PaperDollEquipmentManagerPane.selectedSetName then
PaperDollEquipmentManagerPane.selectedSetName = nil
PaperDollFrame_ClearIgnoredSlots()
end
end
local numSets = GetNumEquipmentSets()
local numRows = numSets
if numSets < MAX_EQUIPMENT_SETS_PER_PLAYER then
numRows = numRows + 1
end
HybridScrollFrame_Update(PaperDollEquipmentManagerPane, numRows * 44 + PaperDollEquipmentManagerPaneEquipSet:GetHeight() + 20 , PaperDollEquipmentManagerPane:GetHeight())
if not PaperDollEquipmentManagerPane.scrollBar.thumbTexture:IsShown() then
PaperDollEquipmentManagerPane.scrollBar.thumbTexture:Show()
end
local scrollOffset = HybridScrollFrame_GetOffset(PaperDollEquipmentManagerPane)
local buttons = PaperDollEquipmentManagerPane.buttons
local selectedName = PaperDollEquipmentManagerPane.selectedSetName
local name, texture, button
for i = 1, #buttons do
button = buttons[i]
if (i + scrollOffset) <= numRows then
button:Show()
button:Enable()
if (i + scrollOffset) <= numSets then
name, texture = GetEquipmentSetInfo(i + scrollOffset)
button.name = name
button.text:SetText(name)
button.text:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b)
if texture then
button.icon:SetTexture(texture)
else
button.icon:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark")
end
if selectedName and button.name == selectedName then
button.SelectedBar:Show()
GearManagerDialog.selectedSet = button
else
button.SelectedBar:Hide()
end
else
button.name = nil
button.text:SetText(L["New Set"])
button.text:SetTextColor(GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b)
button.icon:SetTexture("Interface\\Icons\\Spell_ChargePositive")
button.SelectedBar:Hide()
end
if (i + scrollOffset) % 2 == 0 then
button.Stripe:SetTexture(0.9, 0.9, 1)
button.Stripe:SetAlpha(0.1)
button.Stripe:Show()
else
button.Stripe:Hide()
end
else
button:Hide()
end
end
end
local EnchantSlots = {
{INVSLOT_HEAD, "HEADSLOT"},
{INVSLOT_NECK, "NECKSLOT"},
{INVSLOT_SHOULDER, "SHOULDERSLOT"},
{INVSLOT_CHEST, "CHESTSLOT"},
{INVSLOT_WAIST, "WAISTSLOT"},
{INVSLOT_LEGS, "LEGSSLOT"},
{INVSLOT_FEET, "FEETSLOT"},
{INVSLOT_WRIST, "WRISTSLOT"},
{INVSLOT_HAND, "HANDSSLOT"},
{INVSLOT_FINGER1, "FINGER0SLOT"},
{INVSLOT_FINGER2, "FINGER1SLOT"},
{INVSLOT_TRINKET1, "TRINKET0SLOT"},
{INVSLOT_TRINKET2, "TRINKET1SLOT"},
{INVSLOT_BACK, "BACKSLOT"},
{INVSLOT_MAINHAND, "MAINHANDSLOT"},
{INVSLOT_OFFHAND, "SECONDARYHANDSLOT"},
{INVSLOT_RANGED, "RANGEDSLOT"},
}
function module:MysticEnchantPane_Update()
HybridScrollFrame_Update(PaperDollMysticEnchantPane, 768, PaperDollMysticEnchantPane:GetHeight())
if not PaperDollMysticEnchantPane.scrollBar.thumbTexture:IsShown() then
PaperDollMysticEnchantPane.scrollBar.thumbTexture:Show()
end
local scrollOffset = HybridScrollFrame_GetOffset(PaperDollMysticEnchantPane)
local buttons = PaperDollMysticEnchantPane.buttons
local name, texture, button
local enchantCount = {}
local equippedEnchants = {}
for index, slotInfo in ipairs(EnchantSlots) do
local enchant = GetInventoryItemMysticEnchant("player", slotInfo[1])
local RE
if enchant then
RE = GetREData(enchant)
if not enchantCount[RE.spellID] then
enchantCount[RE.spellID] = 1
else
enchantCount[RE.spellID] = enchantCount[RE.spellID] + 1
end
end
equippedEnchants[index] = {
slotID = slotInfo[1],
slotName = slotInfo[2],
spellID = RE and RE.spellID,
quality = RE and RE.quality,
limit = RE and RE.stackable,
}
end
for i = 1, #buttons do
button = buttons[i]
if (i + scrollOffset) <= 17 then
button:Show()
button:Enable()
local slotInfo = equippedEnchants[i + scrollOffset]
if slotInfo.spellID then
name, _, texture = GetSpellInfo(slotInfo.spellID)
if not name then
name = "|cffFF0000Unknown Enchant: " .. slotInfo.spellID .. "|r"
texture = nil
else
name = ITEM_QUALITY_COLORS[slotInfo.quality]:WrapText(name)
end
if enchantCount[slotInfo.spellID] > slotInfo.limit then
name = name .. " |cffFF0000" .. enchantCount[slotInfo.spellID] .. "/" .. slotInfo.limit .. "|r"
else
name = name .. " " .. enchantCount[slotInfo.spellID] .. "/" .. slotInfo.limit
end
else
name = nil
texture = select(2, GetInventorySlotInfo(slotInfo.slotName))
end
local slotName = _G[slotInfo.slotName]
if name then
button.name = slotName .. "\n" .. name
else
button.name = slotName
end
button.enchant = enchant
button.text:SetText(button.name)
button.text:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b)
if texture then
button.icon:SetTexture(texture)
else
button.icon:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark")
end
if (i + scrollOffset) % 2 == 0 then
button.Stripe:SetTexture(0.9, 0.9, 1)
button.Stripe:SetAlpha(0.1)
button.Stripe:Show()
else
button.Stripe:Hide()
end
else
button:Hide()
end
end
end
function module:PetPaperDollCompanionPane_Update()
local scrollFrame = PetPaperDollCompanionPane
local offset = HybridScrollFrame_GetOffset(scrollFrame)
local buttons = scrollFrame.buttons
local selected, text
local button, displayIndex, index
local creatureID, creatureName, spellID, icon, active
if PetPaperDollFrameCompanionFrame.mode == "CRITTER" then
selected = PetPaperDollFrame_FindCompanionIndex(PetPaperDollFrameCompanionFrame.idCritter)
text = L["Total Companions"]
elseif PetPaperDollFrameCompanionFrame.mode == "MOUNT" then
selected = PetPaperDollFrame_FindCompanionIndex(PetPaperDollFrameCompanionFrame.idMount)
text = L["Total Mounts"]
end
local numCompanions = GetNumCompanions(PetPaperDollFrameCompanionFrame.mode)
scrollFrame.text:SetFormattedText("%s: %d", text, numCompanions)
for i = 1, #buttons do
button = buttons[i]
displayIndex = i + offset
if displayIndex <= numCompanions then
index = displayIndex
creatureID, creatureName, spellID, icon, active = GetCompanionInfo(PetPaperDollFrameCompanionFrame.mode, index)
button:Show()
button:SetID(index)
_G[button:GetName().."Cooldown"]:SetInside()
button.creatureID = creatureID
button.spellID = spellID
button.active = active
if creatureID then
button.name:SetText(creatureName)
button.icon:SetTexture(icon)
button:Enable()
local start, duration, enable = GetCompanionCooldown(PetPaperDollFrameCompanionFrame.mode, index)
if start and duration and enable then
CooldownFrame_SetTimer(_G[button:GetName().."Cooldown"], start, duration, enable)
end
else
button.name:SetText("")
_G[button:GetName().."Cooldown"]:Hide()
button:Disable()
end
if (index == selected) and creatureID then
button.SelectedBar:Show()
button.SelectedBar:SetTexture(1, 1, 1, 0.2)
elseif active then
button.SelectedBar:Show()
button.SelectedBar:SetTexture(1, 1, 0, 0.2)
else
button.SelectedBar:Hide()
end
if (i + offset) % 2 == 0 then
button.Stripe:SetTexture(0.9, 0.9, 1)
button.Stripe:SetAlpha(0.1)
button.Stripe:Show()
else
button.Stripe:Hide()
end
else
button:Hide()
end
end
local totalHeight = numCompanions * 44
HybridScrollFrame_Update(scrollFrame, totalHeight, scrollFrame:GetHeight())
if not scrollFrame.scrollBar.thumbTexture:IsShown() then
scrollFrame.scrollBar.thumbTexture:Show()
end
end
function module:UpdateCharacterModelFrame()
if not module.Initialized then return end
if E.db.enhanced.character.characterBackground then
if not CharacterModelFrame.backdrop then
CharacterModelFrame:CreateBackdrop()
CharacterModelFrame.backdrop:SetAllPoints(CharacterModelFrame)
CharacterModelFrame.textureTopLeft = CharacterModelFrame:CreateTexture("$parentTextureTopLeft", "BACKGROUND")
CharacterModelFrame.textureTopLeft:Point("TOPLEFT", 1, -1)
CharacterModelFrame.textureTopLeft:Size(216, 246)
-- texWidth, texHeight, cropWidth, cropHeight, offsetX, offsetY = 256, 256, 216, 248, 40, 8
CharacterModelFrame.textureTopLeft:SetTexCoord(0.15625, 1, 0.03125, 1)
CharacterModelFrame.textureTopRight = CharacterModelFrame:CreateTexture("$parentTextureTopRight", "BACKGROUND")
CharacterModelFrame.textureTopRight:Point("TOPLEFT", CharacterModelFrame.textureTopLeft, "TOPRIGHT")
CharacterModelFrame.textureTopRight:Size(19, 246)
-- texWidth, texHeight, cropWidth, cropHeight, offsetX, offsetY = 64, 256, 19, 248, 0, 8
CharacterModelFrame.textureTopRight:SetTexCoord(0, 0.296875, 0.03125, 1)
CharacterModelFrame.textureBotLeft = CharacterModelFrame:CreateTexture("$parentTextureBotLeft", "BACKGROUND")
CharacterModelFrame.textureBotLeft:Point("TOPLEFT", CharacterModelFrame.textureTopLeft, "BOTTOMLEFT")
CharacterModelFrame.textureBotLeft:Size(216, 76)
-- texWidth, texHeight, cropWidth, cropHeight, offsetX, offsetY = 256, 128, 216, 76, 40, 0
CharacterModelFrame.textureBotLeft:SetTexCoord(0.15625, 1, 0, 0.59375)
CharacterModelFrame.textureBotRight = CharacterModelFrame:CreateTexture("$parentTextureBotRight", "BACKGROUND")
CharacterModelFrame.textureBotRight:Point("TOPLEFT", CharacterModelFrame.textureTopLeft, "BOTTOMRIGHT")
CharacterModelFrame.textureBotRight:Size(19, 76)
-- texWidth, texHeight, cropWidth, cropHeight, offsetX, offsetY = 64, 128, 19, 76, 0, 0
CharacterModelFrame.textureBotRight:SetTexCoord(0, 0.296875, 0, 0.59375)
CharacterModelFrame.backgroundOverlay = CharacterModelFrame:CreateTexture("$parentBackgroundOverlay", "BORDER")
CharacterModelFrame.backgroundOverlay:SetInside(CharacterModelFrame.backdrop)
CharacterModelFrame.backgroundOverlay:SetTexture(0, 0, 0)
else
CharacterModelFrame.backdrop:Show()
end
local desaturate = E.db.enhanced.character.desaturateCharacter and true or false
local raceEng = lower(E.myrace)
CharacterModelFrame.textureTopLeft:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\"..raceEng.."_1.blp")
CharacterModelFrame.textureTopLeft:SetDesaturated(desaturate)
CharacterModelFrame.textureTopLeft:Show()
CharacterModelFrame.textureTopRight:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\"..raceEng.."_2.blp")
CharacterModelFrame.textureTopRight:SetDesaturated(desaturate)
CharacterModelFrame.textureTopRight:Show()
CharacterModelFrame.textureBotLeft:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\"..raceEng.."_3.blp")
CharacterModelFrame.textureBotLeft:SetDesaturated(desaturate)
CharacterModelFrame.textureBotLeft:Show()
CharacterModelFrame.textureBotRight:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\"..raceEng.."_4.blp")
CharacterModelFrame.textureBotRight:SetDesaturated(desaturate)
CharacterModelFrame.textureBotRight:Show()
CharacterModelFrame.backgroundOverlay:Show()
if raceEng == "scourge" then
CharacterModelFrame.backgroundOverlay:SetAlpha(0.2)
elseif raceEng == "bloodelf" or raceEng == "nightelf" then
CharacterModelFrame.backgroundOverlay:SetAlpha(0.7)
elseif raceEng == "troll" or raceEng == "orc" then
CharacterModelFrame.backgroundOverlay:SetAlpha(0.5)
else
CharacterModelFrame.backgroundOverlay:SetAlpha(0.6)
end
elseif CharacterModelFrame.textureTopLeft then
CharacterModelFrame.backdrop:Hide()
CharacterModelFrame.textureTopLeft:Hide()
CharacterModelFrame.textureTopRight:Hide()
CharacterModelFrame.textureBotLeft:Hide()
CharacterModelFrame.textureBotRight:Hide()
CharacterModelFrame.backgroundOverlay:Hide()
end
end
function module:UpdateInspectModelFrame()
if not module.Initialized or not InspectModelFrame then return end
if E.db.enhanced.character.inspectBackground then
if not InspectModelFrame.backdrop then
InspectModelFrame:CreateBackdrop("Default")
InspectModelFrame.backdrop:SetAllPoints(InspectModelFrame)
InspectModelFrame.textureTopLeft = InspectModelFrame:CreateTexture("$parentTextureTopLeft", "BACKGROUND")
InspectModelFrame.textureTopLeft:Point("TOPLEFT", 1, -1)
InspectModelFrame.textureTopLeft:Size(216, 246)
-- texWidth, texHeight, cropWidth, cropHeight, offsetX, offsetY = 256, 256, 216, 248, 40, 8
InspectModelFrame.textureTopLeft:SetTexCoord(0.15625, 1, 0.03125, 1)
InspectModelFrame.textureTopRight = InspectModelFrame:CreateTexture("$parentTextureTopRight", "BACKGROUND")
InspectModelFrame.textureTopRight:Point("TOPLEFT", InspectModelFrame.textureTopLeft, "TOPRIGHT")
InspectModelFrame.textureTopRight:Size(19, 246)
-- texWidth, texHeight, cropWidth, cropHeight, offsetX, offsetY = 64, 256, 19, 248, 0, 8
InspectModelFrame.textureTopRight:SetTexCoord(0, 0.296875, 0.03125, 1)
InspectModelFrame.textureBotLeft = InspectModelFrame:CreateTexture("$parentTextureBotLeft", "BACKGROUND")
InspectModelFrame.textureBotLeft:Point("TOPLEFT", InspectModelFrame.textureTopLeft, "BOTTOMLEFT")
InspectModelFrame.textureBotLeft:Size(216, 76)
-- texWidth, texHeight, cropWidth, cropHeight, offsetX, offsetY = 256, 128, 216, 76, 40, 0
InspectModelFrame.textureBotLeft:SetTexCoord(0.15625, 1, 0, 0.59375)
InspectModelFrame.textureBotRight = InspectModelFrame:CreateTexture("$parentTextureBotRight", "BACKGROUND")
InspectModelFrame.textureBotRight:Point("TOPLEFT", InspectModelFrame.textureTopLeft, "BOTTOMRIGHT")
InspectModelFrame.textureBotRight:Size(19, 76)
-- texWidth, texHeight, cropWidth, cropHeight, offsetX, offsetY = 64, 128, 19, 76, 0, 0
InspectModelFrame.textureBotRight:SetTexCoord(0, 0.296875, 0, 0.59375)
InspectModelFrame.backgroundOverlay = InspectModelFrame:CreateTexture("$parentBackgroundOverlay", "BORDER")
InspectModelFrame.backgroundOverlay:SetInside(InspectModelFrame.backdrop)
InspectModelFrame.backgroundOverlay:SetTexture(0, 0, 0)
else
InspectModelFrame.backdrop:Show()
end
local _, raceEng = UnitRace(InspectFrame.unit)
raceEng = lower(raceEng)
local desaturate = E.db.enhanced.character.desaturateInspect and true or false
InspectModelFrame.textureTopLeft:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\"..raceEng.."_1.blp")
InspectModelFrame.textureTopLeft:SetDesaturated(desaturate)
InspectModelFrame.textureTopLeft:Show()
InspectModelFrame.textureTopRight:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\"..raceEng.."_2.blp")
InspectModelFrame.textureTopRight:SetDesaturated(desaturate)
InspectModelFrame.textureTopRight:Show()
InspectModelFrame.textureBotLeft:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\"..raceEng.."_3.blp")
InspectModelFrame.textureBotLeft:SetDesaturated(desaturate)
InspectModelFrame.textureBotLeft:Show()
InspectModelFrame.textureBotRight:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\"..raceEng.."_4.blp")
InspectModelFrame.textureBotRight:SetDesaturated(desaturate)
InspectModelFrame.textureBotRight:Show()
InspectModelFrame.backgroundOverlay:Show()
if raceEng == "scourge" then
InspectModelFrame.backgroundOverlay:SetAlpha(0.2)
elseif raceEng == "bloodelf" or raceEng == "nightelf" then
InspectModelFrame.backgroundOverlay:SetAlpha(0.7)
elseif raceEng == "troll" or raceEng == "orc" then
InspectModelFrame.backgroundOverlay:SetAlpha(0.5)
else
InspectModelFrame.backgroundOverlay:SetAlpha(0.6)
end
elseif InspectModelFrame.textureTopLeft then
InspectModelFrame.backdrop:Hide()
InspectModelFrame.textureTopLeft:Hide()
InspectModelFrame.textureTopRight:Hide()
InspectModelFrame.textureBotLeft:Hide()
InspectModelFrame.textureBotRight:Hide()
InspectModelFrame.backgroundOverlay:Hide()
end
end
function module:UpdatePetModelFrame()
if not module.Initialized then return end
if E.db.enhanced.character.petBackground then
if not PetModelFrame.backdrop then
PetModelFrame:CreateBackdrop("Default")
PetModelFrame.backdrop:SetAllPoints(PetModelFrame)
PetModelFrame.petPaperDollPetModelBg = PetModelFrame:CreateTexture("$parentPetPaperDollPetModelBg", "BACKGROUND")
PetModelFrame.petPaperDollPetModelBg:SetInside(PetModelFrame.backdrop)
PetModelFrame.petPaperDollPetModelBg:SetTexCoord(0.00390625, 0.623046875, 0.00390625, 0.689453125)
PetModelFrame.backgroundOverlay = PetModelFrame:CreateTexture("$parentBackgroundOverlay", "BORDER")
PetModelFrame.backgroundOverlay:SetInside(PetModelFrame.backdrop)
PetModelFrame.backgroundOverlay:SetTexture(0, 0, 0)
else
PetModelFrame.backdrop:Show()
end
if E.myclass == "HUNTER" then
PetModelFrame.petPaperDollPetModelBg:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\petHunter.blp")
PetModelFrame.backgroundOverlay:SetAlpha(0.4)
elseif E.myclass == "WARLOCK" then
PetModelFrame.petPaperDollPetModelBg:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\petWarlock.blp")
PetModelFrame.backgroundOverlay:SetAlpha(0.2)
elseif E.myclass == "DEATHKNIGHT" then
PetModelFrame.petPaperDollPetModelBg:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\petDeathKnight.blp")
PetModelFrame.backgroundOverlay:SetAlpha(0.1)
else
PetModelFrame.petPaperDollPetModelBg:Hide()
end
PetModelFrame.petPaperDollPetModelBg:SetDesaturated(E.db.enhanced.character.desaturatePet and true or false)
PetModelFrame.petPaperDollPetModelBg:Show()
PetModelFrame.backgroundOverlay:Show()
elseif PetModelFrame.petPaperDollPetModelBg then
PetModelFrame.backdrop:Hide()
PetModelFrame.petPaperDollPetModelBg:Hide()
PetModelFrame.backgroundOverlay:Hide()
end
end
function module:UpdateCompanionModelFrame()
if not module.Initialized then return end
if E.db.enhanced.character.companionBackground then
if not CompanionModelFrame.backdrop then
CompanionModelFrame:CreateBackdrop("Default")
CompanionModelFrame.backdrop:SetAllPoints(CompanionModelFrame)
CompanionModelFrame.backgroundTex = CompanionModelFrame:CreateTexture("$parentBackgroundTex", "BACKGROUND")
CompanionModelFrame.backgroundTex:SetTexture("Interface\\AddOns\\ElvUI_Enhanced\\Media\\Textures\\backgrounds\\MountJournal-BG")
CompanionModelFrame.backgroundTex:SetInside(CompanionModelFrame.backdrop)
CompanionModelFrame.backgroundTex:SetTexCoord(0.00390625, 0.783203125, 0.0078125, 0.984375)
CompanionModelFrame.backgroundOverlay = CompanionModelFrame:CreateTexture("$parentBackgroundOverlay", "BORDER")
CompanionModelFrame.backgroundOverlay:SetInside(CompanionModelFrame.backdrop)
CompanionModelFrame.backgroundOverlay:SetTexture(0, 0, 0)
CompanionModelFrame.backgroundOverlay:SetAlpha(0.3)
else
CompanionModelFrame.backdrop:Show()
end
CompanionModelFrame.backgroundTex:SetDesaturated(E.db.enhanced.character.desaturateCompanion and true or false)
CompanionModelFrame.backgroundTex:Show()
CompanionModelFrame.backgroundOverlay:Show()
elseif CompanionModelFrame.backgroundTex then
CompanionModelFrame.backdrop:Hide()
CompanionModelFrame.backgroundTex:Hide()
CompanionModelFrame.backgroundOverlay:Hide()
end
end
local function SetScrollValue(self, value)
if self.scrollBar.anim:IsPlaying() then
self.scrollBar.anim:Stop()
end
self.scrollBar.anim.progress:SetChange(value)
self.scrollBar.anim:Play()
end
local function Animation_OnMouseWheel(self, delta, stepSize)
if not self.scrollBar:IsVisible() then return end
self.times = self.times + 1
if self.direction ~= delta then
self.direction = delta
self.times = 1
end
local minVal, maxVal = 0, self.range
stepSize = stepSize or self.stepSize or self.buttonHeight or self.scrollBar.scrollStep
if delta == 1 then
SetScrollValue(self, max(minVal, self.scrollBar:GetValue() - (stepSize * self.times)))
else
SetScrollValue(self, min(maxVal, self.scrollBar:GetValue() + (stepSize * self.times)))
end
end
local function CreateSmoothScrollAnimation(scrollBar, hybridScroll)
if not E.db.enhanced.character.animations then return end
local scrollFrame = scrollBar:GetParent()
scrollFrame.times = 0
scrollFrame.direction = -1
scrollBar.anim = CreateAnimationGroup(scrollBar)
scrollBar.anim.progress = scrollBar.anim:CreateAnimation("Progress")
scrollBar.anim.progress:SetSmoothing("Out")
scrollBar.anim.progress:SetDuration(0.5)
scrollBar.anim.progress:SetScript("OnPlay", function(self)
if (self:GetChange() >= self.Parent:GetParent().range) or (self:GetChange() <= 0) then
self.Parent:GetParent().times = self.Parent:GetParent().times - 1
end
end)
scrollBar.anim.progress:SetScript("OnFinished", function(self)
self.Parent:GetParent().times = 0
end)
scrollFrame:SetScript("OnMouseWheel", Animation_OnMouseWheel)
if not hybridScroll then
scrollFrame:HookScript("OnScrollRangeChanged", function(self)
self.range = select(2, self.scrollBar:GetMinMaxValues())
end)
end
end
function module:Initialize()
if not E.private.enhanced.character.enable then return end
self.skinEnabled = (E.private.skins.blizzard.enable and E.private.skins.blizzard.character) and true or false
if PersonalGearScore then
PersonalGearScore:Hide()
end
if GearScore2 then
GearScore2:Hide()
end
PlayerTitleFrame:Kill()
PlayerTitlePickerFrame:Kill()
CharacterAttributesFrame:Kill()
CharacterResistanceFrame:Kill()
GearManagerToggleButton:Kill()
SetCVar("equipmentManager", 1)
if self.skinEnabled then
AscensionCharacterFrame:Hide()
CharacterFrameCloseButton:Point("CENTER", CharacterFrame.backdrop, "TOPRIGHT", -12, -13)
CharacterFrame.backdrop:ClearAllPoints()
CharacterFrame.backdrop:Point("TOPLEFT", 11, -12)
CharacterFrame.backdrop:Size(341, 424)
S:SetUIPanelWindowInfo(CharacterFrame, "width")
S:SetBackdropHitRect(PaperDollFrame, CharacterFrame.backdrop)
S:SetBackdropHitRect(PetPaperDollFrame, CharacterFrame.backdrop)
S:SetBackdropHitRect(PetPaperDollFrameCompanionFrame, CharacterFrame.backdrop)
S:SetBackdropHitRect(PetPaperDollFramePetFrame, CharacterFrame.backdrop)
end
local function FixHybridScrollBarSkin(frame, h1, h2)
frame.scrollUp:Size(18)
frame.scrollDown:Size(18)
frame.scrollBar.thumbTexture:Size(18, 24)
frame.scrollBar.backdrop:Point("TOPLEFT", frame.scrollBar.Thumb, "TOPLEFT", 2, h1 or -5)
frame.scrollBar.backdrop:Point("BOTTOMRIGHT", frame.scrollBar.Thumb, "BOTTOMRIGHT", -2, h2 or 1)
end
local expandButton = CreateFrame("Button", "CharacterFrameExpandButton", CharacterFrame)
expandButton:Point("BOTTOMLEFT", CharacterFrame, 325, 85)
expandButton:SetFrameLevel(CharacterFrame:GetFrameLevel() + 5)
S:HandleNextPrevButton(expandButton)
expandButton:Size(19)
expandButton:SetScript("OnClick", function(self)
if CharacterFrame.Expanded then
E.private.enhanced.character.collapsed = true
module:CharacterFrame_Collapse()
PlaySound("igCharacterInfoClose")
else
E.private.enhanced.character.collapsed = false
module:CharacterFrame_Expand()
PlaySound("igCharacterInfoOpen")
end
if GameTooltip:GetOwner() == self then
self:GetScript("OnEnter")(self)
end
end)
expandButton:SetScript("OnEnter", function(self)
S.SetModifiedBackdrop(self)
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
if CharacterFrame.Expanded then
GameTooltip:SetText(self.collapseTooltip)
else
GameTooltip:SetText(self.expandTooltip)
end
end)
expandButton:SetScript("OnLeave", function(self)
S.SetOriginalBackdrop(self)
GameTooltip_Hide()
end)
do -- CharacterFrame
local sidebarTabs = CreateFrame("Frame", "PaperDollSidebarTabs", PaperDollFrame)
sidebarTabs:Hide()
sidebarTabs:Size(152, 35)
sidebarTabs:Point("BOTTOMRIGHT", CharacterFrame.backdrop, "TOPRIGHT", -29, -59)
local sidebarTabs4 = CreateFrame("Button", "PaperDollSidebarTab4", sidebarTabs)
sidebarTabs4:SetID(4)
sidebarTabs4:Point("BOTTOMRIGHT", 0, 0)
self:PaperDollSidebarTab(sidebarTabs4)
local sidebarTabs3 = CreateFrame("Button", "PaperDollSidebarTab3", sidebarTabs)
sidebarTabs3:SetID(3)
sidebarTabs3:Point("RIGHT", "PaperDollSidebarTab4", "LEFT", -5, 0)
self:PaperDollSidebarTab(sidebarTabs3)
local sidebarTabs2 = CreateFrame("Button", "PaperDollSidebarTab2", sidebarTabs)
sidebarTabs2:SetID(2)
sidebarTabs2:Point("RIGHT", "PaperDollSidebarTab3", "LEFT", -5, 0)
self:PaperDollSidebarTab(sidebarTabs2)
local sidebarTabs1 = CreateFrame("Button", "PaperDollSidebarTab1", sidebarTabs)
sidebarTabs1:SetID(1)
sidebarTabs1:Point("RIGHT", "PaperDollSidebarTab2", "LEFT", -5, 0)
self:PaperDollSidebarTab(sidebarTabs1)
sidebarTabs1:RegisterEvent("UNIT_PORTRAIT_UPDATE")
sidebarTabs1:RegisterEvent("PLAYER_ENTERING_WORLD")
local tcoords = PAPERDOLL_SIDEBARS[1].texCoords
sidebarTabs1.Icon:SetTexCoord(tcoords[1], tcoords[2], tcoords[3], tcoords[4])
sidebarTabs1:SetScript("OnEvent", function(self, event, unit)
if event == "UNIT_PORTRAIT_UPDATE" then
if not unit or unit == "player" then
SetPortraitTexture(self.Icon, "player")
end
elseif event == "PLAYER_ENTERING_WORLD" then
SetPortraitTexture(self.Icon, "player")
end
end)
--
-- Title Pane
--
local titlePane = CreateFrame("ScrollFrame", "PaperDollTitlesPane", PaperDollFrame, "HybridScrollFrameTemplate")
titlePane:Hide()
titlePane:Size(169, 350)
titlePane:Point("TOPRIGHT", CharacterFrame.backdrop, -29, -64)
titlePane.scrollBar = CreateFrame("Slider", "$parentScrollBar", titlePane, "HybridScrollBarTemplate")
titlePane.scrollBar:Point("TOPLEFT", titlePane, "TOPRIGHT", 2, -16)
titlePane.scrollBar:Point("BOTTOMLEFT", titlePane, "BOTTOMRIGHT", 2, 14)
S:HandleScrollBar(titlePane.scrollBar)
FixHybridScrollBarSkin(titlePane)
CreateSmoothScrollAnimation(titlePane.scrollBar, true)
titlePane:SetScript("OnShow", function(self)
module:PaperDollTitlesPane_Update()
end)
titlePane.scrollBar.Show = function(self)
titlePane:Width(169)
titlePane:Point("TOPRIGHT", CharacterFrame.backdrop, -29, -64)
for _, button in next, titlePane.buttons do
button:Width(169)
end
getmetatable(self).__index.Show(self)
end
titlePane.scrollBar.Hide = function(self)
titlePane:Width(190)
titlePane:Point("TOPRIGHT", CharacterFrame.backdrop, -8, -64)
for _, button in next, titlePane.buttons do
button:Width(190)
end
getmetatable(self).__index.Hide(self)
end
titlePane:SetFrameLevel(CharacterFrame:GetFrameLevel() + 1)
HybridScrollFrame_OnLoad(titlePane)
titlePane.update = self.PaperDollTitlesPane_UpdateScrollFrame
HybridScrollFrame_CreateButtons(PaperDollTitlesPane, "PlayerTitleButtonTemplate2", 2, -4)
local statsPane = CreateFrame("ScrollFrame", "CharacterStatsPane", CharacterFrame, "UIPanelScrollFrameTemplate")
statsPane:Hide()
statsPane:Size(169, 350)
statsPane:Point("TOPRIGHT", CharacterFrame.backdrop, -29, -64)
statsPane.Categories = {}
statsPane.scrollBar = CharacterStatsPaneScrollBar
CharacterStatsPaneScrollBar:Point("TOPLEFT", CharacterStatsPane, "TOPRIGHT", 4, -18)
CharacterStatsPaneScrollBar:Point("BOTTOMLEFT", CharacterStatsPane, "BOTTOMRIGHT", 4, 16)
S:HandleScrollBar(CharacterStatsPaneScrollBar)
CharacterStatsPaneScrollBar.scrollStep = 50
CharacterStatsPane.scrollBarHideable = 1
statsPane:SetScript("OnMouseWheel", function(self, value, scrollBar)
scrollBar = scrollBar or self.scrollBar
local scrollStep = scrollBar.scrollStep or scrollBar:GetHeight() / 2
if value > 0 then
scrollBar:SetValue(scrollBar:GetValue() - scrollStep)
else
scrollBar:SetValue(scrollBar:GetValue() + scrollStep)
end
end)
CharacterStatsPaneScrollBarScrollUpButton:SetScript("OnClick", function(self)
local parent = self:GetParent()
local scrollStep = parent.scrollStep or (parent:GetHeight() / 2)
parent:SetValue(parent:GetValue() - scrollStep)
PlaySound("UChatScrollButton")
end)
CharacterStatsPaneScrollBarScrollDownButton:SetScript("OnClick", function(self)
local parent = self:GetParent()
local scrollStep = parent.scrollStep or (parent:GetHeight() / 2)
parent:SetValue(parent:GetValue() + scrollStep)
PlaySound("UChatScrollButton")
end)
CreateSmoothScrollAnimation(CharacterStatsPaneScrollBar)
--
-- Stats Pane
--
local statsPaneScrollChild = CreateFrame("Frame", "CharacterStatsPaneScrollChild", statsPane)
statsPaneScrollChild:Size(169, 0)
statsPaneScrollChild:Point("TOPLEFT")
for i = 1, 12 do
local button = CreateFrame("Frame", "CharacterStatsPaneCategory"..i, statsPaneScrollChild)
button:Size(169, 0)
button.Toolbar = CreateFrame("Button", nil, button)
button.Toolbar:RegisterForDrag("LeftButton")
button.Toolbar:Size(150, 18)
button.Toolbar:Point("TOP")
button.Toolbar:SetTemplate("Default", true)
button.Toolbar:HookScript("OnEnter", S.SetModifiedBackdrop)
button.Toolbar:HookScript("OnLeave", S.SetOriginalBackdrop)
button.Toolbar:SetScript("OnClick", function(self)
if self:GetParent().collapsed then
PaperDollFrame_ExpandStatCategory(self:GetParent())
CharacterStatsPane.collapsedData[self:GetParent().Category] = false
else
PaperDollFrame_CollapseStatCategory(self:GetParent())
CharacterStatsPane.collapsedData[self:GetParent().Category] = true
end
end)
button.Toolbar:SetScript("OnDragStart", function(self)
PaperDollStatCategory_OnDragStart(self:GetParent())
end)
button.Toolbar:SetScript("OnDragStop", function(self)
PaperDollStatCategory_OnDragStop(self:GetParent())
end)
button.NameText = button.Toolbar:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
button.NameText:Point("CENTER")
button.Stats = {}
button.Stats[1] = CreateFrame("Frame", "$parentStat1", button, "CharacterStatFrameTemplate")
button.Stats[1]:Point("TOPLEFT", 0, -23)
button.Stats[1]:Point("RIGHT", -4, 0)
statsPane.Categories[i] = button
end
statsPane:SetScrollChild(statsPaneScrollChild)
CharacterStatsPaneScrollBar.Show = function(self)
statsPane:Width(169)
statsPane:Point("TOPRIGHT", CharacterFrame.backdrop, -29, -64)
for _, button in next, statsPane.Categories do
button:Width(169)
button.Toolbar:Width(132)
end
getmetatable(self).__index.Show(self)
end
CharacterStatsPaneScrollBar.Hide = function(self)
statsPane:Width(190)
statsPane:Point("TOPRIGHT", CharacterFrame.backdrop, -8, -64)
for _, button in next, statsPane.Categories do
button:Width(190)
button.Toolbar:Width(150)
end
getmetatable(self).__index.Hide(self)
end
--
-- Equipment Manager Pane
--
local equipmentManagerPane = CreateFrame("ScrollFrame", "PaperDollEquipmentManagerPane", PaperDollFrame, "HybridScrollFrameTemplate")
equipmentManagerPane:Hide()
equipmentManagerPane:Size(169, 350)
equipmentManagerPane:Point("TOPRIGHT", CharacterFrame.backdrop, -29, -64)
equipmentManagerPane.EquipSet = CreateFrame("Button", "$parentEquipSet", equipmentManagerPane, "UIPanelButtonTemplate")
equipmentManagerPane.EquipSet:SetText(EQUIPSET_EQUIP)
equipmentManagerPane.EquipSet:Size(78, 22)
equipmentManagerPane.EquipSet:Point("TOPLEFT")
S:HandleButton(equipmentManagerPane.EquipSet)
equipmentManagerPane.EquipSet:SetScript("OnClick", function()
local selectedSetName = PaperDollEquipmentManagerPane.selectedSetName
if selectedSetName and selectedSetName ~= "" then
PlaySound("igCharacterInfoTab")
EquipmentManager_EquipSet(selectedSetName)
end
end)
equipmentManagerPane.SaveSet = CreateFrame("Button", "$parentSaveSet", equipmentManagerPane, "UIPanelButtonTemplate")
equipmentManagerPane.SaveSet:SetText(SAVE)
equipmentManagerPane.SaveSet:Size(78, 22)
equipmentManagerPane.SaveSet:Point("LEFT", "$parentEquipSet", "RIGHT", 3, 0)
S:HandleButton(equipmentManagerPane.SaveSet)
equipmentManagerPane.SaveSet:SetScript("OnClick", GearManagerDialogSaveSet_OnClick)
equipmentManagerPane.SendToBank = CreateFrame("CheckButton", "$parentSendToBank", equipmentManagerPane, "OptionsCheckButtonTemplate")
equipmentManagerPane.SendToBank:Size(28, 28)
equipmentManagerPane.SendToBank:Point("LEFT", "$parentSaveSet", "RIGHT", 12, 0)
S:HandleCheckBox(equipmentManagerPane.SendToBank)
equipmentManagerPane.SendToBank.Icon = equipmentManagerPane.SendToBank:CreateTexture(nil, "OVERLAY")
equipmentManagerPane.SendToBank.Icon:SetPoint("RIGHT", equipmentManagerPane.SendToBank, "LEFT", 2, 0)
equipmentManagerPane.SendToBank.Icon:SetSize(14, 14)
equipmentManagerPane.SendToBank.Icon:SetTexture("Interface\\GossipFrame\\BankerGossipIcon")
local cvar = C_CVar.GetBool("bankEquipmentManager")
equipmentManagerPane.SendToBank:SetChecked(cvar)
C_EquipmentSet.SetDstBank(cvar)
equipmentManagerPane.SendToBank:SetScript("OnClick", GearManagerDialogSendItemsToBank_OnClick)
equipmentManagerPane.SendToBank:SetScript("OnEnter", function(self)
GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT")
GameTooltip:SetText(EQUIPMENT_MANAGER_STORE_SETS_IN_BANK, 1, 1, 1, 1)
GameTooltip:AddLine(EQUIPMENT_MANAGER_STORE_SETS_IN_BANK_TOOLTIP, 1, 0.82, 0, true)
GameTooltip:Show()
end)
equipmentManagerPane.SendToBank:SetScript("OnLeave", GameTooltip_Hide)
equipmentManagerPane.scrollBar = CreateFrame("Slider", "$parentScrollBar", equipmentManagerPane, "HybridScrollBarTemplate")
equipmentManagerPane.scrollBar:Point("TOPLEFT", equipmentManagerPane, "TOPRIGHT", 2, -16)
equipmentManagerPane.scrollBar:Point("BOTTOMLEFT", equipmentManagerPane, "BOTTOMRIGHT", 2, 14)
S:HandleScrollBar(equipmentManagerPane.scrollBar)
FixHybridScrollBarSkin(equipmentManagerPane)
CreateSmoothScrollAnimation(equipmentManagerPane.scrollBar, true)
equipmentManagerPane.scrollBar.Show = function(self)
equipmentManagerPane.EquipSet:Width(64)
equipmentManagerPane.SaveSet:Width(64)
equipmentManagerPane:Width(169)
equipmentManagerPane:Point("TOPRIGHT", CharacterFrame.backdrop, -29, -64)
for _, button in next, equipmentManagerPane.buttons do
button:Width(169)
end
getmetatable(self).__index.Show(self)
end
equipmentManagerPane.scrollBar.Hide = function(self)
equipmentManagerPane.EquipSet:Width(76)
equipmentManagerPane.SaveSet:Width(76)
equipmentManagerPane:Width(190)
equipmentManagerPane:Point("TOPRIGHT", CharacterFrame.backdrop, -8, -64)
for _, button in next, equipmentManagerPane.buttons do
button:Width(190)
end
getmetatable(self).__index.Hide(self)
end
equipmentManagerPane:SetFrameLevel(CharacterFrame:GetFrameLevel() + 1)
equipmentManagerPane.EquipSet:SetFrameLevel(equipmentManagerPane:GetFrameLevel() + 3)
equipmentManagerPane.SaveSet:SetFrameLevel(equipmentManagerPane:GetFrameLevel() + 3)
HybridScrollFrame_OnLoad(equipmentManagerPane)
equipmentManagerPane.update = self.PaperDollEquipmentManagerPane_Update
HybridScrollFrame_CreateButtons(equipmentManagerPane, "GearSetButtonTemplate2", 2, -(equipmentManagerPane.EquipSet:GetHeight() + 4))
equipmentManagerPane:RegisterEvent("EQUIPMENT_SWAP_FINISHED")
equipmentManagerPane:RegisterEvent("EQUIPMENT_SETS_CHANGED")
equipmentManagerPane:RegisterEvent("PLAYER_EQUIPMENT_CHANGED")
equipmentManagerPane:RegisterEvent("BAG_UPDATE")
equipmentManagerPane:SetScript("OnShow", function(self)
module:PaperDollEquipmentManagerPane_Update()
PaperDollFrameItemPopoutButton_ShowAll()
end)
equipmentManagerPane:SetScript("OnHide", function()
PaperDollFrame_ClearIgnoredSlots()
PaperDollFrameItemPopoutButton_HideAll()
GearManagerDialogPopup:Hide()
StaticPopup_Hide("CONFIRM_SAVE_EQUIPMENT_SET")
StaticPopup_Hide("CONFIRM_OVERWRITE_EQUIPMENT_SET")
end)
equipmentManagerPane:SetScript("OnEvent", function(self, event, ...)
if event == "EQUIPMENT_SWAP_FINISHED" then
local completed, setName = ...
if completed then
if self:IsShown() then
self.selectedSetName = setName
module:PaperDollEquipmentManagerPane_Update()
end
end
end
if self:IsShown() then
if event == "EQUIPMENT_SETS_CHANGED" then
module:PaperDollEquipmentManagerPane_Update()
elseif event == "PLAYER_EQUIPMENT_CHANGED" or event == "BAG_UPDATE" then
self.queuedUpdate = true
end
end
end)
equipmentManagerPane:SetScript("OnUpdate", function(self)
for i = 1, #self.buttons do
local button = self.buttons[i]
if button:IsMouseOver() then
if button.name then
button.DeleteButton:Show()
button.EditButton:Show()
else
button.DeleteButton:Hide()
button.EditButton:Hide()
end
button.HighlightBar:Show()
else
button.DeleteButton:Hide()
button.EditButton:Hide()
button.HighlightBar:Hide()
end
end
if self.queuedUpdate then
module:PaperDollEquipmentManagerPane_Update()
self.queuedUpdate = false
end
end)
GearManagerDialogPopup:SetParent(PaperDollFrame)
GearManagerDialogPopup:ClearAllPoints()
GearManagerDialogPopup:Point("BOTTOMLEFT", CharacterFrame.backdrop, "BOTTOMRIGHT", -6, -8)
--
-- Mystic Enchants Pane
--
local mysticEnchantPane = CreateFrame("ScrollFrame", "PaperDollMysticEnchantPane", PaperDollFrame, "HybridScrollFrameTemplate")
mysticEnchantPane:Hide()
mysticEnchantPane:Size(169, 350)
mysticEnchantPane.scrollBar = CreateFrame("Slider", "$parentScrollBar", mysticEnchantPane, "HybridScrollBarTemplate")
mysticEnchantPane.scrollBar:Point("TOPLEFT", mysticEnchantPane, "TOPRIGHT", 2, -16)
mysticEnchantPane.scrollBar:Point("BOTTOMLEFT", mysticEnchantPane, "BOTTOMRIGHT", 2, 14)
S:HandleScrollBar(mysticEnchantPane.scrollBar)
FixHybridScrollBarSkin(mysticEnchantPane)
CreateSmoothScrollAnimation(mysticEnchantPane.scrollBar, true)
mysticEnchantPane:SetScript("OnShow", function(self)
module:MysticEnchantPane_Update()
end)
mysticEnchantPane.scrollBar.Show = function(self)
mysticEnchantPane:Width(169)
mysticEnchantPane:Point("TOPRIGHT", CharacterFrame.backdrop, -29, -64)
for _, button in next, mysticEnchantPane.buttons do
button:Width(169)
end
getmetatable(self).__index.Show(self)
end
mysticEnchantPane.scrollBar.Hide = function(self)
mysticEnchantPane:Width(190)
mysticEnchantPane:Point("TOPRIGHT", CharacterFrame.backdrop, -8, -64)
for _, button in next, mysticEnchantPane.buttons do
button:Width(190)
end
getmetatable(self).__index.Hide(self)
end
mysticEnchantPane:SetFrameLevel(CharacterFrame:GetFrameLevel() + 1)
HybridScrollFrame_OnLoad(mysticEnchantPane)
mysticEnchantPane.update = self.MysticEnchantPane_Update
HybridScrollFrame_CreateButtons(PaperDollMysticEnchantPane, "MysticEnchantButtonTemplate2", 2, -4)
CharacterModelFrame:Size(237, 324)
if not E.private.enhanced.character.player.orderName2 then
E.private.enhanced.character.player.orderName2 = E.private.enhanced.character.player.orderName
E.private.enhanced.character.player.collapsedName2 = table.copy(E.private.enhanced.character.player.collapsedName)
end
if C_Player:IsDefaultClass() then
-- default class has no primary stat
PAPERDOLL_STATCATEGORIES["PRIMARY_STAT"] = nil
PAPERDOLL_STATINFO["PRIMARY_STAT"] = nil
table.RemoveItem(PAPERDOLL_STATCATEGORY_DEFAULTORDER, "PRIMARY_STAT")
end
local activeSpec = GetActiveTalentGroup()
if activeSpec == 1 then
self:PaperDoll_InitStatCategories(PAPERDOLL_STATCATEGORY_DEFAULTORDER, E.private.enhanced.character.player.orderName, E.private.enhanced.character.player.collapsedName, "player")
else
self:PaperDoll_InitStatCategories(PAPERDOLL_STATCATEGORY_DEFAULTORDER, E.private.enhanced.character.player.orderName2, E.private.enhanced.character.player.collapsedName2, "player")
end
PaperDollFrame:RegisterEvent("PLAYER_TALENT_UPDATE")
PaperDollFrame:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED")
PaperDollFrame:SetScript("OnEvent", function(self, event, unit)
if event == "PLAYER_ENTERING_WORLD" or (event == "UNIT_MODEL_CHANGED" and unit == "player") then
CharacterModelFrame:SetUnit("player")
return
elseif event == "KNOWN_TITLES_UPDATE" or (event == "UNIT_NAME_UPDATE" and unit == "player") then
if PaperDollTitlesPane:IsShown() then
module:PaperDollTitlesPane_Update()
end
end
if not self:IsVisible() then return end
if unit == "player" then
if event == "UNIT_LEVEL" then
module:PaperDollFrame_SetLevel()
elseif event == "UNIT_DAMAGE" or event == "PLAYER_DAMAGE_DONE_MODS" or event == "UNIT_ATTACK_SPEED" or event == "UNIT_RANGEDDAMAGE" or event == "UNIT_ATTACK" or event == "UNIT_STATS" or event == "UNIT_RANGED_ATTACK_POWER" or event == "UNIT_RESISTANCES" then
self:SetScript("OnUpdate", PaperDollFrame_QueuedUpdate)
end
end
if event == "COMBAT_RATING_UPDATE" then
self:SetScript("OnUpdate", PaperDollFrame_QueuedUpdate)
elseif event == "PLAYER_TALENT_UPDATE" then
module:PaperDollFrame_SetLevel()
elseif event == "ACTIVE_TALENT_GROUP_CHANGED" then
if GetActiveTalentGroup() == 1 then
module:PaperDoll_InitStatCategories(PAPERDOLL_STATCATEGORY_DEFAULTORDER, E.private.enhanced.character.player.orderName, E.private.enhanced.character.player.collapsedName, "player")
else
module:PaperDoll_InitStatCategories(PAPERDOLL_STATCATEGORY_DEFAULTORDER, E.private.enhanced.character.player.orderName2, E.private.enhanced.character.player.collapsedName2, "player")
end
end
end)
PaperDollFrame:SetScript("OnShow", function()
module:PaperDollFrame_SetLevel()
-- Include Hit Rating Adjustments
C_Cache:QueryAllStats()
if UnitHasRelicSlot("player") then
CharacterAmmoSlot:Hide()
else
CharacterAmmoSlot:Show()
end
if PaperDollFrame.currentSideBarID == 2 then
module:PaperDollTitlesPane_Update()
end
if GetActiveTalentGroup() == 1 then
module:PaperDoll_InitStatCategories(PAPERDOLL_STATCATEGORY_DEFAULTORDER, E.private.enhanced.character.player.orderName, E.private.enhanced.character.player.collapsedName, "player")
else
module:PaperDoll_InitStatCategories(PAPERDOLL_STATCATEGORY_DEFAULTORDER, E.private.enhanced.character.player.orderName2, E.private.enhanced.character.player.collapsedName2, "player")
end
if E.private.enhanced.character.collapsed then
module:CharacterFrame_Collapse()
else
module:CharacterFrame_Expand()
end
CharacterFrameExpandButton:Show()
CharacterFrameExpandButton.collapseTooltip = L["Hide Character Information"]
CharacterFrameExpandButton.expandTooltip = L["Show Character Information"]
end)
PaperDollFrame:SetScript("OnHide", function(self)
module:CharacterFrame_Collapse()
CharacterFrameExpandButton:Hide()
if MOVING_STAT_CATEGORY then
PaperDollStatCategory_OnDragStop(MOVING_STAT_CATEGORY)
end
end)
hooksecurefunc("PaperDollFrame_UpdateStats", function() module:PaperDollFrame_UpdateStats() end)
end
do -- PetFrame
PetNameText:ClearAllPoints()
PetNameText:Point("CENTER", CharacterFrame.backdrop, 0, 200)
PetLevelText:ClearAllPoints()
PetLevelText:Point("TOP", CharacterFrame.backdrop, 0, -20)
PetPaperDollCloseButton:Kill()
PetAttributesFrame:Kill()
PetResistanceFrame:Kill()
PetModelFrame:Size(325, 324)
PetModelFrame:Point("TOPLEFT", 19, -76)
PetModelFrameRotateLeftButton:Point("TOPLEFT", PetPaperDollFrame, "TOPLEFT", 23, -80)
PetPaperDollFrameExpBar:Width(297)
PetPaperDollFrameExpBar:Point("BOTTOMLEFT", 20, 88)
self:PaperDoll_InitStatCategories(PETPAPERDOLL_STATCATEGORY_DEFAULTORDER, E.private.enhanced.character.pet.orderName, E.private.enhanced.character.pet.collapsedName, "pet")
PetPaperDollFrame:SetScript("OnEvent", function(self, event, unit)
if event == "PET_UI_UPDATE" or event == "PET_UI_CLOSE" or event == "PET_BAR_UPDATE"
or (event == "UNIT_PET" and unit == "player")
or (event == "UNIT_NAME_UPDATE" and unit == "pet") then
PetPaperDollFrame_UpdateTabs()
if self:IsVisible() then
self:SetScript("OnUpdate", PetPaperDollFrame_QueuedUpdate)
end
elseif event == "UNIT_PET_EXPERIENCE" then
PetExpBar_Update()
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
if PetPaperDollFrameCompanionFrame:IsVisible() then
module:PetPaperDollCompanionPane_Update()
end
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
if self:IsVisible() then
PetPaperDollFrame_UpdateTabs()
module:PetPaperDollCompanionPane_Update()
end
elseif event == "COMPANION_UNLEARNED" then
if self:IsVisible() then
PetPaperDollFrame_UpdateTabs()
module:PetPaperDollCompanionPane_Update()
end
elseif event == "SPELL_UPDATE_COOLDOWN" then
if PetPaperDollFrameCompanionFrame:IsVisible() then
PetPaperDollFrame_UpdateCompanionCooldowns()
end
elseif ((event == "UNIT_ENTERED_VEHICLE" or event == "UNIT_EXITED_VEHICLE") and unit == "player") then
module:PetPaperDollCompanionPane_Update()
elseif event == "PET_SPELL_POWER_UPDATE" then
if self:IsVisible() then
self:SetScript("OnUpdate", PetPaperDollFrame_QueuedUpdate)
end
elseif unit == "pet" then
if self:IsVisible() then
self:SetScript("OnUpdate", PetPaperDollFrame_QueuedUpdate)
end
end
end)
PetPaperDollFramePetFrame:HookScript("OnShow", function()
if E.private.enhanced.character.collapsed then
module:CharacterFrame_Collapse()
else
module:CharacterFrame_Expand()
end
CharacterFrameExpandButton:Show()
CharacterFrameExpandButton.collapseTooltip = L["Hide Pet Information"]
CharacterFrameExpandButton.expandTooltip = L["Show Pet Information"]
module:PaperDoll_InitStatCategories(PETPAPERDOLL_STATCATEGORY_DEFAULTORDER, E.private.enhanced.character.pet.orderName, E.private.enhanced.character.pet.collapsedName, "pet")
module:PaperDollFrame_UpdateStats()
end)
PetPaperDollFramePetFrame:HookScript("OnHide", function()
if PaperDollFrame:IsShown() then return end
module:CharacterFrame_Collapse()
CharacterFrameExpandButton:Hide()
end)
end
do -- CompanionFrame
CompanionModelFrame:Size(325, 352)
CompanionModelFrame:Point("TOPLEFT", 19, -76)
CompanionModelFrameRotateLeftButton:Point("TOPLEFT", PetPaperDollFrame, "TOPLEFT", 23, -80)
CompanionSelectedName:ClearAllPoints()
CompanionSelectedName:Point("BOTTOM", CompanionModelFrame, "BOTTOM", 0, 10)
CompanionSelectedName:SetParent(CompanionModelFrame)
CompanionSelectedName:SetTextColor(1, 1, 1)
CompanionPageNumber:Kill()
CompanionSummonButton:Kill()
for i = 1, 12 do
_G["CompanionButton"..i]:Kill()
_G["CompanionButton"..i].Disable = E.noop
_G["CompanionButton"..i].Enable = E.noop
end
CompanionPrevPageButton:Kill()
CompanionNextPageButton:Kill()
local companionPane = CreateFrame("ScrollFrame", "PetPaperDollCompanionPane", PetPaperDollFrameCompanionFrame, "HybridScrollFrameTemplate")
companionPane:Hide()
companionPane:Size(169, 350)
companionPane:Point("TOPRIGHT", CharacterFrame.backdrop, -29, -64)
companionPane.text = companionPane:CreateFontString(nil, "OVERLAY")
companionPane.text:Size(169, 20)
companionPane.text:Point("BOTTOM", PetPaperDollCompanionPane, "TOP", 0, 7)
companionPane.text:FontTemplate()
companionPane.scrollBar = CreateFrame("Slider", "$parentScrollBar", companionPane, "HybridScrollBarTemplate")
companionPane.scrollBar:Point("TOPLEFT", companionPane, "TOPRIGHT", 2, -16)
companionPane.scrollBar:Point("BOTTOMLEFT", companionPane, "BOTTOMRIGHT", 2, 14)
S:HandleScrollBar(companionPane.scrollBar)
FixHybridScrollBarSkin(companionPane)
CreateSmoothScrollAnimation(companionPane.scrollBar, true)
companionPane.scrollBar.Show = function(self)
companionPane:Width(169)
companionPane:Point("TOPRIGHT", CharacterFrame.backdrop, -29, -64)
for _, button in next, companionPane.buttons do
button:Width(169)
end
getmetatable(self).__index.Show(self)
end
companionPane.scrollBar.Hide = function(self)
companionPane:Width(190)
companionPane:Point("TOPRIGHT", CharacterFrame.backdrop, -8, -64)
for _, button in next, companionPane.buttons do
button:Width(190)
end
getmetatable(self).__index.Hide(self)
end
companionPane.update = self.PetPaperDollCompanionPane_Update
HybridScrollFrame_CreateButtons(companionPane, "CompanionButtonTemplate2", 2)
PetPaperDollFrameCompanionFrame:HookScript("OnShow", function(self)
if not CharacterFrame.Expanded then
module:CharacterFrame_Expand(true)
end
module:PetPaperDollCompanionPane_Update()
end)
PetPaperDollFrameCompanionFrame:HookScript("OnHide", function(self)
if PaperDollFrame:IsShown() or PetPaperDollFramePetFrame:IsShown() then return end
module:CharacterFrame_Collapse(true)
end)
end
hooksecurefunc("PetPaperDollFrame_SetTab", function(id)
if id == 1 and HasPetUI() then
PetPaperDollCompanionPane:Hide()
elseif (id == 2 and GetNumCompanions("CRITTER") > 0)
or (id == 3 and GetNumCompanions("MOUNT") > 0)
then
PetPaperDollCompanionPane:Show()
module:PetPaperDollCompanionPane_Update()
end
end)
self.Initialized = true
self:UpdateCharacterModelFrame()
self:UpdatePetModelFrame()
self:UpdateCompanionModelFrame()
self:RegisterEvent("ADDON_LOADED", function(event, addon)
if addon == "Blizzard_InspectUI" then
module:UnregisterEvent(event)
module:SecureHook("InspectFrame_UpdateTalentTab", "UpdateInspectModelFrame")
end
end)
end
local function InitializeCallback()
module:Initialize()
end
E:RegisterModule(module:GetName(), InitializeCallback)