完成焦点等开发
This commit is contained in:
144
Units/Pet.lua
144
Units/Pet.lua
@@ -270,11 +270,13 @@ function SFrames.Pet:Initialize()
|
||||
end)
|
||||
|
||||
f:SetScript("OnEnter", function()
|
||||
if SetMouseoverUnit then SetMouseoverUnit("pet") end
|
||||
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
||||
GameTooltip:SetUnit("pet")
|
||||
GameTooltip:Show()
|
||||
end)
|
||||
f:SetScript("OnLeave", function()
|
||||
if SetMouseoverUnit then SetMouseoverUnit() end
|
||||
GameTooltip:Hide()
|
||||
end)
|
||||
|
||||
@@ -297,6 +299,25 @@ function SFrames.Pet:Initialize()
|
||||
f.health.bg:SetTexture(SFrames:GetTexture())
|
||||
f.health.bg:SetVertexColor(_A.slotBg[1], _A.slotBg[2], _A.slotBg[3], _A.slotBg[4] or 1)
|
||||
|
||||
-- Heal prediction overlay (incoming heals)
|
||||
f.health.healPredMine = f.health:CreateTexture(nil, "ARTWORK")
|
||||
f.health.healPredMine:SetTexture(SFrames:GetTexture())
|
||||
f.health.healPredMine:SetVertexColor(0.4, 1.0, 0.55, 0.78)
|
||||
f.health.healPredMine:SetDrawLayer("ARTWORK", 2)
|
||||
f.health.healPredMine:Hide()
|
||||
|
||||
f.health.healPredOther = f.health:CreateTexture(nil, "ARTWORK")
|
||||
f.health.healPredOther:SetTexture(SFrames:GetTexture())
|
||||
f.health.healPredOther:SetVertexColor(0.2, 0.9, 0.35, 0.5)
|
||||
f.health.healPredOther:SetDrawLayer("ARTWORK", 2)
|
||||
f.health.healPredOther:Hide()
|
||||
|
||||
f.health.healPredOver = f.health:CreateTexture(nil, "OVERLAY")
|
||||
f.health.healPredOver:SetTexture(SFrames:GetTexture())
|
||||
f.health.healPredOver:SetVertexColor(1.0, 0.3, 0.3, 0.6)
|
||||
f.health.healPredOver:SetDrawLayer("OVERLAY", 7)
|
||||
f.health.healPredOver:Hide()
|
||||
|
||||
-- Power Bar
|
||||
f.power = SFrames:CreateStatusBar(f, "SFramesPetPower")
|
||||
f.power:SetPoint("TOPLEFT", f.health, "BOTTOMLEFT", 0, -1)
|
||||
@@ -434,6 +455,128 @@ function SFrames.Pet:UpdateHealth()
|
||||
else
|
||||
self.frame.healthText:SetText("")
|
||||
end
|
||||
|
||||
self:UpdateHealPrediction()
|
||||
end
|
||||
|
||||
function SFrames.Pet:UpdateHealPrediction()
|
||||
if not (self.frame and self.frame.health and self.frame.health.healPredMine and self.frame.health.healPredOther and self.frame.health.healPredOver) then return end
|
||||
local predMine = self.frame.health.healPredMine
|
||||
local predOther = self.frame.health.healPredOther
|
||||
local predOver = self.frame.health.healPredOver
|
||||
|
||||
local function HidePredictions()
|
||||
predMine:Hide()
|
||||
predOther:Hide()
|
||||
predOver:Hide()
|
||||
end
|
||||
|
||||
local hp = UnitHealth("pet") or 0
|
||||
local maxHp = UnitHealthMax("pet") or 0
|
||||
|
||||
if CheckSuperWow then
|
||||
local ok, hasSW = pcall(CheckSuperWow)
|
||||
if ok and hasSW then
|
||||
local ok2, realHp = pcall(UnitHealth, "pet")
|
||||
if ok2 then hp = realHp or hp end
|
||||
local ok3, realMaxHp = pcall(UnitHealthMax, "pet")
|
||||
if ok3 then maxHp = realMaxHp or maxHp end
|
||||
end
|
||||
end
|
||||
|
||||
if maxHp <= 0 or UnitIsDeadOrGhost("pet") then
|
||||
HidePredictions()
|
||||
return
|
||||
end
|
||||
|
||||
local totalIncoming, mineIncoming, othersIncoming = 0, 0, 0
|
||||
local ok, t, m, o = pcall(function() return SFrames:GetIncomingHeals("pet") end)
|
||||
if ok then
|
||||
totalIncoming, mineIncoming, othersIncoming = t or 0, m or 0, o or 0
|
||||
end
|
||||
|
||||
local missing = maxHp - hp
|
||||
if missing <= 0 and (mineIncoming <= 0 and othersIncoming <= 0) then
|
||||
HidePredictions()
|
||||
return
|
||||
end
|
||||
|
||||
local mineShown = math.min(math.max(0, mineIncoming), missing)
|
||||
local remaining = missing - mineShown
|
||||
local otherShown = math.min(math.max(0, othersIncoming), remaining)
|
||||
if mineShown <= 0 and otherShown <= 0 and (mineIncoming <= 0 and othersIncoming <= 0) then
|
||||
HidePredictions()
|
||||
return
|
||||
end
|
||||
|
||||
local barWidth = self.frame.health:GetWidth()
|
||||
if barWidth <= 0 then
|
||||
HidePredictions()
|
||||
return
|
||||
end
|
||||
|
||||
local currentWidth = (hp / maxHp) * barWidth
|
||||
if currentWidth < 0 then currentWidth = 0 end
|
||||
if currentWidth > barWidth then currentWidth = barWidth end
|
||||
|
||||
local availableWidth = barWidth - currentWidth
|
||||
if availableWidth <= 0 and (mineIncoming <= 0 and othersIncoming <= 0) then
|
||||
HidePredictions()
|
||||
return
|
||||
end
|
||||
|
||||
local mineWidth = 0
|
||||
local otherWidth = 0
|
||||
if missing > 0 then
|
||||
mineWidth = (mineShown / missing) * availableWidth
|
||||
otherWidth = (otherShown / missing) * availableWidth
|
||||
if mineWidth < 0 then mineWidth = 0 end
|
||||
if otherWidth < 0 then otherWidth = 0 end
|
||||
if mineWidth > availableWidth then mineWidth = availableWidth end
|
||||
if otherWidth > (availableWidth - mineWidth) then
|
||||
otherWidth = availableWidth - mineWidth
|
||||
end
|
||||
end
|
||||
|
||||
if mineWidth > 0 then
|
||||
predMine:ClearAllPoints()
|
||||
predMine:SetPoint("TOPLEFT", self.frame.health, "TOPLEFT", currentWidth, 0)
|
||||
predMine:SetPoint("BOTTOMLEFT", self.frame.health, "BOTTOMLEFT", currentWidth, 0)
|
||||
predMine:SetWidth(mineWidth)
|
||||
predMine:SetHeight(self.frame.health:GetHeight())
|
||||
predMine:Show()
|
||||
else
|
||||
predMine:Hide()
|
||||
end
|
||||
|
||||
if otherWidth > 0 then
|
||||
predOther:ClearAllPoints()
|
||||
predOther:SetPoint("TOPLEFT", self.frame.health, "TOPLEFT", currentWidth + mineWidth, 0)
|
||||
predOther:SetPoint("BOTTOMLEFT", self.frame.health, "BOTTOMLEFT", currentWidth + mineWidth, 0)
|
||||
predOther:SetWidth(otherWidth)
|
||||
predOther:SetHeight(self.frame.health:GetHeight())
|
||||
predOther:Show()
|
||||
else
|
||||
predOther:Hide()
|
||||
end
|
||||
|
||||
local totalIncomingValue = mineIncoming + othersIncoming
|
||||
local overHeal = totalIncomingValue - missing
|
||||
if overHeal > 0 then
|
||||
local overWidth = math.floor((overHeal / maxHp) * barWidth + 0.5)
|
||||
if overWidth > 0 then
|
||||
predOver:ClearAllPoints()
|
||||
predOver:SetPoint("TOPLEFT", self.frame.health, "TOPRIGHT", 0, 0)
|
||||
predOver:SetPoint("BOTTOMLEFT", self.frame.health, "BOTTOMRIGHT", 0, 0)
|
||||
predOver:SetWidth(overWidth)
|
||||
predOver:SetHeight(self.frame.health:GetHeight())
|
||||
predOver:Show()
|
||||
else
|
||||
predOver:Hide()
|
||||
end
|
||||
else
|
||||
predOver:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
function SFrames.Pet:UpdatePowerType()
|
||||
@@ -1118,6 +1261,7 @@ function SFrames.Pet:CreateAuras()
|
||||
this.timer = this.timer + arg1
|
||||
if this.timer >= 0.25 then
|
||||
SFrames.Pet:TickAuras()
|
||||
SFrames.Pet:UpdateHealPrediction()
|
||||
this.timer = 0
|
||||
end
|
||||
end)
|
||||
|
||||
Reference in New Issue
Block a user