You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

204 lines
7.3 KiB

local SLE, T, E, L, V, P, G = unpack(ElvUI_SLE)
local NP = E.NamePlates
local N = SLE.Nameplates
-- GLOBALS: unpack, select, format, UnitName, hooksecurefunc, UnitIsPlayer, C_NamePlate
local format = format
local GetNamePlates = C_NamePlate.GetNamePlates
local UnitName, UnitExists = UnitName, UnitExists
local rosterTimer
--Table to cache the members of player's group
N.GroupMembers = {}
function N:CreateThreatIndicator(nameplate)
nameplate.SLE_threatInfo = nameplate.Health:CreateFontString(nil, 'OVERLAY')
nameplate.SLE_threatInfo:SetPoint('BOTTOMLEFT', nameplate.Health, 'BOTTOMLEFT', E.db.sle.nameplates.threat.xoffset, E.db.sle.nameplates.threat.yoffset)
nameplate.SLE_threatInfo:SetJustifyH('LEFT')
nameplate.SLE_threatInfo:FontTemplate(E.LSM:Fetch('font', E.db.sle.nameplates.threat.font), E.db.sle.nameplates.threat.size, E.db.sle.nameplates.threat.fontOutline)
end
hooksecurefunc(NP, 'ThreatIndicator_PostUpdate', function(threat, unit)
if not threat.__owner then return end
if threat.__owner.SLE_threatInfo then
threat.__owner.SLE_threatInfo:SetText() --Reseting text to empty
if E.db.sle.nameplates.threat.enable and threat.__owner.frameType == 'ENEMY_NPC' then
if not unit then
for i=1, 4 do
if threat.__owner.guid == UnitGUID(format('boss%d', i)) then
unit = format('boss%d', i)
break
end
end
end
if unit and not UnitIsPlayer(unit) and UnitCanAttack('player', unit) then
local status, percent = select(2, UnitDetailedThreatSituation('player', unit))
if (status) then
threat.__owner.SLE_threatInfo:SetFormattedText('%s%.0f%%|r', E:RGBToHex(GetThreatStatusColor(status)), percent or '')
end
end
else
threat.__owner.SLE_threatInfo:SetText('')
end
end
end)
function N:CreateTargetCounter(nameplate)
nameplate.SLE_targetcount = nameplate.Health:CreateFontString(nil, 'OVERLAY')
nameplate.SLE_targetcount:SetPoint('BOTTOMRIGHT', nameplate.Health, 'BOTTOMRIGHT', E.db.sle.nameplates.targetcount.xoffset, E.db.sle.nameplates.targetcount.yoffset)
nameplate.SLE_targetcount:SetJustifyH('RIGHT')
nameplate.SLE_TargetedByCounter = 0
nameplate.SLE_targetcount:FontTemplate(E.LSM:Fetch('font', E.db.sle.nameplates.targetcount.font), E.db.sle.nameplates.targetcount.size, E.db.sle.nameplates.targetcount.fontOutline)
nameplate.SLE_targetcount:SetText()
end
function N:UpdateCount(event, unit, force)
if E.db.sle.nameplates.targetcount == nil or not E.db.sle.nameplates.targetcount.enable then return end
if (not strfind(unit, 'raid') and not strfind(unit, 'party') and not (unit == 'player' and force) and not N.TestSoloTarget) or strfind(unit, 'pet') then return end
local isGrouped = IsInRaid() or IsInGroup()
local target
--Forced update of the roster. Usually on load
if force and isGrouped then N:UpdateRoster() end
for _, frame in pairs(GetNamePlates()) do
if(frame and frame.unitFrame) then
local plate = frame.unitFrame
--Reset couunter
plate.SLE_targetcount:SetText('')
plate.SLE_TargetedByCounter = 0
--If in group, then update counter
if isGrouped then
for _, unitid in pairs(N.GroupMembers) do --For every unit in roster
if not UnitIsUnit(unitid, 'player') and plate.unit then
target = format('%starget', unitid) --Get group member's target
plate.guid = UnitGUID(plate.unit) --Find unit's guid
if plate.guid and UnitExists(target) then --If target exists and plate actually has unit, then someone actually targets this plate
if UnitGUID(target) == plate.guid then
plate.SLE_TargetedByCounter = plate.SLE_TargetedByCounter + 1
end
end
end
end
end
--If debug mode is set
if N.TestSoloTarget then
plate.guid = UnitGUID(plate.unit)
if plate.guid and UnitExists('target') then
if UnitGUID('target') == plate.guid then
plate.SLE_TargetedByCounter = plate.SLE_TargetedByCounter + 1
end
end
end
if not (plate.SLE_TargetedByCounter == 0) then
plate.SLE_targetcount:SetText(format('[%d]', plate.SLE_TargetedByCounter))
end
end
end
end
--Adding people to roster table
local function AddToRoster(unitId)
local unitName = UnitName(unitId)
if unitName then N.GroupMembers[unitName] = unitId end
end
function N:UpdateRoster()
wipe(N.GroupMembers)
local groupSize = IsInRaid() and GetNumGroupMembers() or IsInGroup() and GetNumSubgroupMembers() or 0
local groupType = IsInRaid() and 'raid' or IsInGroup() and 'party' or 'solo'
for index = 1, groupSize do
AddToRoster(groupType..index)
end
if groupType == 'party' then
AddToRoster('player')
end
end
--Set a timer. cause on group update info about new member is not immidiately available
function N:StartRosterUpdate()
if not rosterTimer then
rosterTimer = N:ScheduleTimer(N.UpdateRoster, 1)
end
end
function N:NamePlateCallBackSLE(nameplate, event, unit)
if not nameplate then return end
if event == 'NAME_PLATE_UNIT_ADDED' then
--If nameplate is shown, update counter cause someone may have been targeting this bastard offscreen
N:UpdateCount(nil, 'player', true)
elseif event == 'NAME_PLATE_UNIT_REMOVED' then
--Nameplate is hidden, reset everything
if nameplate.SLE_threatInfo then
nameplate.SLE_threatInfo:SetText('')
end
if nameplate.SLE_targetcount then
nameplate.SLE_targetcount:SetText('')
nameplate.SLE_TargetedByCounter = 0
end
end
end
--Creating additional nameplate elements
4 years ago
function N:CreateNameplate(frame)
if not frame then return end
if not frame.SLE_threatInfo then
N:CreateThreatIndicator(frame)
end
if not frame.SLE_targetcount then
N:CreateTargetCounter(frame)
end
end
function N:UpdatePlate(nameplate)
N.db = E.db.sle.nameplates
if nameplate.SLE_threatInfo then
nameplate.SLE_threatInfo:FontTemplate(E.LSM:Fetch('font', N.db.threat.font), N.db.threat.size, N.db.threat.fontOutline)
nameplate.SLE_threatInfo:SetPoint('BOTTOMLEFT', nameplate.Health, 'BOTTOMLEFT', N.db.threat.xoffset, N.db.threat.yoffset)
if not N.db.threat.enable then nameplate.SLE_threatInfo:SetText('') end
end
if nameplate.SLE_targetcount then
nameplate.SLE_targetcount:FontTemplate(E.LSM:Fetch('font', N.db.targetcount.font), N.db.targetcount.size, N.db.targetcount.fontOutline)
nameplate.SLE_targetcount:SetPoint('BOTTOMRIGHT', nameplate.Health, 'BOTTOMRIGHT', N.db.targetcount.xoffset, N.db.targetcount.yoffset)
if N.db.targetcount.enable then N:UpdateCount(nil, 'player', true) else nameplate.SLE_targetcount:SetText(''); nameplate.SLE_TargetedByCounter = 0 end
end
end
function N:Initialize()
if not SLE.initialized or not E.private.nameplates.enable then return end
N.db = E.db.sle.nameplates
--Hooking to ElvUI's nameplates
4 years ago
hooksecurefunc(NP, 'StylePlate', N.CreateNameplate)
hooksecurefunc(NP, 'UpdatePlate', N.UpdatePlate)
N:RegisterEvent('GROUP_ROSTER_UPDATE', 'StartRosterUpdate')
N:RegisterEvent('UNIT_TARGET', 'UpdateCount')
hooksecurefunc(NP, 'NamePlateCallBack', N.NamePlateCallBackSLE)
--This function call is to update target count, cause right after creating it doesn't show up
-- E:Delay(.3, function() N:UpdateCount(nil, 'player', true) end)
function N:ForUpdateAll()
N.db = E.db.sle.nameplates
N:UpdateCount(nil, 'player', true)
end
N:ForUpdateAll()
end
SLE:RegisterModule(N:GetName())