96 lines
2.8 KiB
Lua
96 lines
2.8 KiB
Lua
local _G = ShaguTweaks.GetGlobalEnv()
|
|
local T = ShaguTweaks.T
|
|
|
|
local module = ShaguTweaks:register({
|
|
title = T["Show Aggro Indicators"],
|
|
description = T["Show indicators on raid members that are currently attacked by other units. (This only works if the unit is a target of a raid member)"],
|
|
expansions = { ["vanilla"] = true, ["tbc"] = false },
|
|
category = T["Raid Frames"],
|
|
maintainer = "@shagu (GitHub)",
|
|
enabled = true,
|
|
})
|
|
|
|
|
|
local backdrop = {
|
|
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
|
tile = true, tileSize = 8, edgeSize = 8,
|
|
insets = { left = 2, right = 2, top = 2, bottom = 2 }
|
|
}
|
|
|
|
-- basic unitstrings
|
|
local unitstrings = {
|
|
["pet"] = true, ["player"] = true, ["target"] = true, ["mouseover"] = true
|
|
}
|
|
|
|
-- group and raid units
|
|
for i=1,4 do unitstrings["party" .. i] = true end
|
|
for i=1,4 do unitstrings["partypet" .. i] = true end
|
|
for i=1,40 do unitstrings["raid" .. i] = true end
|
|
for i=1,40 do unitstrings["raidpet" .. i] = true end
|
|
|
|
-- cached aggro detection function
|
|
local aggrodata = { }
|
|
local function UnitHasAggro(unit)
|
|
local now = GetTime()
|
|
if aggrodata[unit] and now < aggrodata[unit].check + 1 then
|
|
return aggrodata[unit].state
|
|
end
|
|
|
|
aggrodata[unit] = aggrodata[unit] or { }
|
|
aggrodata[unit].check = now
|
|
aggrodata[unit].state = 0
|
|
|
|
if UnitExists(unit) and UnitIsFriend(unit, "player") then
|
|
for u in pairs(unitstrings) do
|
|
local t = u .. "target"
|
|
local tt = t .. "target"
|
|
|
|
if UnitExists(t) and UnitIsUnit(t, unit) and UnitCanAttack(u, unit) then
|
|
aggrodata[unit].state = aggrodata[unit].state + 1
|
|
end
|
|
|
|
if UnitExists(tt) and UnitIsUnit(tt, unit) and UnitCanAttack(t, unit) then
|
|
aggrodata[unit].state = aggrodata[unit].state + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
return aggrodata[unit].state
|
|
end
|
|
|
|
module.enable = function(self)
|
|
ShaguTweaks.UnitFrame_NewComponent('aggro indicator', {
|
|
events = {
|
|
'FRAME_TICK_250',
|
|
},
|
|
|
|
create = function(frame)
|
|
-- create aggro icon
|
|
frame.aggro = CreateFrame("Frame", nil, frame.bar)
|
|
frame.aggro:SetPoint("TOPRIGHT", frame.bar, "TOPRIGHT", 0, 0)
|
|
|
|
frame.aggro:SetWidth(12)
|
|
frame.aggro:SetHeight(10)
|
|
frame.aggro:SetBackdrop(backdrop)
|
|
ShaguTweaks.DarkenFrame(frame.aggro)
|
|
|
|
frame.aggro.tex = frame.aggro:CreateTexture(nil, 'BACKGROUND')
|
|
frame.aggro.tex:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-Skills-Bar")
|
|
frame.aggro.tex:SetVertexColor(1, 0, 0, 1)
|
|
frame.aggro.tex:SetPoint("TOPLEFT", frame.aggro, "TOPLEFT", 2, -2)
|
|
frame.aggro.tex:SetPoint("BOTTOMRIGHT", frame.aggro, "BOTTOMRIGHT", -2, 2)
|
|
frame.aggro:Hide()
|
|
end,
|
|
|
|
update = function(frame, event)
|
|
if not event then return end
|
|
|
|
if UnitHasAggro(frame.unitstr) > 0 then
|
|
frame.aggro:Show()
|
|
else
|
|
frame.aggro:Hide()
|
|
end
|
|
end
|
|
})
|
|
end
|