mirror of
https://github.com/parnic/ice-hud.git
synced 2025-06-16 06:40:13 -05:00
- added an option to the threat module to display the scaled percent (the old method) instead of raw. this will cause it to disagree with Omen, but it's displaying the same information, only in a different way
292 lines
7.7 KiB
Lua
292 lines
7.7 KiB
Lua
--[[
|
|
Name: IHUD_Threat
|
|
Version: 1.2
|
|
Author: Caryna/Turalyon EU (Alliance) (updated for Threat-2.0 by 'acapela' of WoWI and merged into IceHUD by Parnic)
|
|
Description: adds a threat bar to IceHUD
|
|
]]
|
|
|
|
local AceOO = AceLibrary("AceOO-2.0")
|
|
|
|
local IHUD_Threat = AceOO.Class(IceUnitBar)
|
|
|
|
IHUD_Threat.prototype.color = nil
|
|
IHUD_Threat.aggroBar = nil
|
|
IHUD_Threat.aggroBarMulti = nil
|
|
|
|
-- constructor
|
|
function IHUD_Threat.prototype:init()
|
|
IHUD_Threat.super.prototype.init(self, "Threat", "target")
|
|
|
|
self:SetDefaultColor("ThreatLow", 102, 204, 51)
|
|
self:SetDefaultColor("ThreatMedium", 0, 204, 204)
|
|
self:SetDefaultColor("ThreatHigh", 204, 0, 153)
|
|
self:SetDefaultColor("ThreatDanger", 255, 0, 0)
|
|
self:SetDefaultColor("ThreatCustom", 255, 255, 0)
|
|
self:SetDefaultColor("ThreatPullAggro", 255, 0, 0)
|
|
|
|
self:OnCoreLoad()
|
|
end
|
|
|
|
-- default settings
|
|
function IHUD_Threat.prototype:GetDefaultSettings()
|
|
local settings = IHUD_Threat.super.prototype.GetDefaultSettings(self)
|
|
settings["side"] = IceCore.Side.Left
|
|
settings["offset"] = 4
|
|
settings["enabled"] = false
|
|
settings["aggroAlpha"] = 0.7
|
|
settings["usesDogTagStrings"] = false
|
|
settings["onlyShowInGroups"] = true
|
|
settings["showScaledThreat"] = false
|
|
return settings
|
|
end
|
|
|
|
-- options stuff
|
|
function IHUD_Threat.prototype:GetOptions()
|
|
local opts = IHUD_Threat.super.prototype.GetOptions(self)
|
|
|
|
opts["enabled"] = {
|
|
type = "toggle",
|
|
name = "|c" .. self.configColor .. "Enabled|r",
|
|
desc = "Enable/disable module (requires Threat-2.0 library)",
|
|
get = function()
|
|
return self.moduleSettings.enabled
|
|
end,
|
|
set = function(value)
|
|
self.moduleSettings.enabled = value
|
|
if (value) then
|
|
self:Enable(true)
|
|
else
|
|
self:Disable()
|
|
end
|
|
end,
|
|
order = 20
|
|
}
|
|
|
|
opts["aggroAlpha"] =
|
|
{
|
|
type = 'range',
|
|
name = 'Aggro Indicator alpha',
|
|
desc = 'Aggro indicator alpha (0 is disabled)',
|
|
min = 0,
|
|
max = 1,
|
|
step = 0.1,
|
|
get = function()
|
|
return self.moduleSettings.aggroAlpha
|
|
end,
|
|
set = function(value)
|
|
self.moduleSettings.aggroAlpha = value
|
|
self:Redraw()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 27.5
|
|
}
|
|
|
|
opts["onlyShowInGroups"] = {
|
|
type = 'toggle',
|
|
name = 'Only show in groups',
|
|
desc = 'Only show the threat bar if you are in a group or you have an active pet',
|
|
get = function()
|
|
return self.moduleSettings.onlyShowInGroups
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.onlyShowInGroups = v
|
|
self:Redraw()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 27.6
|
|
}
|
|
|
|
opts["showScaledThreat"] = {
|
|
type = 'toggle',
|
|
name = 'Show scaled threat',
|
|
desc = 'Whether to show threat in scaled values or raw values. Scaled threat means that you will pull aggro when it hits 100%. Raw threat means you will pull aggro at either 110% (melee) or 130% (ranged). Omen uses raw threat which can cause this mod to disagree with Omen if it is in scaled mode.',
|
|
get = function()
|
|
return self.moduleSettings.showScaledThreat
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.showScaledThreat = v
|
|
self:Redraw()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 27.7
|
|
}
|
|
|
|
return opts
|
|
end
|
|
|
|
-- enable plugin
|
|
function IHUD_Threat.prototype:Enable(core)
|
|
IHUD_Threat.super.prototype.Enable(self, core)
|
|
|
|
self:ScheduleRepeatingEvent(self.elementName, self.Update, 0.2, self)
|
|
|
|
self:Update(self.unit)
|
|
end
|
|
|
|
-- disable plugin
|
|
function IHUD_Threat.prototype:Disable(core)
|
|
IHUD_Threat.super.prototype.Disable(self, core)
|
|
|
|
self:CancelScheduledEvent(self.elementName)
|
|
end
|
|
|
|
-- OVERRIDE
|
|
function IHUD_Threat.prototype:CreateFrame()
|
|
IHUD_Threat.super.prototype.CreateFrame(self)
|
|
|
|
self:CreateAggroBar()
|
|
end
|
|
|
|
-- needs to be inverted for threat bar
|
|
function IHUD_Threat.prototype:UseTargetAlpha(scale)
|
|
return (scale and (scale > 0))
|
|
end
|
|
|
|
-- create the aggro range indicator bar
|
|
function IHUD_Threat.prototype:CreateAggroBar()
|
|
if not (self.aggroBar) then
|
|
self.aggroBar = CreateFrame("StatusBar", nil, self.frame)
|
|
end
|
|
|
|
self.aggroBar:SetFrameStrata("BACKGROUND")
|
|
self.aggroBar:SetWidth(self.settings.barWidth + (self.moduleSettings.widthModifier or 0))
|
|
self.aggroBar:SetHeight(self.settings.barHeight)
|
|
|
|
if not (self.aggroBar.bar) then
|
|
self.aggroBar.bar = self.aggroBar:CreateTexture(nil, "BACKGROUND")
|
|
end
|
|
|
|
self.aggroBar.bar:SetTexture(IceElement.TexturePath .. self.settings.barTexture .. "BG")
|
|
self.aggroBar.bar:SetAllPoints(self.aggroBar)
|
|
|
|
self.aggroBar:SetStatusBarTexture(self.aggroBar.bar)
|
|
|
|
local r, g, b = self:GetColor("ThreatPullAggro")
|
|
if (self.settings.backgroundToggle) then
|
|
r, g, b = self:GetColor("CastCasting")
|
|
end
|
|
self.aggroBar:SetStatusBarColor(r, g, b, self.moduleSettings.aggroAlpha)
|
|
|
|
if (self.moduleSettings.side == IceCore.Side.Left) then
|
|
self.aggroBar.bar:SetTexCoord(1, 0, 0, 0)
|
|
else
|
|
self.aggroBar.bar:SetTexCoord(0, 1, 0, 0)
|
|
end
|
|
|
|
self.aggroBar:ClearAllPoints()
|
|
self.aggroBar:SetPoint("BOTTOM", self.frame, "BOTTOM", 0, 0)
|
|
end
|
|
|
|
-- bar stuff
|
|
function IHUD_Threat.prototype:Update(unit)
|
|
IHUD_Threat.super.prototype.Update(self)
|
|
|
|
if (unit and (unit ~= self.unit)) then
|
|
return
|
|
end
|
|
|
|
if not unit then
|
|
unit = self.unit
|
|
end
|
|
|
|
if self.moduleSettings.onlyShowInGroups and (GetNumPartyMembers() == 0 and not UnitExists("pet")) then
|
|
self:Show(false)
|
|
return
|
|
end
|
|
|
|
if not UnitExists("target") or not UnitCanAttack("player", "target") or UnitIsDead("target")
|
|
or UnitIsFriend("player", "target") or UnitPlayerControlled("target") then
|
|
self:Show(false)
|
|
return
|
|
else
|
|
self:Show(true)
|
|
end
|
|
|
|
local isTanking, threatState, scaledPercent, rawPercent = UnitDetailedThreatSituation("player", "target")
|
|
local scaledPercentZeroToOne
|
|
|
|
if not self.combat and (scaledPercent == 0 or rawPercent == 0) then
|
|
self:Show(false)
|
|
return
|
|
end
|
|
|
|
if not rawPercent then
|
|
rawPercent = 0
|
|
end
|
|
|
|
if rawPercent < 0 then
|
|
rawPercent = 0
|
|
elseif isTanking then
|
|
rawPercent = 100
|
|
end
|
|
|
|
if not threatState or not scaledPercent or not rawPercent then
|
|
scaledPercentZeroToOne = 0
|
|
scaledPercent = 0
|
|
|
|
IceHUD:Debug( "Threat: nil threat on valid target" )
|
|
else
|
|
if self.moduleSettings.showScaledThreat then
|
|
scaledPercentZeroToOne = scaledPercent / 100
|
|
else
|
|
scaledPercentZeroToOne = rawPercent / 100
|
|
end
|
|
|
|
IceHUD:Debug( "isTanking="..(isTanking or "nil").." threatState="..(threatState or "nil").." scaledPercent="..(scaledPercent or "nil").." rawPercent="..(rawPercent or "nil") )
|
|
end
|
|
|
|
-- set percentage text
|
|
self:SetBottomText1( IceHUD:MathRound(self.moduleSettings.showScaledThreat and scaledPercent or rawPercent) .. "%" )
|
|
self:SetBottomText2()
|
|
|
|
-- Parnic: threat lib is no longer used in wotlk
|
|
-- ...assuming a 1.1 threat multi if not tanking for the time being unless we decide to switch it back to 1.3/1.1 based on ranged/melee status later
|
|
local threatMulti = 1.1
|
|
if ( isTanking ) then
|
|
threatMulti = 1
|
|
end
|
|
|
|
-- Parnic: this should probably be switched to use the new api colors for threat...
|
|
-- set bar color
|
|
if( threatMulti == 1 ) then
|
|
self.color = "ThreatDanger"
|
|
elseif( scaledPercent < 50 ) then
|
|
self.color = "ThreatLow"
|
|
elseif ( scaledPercent < 80 ) then
|
|
self.color = "ThreatMedium"
|
|
else
|
|
self.color = "ThreatHigh"
|
|
end
|
|
|
|
-- set the bar value
|
|
self:UpdateBar( scaledPercentZeroToOne, self.color )
|
|
|
|
-- do the aggro indicator bar stuff, but only if it has changed
|
|
if ( self.aggroBarMulti ~= threatMulti ) then
|
|
self.aggroBarMulti = threatMulti
|
|
|
|
local pos = 1 - (1 / threatMulti)
|
|
local y = self.settings.barHeight - ( pos * self.settings.barHeight )
|
|
|
|
if ( self.moduleSettings.side == IceCore.Side.Left ) then
|
|
self.aggroBar.bar:SetTexCoord(1, 0, 0, pos)
|
|
else
|
|
self.aggroBar.bar:SetTexCoord(0, 1, 0, pos)
|
|
end
|
|
|
|
self.aggroBar:SetPoint("BOTTOM", self.frame, "BOTTOM", 0, y)
|
|
end
|
|
|
|
self:UpdateAlpha()
|
|
end
|
|
|
|
|
|
-- Load us up
|
|
IceHUD.IHUD_Threat = IHUD_Threat:new()
|