From 8a2accdb08aea3ff63fa63134dc0fbccf7400e75 Mon Sep 17 00:00:00 2001 From: Adrian L Lange Date: Sun, 21 Sep 2014 17:48:28 +0200 Subject: [PATCH] Rewrite the tags to only use events - Also moved cpoints to player --- elements/tags.lua | 279 ++++++++++++++++++++++++++--------------------------- oUF_P3lim.lua | 31 +++--- 2 files changed, 156 insertions(+), 154 deletions(-) diff --git a/elements/tags.lua b/elements/tags.lua index d02a2ce..a00d5b4 100644 --- a/elements/tags.lua +++ b/elements/tags.lua @@ -1,11 +1,16 @@ -local _, ns = ... -local tags = ns.oUF.Tags +local tags = select(2, ...).oUF.Tags -local function ShortValue(value) +local gsub = string.gsub +local format = string.format +local floor = math.floor + +local DEAD_TEXTURE = [[|TInterface\RaidFrame\Raid-Icon-DebuffDisease:26|t]] + +local function Short(value) if(value >= 1e6) then - return ('%.2fm'):format(value / 1e6):gsub('%.?0+([km])$', '%1') + return gsub(format('%.2fm', value / 1e6), '%.?0+([km])$', '%1') elseif(value >= 1e4) then - return ('%.1fk'):format(value / 1e3):gsub('%.?0+([km])$', '%1') + return gsub(format('%.1fk', value / 1e3), '%.?0+([km])$', '%1') else return value end @@ -21,148 +26,142 @@ local function Status(unit) end end -tags.Methods['p3lim:status'] = Status - -tags.Methods['p3lim:health'] = function(unit) - local max = UnitHealthMax(unit) - if(UnitHealth(unit) == max) then - return max - end -end - -tags.Methods['p3lim:deficit'] = function(unit) - if(Status(unit)) then return end - - local cur, max = UnitHealth(unit), UnitHealthMax(unit) - if(cur ~= max) then - return ('|cffff8080-%s|r'):format(ShortValue(max - cur)) - end -end - -tags.Methods['p3lim:percent'] = function(unit) - if(Status(unit)) then return end - - return ('%d|cff0090ff%%|r'):format(UnitHealth(unit) / UnitHealthMax(unit) * 100) -end - -tags.Methods['p3lim:phealth'] = function(unit) - if(Status(unit)) then return end - - local maxHealth = _TAGS['p3lim:health'](unit) - if(maxHealth) then - return ShortValue(maxHealth) - else - return ('%s %s'):format(_TAGS['p3lim:deficit'](unit), _TAGS['p3lim:percent'](unit)) - end -end - -tags.Methods['p3lim:thealth'] = function(unit) - if(Status(unit)) then return end - - if(UnitCanAttack('player', unit)) then - return ('%s (%s)'):format(ShortValue(UnitHealth(unit)), _TAGS['p3lim:percent'](unit)) - else - local maxHealth = _TAGS['p3lim:health'](unit) - if(maxHealth) then - return ShortValue(maxHealth) - else - return ('%s |cff0090ff/|r %s'):format(ShortValue(UnitHealth(unit)), ShortValue(UnitHealthMax(unit))) +local events = { + curhp = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH', + defhp = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH', + maxhp = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH', + perhp = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH', + pethp = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH', + targethp = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH', + curpp = 'UNIT_POWER_FREQUENT UNIT_MAXPOWER', + altpp = 'UNIT_POWER_FREQUENT UNIT_MAXPOWER UNIT_DISPLAYPOWER', + ptype = 'UNIT_DISPLAYPOWER', + leader = 'PARTY_LEADER_CHANGED', + combo = 'UNIT_COMBO_POINTS PLAYER_TARGET_CHANGED', + anticipation = 'UNIT_AURA', + spell = 'UNIT_SPELLCAST_START UNIT_SPELLCAST_STOP UNIT_SPELLCAST_CHANNEL_START UNIT_SPELLCAST_CHANNEL_STOP', + color = 'UNIT_REACTION UNIT_FACTION', + status = 'UNIT_CONNECTION UNIT_HEALTH' +} + +for tag, func in next, { + curhp = function(unit) + if(Status(unit)) then return end + return Short(UnitHealth(unit)) + end, + defhp = function(unit) + if(Status(unit)) then return end + + local cur = UnitHealth(unit) + local max = UnitHealthMax(unit) + if(cur ~= max) then + return Short(max - cur) end - end -end - -tags.Methods['p3lim:power'] = function(unit) - local cur = UnitPower(unit) - if(cur > 0 and not UnitIsDeadOrGhost(unit)) then - local _, type = UnitPowerType(unit) - local colors = _COLORS.power - return ('%s%d|r'):format(Hex(colors[type] or colors['RUNES']), cur) - end -end - -tags.Methods['p3lim:mana'] = function(unit) - local cur, max = UnitPower(unit, 0), UnitPowerMax(unit, 0) - if(UnitPowerType(unit) ~= 0 and cur ~= max) then - return ('%d%%'):format(cur / max * 100) - end -end - -tags.Events['p3lim:color'] = 'UNIT_REACTION UNIT_FACTION' -tags.Methods['p3lim:color'] = function(unit) - local reaction = UnitReaction(unit, 'player') - if((UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit)) or not UnitIsConnected(unit)) then - return Hex(3/5, 3/5, 3/5) - elseif(not UnitIsPlayer(unit) and reaction) then - return Hex(_COLORS.reaction[reaction]) - elseif(UnitFactionGroup(unit) and UnitIsEnemy(unit, 'player') and UnitIsPVP(unit)) then - return Hex(1, 0, 0) - else - return Hex(1, 1, 1) - end -end - -tags.Events['p3lim:leader'] = 'PARTY_LEADER_CHANGED' -tags.Methods['p3lim:leader'] = function(unit) - if(UnitIsGroupLeader(unit)) then - return '|cffffff00!|r' - end -end + end, + maxhp = function(unit) + if(Status(unit)) then return end -tags.Methods['p3lim:spell'] = function(unit) - return UnitCastingInfo(unit) or UnitChannelInfo(unit) -end + local max = UnitHealthMax(unit) + if(max == UnitHealth(unit)) then + return Short(max) + end + end, + perhp = function(unit) + if(Status(unit)) then return end + + local cur = UnitHealth(unit) + local max = UnitHealthMax(unit) + if(cur ~= max) then + return floor(cur / max * 100) + end + end, + pethp = function() + if(UnitIsUnit('pet', 'vehicle')) then return end -tags.Methods['p3lim:pet'] = function() - local cur = UnitHealth('pet') - if(cur > 0) then + local cur = UnitHealth('pet') local max = UnitHealthMax('pet') - return ('%s%d%%|r'):format(Hex(ColorGradient(cur, max, 1, 0, 0, 1, 1, 0, 1, 1, 1)), cur / max * 100) - elseif(UnitIsDead('pet')) then - return [[|TInterface\RaidFrame\Raid-Icon-DebuffDisease:26|t]] - end -end - -local isRogue = (select(2, UnitClass('player'))) == 'ROGUE' -if(isRogue) then - tags.SharedEvents.UNIT_AURA = true - tags.Events['p3lim:cpoints'] = 'UNIT_COMBO_POINTS PLAYER_TARGET_CHANGED UNIT_AURA' -else - tags.Events['p3lim:cpoints'] = 'UNIT_COMBO_POINTS PLAYER_TARGET_CHANGED' -end - -tags.Methods['p3lim:cpoints'] = function() - local points - if(UnitHasVehicleUI('player')) then - points = GetComboPoints('vehicle', 'target') - else - points = GetComboPoints('player', 'target') - end - - local anticipation - if(isRogue) then - for index = 1, 40 do - local _, _, _, count, _, _, _, _, _, _, spellID = UnitAura('player', index, 'HELPFUL') - if(spellID and spellID == 115189 and count and count > 0) then - anticipation = count - break - elseif(not spellID) then - break - end + if(cur > 0) then + return format('%s%d%%|r', Hex(ColorGradient(cur, max, 1, 0, 0, 1, 1, 0, 1, 1, 1)), cur / max * 100) + elseif(UnitIsDead('pet')) then + return DEAD_TEXTURE end - end - - local prefix = '' - if(anticipation) then - prefix = anticipation .. ' ' - end + end, + targethp = function(unit) + if(Status(unit)) then return end + + local cur = UnitHealth(unit) + local max = UnitHealthMax(unit) + if(UnitCanAttack('player', unit)) then + return format('(%d|cff0090ff%%|r)', cur / max * 100) + elseif(cur ~= max) then + return format('|cff0090ff/|r %s', Short(max)) + end + end, + curpp = function(unit) + if(Status(unit)) then return end - if(points > 0 or anticipation) then + local cur = UnitPower(unit) + if(cur > 0) then + return Short(cur) + end + end, + altpp = function(unit) + local cur = UnitPower(unit, 0) + local max = UnitPowerMax(unit, 0) + if(UnitPowerType(unit) ~= 0 and cur ~= max) then + return floor(cur / max * 100) + end + end, + ptype = function(unit) + local _, type = UnitPowerType(unit) + return Hex(_COLORS.power[type]) + end, + leader = function(unit) + return UnitIsGroupLeader(unit) and '|cffffff00!|r' + end, + spell = function(unit) + return UnitCastingInfo(unit) or UnitChannelInfo(unit) + end, + combo = function(unit) + if(not UnitExists('target')) then return end + + local points = GetComboPoints(unit, 'target') if(points == 5) then - return prefix .. '|cffcc3333' .. points .. '|r' + return format('|cffcc3333%d|r', points) elseif(points == 4) then - return prefix .. '|cffff6600' .. points .. '|r' - else - return prefix .. '|cffffcc00' .. points .. '|r' + return format('|cffff6600%d|r', points) + elseif(points > 0) then + return format('|cffffcc00%d|r', points) end - end + end, + anticipation = function(unit) + if(not UnitExists('target')) then return end + + local index, points = 1 + repeat + local _, _, _, count, _, _, _, _, _, _, spellID = UnitAura(unit, index, 'HELPFUL') + if(spellID == 115189) then + points = count + break + end + + index = index + 1 + until(not spellID) + + return points + end, + color = function(unit) + local reaction = UnitReaction(unit, 'player') + if((UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit)) or not UnitIsConnected(unit)) then + return '|cff999999' + elseif(not UnitIsPlayer(unit) and reaction) then + return Hex(_COLORS.reaction[reaction]) + elseif(UnitFactionGroup(unit) and UnitIsEnemy(unit, 'player') and UnitIsPVP(unit)) then + return '|cffff0000' + end + end, + status = Status +} do + tags.Methods['p3lim:' .. tag] = func + tags.Events['p3lim:' .. tag] = events[tag] end diff --git a/oUF_P3lim.lua b/oUF_P3lim.lua index 6969faa..3672093 100644 --- a/oUF_P3lim.lua +++ b/oUF_P3lim.lua @@ -233,8 +233,7 @@ local UnitSpecific = { PowerValue:SetPoint('RIGHT', self.HealthValue, 'LEFT', -3) PowerValue:SetFont(FONT, 8, 'OUTLINEMONOCHROME') PowerValue:SetJustifyH('LEFT') - PowerValue.frequentUpdates = 0.1 - self:Tag(PowerValue, '[p3lim:power][ |cff997fcc>demonicfury<|r][ |cff0090ff>p3lim:mana<|r][ | >p3lim:spell]') + self:Tag(PowerValue, '[p3lim:ptype][p3lim:curpp]|r[ |cff997fcc>demonicfury<|r][ |cff0090ff>p3lim:altpp<%|r][ | >p3lim:spell]') local Experience = CreateFrame('StatusBar', nil, self) Experience:SetPoint('BOTTOM', 0, -20) @@ -257,6 +256,17 @@ local UnitSpecific = { local _, playerClass = UnitClass('player') + local ComboPoints = self:CreateFontString(nil, 'OVERLAY', 'SubZoneTextFont') + ComboPoints:SetPoint('RIGHT', self, 'LEFT', 590, -2) + ComboPoints:SetJustifyH('RIGHT') + ComboPoints:SetTextColor(1, 1, 1) + + if(playerClass == 'ROGUE') then + self:Tag(ComboPoints, '[p3lim:anticipation< ][p3lim:combo]') + else + self:Tag(ComboPoints, '[p3lim:combo]') + end + local ClassIcons = {} ClassIcons.UpdateTexture = function() end ClassIcons.PostUpdate = PostUpdateClassIcon @@ -399,16 +409,10 @@ local UnitSpecific = { self.Buffs.PostUpdateIcon = PostUpdateBuff self.Buffs.CustomFilter = FilterPlayerBuffs - self:Tag(self.HealthValue, '[p3lim:pet< : ][p3lim:status][p3lim:phealth]') + self:Tag(self.HealthValue, '[p3lim:pethp< : ][p3lim:status][p3lim:maxhp][|cffff8080->p3lim:defhp<|r][ >p3lim:perhp<|cff0090ff%|r]') self:SetWidth(230) end, target = function(self) - local ComboPoints = self:CreateFontString(nil, 'OVERLAY', 'SubZoneTextFont') - ComboPoints:SetPoint('RIGHT', self, 'LEFT', -9, -2) - ComboPoints:SetJustifyH('RIGHT') - ComboPoints:SetTextColor(1, 1, 1) - self:Tag(ComboPoints, '[p3lim:cpoints]') - self.Castbar.PostCastStart = PostUpdateCast self.Castbar.PostCastInterruptible = PostUpdateCast self.Castbar.PostCastNotInterruptible = PostUpdateCast @@ -422,7 +426,7 @@ local UnitSpecific = { self.Debuffs.PostUpdateIcon = PostUpdateDebuff self.Power.PostUpdate = PostUpdatePower - self:Tag(self.HealthValue, '[p3lim:status][p3lim:thealth]') + self:Tag(self.HealthValue, '[p3lim:status][p3lim:curhp][ >p3lim:targethp]') self:SetWidth(230) end, party = function(self) @@ -442,17 +446,17 @@ local UnitSpecific = { self.Health:SetAllPoints() self:Tag(self.Name, '[p3lim:leader][raidcolor][name]') - self:Tag(self.HealthValue, '[p3lim:status][p3lim:percent]') + self:Tag(self.HealthValue, '[p3lim:status][p3lim:perhp<|cff0090ff%|r]') end, boss = function(self) self:SetSize(126, 19) self.Health:SetAllPoints() - self:Tag(self.HealthValue, '[p3lim:percent]') + self:Tag(self.HealthValue, '[p3lim:perhp<|cff0090ff%|r]') end, arena = function(self) self:SetSize(126, 19) self:Tag(self.Name, '[raidcolor][name]') - self:Tag(self.HealthValue, '[p3lim:percent]') + self:Tag(self.HealthValue, '[p3lim:perhp<|cff0090ff%|r]') self.Health:SetHeight(17) end } @@ -484,7 +488,6 @@ local function Shared(self, unit) HealthValue:SetPoint('RIGHT', -2, 0) HealthValue:SetFont(FONT, 8, 'OUTLINEMONOCHROME') HealthValue:SetJustifyH('RIGHT') - HealthValue.frequentUpdates = 1/4 self.HealthValue = HealthValue if(unit == 'player' or unit == 'target' or unit == 'arena') then -- 1.7.9.5