mirror of
https://github.com/parnic/ice-hud.git
synced 2025-06-16 06:40:13 -05:00
Apparently we don't have to do any of this anymore (and might not have had to do it for a long time, but I missed the memo) so if we can, just use the built-in menuing stuff. Setting focus doesn't trigger taint with this.
1562 lines
48 KiB
Lua
1562 lines
48 KiB
Lua
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
|
local PlayerHealth = IceCore_CreateClass(IceUnitBar)
|
|
|
|
local IceHUD = _G.IceHUD
|
|
|
|
PlayerHealth.prototype.resting = nil
|
|
PlayerHealth.prototype.pendingBlizzardPartyHide = false
|
|
PlayerHealth.prototype.absorbAmount = 0
|
|
|
|
local configMode = false
|
|
local HealComm
|
|
local incomingHealAmt = 0
|
|
local groupEvent = IceHUD.EventExistsGroupRosterUpdate and "GROUP_ROSTER_UPDATE" or "PARTY_MEMBERS_CHANGED"
|
|
|
|
-- Constructor --
|
|
function PlayerHealth.prototype:init()
|
|
PlayerHealth.super.prototype.init(self, "PlayerHealth", "player")
|
|
|
|
self:SetDefaultColor("PlayerHealth", 37, 164, 30)
|
|
self:SetDefaultColor("PlayerHealthHealAmount", 37, 164, 30)
|
|
self:SetDefaultColor("PlayerHealthAbsorbAmount", 220, 220, 220)
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:GetDefaultSettings()
|
|
local settings = PlayerHealth.super.prototype.GetDefaultSettings(self)
|
|
|
|
settings["side"] = IceCore.Side.Left
|
|
settings["offset"] = 1
|
|
settings["hideBlizz"] = false
|
|
settings["hideBlizzParty"] = false
|
|
settings["upperText"] = "[PercentHP:Round]"
|
|
settings["lowerText"] = "[FractionalHP:Short:HPColor:Bracket]"
|
|
settings["allowMouseInteraction"] = false
|
|
settings["allowMouseInteractionCombat"] = false
|
|
settings["healAlpha"] = 0.6
|
|
settings["absorbAlpha"] = 0.6
|
|
settings["lockIconAlpha"] = false
|
|
settings["showIncomingHeals"] = true
|
|
settings["showAbsorbs"] = true
|
|
|
|
settings["showStatusIcon"] = true
|
|
settings["statusIconOffset"] = {x=110, y=0}
|
|
settings["statusIconScale"] = 1
|
|
settings["showStatusCombat"] = true
|
|
settings["showStatusResting"] = true
|
|
|
|
settings["showLeaderIcon"] = true
|
|
settings["leaderIconOffset"] = {x=135, y=15}
|
|
settings["leaderIconScale"] = 0.9
|
|
|
|
settings["showLootMasterIcon"] = true
|
|
settings["lootMasterIconOffset"] = {x=100, y=-20}
|
|
settings["lootMasterIconScale"] = 0.9
|
|
|
|
settings["showPvPIcon"] = true
|
|
settings["PvPIconOffset"] = {x=95, y=-40}
|
|
settings["PvPIconScale"] = 0.9
|
|
|
|
settings["showPartyRoleIcon"] = true
|
|
settings["PartyRoleIconOffset"] = {x=90, y=-59}
|
|
settings["PartyRoleIconScale"] = 0.9
|
|
|
|
return settings
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:Enable(core)
|
|
PlayerHealth.super.prototype.Enable(self, core)
|
|
|
|
self:RegisterEvent("UNIT_HEALTH", "UpdateEvent")
|
|
if IceHUD.EventExistsUnitHealthFrequent then
|
|
self:RegisterEvent("UNIT_HEALTH_FREQUENT", "UpdateEvent")
|
|
end
|
|
self:RegisterEvent("UNIT_MAXHEALTH", "UpdateEvent")
|
|
|
|
self:RegisterEvent("PLAYER_ENTERING_WORLD", "EnteringWorld")
|
|
|
|
self:RegisterEvent("PLAYER_UPDATE_RESTING", "Resting")
|
|
|
|
self:RegisterEvent("PLAYER_REGEN_ENABLED", "CheckCombat")
|
|
self:RegisterEvent("PLAYER_REGEN_DISABLED", "CheckCombat")
|
|
|
|
self:RegisterEvent("PARTY_LEADER_CHANGED", "CheckLeader")
|
|
self:RegisterEvent(groupEvent, "CheckLeader")
|
|
if GetLFGProposal then
|
|
self:RegisterEvent("LFG_PROPOSAL_UPDATE", "CheckPartyRole")
|
|
self:RegisterEvent("LFG_PROPOSAL_FAILED", "CheckPartyRole")
|
|
self:RegisterEvent("LFG_ROLE_UPDATE", "CheckPartyRole")
|
|
end
|
|
|
|
--self:RegisterEvent("PARTY_MEMBERS_CHANGED", "CheckPartyFrameStatus")
|
|
|
|
self:RegisterEvent("PARTY_LOOT_METHOD_CHANGED", "CheckLootMaster")
|
|
|
|
self:RegisterEvent("UPDATE_FACTION", "CheckPvP")
|
|
self:RegisterEvent("PLAYER_FLAGS_CHANGED", "CheckPvP")
|
|
self:RegisterEvent("UNIT_FACTION", "CheckPvP")
|
|
|
|
if UnitHasVehicleUI then
|
|
self:RegisterEvent("UNIT_ENTERED_VEHICLE", "EnteringVehicle")
|
|
self:RegisterEvent("UNIT_EXITED_VEHICLE", "ExitingVehicle")
|
|
end
|
|
|
|
if not IceHUD.SupportsHealPrediction then
|
|
HealComm = LibStub("LibHealComm-4.0", true)
|
|
if HealComm then
|
|
HealComm.RegisterCallback(self, "HealComm_HealStarted", function(event, casterGUID, spellID, spellType, endTime, ...) self:HealComm_HealEvent(event, casterGUID, spellID, spellType, endTime, ...) end)
|
|
HealComm.RegisterCallback(self, "HealComm_HealUpdated", function(event, casterGUID, spellID, spellType, endTime, ...) self:HealComm_HealEvent(event, casterGUID, spellID, spellType, endTime, ...) end)
|
|
HealComm.RegisterCallback(self, "HealComm_HealDelayed", function(event, casterGUID, spellID, spellType, endTime, ...) self:HealComm_HealEvent(event, casterGUID, spellID, spellType, endTime, ...) end)
|
|
HealComm.RegisterCallback(self, "HealComm_HealStopped", function(event, casterGUID, spellID, spellType, interrupted, ...) self:HealComm_HealEvent(event, casterGUID, spellID, spellType, interrupted, ...) end)
|
|
HealComm.RegisterCallback(self, "HealComm_ModifierChanged", function(event, guid) self:HealComm_ModifierChanged(event, guid) end)
|
|
end
|
|
else
|
|
self:RegisterEvent("UNIT_HEAL_PREDICTION", "IncomingHealPrediction")
|
|
end
|
|
|
|
if UnitGetTotalAbsorbs then
|
|
self:RegisterEvent("UNIT_ABSORB_AMOUNT_CHANGED", "UpdateAbsorbAmount")
|
|
end
|
|
|
|
if (self.moduleSettings.hideBlizz) then
|
|
self:HideBlizz()
|
|
end
|
|
|
|
if (self.moduleSettings.hideBlizzParty) then
|
|
self:HideBlizzardParty()
|
|
end
|
|
self:Resting()
|
|
--self:Update(self.unit)
|
|
end
|
|
|
|
function PlayerHealth.prototype:Disable(core)
|
|
PlayerHealth.super.prototype.Disable(self, core)
|
|
|
|
if self.moduleSettings.hideBlizz then
|
|
self:ShowBlizz()
|
|
end
|
|
end
|
|
|
|
function PlayerHealth.prototype:HealComm_HealEvent(event, casterGUID, spellID, spellType, endTime, ...)
|
|
local bFoundMe = false
|
|
for i=1, select("#", ...) do
|
|
if select(i, ...) == UnitGUID("player") then
|
|
bFoundMe = true
|
|
break
|
|
end
|
|
end
|
|
|
|
if not bFoundMe then
|
|
return
|
|
end
|
|
|
|
incomingHealAmt = HealComm:GetHealAmount(UnitGUID("player"), HealComm.ALL_HEALS)
|
|
if incomingHealAmt == nil then
|
|
incomingHealAmt = 0
|
|
end
|
|
self:Update()
|
|
end
|
|
|
|
function PlayerHealth.prototype:HealComm_ModifierChanged(event, guid)
|
|
if guid == UnitGUID("player") then
|
|
incomingHealAmt = incomingHealAmt * HealComm:GetHealModifier(guid)
|
|
self:Update()
|
|
end
|
|
end
|
|
|
|
function PlayerHealth.prototype:IncomingHealPrediction(event, unit)
|
|
if IceHUD.SupportsHealPrediction then
|
|
if unit and unit ~= self.unit then
|
|
return
|
|
end
|
|
|
|
incomingHealAmt = UnitGetIncomingHeals(self.unit)
|
|
self:Update()
|
|
end
|
|
end
|
|
|
|
function PlayerHealth.prototype:UpdateAbsorbAmount()
|
|
self.absorbAmount = UnitGetTotalAbsorbs(self.unit) or 0
|
|
self:Update()
|
|
end
|
|
|
|
|
|
-- OVERRIDE
|
|
function PlayerHealth.prototype:GetOptions()
|
|
local opts = PlayerHealth.super.prototype.GetOptions(self)
|
|
|
|
opts["classColor"] = {
|
|
type = "toggle",
|
|
name = L["Class color bar"],
|
|
desc = L["Use class color as the bar color instead of default color"],
|
|
get = function()
|
|
return self.moduleSettings.classColor
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.classColor = value
|
|
self:Update(self.unit)
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 40
|
|
}
|
|
|
|
opts["hideBlizz"] = {
|
|
type = "toggle",
|
|
name = L["Hide Blizzard Frame"],
|
|
desc = L["Hides Blizzard Player frame and disables all events related to it"],
|
|
get = function()
|
|
return self.moduleSettings.hideBlizz
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.hideBlizz = value
|
|
if (value) then
|
|
self:HideBlizz()
|
|
else
|
|
self:ShowBlizz()
|
|
end
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 41
|
|
}
|
|
|
|
opts["hideBlizzParty"] = {
|
|
type = "toggle",
|
|
name = L["Hide Blizzard Party"],
|
|
desc = L["Hides Blizzard's default party frame and disables all events related to them"],
|
|
get = function()
|
|
return self.moduleSettings.hideBlizzParty
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.hideBlizzParty = value
|
|
if (value) then
|
|
self:HideBlizzardParty()
|
|
else
|
|
self:ShowBlizzardParty()
|
|
end
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 41.1
|
|
}
|
|
|
|
opts["scaleHealthColor"] = {
|
|
type = "toggle",
|
|
name = L["Color bar by health %"],
|
|
desc = L["Colors the health bar from MaxHealthColor to MinHealthColor based on current health %"],
|
|
get = function()
|
|
return self.moduleSettings.scaleHealthColor
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.scaleHealthColor = value
|
|
self:Redraw()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 42
|
|
}
|
|
|
|
opts["allowClickTarget"] = {
|
|
type = 'toggle',
|
|
name = L["Allow click-targeting"],
|
|
desc = L["Whether or not to allow click targeting/casting and the player drop-down menu for this bar (Note: does not work properly with HiBar, have to click near the base of the bar)"],
|
|
get = function()
|
|
return self.moduleSettings.allowMouseInteraction
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.allowMouseInteraction = v
|
|
self:CreateBackground(true)
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 43
|
|
}
|
|
|
|
opts["allowClickTargetCombat"] = {
|
|
type = 'toggle',
|
|
name = L["Allow click-targeting in combat"],
|
|
desc = L["Whether or not to allow click targeting/casting and the player drop-down menu for this bar while the player is in combat (Note: does not work properly with HiBar, have to click near the base of the bar)"],
|
|
width = 'double',
|
|
get = function()
|
|
return self.moduleSettings.allowMouseInteractionCombat
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.allowMouseInteractionCombat = v
|
|
self:CreateBackground(true)
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.allowMouseInteraction
|
|
end,
|
|
order = 43.5
|
|
}
|
|
|
|
opts["showIncomingHeals"] =
|
|
{
|
|
type = 'toggle',
|
|
name = L["Show incoming heals"],
|
|
desc = L["Whether or not to show incoming heals as a lighter-colored bar on top of your current health (requires LibHealComm-4.0 or official patch 4.0)"],
|
|
get = function()
|
|
return self.moduleSettings.showIncomingHeals
|
|
end,
|
|
set = function(info, v)
|
|
if not v then
|
|
self.healFrame.bar:Hide()
|
|
else
|
|
self.healFrame.bar:Show()
|
|
end
|
|
|
|
self.moduleSettings.showIncomingHeals = v
|
|
|
|
incomingHealAmt = 0
|
|
self:Update()
|
|
end,
|
|
disabled = function()
|
|
return not (self.moduleSettings.enabled and (IceHUD.SupportsHealPrediction or HealComm))
|
|
end,
|
|
order = 43.6
|
|
}
|
|
|
|
opts["healAlpha"] =
|
|
{
|
|
type = "range",
|
|
name = L["Incoming heal bar alpha"],
|
|
desc = L["What alpha value to use for the bar that displays how much health you'll have after an incoming heal (This gets multiplied by the bar's current alpha to stay in line with the bar on top of it)"],
|
|
min = 0,
|
|
max = 100,
|
|
step = 5,
|
|
get = function()
|
|
return self.moduleSettings.healAlpha * 100
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.healAlpha = v / 100.0
|
|
self:Redraw()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showIncomingHeals
|
|
end,
|
|
order = 43.7
|
|
}
|
|
|
|
opts["showAbsorbs"] =
|
|
{
|
|
type = 'toggle',
|
|
name = L["Show absorbs"],
|
|
desc = L["Whether or not to show absorb amounts as a lighter-colored bar on top of your current health."],
|
|
get = function()
|
|
return self.moduleSettings.showAbsorbs
|
|
end,
|
|
set = function(info, v)
|
|
if not v then
|
|
self.absorbFrame.bar:Hide()
|
|
else
|
|
self.absorbFrame.bar:Show()
|
|
end
|
|
|
|
self.moduleSettings.showAbsorbs = v
|
|
|
|
self:Update()
|
|
end,
|
|
disabled = function()
|
|
return not (self.moduleSettings.enabled and UnitGetTotalAbsorbs)
|
|
end,
|
|
order = 43.8
|
|
}
|
|
|
|
opts["absorbAlpha"] =
|
|
{
|
|
type = "range",
|
|
name = L["Absorb bar alpha"],
|
|
desc = L["What alpha value to use for the bar that displays how much effective health you have including absorbs (This gets multiplied by the bar's current alpha to stay in line with the bar on top of it)"],
|
|
min = 0,
|
|
max = 100,
|
|
step = 5,
|
|
get = function()
|
|
return self.moduleSettings.absorbAlpha * 100
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.absorbAlpha = v / 100.0
|
|
self:Redraw()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showAbsorbs
|
|
end,
|
|
order = 43.9
|
|
}
|
|
|
|
opts["iconSettings"] =
|
|
{
|
|
type = 'group',
|
|
name = "|c"..self.configColor..L["Icon Settings"].."|r",
|
|
desc = L["Settings related to icons"],
|
|
args = {
|
|
iconConfigMode = {
|
|
type = "toggle",
|
|
name = L["Icon config mode"],
|
|
desc = L["With this enabled, all icons draw so you can configure their placement\n\nNote: the combat and status icons are actually the same texture so you'll only see combat in config mode (unless you're already resting)"],
|
|
get = function()
|
|
return configMode
|
|
end,
|
|
set = function(info, v)
|
|
configMode = v
|
|
self:EnteringWorld()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 5
|
|
},
|
|
|
|
lockIconAlpha = {
|
|
type = "toggle",
|
|
name = L["Lock all icons to 100% alpha"],
|
|
desc = L["With this enabled, all icons will be 100% visible regardless of the alpha settings for this bar."],
|
|
get = function()
|
|
return self.moduleSettings.lockIconAlpha
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.lockIconAlpha = v
|
|
self:Redraw()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 6
|
|
},
|
|
|
|
headerStatusIcon = {
|
|
type = 'header',
|
|
name = L["Status icon"],
|
|
order = 9.9
|
|
},
|
|
statusIcon = {
|
|
type = "toggle",
|
|
name = L["Show status icon"],
|
|
desc = L["Whether or not to show the status icon (resting/combat) above this bar\n\nNote: You can configure resting/combat separately below, but disabling both resting and combat is the same as disabling the icon altogether"],
|
|
get = function()
|
|
return self.moduleSettings.showStatusIcon
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.showStatusIcon = value
|
|
self:Resting()
|
|
self:CheckCombat()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 10
|
|
},
|
|
showStatusCombat = {
|
|
type = "toggle",
|
|
name = L["Show combat status"],
|
|
desc = L["Whether or not to show the combat status portion of the status icon (for example, if you only care when you're resting, not when you're in combat)"],
|
|
get = function()
|
|
return self.moduleSettings.showStatusCombat
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.showStatusCombat = value
|
|
self:Resting()
|
|
self:CheckCombat()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showStatusIcon
|
|
end,
|
|
order = 10.1
|
|
},
|
|
showStatusResting = {
|
|
type = "toggle",
|
|
name = L["Show resting status"],
|
|
desc = L["Whether or not to show the resting status portion of the status icon (for example, if you only care when you're in combat, but not when you're resting)"],
|
|
get = function()
|
|
return self.moduleSettings.showStatusResting
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.showStatusResting = value
|
|
self:Resting()
|
|
self:CheckCombat()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showStatusIcon
|
|
end,
|
|
order = 10.2
|
|
},
|
|
statusIconOffsetX = {
|
|
type = "range",
|
|
name = L["Status Icon Horizontal Offset"],
|
|
desc = L["How much to offset the status icon (resting/combat) from the bar horizontally"],
|
|
min = -700,
|
|
max = 900,
|
|
step = 1,
|
|
get = function()
|
|
return self.moduleSettings.statusIconOffset['x']
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.statusIconOffset['x'] = v
|
|
self:SetTexLoc(self.frame.statusIcon, self.moduleSettings.statusIconOffset['x'], self.moduleSettings.statusIconOffset['y'])
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showStatusIcon
|
|
end,
|
|
order = 11
|
|
},
|
|
statusIconOffsetY = {
|
|
type = "range",
|
|
name = L["Status Icon Vertical Offset"],
|
|
desc = L["How much to offset the status icon (resting/combat) from the bar vertically"],
|
|
min = -700,
|
|
max = 550,
|
|
step = 1,
|
|
get = function()
|
|
return self.moduleSettings.statusIconOffset['y']
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.statusIconOffset['y'] = v
|
|
self:SetTexLoc(self.frame.statusIcon, self.moduleSettings.statusIconOffset['x'], self.moduleSettings.statusIconOffset['y'])
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showStatusIcon
|
|
end,
|
|
order = 12
|
|
},
|
|
statusIconScale = {
|
|
type = "range",
|
|
name = L["Status Icon Scale"],
|
|
desc = L["How much to scale the status icon"],
|
|
min = 0.05,
|
|
max = 2,
|
|
step = 0.05,
|
|
get = function()
|
|
return self.moduleSettings.statusIconScale
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.statusIconScale = v
|
|
self:SetTexScale(self.frame.statusIcon, 20, 20, v)
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showStatusIcon
|
|
end,
|
|
order = 13
|
|
},
|
|
|
|
headerLeaderIcon = {
|
|
type = 'header',
|
|
name = L["Leader icon"],
|
|
order = 19.9
|
|
},
|
|
leaderIcon = {
|
|
type = "toggle",
|
|
name = L["Show leader icon"],
|
|
desc = L["Whether or not to show the party leader icon above this bar"],
|
|
get = function()
|
|
return self.moduleSettings.showLeaderIcon
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.showLeaderIcon = value
|
|
self:CheckLeader()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 20
|
|
},
|
|
leaderIconOffsetX = {
|
|
type = "range",
|
|
name = L["Leader Icon Horizontal Offset"],
|
|
desc = L["How much to offset the leader icon from the bar horizontally"],
|
|
min = -700,
|
|
max = 900,
|
|
step = 1,
|
|
get = function()
|
|
return self.moduleSettings.leaderIconOffset['x']
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.leaderIconOffset['x'] = v
|
|
self:SetTexLoc(self.frame.leaderIcon, self.moduleSettings.leaderIconOffset['x'], self.moduleSettings.leaderIconOffset['y'])
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showLeaderIcon
|
|
end,
|
|
order = 21
|
|
},
|
|
leaderIconOffsetY = {
|
|
type = "range",
|
|
name = L["Leader Icon Vertical Offset"],
|
|
desc = L["How much to offset the leader icon from the bar vertically"],
|
|
min = -700,
|
|
max = 550,
|
|
step = 1,
|
|
get = function()
|
|
return self.moduleSettings.leaderIconOffset['y']
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.leaderIconOffset['y'] = v
|
|
self:SetTexLoc(self.frame.leaderIcon, self.moduleSettings.leaderIconOffset['x'], self.moduleSettings.leaderIconOffset['y'])
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showLeaderIcon
|
|
end,
|
|
order = 22
|
|
},
|
|
leaderIconScale = {
|
|
type = "range",
|
|
name = L["Leader Icon Scale"],
|
|
desc = L["How much to scale the leader icon"],
|
|
min = 0.05,
|
|
max = 2,
|
|
step = 0.05,
|
|
get = function()
|
|
return self.moduleSettings.leaderIconScale
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.leaderIconScale = v
|
|
self:SetTexScale(self.frame.leaderIcon, 20, 20, v)
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showLeaderIcon
|
|
end,
|
|
order = 23
|
|
},
|
|
|
|
headerLootMasterIcon = {
|
|
type = 'header',
|
|
name = L["Loot Master icon"],
|
|
order = 29.9
|
|
},
|
|
lootMasterIcon = {
|
|
type = "toggle",
|
|
name = L["Show loot master icon"],
|
|
desc = L["Whether or not to show the loot master icon"],
|
|
get = function()
|
|
return self.moduleSettings.showLootMasterIcon
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.showLootMasterIcon = value
|
|
self:CheckLootMaster()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 30
|
|
},
|
|
lootMasterIconOffsetX = {
|
|
type = "range",
|
|
name = L["Loot Master Icon Horizontal Offset"],
|
|
desc = L["How much to offset the loot master icon from the bar horizontally"],
|
|
min = -700,
|
|
max = 900,
|
|
step = 1,
|
|
get = function()
|
|
return self.moduleSettings.lootMasterIconOffset['x']
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.lootMasterIconOffset['x'] = v
|
|
self:SetTexLoc(self.frame.lootMasterIcon, self.moduleSettings.lootMasterIconOffset['x'], self.moduleSettings.lootMasterIconOffset['y'])
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showLootMasterIcon
|
|
end,
|
|
order = 31
|
|
},
|
|
lootMasterIconOffsetY = {
|
|
type = "range",
|
|
name = L["Loot Master Icon Vertical Offset"],
|
|
desc = L["How much to offset the loot master icon from the bar vertically"],
|
|
min = -700,
|
|
max = 550,
|
|
step = 1,
|
|
get = function()
|
|
return self.moduleSettings.lootMasterIconOffset['y']
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.lootMasterIconOffset['y'] = v
|
|
self:SetTexLoc(self.frame.lootMasterIcon, self.moduleSettings.lootMasterIconOffset['x'], self.moduleSettings.lootMasterIconOffset['y'])
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showLootMasterIcon
|
|
end,
|
|
order = 32
|
|
},
|
|
lootMasterIconScale = {
|
|
type = "range",
|
|
name = L["Loot Master Icon Scale"],
|
|
desc = L["How much to scale the loot master icon"],
|
|
min = 0.05,
|
|
max = 2,
|
|
step = 0.05,
|
|
get = function()
|
|
return self.moduleSettings.lootMasterIconScale
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.lootMasterIconScale = v
|
|
self:SetTexScale(self.frame.lootMasterIcon, 20, 20, v)
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showLootMasterIcon
|
|
end,
|
|
order = 33
|
|
},
|
|
|
|
headerPvPIcon = {
|
|
type = 'header',
|
|
name = L["PvP icon"],
|
|
order = 39.9
|
|
},
|
|
PvPIcon = {
|
|
type = "toggle",
|
|
name = L["Show PvP icon"],
|
|
desc = L["Whether or not to show the PvP icon"],
|
|
get = function()
|
|
return self.moduleSettings.showPvPIcon
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.showPvPIcon = value
|
|
self:CheckPvP()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 40
|
|
},
|
|
PvPIconOffsetX = {
|
|
type = "range",
|
|
name = L["PvP Icon Horizontal Offset"],
|
|
desc = L["How much to offset the PvP icon from the bar horizontally"],
|
|
min = -700,
|
|
max = 900,
|
|
step = 1,
|
|
get = function()
|
|
return self.moduleSettings.PvPIconOffset['x']
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.PvPIconOffset['x'] = v
|
|
self:SetTexLoc(self.frame.PvPIcon, self.moduleSettings.PvPIconOffset['x'], self.moduleSettings.PvPIconOffset['y'])
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showPvPIcon
|
|
end,
|
|
order = 41
|
|
},
|
|
PvPIconOffsetY = {
|
|
type = "range",
|
|
name = L["PvP Icon Vertical Offset"],
|
|
desc = L["How much to offset the PvP icon from the bar vertically"],
|
|
min = -700,
|
|
max = 550,
|
|
step = 1,
|
|
get = function()
|
|
return self.moduleSettings.PvPIconOffset['y']
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.PvPIconOffset['y'] = v
|
|
self:SetTexLoc(self.frame.PvPIcon, self.moduleSettings.PvPIconOffset['x'], self.moduleSettings.PvPIconOffset['y'])
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showPvPIcon
|
|
end,
|
|
order = 42
|
|
},
|
|
PvPIconScale = {
|
|
type = "range",
|
|
name = L["PvP Icon Scale"],
|
|
desc = L["How much to scale the PvP icon"],
|
|
min = 0.05,
|
|
max = 2,
|
|
step = 0.05,
|
|
get = function()
|
|
return self.moduleSettings.PvPIconScale
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.PvPIconScale = v
|
|
self:SetTexScale(self.frame.PvPIcon, 20, 20, v)
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showPvPIcon
|
|
end,
|
|
order = 43
|
|
},
|
|
headerPartyRoleIcon = {
|
|
type = 'header',
|
|
name = L["Party Role icon"],
|
|
order = 49.9
|
|
},
|
|
PartyRoleIcon = {
|
|
type = "toggle",
|
|
name = L["Show Party Role icon"],
|
|
desc = L["Whether or not to show the Party Role icon"],
|
|
get = function()
|
|
return self.moduleSettings.showPartyRoleIcon
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.showPartyRoleIcon = value
|
|
self:CheckPartyRole()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 50
|
|
},
|
|
PartyRoleIconOffsetX = {
|
|
type = "range",
|
|
name = L["Party Role Icon Horizontal Offset"],
|
|
desc = L["How much to offset the Party Role icon from the bar horizontally"],
|
|
min = -700,
|
|
max = 900,
|
|
step = 1,
|
|
get = function()
|
|
return self.moduleSettings.PartyRoleIconOffset['x']
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.PartyRoleIconOffset['x'] = v
|
|
self:SetTexLoc(self.frame.PartyRoleIcon, self.moduleSettings.PartyRoleIconOffset['x'], self.moduleSettings.PartyRoleIconOffset['y'])
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showPartyRoleIcon
|
|
end,
|
|
order = 51
|
|
},
|
|
PartyRoleIconOffsetY = {
|
|
type = "range",
|
|
name = L["Party Role Icon Vertical Offset"],
|
|
desc = L["How much to offset the Party Role icon from the bar vertically"],
|
|
min = -700,
|
|
max = 550,
|
|
step = 1,
|
|
get = function()
|
|
return self.moduleSettings.PartyRoleIconOffset['y']
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.PartyRoleIconOffset['y'] = v
|
|
self:SetTexLoc(self.frame.PartyRoleIcon, self.moduleSettings.PartyRoleIconOffset['x'], self.moduleSettings.PartyRoleIconOffset['y'])
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showPartyRoleIcon
|
|
end,
|
|
order = 52
|
|
},
|
|
PartyRoleIconScale = {
|
|
type = "range",
|
|
name = L["Party Role Icon Scale"],
|
|
desc = L["How much to scale the Party Role icon"],
|
|
min = 0.05,
|
|
max = 2,
|
|
step = 0.05,
|
|
get = function()
|
|
return self.moduleSettings.PartyRoleIconScale
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.PartyRoleIconScale = v
|
|
self:SetTexScale(self.frame.PartyRoleIcon, 20, 20, v)
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.showPartyRoleIcon
|
|
end,
|
|
order = 53
|
|
}
|
|
}
|
|
}
|
|
|
|
return opts
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:EnteringVehicle(event, unit, arg2)
|
|
if (self.unit == "player" and IceHUD:ShouldSwapToVehicle(unit, arg2)) then
|
|
self.unit = "vehicle"
|
|
self:RegisterFontStrings()
|
|
self:Update(self.unit)
|
|
end
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:ExitingVehicle(event, unit)
|
|
if (unit == "player" and self.unit == "vehicle") then
|
|
self.unit = "player"
|
|
self:RegisterFontStrings()
|
|
self:Update(self.unit)
|
|
end
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:CreateFrame()
|
|
PlayerHealth.super.prototype.CreateFrame(self)
|
|
|
|
self:CreateHealBar()
|
|
self:CreateAbsorbBar()
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:CreateBackground(redraw)
|
|
PlayerHealth.super.prototype.CreateBackground(self)
|
|
|
|
if not self.frame.button then
|
|
self.frame.button = CreateFrame("Button", "IceHUD_PlayerClickFrame", self.frame, "SecureUnitButtonTemplate")
|
|
end
|
|
|
|
self.frame.button:ClearAllPoints()
|
|
-- Parnic - kinda hacky, but in order to fit this region to multiple types of bars, we need to do this...
|
|
-- would be nice to define this somewhere in data, but for now...here we are
|
|
if self:GetMyBarTexture() == "HiBar" then
|
|
self.frame.button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", 0, 0)
|
|
self.frame.button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMRIGHT", -1 * self.frame:GetWidth(), 0)
|
|
elseif self:GetMyBarTexture() == "ArcHUD" then
|
|
if self.moduleSettings.side == IceCore.Side.Left then
|
|
self.frame.button:SetPoint("TOPLEFT", self.frame, "TOPLEFT")
|
|
self.frame.button:SetPoint("BOTTOMRIGHT", self.frame, "BOTTOMLEFT", self.frame:GetWidth() / 3, 0)
|
|
else
|
|
self.frame.button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT")
|
|
self.frame.button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMRIGHT", -1 * self.frame:GetWidth() / 3, 0)
|
|
end
|
|
else
|
|
if self.moduleSettings.side == IceCore.Side.Left then
|
|
self.frame.button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", -6, 0)
|
|
self.frame.button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMRIGHT", -1 * self.frame:GetWidth() / 3, 0)
|
|
else
|
|
self.frame.button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 6, 0)
|
|
self.frame.button:SetPoint("BOTTOMRIGHT", self.frame, "BOTTOMRIGHT", -1 * self.frame:GetWidth() / 1.5, 0)
|
|
end
|
|
end
|
|
|
|
if not self.frame.button.menu and UnitPopup_ShowMenu then
|
|
self.frame.button.menu = function(this, unit)
|
|
IceHUD.DropdownUnit = unit
|
|
ToggleDropDownMenu(1, nil, IceHUD_UnitFrame_DropDown, "cursor")
|
|
end
|
|
end
|
|
|
|
self:EnableClickTargeting(self.moduleSettings.allowMouseInteraction)
|
|
end
|
|
|
|
function PlayerHealth.prototype:CreateHealBar()
|
|
self.healFrame = self:BarFactory(self.healFrame, "LOW","BACKGROUND", "Heal")
|
|
|
|
self.healFrame.bar:SetVertexColor(self:GetColor("PlayerHealthHealAmount", self.alpha * self.moduleSettings.healAlpha))
|
|
|
|
self:UpdateBar(1, "undef")
|
|
|
|
if not self.moduleSettings.showIncomingHeals or (not IceHUD.SupportsHealPrediction and not HealComm) then
|
|
self.healFrame.bar:Hide()
|
|
end
|
|
end
|
|
|
|
function PlayerHealth.prototype:CreateAbsorbBar()
|
|
self.absorbFrame = self:BarFactory(self.absorbFrame, "LOW","BACKGROUND", "Absorb")
|
|
|
|
self.absorbFrame.bar:SetVertexColor(self:GetColor("PlayerHealthAbsorbAmount", self.alpha * self.moduleSettings.absorbAlpha))
|
|
|
|
self:UpdateBar(1, "undef")
|
|
|
|
if not self.moduleSettings.showAbsorbs or not UnitGetTotalAbsorbs then
|
|
self.absorbFrame.bar:Hide()
|
|
end
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:EnableClickTargeting(bEnable)
|
|
if bEnable then
|
|
self.frame.button:EnableMouse(true)
|
|
self.frame.button:RegisterForClicks("AnyUp")
|
|
self.frame.button:SetAttribute("type1", "target")
|
|
self.frame.button:SetAttribute("type2", UnitPopup_ShowMenu and "menu" or "togglemenu")
|
|
self.frame.button:SetAttribute("unit", self.unit)
|
|
|
|
-- set up click casting
|
|
ClickCastFrames = ClickCastFrames or {}
|
|
ClickCastFrames[self.frame.button] = true
|
|
|
|
-- Parnic - debug code for showing the clickable region on this bar
|
|
-- self.frame.button:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background",
|
|
-- edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
|
|
-- tile = false,
|
|
-- insets = { left = 0, right = 0, top = 0, bottom = 0 }})
|
|
-- self.frame.button:SetBackdropColor(0,0,0,1)
|
|
else
|
|
self.frame.button:EnableMouse(false)
|
|
self.frame.button:RegisterForClicks()
|
|
self.frame.button:SetAttribute("type1")
|
|
self.frame.button:SetAttribute("type2")
|
|
self.frame.button:SetAttribute("unit")
|
|
|
|
-- set up click casting
|
|
--ClickCastFrames = ClickCastFrames or {}
|
|
--ClickCastFrames[self.frame.button] = false
|
|
end
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:EnteringWorld()
|
|
self:CheckVehicle()
|
|
self:CheckCombat()
|
|
self:CheckLeader()
|
|
self:CheckPartyRole()
|
|
self:CheckPvP()
|
|
-- Parnic - moved :Resting to the end because it calls Update which sets alpha on everything
|
|
self:Resting()
|
|
end
|
|
|
|
function PlayerHealth.prototype:CheckVehicle()
|
|
if UnitHasVehicleUI then
|
|
if UnitHasVehicleUI("player") then
|
|
self:EnteringVehicle(nil, "player", true)
|
|
else
|
|
self:ExitingVehicle(nil, "player")
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:Resting()
|
|
self.resting = IsResting()
|
|
|
|
-- moved icon logic above :Update so that it will trigger the alpha settings properly
|
|
if (self.resting) then
|
|
if self.moduleSettings.showStatusIcon and self.moduleSettings.showStatusResting then
|
|
if not self.frame.statusIcon then
|
|
self.frame.statusIcon = self:CreateTexCoord(self.frame.statusIcon, "Interface\\CharacterFrame\\UI-StateIcon", 20, 20,
|
|
self.moduleSettings.statusIconScale, 0.0625, 0.4475, 0.0625, 0.4375)
|
|
self:SetTexLoc(self.frame.statusIcon, self.moduleSettings.statusIconOffset['x'], self.moduleSettings.statusIconOffset['y'])
|
|
self:SetIconAlpha()
|
|
else
|
|
self.frame.statusIcon:SetTexCoord(0.0625, 0.4475, 0.0625, 0.4375)
|
|
end
|
|
elseif (not self.moduleSettings.showStatusIcon or not self.moduleSettings.showStatusResting) and self.frame.statusIcon and not self.combat then
|
|
self.frame.statusIcon = self:DestroyTexFrame(self.frame.statusIcon)
|
|
end
|
|
else
|
|
if not self.combat and not configMode and self.frame.statusIcon then
|
|
self.frame.statusIcon = self:DestroyTexFrame(self.frame.statusIcon)
|
|
end
|
|
end
|
|
|
|
self:Update(self.unit)
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:CheckCombat()
|
|
local preCombatValue = self.combat
|
|
PlayerHealth.super.prototype.CheckCombat(self)
|
|
local postCombatValue = self.combat
|
|
|
|
if preCombatValue ~= postCombatValue then
|
|
if postCombatValue then
|
|
self:InCombat()
|
|
else
|
|
self:OutCombat()
|
|
end
|
|
end
|
|
|
|
if self.combat then
|
|
if self.moduleSettings.allowMouseInteraction and not self.moduleSettings.allowMouseInteractionCombat then
|
|
self:EnableClickTargeting(false)
|
|
end
|
|
else
|
|
if self.moduleSettings.allowMouseInteraction and not self.moduleSettings.allowMouseInteractionCombat then
|
|
self:EnableClickTargeting(true)
|
|
end
|
|
end
|
|
|
|
if self.combat or configMode then
|
|
if (configMode or (self.moduleSettings.showStatusIcon and self.moduleSettings.showStatusCombat)) then
|
|
if not self.frame.statusIcon then
|
|
self.frame.statusIcon = self:CreateTexCoord(self.frame.statusIcon, "Interface\\CharacterFrame\\UI-StateIcon", 20, 20,
|
|
self.moduleSettings.statusIconScale, 0.5625, 0.9375, 0.0625, 0.4375)
|
|
self:SetTexLoc(self.frame.statusIcon, self.moduleSettings.statusIconOffset['x'], self.moduleSettings.statusIconOffset['y'])
|
|
self:SetIconAlpha()
|
|
else
|
|
self.frame.statusIcon:SetTexCoord(0.5625, 0.9375, 0.0625, 0.4375)
|
|
end
|
|
elseif not configMode and not self.resting and (not self.moduleSettings.showStatusIcon or not self.moduleSettings.showStatusCombat) and self.frame.statusIcon then
|
|
self.frame.statusIcon = self:DestroyTexFrame(self.frame.statusIcon)
|
|
end
|
|
else
|
|
if (not self.resting or not self.moduleSettings.showStatusResting) and self.frame.statusIcon then
|
|
self.frame.statusIcon = self:DestroyTexFrame(self.frame.statusIcon)
|
|
elseif self.resting then
|
|
self:Resting()
|
|
end
|
|
end
|
|
end
|
|
|
|
function PlayerHealth.prototype:CheckPartyRole()
|
|
if configMode or IceHUD:GetIsInLFGGroup() then
|
|
if (configMode or self.moduleSettings.showPartyRoleIcon) and not self.frame.PartyRoleIcon then
|
|
local isTank, isHeal, isDPS
|
|
local proposalExists, typeID, id, subtypeID, name
|
|
local texture, role, hasResponded, totalEncounters, completedEncounters, numMembers, isleader
|
|
proposalExists, id, typeID, subtypeID, name, texture, role, hasResponded, totalEncounters, completedEncounters, numMembers, isleader = GetLFGProposal()
|
|
|
|
local p = self.unit
|
|
if not IceHUD.UnitGroupRolesReturnsRoleString then
|
|
isTank, isHeal, isDPS = UnitGroupRolesAssigned(p)
|
|
else
|
|
local grpRole = UnitGroupRolesAssigned(p)
|
|
isTank = (grpRole == "TANK")
|
|
isHeal = (grpRole == "HEALER")
|
|
isDPS = (grpRole == "DAMAGER")
|
|
end
|
|
IceHUD:Debug(".......")
|
|
IceHUD:Debug(p.."="..tostring(UnitName(p)))
|
|
IceHUD:Debug( tostring(proposalExists) .."**".. tostring(typeID) .."**".. tostring(id) .."**".. tostring(name) .."**".. tostring(texture) .."**".. tostring(role) .."**".. tostring(hasResponded) .."**".. tostring(totalEncounters) .."**".. tostring(completedEncounters) .."**".. tostring(numMembers) .."**".. tostring(isleader) )
|
|
|
|
if proposalExists == true then
|
|
IceHUD:Debug(tostring(typeID).." "..(role or ""))
|
|
isTank = (role == "TANK")
|
|
isHeal = (role == "HEALER")
|
|
isDPS = (role == "DAMAGER")
|
|
else
|
|
IceHUD:Debug("NoProposal")
|
|
end
|
|
|
|
IceHUD:Debug("---")
|
|
|
|
if proposalExists == nil then
|
|
hasResponded = false
|
|
proposalExists = false
|
|
end
|
|
|
|
if hasResponded == false then
|
|
if proposalExists == true then
|
|
isTank = (role == "TANK")
|
|
isHeal = (role == "HEALER")
|
|
isDPS = (role == "DAMAGER")
|
|
end
|
|
else
|
|
isTank = not hasResponded
|
|
isHeal = not hasResponded
|
|
isDPS = not hasResponded
|
|
end
|
|
|
|
IceHUD:Debug("Tank:"..tostring(isTank))
|
|
IceHUD:Debug("Heal:"..tostring(isHeal))
|
|
IceHUD:Debug("DPS:"..tostring(isDPS))
|
|
|
|
if isTank then
|
|
IceHUD:Debug("Loading Tank")
|
|
self.frame.PartyRoleIcon = self:CreateTexCoord(self.frame.PartyRoleIcon, "Interface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES", 20, 20, self.moduleSettings.PartyRoleIconScale, 0/64, 19/64, 22/64, 41/64)
|
|
elseif isHeal then
|
|
IceHUD:Debug("Loading Heal")
|
|
self.frame.PartyRoleIcon = self:CreateTexCoord(self.frame.PartyRoleIcon, "Interface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES", 20, 20, self.moduleSettings.PartyRoleIconScale, 20/64, 39/64, 1/64, 20/64)
|
|
elseif isDPS then
|
|
IceHUD:Debug("Loading DPS")
|
|
self.frame.PartyRoleIcon = self:CreateTexCoord(self.frame.PartyRoleIcon, "Interface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES", 20, 20, self.moduleSettings.PartyRoleIconScale, 20/64, 39/64, 22/64, 41/64)
|
|
elseif configMode then
|
|
IceHUD:Debug("No Roles==Defaulting to Leader icon")
|
|
self.frame.PartyRoleIcon = self:CreateTexCoord(self.frame.PartyRoleIcon, "Interface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES", 20, 20, self.moduleSettings.PartyRoleIconScale, 0/64, 19/64, 1/64, 20/64)
|
|
else
|
|
IceHUD:Debug("Clearing Frame")
|
|
self.frame.PartyRoleIcon = self:DestroyTexFrame(self.frame.PartyRoleIcon)
|
|
end
|
|
self:SetTexLoc(self.frame.PartyRoleIcon, self.moduleSettings.PartyRoleIconOffset['x'], self.moduleSettings.PartyRoleIconOffset['y'])
|
|
self:SetIconAlpha()
|
|
elseif not configMode and not self.moduleSettings.showPartyRoleIcon and self.frame.PartyRoleIcon then
|
|
IceHUD:Debug("Clearing Frame")
|
|
self.frame.PartyRoleIcon = self:DestroyTexFrame(self.frame.PartyRoleIcon)
|
|
end
|
|
else
|
|
if self.frame.PartyRoleIcon then
|
|
IceHUD:Debug("Clearing Frame")
|
|
self.frame.PartyRoleIcon = self:DestroyTexFrame(self.frame.PartyRoleIcon)
|
|
end
|
|
end
|
|
self:CheckLootMaster()
|
|
end
|
|
|
|
function PlayerHealth.prototype:CheckLeader()
|
|
local isLeader
|
|
if UnitIsGroupLeader then
|
|
isLeader = UnitIsGroupLeader("player")
|
|
else
|
|
isLeader = IsPartyLeader()
|
|
end
|
|
if configMode or isLeader then
|
|
if (configMode or self.moduleSettings.showLeaderIcon) and not self.frame.leaderIcon then
|
|
self.frame.leaderIcon = self:CreateTexCoord(self.frame.leaderIcon, "Interface\\GroupFrame\\UI-Group-LeaderIcon", 20, 20,
|
|
self.moduleSettings.leaderIconScale, 0, 1, 0, 1)
|
|
self:SetTexLoc(self.frame.leaderIcon, self.moduleSettings.leaderIconOffset['x'], self.moduleSettings.leaderIconOffset['y'])
|
|
self:SetIconAlpha()
|
|
elseif not configMode and not self.moduleSettings.showLeaderIcon and self.frame.leaderIcon then
|
|
self.frame.leaderIcon = self:DestroyTexFrame(self.frame.leaderIcon)
|
|
end
|
|
else
|
|
if self.frame.leaderIcon then
|
|
self.frame.leaderIcon = self:DestroyTexFrame(self.frame.leaderIcon)
|
|
end
|
|
end
|
|
|
|
self:CheckPartyRole()
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:CheckLootMaster()
|
|
local _, lootmaster = GetLootMethod()
|
|
if configMode or lootmaster == 0 then
|
|
if (configMode or self.moduleSettings.showLootMasterIcon) and not self.frame.lootMasterIcon then
|
|
self.frame.lootMasterIcon = self:CreateTexCoord(self.frame.lootMasterIcon, "Interface\\GroupFrame\\UI-Group-MasterLooter", 20, 20,
|
|
self.moduleSettings.lootMasterIconScale, 0, 1, 0, 1)
|
|
self:SetTexLoc(self.frame.lootMasterIcon, self.moduleSettings.lootMasterIconOffset['x'], self.moduleSettings.lootMasterIconOffset['y'])
|
|
self:SetIconAlpha()
|
|
elseif not configMode and not self.moduleSettings.showLootMasterIcon and self.frame.lootMasterIcon then
|
|
self.frame.lootMasterIcon = self:DestroyTexFrame(self.frame.lootMasterIcon)
|
|
end
|
|
else
|
|
if self.frame.lootMasterIcon then
|
|
self.frame.lootMasterIcon = self:DestroyTexFrame(self.frame.lootMasterIcon)
|
|
end
|
|
end
|
|
|
|
self:CheckPartyFrameStatus()
|
|
|
|
end
|
|
|
|
function PlayerHealth.prototype:CheckPartyFrameStatus()
|
|
if (self.moduleSettings.hideBlizzParty) then
|
|
self:HideBlizzardParty()
|
|
end
|
|
end
|
|
|
|
function PlayerHealth.prototype:CheckPvP()
|
|
local pvpMode = nil
|
|
local minx, maxx, miny, maxy
|
|
|
|
if configMode or UnitIsPVPFreeForAll(self.unit) then
|
|
pvpMode = "FFA"
|
|
|
|
minx, maxx, miny, maxy = 0.05, 0.605, 0.015, 0.57
|
|
elseif UnitIsPVP(self.unit) then
|
|
pvpMode = UnitFactionGroup(self.unit)
|
|
|
|
if pvpMode == "Neutral" then
|
|
pvpMode = "FFA"
|
|
end
|
|
|
|
if pvpMode == "Alliance" then
|
|
minx, maxx, miny, maxy = 0.07, 0.58, 0.06, 0.57
|
|
else
|
|
minx, maxx, miny, maxy = 0.08, 0.58, 0.045, 0.545
|
|
end
|
|
end
|
|
|
|
if pvpMode then
|
|
if (configMode or self.moduleSettings.showPvPIcon) and not self.frame.PvPIcon then
|
|
self.frame.PvPIcon = self:CreateTexCoord(self.frame.PvPIcon, "Interface\\TargetingFrame\\UI-PVP-"..pvpMode, 20, 20,
|
|
self.moduleSettings.PvPIconScale, minx, maxx, miny, maxy)
|
|
self:SetTexLoc(self.frame.PvPIcon, self.moduleSettings.PvPIconOffset['x'], self.moduleSettings.PvPIconOffset['y'])
|
|
self:SetIconAlpha()
|
|
elseif not configMode and not self.moduleSettings.showPvPIcon and self.frame.PvPIcon then
|
|
self.frame.PvPIcon = self:DestroyTexFrame(self.frame.PvPIcon)
|
|
end
|
|
else
|
|
if self.frame.PvPIcon then
|
|
self.frame.PvPIcon = self:DestroyTexFrame(self.frame.PvPIcon)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:UpdateEvent(event, unit)
|
|
self:Update(unit)
|
|
end
|
|
|
|
function PlayerHealth.prototype:Update(unit)
|
|
PlayerHealth.super.prototype.Update(self)
|
|
if (unit and (unit ~= self.unit)) then
|
|
return
|
|
end
|
|
|
|
local color = "PlayerHealth"
|
|
|
|
if (self.moduleSettings.classColor) then
|
|
color = self.unitClass
|
|
end
|
|
|
|
if (self.moduleSettings.scaleHealthColor) then
|
|
color = "ScaledHealthColor"
|
|
elseif self.moduleSettings.lowThresholdColor and self.healthPercentage <= self.moduleSettings.lowThreshold then
|
|
color = "ScaledHealthColor"
|
|
end
|
|
|
|
if not (self.alive) then
|
|
color = "Dead"
|
|
end
|
|
|
|
local textColor = color
|
|
if (self.resting) then
|
|
textColor = "Text"
|
|
end
|
|
|
|
self:UpdateBar(self.healthPercentage, color)
|
|
|
|
-- sadly, animation uses bar-local variables so we can't use the animation for 2 bar textures on the same bar element
|
|
if self.moduleSettings.showIncomingHeals and self.healFrame and self.healFrame.bar and incomingHealAmt then
|
|
local percent
|
|
|
|
if incomingHealAmt > 0 then
|
|
percent = self.maxHealth ~= 0 and ((self.health + (self.absorbAmount or 0) + incomingHealAmt) / self.maxHealth) or 0
|
|
if self.moduleSettings.reverse then
|
|
percent = 1 - percent
|
|
-- Rokiyo: I'm thinking the frama strata should also to be set to medium if we're in reverse.
|
|
end
|
|
else
|
|
percent = 0
|
|
end
|
|
|
|
percent = IceHUD:Clamp(percent, 0, 1)
|
|
|
|
self:SetBarCoord(self.healFrame, percent)
|
|
end
|
|
|
|
if self.moduleSettings.showAbsorbs and self.absorbFrame and self.absorbFrame.bar and self.absorbAmount then
|
|
local percent
|
|
|
|
if self.absorbAmount > 0 then
|
|
percent = self.maxHealth ~= 0 and ((self.health + self.absorbAmount) / self.maxHealth) or 0
|
|
if self.moduleSettings.reverse then
|
|
percent = 1 - percent
|
|
end
|
|
else
|
|
percent = 0
|
|
end
|
|
|
|
percent = IceHUD:Clamp(percent, 0, 1)
|
|
|
|
self:SetBarCoord(self.absorbFrame, percent)
|
|
end
|
|
|
|
if not IceHUD.IceCore:ShouldUseDogTags() then
|
|
self:SetBottomText1(math.floor(self.healthPercentage * 100))
|
|
self:SetBottomText2(self:GetFormattedText(self.health, self.maxHealth), textColor)
|
|
end
|
|
|
|
--self:CheckPartyRole()
|
|
self:SetIconAlpha()
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:SetIconAlpha()
|
|
if self.frame.statusIcon then
|
|
self.frame.statusIcon:SetAlpha(self.moduleSettings.lockIconAlpha and 1 or self.alpha)
|
|
end
|
|
|
|
if self.frame.leaderIcon then
|
|
self.frame.leaderIcon:SetAlpha(self.moduleSettings.lockIconAlpha and 1 or self.alpha)
|
|
end
|
|
|
|
if self.frame.lootMasterIcon then
|
|
self.frame.lootMasterIcon:SetAlpha(self.moduleSettings.lockIconAlpha and 1 or self.alpha)
|
|
end
|
|
|
|
if self.frame.PvPIcon then
|
|
self.frame.PvPIcon:SetAlpha(self.moduleSettings.lockIconAlpha and 1 or self.alpha)
|
|
end
|
|
|
|
if self.frame.PartyRoleIcon then
|
|
self.frame.PartyRoleIcon:SetAlpha(self.moduleSettings.lockIconAlpha and 1 or self.alpha)
|
|
end
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:CreateTexCoord(texframe, icon, width, height, scale, left, right, top, bottom)
|
|
if not texframe then
|
|
texframe = self.masterFrame:CreateTexture(nil, "BACKGROUND")
|
|
end
|
|
texframe:SetTexture(icon)
|
|
texframe:SetTexCoord(left, right, top, bottom)
|
|
self:SetTexScale(texframe, width, height, scale)
|
|
|
|
return texframe
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:SetTexLoc(texframe, xpos, ypos, anchorFrom, anchorTo)
|
|
if not texframe then
|
|
return
|
|
end
|
|
|
|
texframe:ClearAllPoints()
|
|
texframe:SetPoint(anchorFrom and anchorFrom or "TOPLEFT", self.frame, anchorTo and anchorTo or "TOPLEFT", xpos, ypos)
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:SetTexScale(texframe, width, height, scale)
|
|
if not texframe then
|
|
return
|
|
end
|
|
|
|
texframe:SetWidth(width * scale)
|
|
texframe:SetHeight(height * scale)
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:DestroyTexFrame(texframe)
|
|
if not texframe then
|
|
return nil
|
|
end
|
|
|
|
texframe:SetTexture(nil)
|
|
texframe:Hide()
|
|
texframe:ClearAllPoints()
|
|
|
|
return nil
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:ShowBlizz()
|
|
PlayerFrame:SetParent(self.OriginalPlayerFrameParent or UIParent)
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:HideBlizz()
|
|
if not self.PlayerFrameParent then
|
|
self.PlayerFrameParent = CreateFrame("Frame")
|
|
self.PlayerFrameParent:Hide()
|
|
end
|
|
|
|
self.OriginalPlayerFrameParent = PlayerFrame:GetParent()
|
|
PlayerFrame:SetParent(self.PlayerFrameParent)
|
|
end
|
|
|
|
local parents = {}
|
|
local hide_frame = IceHUD:OutOfCombatWrapper(function(self) self:Hide() end)
|
|
|
|
local function hook_frames(...)
|
|
for i = 1, select("#", ...) do
|
|
local frame = select(i, ...)
|
|
frame:UnregisterAllEvents()
|
|
if not IceHUD:IsHooked(frame, "OnShow") then
|
|
IceHUD:SecureHookScript(frame, "OnShow", hide_frame)
|
|
end
|
|
frame:Hide()
|
|
end
|
|
end
|
|
|
|
local function unhook_frame(frame)
|
|
if IceHUD:IsHooked(frame, "OnShow") then
|
|
IceHUD:Unhook(frame, "OnShow")
|
|
local parent = parents[frame]
|
|
if parent then
|
|
frame:SetParent(parent)
|
|
end
|
|
elseif IceHUD:IsHooked(frame, "Show") then
|
|
IceHUD:Unhook(frame, "Show")
|
|
IceHUD:Unhook(frame, "SetPoint")
|
|
end
|
|
end
|
|
|
|
local function unhook_frames(...)
|
|
for i = 1, select("#", ...) do
|
|
local frame = select(i, ...)
|
|
unhook_frame(frame)
|
|
local handler = frame:GetScript("OnLoad")
|
|
if handler then
|
|
handler(frame)
|
|
end
|
|
end
|
|
end
|
|
|
|
function PlayerHealth.prototype:HideBlizzardParty()
|
|
if self.combat then
|
|
self.pendingBlizzardPartyHide = true
|
|
return
|
|
end
|
|
|
|
if PartyFrame then
|
|
PartyFrame:Hide()
|
|
PartyFrame:UnregisterEvent(groupEvent)
|
|
else
|
|
for i = 1, MAX_PARTY_MEMBERS do
|
|
local frame = _G["PartyMemberFrame" .. i]
|
|
frame:SetAttribute("statehidden", true)
|
|
hook_frames(frame)
|
|
end
|
|
UIParent:UnregisterEvent(groupEvent)
|
|
end
|
|
end
|
|
|
|
|
|
function PlayerHealth.prototype:ShowBlizzardParty()
|
|
if PartyFrame then
|
|
PartyFrame:Show()
|
|
PartyFrame:Layout()
|
|
PartyFrame:RegisterEvent(groupEvent)
|
|
else
|
|
for i = 1, MAX_PARTY_MEMBERS do
|
|
local frame = _G["PartyMemberFrame" .. i]
|
|
frame:SetAttribute("statehidden", nil)
|
|
unhook_frames(frame)
|
|
frame:GetScript("OnEvent")(frame, groupEvent)
|
|
end
|
|
UIParent:RegisterEvent(groupEvent)
|
|
end
|
|
end
|
|
|
|
--function PlayerHealth.prototype:ShowBlizzParty()
|
|
-- This loop exists because we need to unregister for events in case the party composition changes.
|
|
-- for i = 1, MAX_PARTY_MEMBERS do
|
|
-- local party = _G['PartyMemberFrame'..i]
|
|
-- party.Show = nil
|
|
-- party:RegisterEvent('PARTY_MEMBERS_CHANGED')
|
|
-- party:RegisterEvent('PARTY_LEADER_CHANGED')
|
|
-- party:RegisterEvent('PARTY_MEMBER_ENABLE')
|
|
-- party:RegisterEvent('PARTY_MEMBER_DISABLE')
|
|
-- party:RegisterEvent('PARTY_LOOT_METHOD_CHANGED')
|
|
-- party:RegisterEvent('MUTELIST_UPDATE')
|
|
-- party:RegisterEvent('IGNORELIST_UPDATE')
|
|
-- party:RegisterEvent('UNIT_PVP_UPDATE')
|
|
-- party:RegisterEvent('UNIT_AURA')
|
|
-- party:RegisterEvent('UNIT_PET')
|
|
-- party:RegisterEvent('VARIABLES_LOADED')
|
|
-- party:RegisterEvent('UNIT_NAME_UPDATE')
|
|
-- party:RegisterEvent('UNIT_PORTRAIT_UPDATE')
|
|
-- party:RegisterEvent('UNIT_DISPLAYPOWER')
|
|
-- party:RegisterEvent('UNIT_ENTERED_VEHICLE')
|
|
-- party:RegisterEvent('UNIT_EXITED_VEHICLE')
|
|
-- party:RegisterEvent('VOICE_START')
|
|
-- party:RegisterEvent('VOICE_STOP')
|
|
-- party:RegisterEvent('VOICE_STATUS_UPDATE')
|
|
-- party:RegisterEvent('READY_CHECK')
|
|
-- party:RegisterEvent('READY_CHECK_CONFIRM')
|
|
-- party:RegisterEvent('READY_CHECK_FINISHED')
|
|
-- UnitFrame_OnEvent('PARTY_MEMBERS_CHANGED')
|
|
-- end
|
|
-- UIParent:RegisterEvent('RAID_ROSTER_UPDATE')
|
|
--
|
|
-- ShowPartyFrame() -- Just call Blizzard default method
|
|
--end
|
|
|
|
function PlayerHealth.prototype:UpdateBar(scale, color, alpha)
|
|
PlayerHealth.super.prototype.UpdateBar(self, scale, color, alpha)
|
|
|
|
if self.healFrame and self.healFrame.bar then
|
|
self.healFrame.bar:SetVertexColor(self:GetColor("PlayerHealthHealAmount", self.alpha * self.moduleSettings.healAlpha))
|
|
end
|
|
if self.absorbFrame and self.absorbFrame.bar then
|
|
self.absorbFrame.bar:SetVertexColor(self:GetColor("PlayerHealthAbsorbAmount", self.alpha * self.moduleSettings.absorbAlpha))
|
|
end
|
|
--[[ seems to be causing taint. oh well
|
|
if self.frame.button then
|
|
if self.alpha == 0 then
|
|
self.frame.button:Hide()
|
|
else
|
|
self.frame.button:Show()
|
|
end
|
|
end
|
|
]]
|
|
end
|
|
|
|
function PlayerHealth.prototype:OutCombat()
|
|
PlayerHealth.super.prototype.OutCombat(self)
|
|
|
|
if self.pendingBlizzardPartyHide then
|
|
self.pendingBlizzardPartyHide = false
|
|
self:HideBlizzardParty()
|
|
end
|
|
end
|
|
|
|
-- Load us up
|
|
IceHUD.PlayerHealth = PlayerHealth.new()
|