插件[血量扩展]

1、移除主插件中集成,更换为根目录独立插件;
2、增加总血条显示;
3、增加buff显示。
This commit is contained in:
尚美 2025-08-31 00:34:18 +08:00
parent f89b248760
commit e561c97a29
15 changed files with 810 additions and 251 deletions

View File

@ -1,6 +1,8 @@
-- 配置参数
local MAX_HEALTH_PER_LAYER = 100000000
local SHAKE_ENABLED = 1 -- 震动开关变量设置为 false 可禁用震动
print("血量扩展插件开始")
local MAX_HEALTH_PER_LAYER = 10000000000
local SHAKE_ENABLED = false -- 震动开关变量设置为 false 可禁用震动
local SHAKE_INTENSITY = 2 -- 震动强度
local Translation_1 = 0.01 -- 震动速度1-向下速度
local Translation_2 = 0.21 -- 震动速度2-回弹速度
@ -10,66 +12,260 @@ local SHAKE_COOLDOWN = 0.1 -- 独立震动冷却
local HEALTHFRAME_W = 800 --血条宽度
local HEALTHFRAME_H = 25 --血条高度
-- 血条颜色
local LAYER_COLOR_TABLE = {
{ r = 1.00, g = 0.00, b = 0.00 }, -- 红
{ r = 0.00, g = 1.00, b = 0.00 }, -- 绿
{ r = 0.00, g = 0.00, b = 1.00 }, -- 蓝
{ r = 1.00, g = 1.00, b = 0.00 }, -- 黄
{ r = 1.00, g = 0.00, b = 1.00 }, -- 品红
{ r = 0.00, g = 1.00, b = 1.00 }, -- 青
{ r = 1.00, g = 0.50, b = 0.00 }, -- 橙
{ r = 0.50, g = 0.00, b = 1.00 }, -- 紫
{ r = 0.50, g = 0.50, b = 0.50 }, -- 灰
-- 基础高饱和色
{ r = 1.00, g = 0.00, b = 0.00 }, -- 红(原色,饱和)
{ r = 0.00, g = 1.00, b = 0.00 }, -- 绿(原色,饱和)
{ r = 1.00, g = 1.00, b = 0.00 }, -- 黄(原色,饱和)
{ r = 1.00, g = 0.00, b = 1.00 }, -- 品红(原色,饱和)
{ r = 0.00, g = 1.00, b = 1.00 }, -- 青(原色,饱和)
{ r = 1.00, g = 0.50, b = 0.00 }, -- 橙(饱和度已提高)
{ r = 0.00, g = 0.18, b = 0.65 }, -- 克莱因蓝RGB: #002FA7
{ r = 0.98, g = 0.86, b = 0.14 }, -- 申布伦黄RGB: #F9DC24
{ r = 0.46, g = 0.00, b = 0.13 }, -- 勃艮第红RGB: #990033
{ r = 0.18, g = 0.55, b = 0.34 }, -- 马尔斯绿RGB: #2E8B57
{ r = 0.99, g = 0.39, b = 0.28 }, -- 提香红RGB: #FF6347
}
Creature_MultiLifeMultiplierAddon = Creature_MultiLifeMultiplierAddon or {
SavedData = {}, -- 现在按GUID存储不是Entry
CreatureTemplates = {}, -- 新增按Entry存储模板数据
CurrentTargetGUID = nil, -- 改为存储GUID
lastDamageTrackTime = 0, -- 独立追踪冷却计时
lastShakeTime = 0, -- 独立震动冷却计时
-- 新增:保存原始目标框架状态
originalTargetFrameState =
Creature_MultiLifeMultiplierAddon = Creature_MultiLifeMultiplierAddon or
{
wasShown = false
SavedData = {}, -- 现在按GUID存储不是Entry
CreatureTemplates = {}, -- 新增按Entry存储模板数据
CurrentTargetGUID = nil, -- 改为存储GUID
lastDamageTrackTime = 0, -- 独立追踪冷却计时
lastShakeTime = 0, -- 独立震动冷却计时
-- 保存原始目标框架状态
originalTargetFrameState =
{
wasShown = false
}
}
}
-- 安全隐藏默认目标框体
function Creature_MultiLifeMultiplierAddon:SafeHideDefaultTargetFrame()
if TargetFrame:IsShown() then
self.originalTargetFrameState.wasShown = true
TargetFrame:Hide()
else
self.originalTargetFrameState.wasShown = false
end
end
-- 安全显示默认目标框体
function Creature_MultiLifeMultiplierAddon:SafeShowDefaultTargetFrame()
-- 只有在有目标且之前确实显示的情况下才重新显示
if UnitExists("target") and (self.originalTargetFrameState.wasShown or not self.CustomHealthFrame:IsShown()) then
TargetFrame:Show()
-- 确保事件正常注册
if not TargetFrame:IsEventRegistered("PLAYER_TARGET_CHANGED") then
TargetFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
end
if not TargetFrame:IsEventRegistered("UNIT_HEALTH") then
TargetFrame:RegisterEvent("UNIT_HEALTH")
end
if not TargetFrame:IsEventRegistered("UNIT_POWER_UPDATE") then
TargetFrame:RegisterEvent("UNIT_POWER_UPDATE")
end
elseif not UnitExists("target") then
-- 没有目标时确保隐藏目标框架
TargetFrame:Hide()
end
end
-- 初始化函数
function Creature_MultiLifeMultiplierAddon:Initialize()
self:InitializeProgressBar()
self:RegisterEvents()
self:RegisterEvents() --事件
self:BuffInitialize() -- 初始化BUFF文件
end
-- 创建血条
function Creature_MultiLifeMultiplierAddon:InitializeProgressBar()
-- 创建主框架(不参与震动)
self.CustomHealthFrame = CreateFrame("Frame", "CustomHealthFrame", UIParent)
self.CustomHealthFrame:SetSize(HEALTHFRAME_W, HEALTHFRAME_H)
self.CustomHealthFrame:SetPoint("BOTTOM", UIParent, "TOP", 0, -80)
self.CustomHealthFrame:Hide()
if self.CustomHealthFrame.SetFrameLevel then
self.CustomHealthFrame:SetFrameLevel(10)
end
-- 背景血条直接放在CustomHealthFrame中
self.healthBarBg = CreateFrame("StatusBar", nil, self.CustomHealthFrame)
self.healthBarBg:SetSize(HEALTHFRAME_W, HEALTHFRAME_H)
self.healthBarBg:SetPoint("TOP", self.CustomHealthFrame, "TOP", 0, 0) -- 调整锚点
self.healthBarBg:SetStatusBarTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\StatusBar")
self.healthBarBg:SetMinMaxValues(0, MAX_HEALTH_PER_LAYER)
if self.healthBarBg.SetFrameLevel then
self.healthBarBg:SetFrameLevel(1)
end
-- 伤害跟踪条
self.damageTrackBar = CreateFrame("StatusBar", nil, self.healthBarBg)
self.damageTrackBar:SetAllPoints(self.healthBarBg)
self.damageTrackBar:SetStatusBarTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\StatusBar")
self.damageTrackBar:SetMinMaxValues(0, MAX_HEALTH_PER_LAYER)
self.damageTrackBar:Hide()
-- 主血条
self.healthBar = CreateFrame("StatusBar", nil, self.healthBarBg)
self.healthBar:SetAllPoints(self.healthBarBg)
self.healthBar:SetStatusBarTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\StatusBar")
self.healthBar:SetMinMaxValues(0, MAX_HEALTH_PER_LAYER)
if self.healthBar.SetFrameLevel then
self.healthBar:SetFrameLevel(2)
end
-- 闪光效果层
self.flashEffectBar = CreateFrame("StatusBar", nil, self.healthBarBg)
self.flashEffectBar:SetAllPoints(self.healthBarBg)
self.flashEffectBar:SetStatusBarTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\StatusBar")
self.flashEffectBar:SetMinMaxValues(0, MAX_HEALTH_PER_LAYER)
if self.flashEffectBar.SetFrameLevel then
self.flashEffectBar:SetFrameLevel(3)
end
self.flashEffectBar:Hide()
-- 血条边框
local border = CreateFrame("Frame", nil, self.healthBar)
border:SetSize(HEALTHFRAME_W + 5, HEALTHFRAME_H + 5)
border:SetPoint("CENTER", self.healthBar, "CENTER", 0, 0)
border:SetBackdrop({ edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", edgeSize = 15 })
if border.SetFrameLevel then
border:SetFrameLevel(5)
end
-- 右下方百分比框架
local HealthPerFeame = CreateFrame("Frame", nil, border)
HealthPerFeame:SetSize(80, 20)
HealthPerFeame:SetPoint("TOPRIGHT", border, "BOTTOMRIGHT", 0, 4)
HealthPerFeame:SetBackdrop({ bgFile = "Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\HealthPerImg" })
if HealthPerFeame.SetFrameLevel then
HealthPerFeame:SetFrameLevel(4)
end
-- 右下方百分比攻击图标
self.HealthPerAttImg = HealthPerFeame:CreateTexture(nil, "OVERLAY")
self.HealthPerAttImg:SetSize(15, 15)
self.HealthPerAttImg:SetPoint("LEFT", HealthPerFeame, "LEFT", 18, 0)
self.HealthPerAttImg:SetTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\HealthPerAttImg")
-- 右下方百分比文本
self.HealthPerText = HealthPerFeame:CreateFontString(nil, "OVERLAY")
self.HealthPerText:SetFont("Fonts\\SM02-W.TTF", 7, "OUTLINE, MONOCHROME")
self.HealthPerText:SetTextColor(150 / 200, 140 / 255, 0)
self.HealthPerText:SetPoint("LEFT", HealthPerFeame, "LEFT", 20 + 13, 0)
self.HealthPerText:SetText("100%")
-- 创建闪光效果纹理
self.flashTexture = self.healthBarBg:CreateTexture(nil, "OVERLAY")
self.flashTexture:SetSize(60, 25)
self.flashTexture:SetPoint("CENTER", self.healthBarBg, "CENTER")
self.flashTexture:SetTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\flash")
self.flashTexture:SetBlendMode("ADD")
self.flashTexture:SetAlpha(0)
-- 创建血量文本
self.healthText = self.healthBarBg:CreateFontString(nil, "OVERLAY")
self.healthText:SetFont("Fonts\\ZYKai_T.TTF", 12, "OUTLINE, MONOCHROME")
self.healthText:SetTextColor(1, 1, 1)
self.healthText:SetPoint("BOTTOMRIGHT", self.healthBarBg, "TOPRIGHT", 0, 5)
self.healthText:SetShadowOffset(1, -1);
-- 创建层数文本
self.layerText = border:CreateFontString(nil, "OVERLAY")
self.layerText:SetFont("Fonts\\SM02-W.TTF", 16, "OUTLINE, MONOCHROME")
self.layerText:SetTextColor(1, 1, 1)
self.layerText:SetPoint("RIGHT", border, "RIGHT", -20, 0)
self.layerText:SetShadowColor(0 / 255, 0 / 255, 0 / 255) --文本阴影
self.layerText:SetShadowOffset(1, -1);
-- 创建等级文本
self.levelText = border:CreateFontString(nil, "OVERLAY")
self.levelText:SetFont("Fonts\\ZYKai_T.TTF", 14, "OUTLINE, MONOCHROME")
self.levelText:SetTextColor(255 / 255, 255 / 255, 255)
self.levelText:SetShadowColor(0, 0, 0)
self.levelText:SetShadowOffset(2, -2)
self.levelText:SetPoint("BOTTOMLEFT", border, "TOPLEFT", 30, 1)
-- 创建名字文本
self.nameText = border:CreateFontString(nil, "OVERLAY")
self.nameText:SetFont("Fonts\\ZYKai_T.TTF", 14, "OUTLINE, MONOCHROME")
self.nameText:SetTextColor(255 / 255, 255 / 255, 255)
self.nameText:SetShadowColor(0, 0, 0)
self.nameText:SetShadowOffset(2, -2)
self.nameText:SetPoint("LEFT", self.levelText, "RIGHT", 0, 0)
-- 头像框架
self.portraitFrame = CreateFrame("Frame", nil, self.healthBarBg)
self.portraitFrame:SetSize(50, 50)
self.portraitFrame:SetPoint("RIGHT", self.healthBarBg, "LEFT", 3, 0)
self.portraitFrame:SetBackdrop({
bgFile = "Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\PortraitFrame"
})
self.portraitFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
if self.portraitFrame.SetFrameLevel then
self.portraitFrame:SetFrameLevel(6)
end
self.portraitIconMask = CreateFrame("Button", nil, self.portraitFrame)
self.portraitIconMask:SetSize(self.portraitFrame:GetWidth() - 10, self.portraitFrame:GetHeight() - 10)
self.portraitIconMask:SetPoint("CENTER", self.portraitFrame, "CENTER", 0, 0)
self.portraitIconMask:SetNormalTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\Mask")
self.portraitIconMask:SetFrameLevel(self.portraitFrame:GetFrameLevel() - 2)
self.portraitIconMask:GetNormalTexture():SetBlendMode("MOD")
-- -- 创建头像
self.portraitIcon = self.portraitIconMask:CreateTexture(nil, "BACKGROUND")
self.portraitIcon:SetSize(34, 34)
self.portraitIcon:SetPoint("CENTER", self.portraitIconMask, "CENTER")
-- 创建Boss图标
self.bossIcon = self.portraitFrame:CreateTexture(nil, "ARTWORK")
self.bossIcon:SetSize(25, 25)
self.bossIcon:SetPoint("LEFT", self.healthBar, "RIGHT", 10, 0)
self.bossIcon:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-Skull")
self.bossIcon:Hide()
------------------------------------------ 下方总血条 ------------------------------------------
-- 下方总血条底部纹理
self.Z_border = CreateFrame("Frame", nil, border)
self.Z_border:SetSize(HEALTHFRAME_W / 1.105, HEALTHFRAME_H / 3)
self.Z_border:SetPoint("TOPLEFT", border, "BOTTOMLEFT", 5, 2)
self.Z_border:SetFrameLevel(5)
self.Z_border:SetBackdrop({ bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background" })
-- 总血条状态条
self.Z_border.healthBar = CreateFrame("StatusBar", nil, self.Z_border)
self.Z_border.healthBar:SetSize(self.Z_border:GetWidth() - 1, self.Z_border:GetHeight() - 1)
self.Z_border.healthBar:SetPoint("CENTER", self.Z_border, "CENTER", 0, 0)
self.Z_border.healthBar:SetStatusBarTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\Z_border_healthBar")
self.Z_border.healthBar:SetFrameLevel(self.Z_border:GetFrameLevel() + 1)
self.Z_border.healthBar:SetMinMaxValues(0, 100)
self.Z_border.healthBar:SetValue(100) -- 始终保持满血显示
-- 创建遮罩覆盖层
self.Z_border.maskOverlay = CreateFrame("Frame", nil, self.Z_border)
self.Z_border.maskOverlay:SetFrameLevel(self.Z_border.healthBar:GetFrameLevel() + 1)
self.Z_border.maskOverlay:SetPoint("TOPRIGHT", self.Z_border.healthBar, "TOPRIGHT", 0, 0)
self.Z_border.maskOverlay:SetPoint("BOTTOMRIGHT", self.Z_border.healthBar, "BOTTOMRIGHT", 0, 0)
self.Z_border.maskOverlay:SetWidth(0) -- 初始宽度为0满血状态
-- 创建遮罩纹理
self.Z_border.maskTexture = self.Z_border.maskOverlay:CreateTexture(nil, "ARTWORK")
self.Z_border.maskTexture:SetAllPoints(self.Z_border.maskOverlay)
self.Z_border.maskTexture:SetTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\WHITE8x8")
-- 下方总血条覆盖边框
self.Z_border.WFrame = CreateFrame("Frame", nil, border)
self.Z_border.WFrame:SetAllPoints(self.Z_border)
self.Z_border.WFrame:SetFrameLevel(self.Z_border.healthBar:GetFrameLevel() + 2)
self.Z_border.WFrame:SetBackdrop({
bgFile = "Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\Z_border_healthWFrame",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", edgeSize = 5
})
-- 总血条闪光效果层
self.Z_border.flashEffectBar = CreateFrame("StatusBar", nil, self.Z_border.healthBar)
self.Z_border.flashEffectBar:SetAllPoints(self.Z_border.healthBar)
self.Z_border.flashEffectBar:SetStatusBarTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\StatusBar")
self.Z_border.flashEffectBar:SetMinMaxValues(0, 100)
--self.Z_border.flashEffectBar:SetFrameLevel(15)
self.Z_border.flashEffectBar:Hide()
------------------------------------------ 其他初始化 ------------------------------------------
-- 初始化动画
self.shakeAnimation = self:CreateShakeAnimation()
self.flashAnimation = self:CreateFlashAnimation()
-- 初始化闪光效果动画
self:CreateFlashEffectAnimation()
-- 初始化伤害跟踪动画
self:CreateDamageTrackAnimation()
-- 初始化宗学跳闪光效果动画
self:CreateZ_borderFlashEffectAnimation()
end
-- 隐藏默认目标框体
function Creature_MultiLifeMultiplierAddon:SafeHideDefaultTargetFrame()
if TargetFrame:IsShown() then
self.originalTargetFrameState.wasShown = true
TargetFrame:Hide()
TargetFrame:UnregisterAllEvents()
else
self.originalTargetFrameState.wasShown = false
end
end
-- 闪光动画
@ -142,141 +338,6 @@ function Creature_MultiLifeMultiplierAddon:CreateShakeAnimation()
return ag
end
-- 创建进度条
function Creature_MultiLifeMultiplierAddon:InitializeProgressBar()
-- 创建主框架(不参与震动)
self.CustomHealthFrame = CreateFrame("Frame", "CustomHealthFrame", UIParent)
self.CustomHealthFrame:SetSize(HEALTHFRAME_W, HEALTHFRAME_H)
self.CustomHealthFrame:SetPoint("BOTTOM", UIParent, "TOP", 0, -80)
self.CustomHealthFrame:Hide()
if self.CustomHealthFrame.SetFrameLevel then
self.CustomHealthFrame:SetFrameLevel(15)
end
-- 背景血条直接放在CustomHealthFrame中
self.healthBarBg = CreateFrame("StatusBar", nil, self.CustomHealthFrame)
self.healthBarBg:SetSize(HEALTHFRAME_W, HEALTHFRAME_H)
self.healthBarBg:SetPoint("TOP", self.CustomHealthFrame, "TOP", 0, 0) -- 调整锚点
self.healthBarBg:SetStatusBarTexture("Interface\\AddOns\\SM_CoreAddons\\SM3.0\\Creature_MultiLifeMultiplier\\img\\StatusBar")
self.healthBarBg:SetMinMaxValues(0, MAX_HEALTH_PER_LAYER)
if self.healthBarBg.SetFrameLevel then
self.healthBarBg:SetFrameLevel(1)
end
-- 伤害跟踪条
self.damageTrackBar = CreateFrame("StatusBar", nil, self.healthBarBg)
self.damageTrackBar:SetAllPoints(self.healthBarBg)
self.damageTrackBar:SetStatusBarTexture("Interface\\AddOns\\SM_CoreAddons\\SM3.0\\Creature_MultiLifeMultiplier\\img\\StatusBar")
self.damageTrackBar:SetMinMaxValues(0, MAX_HEALTH_PER_LAYER)
if self.damageTrackBar.SetFrameLevel then
self.damageTrackBar:SetFrameLevel(2)
end
self.damageTrackBar:Hide()
-- 闪光效果层
self.flashEffectBar = CreateFrame("StatusBar", nil, self.healthBarBg)
self.flashEffectBar:SetAllPoints(self.healthBarBg)
self.flashEffectBar:SetStatusBarTexture("Interface\\AddOns\\SM_CoreAddons\\SM3.0\\Creature_MultiLifeMultiplier\\img\\StatusBar")
self.flashEffectBar:SetMinMaxValues(0, MAX_HEALTH_PER_LAYER)
if self.flashEffectBar.SetFrameLevel then
self.flashEffectBar:SetFrameLevel(5)
end
self.flashEffectBar:Hide()
-- 主血条
self.healthBar = CreateFrame("StatusBar", nil, self.healthBarBg)
self.healthBar:SetAllPoints(self.healthBarBg)
self.healthBar:SetStatusBarTexture("Interface\\AddOns\\SM_CoreAddons\\SM3.0\\Creature_MultiLifeMultiplier\\img\\StatusBar")
self.healthBar:SetMinMaxValues(0, MAX_HEALTH_PER_LAYER)
if self.healthBar.SetFrameLevel then
self.healthBar:SetFrameLevel(4)
end
-- 血条边框
local border = CreateFrame("Frame", nil, self.healthBarBg)
border:SetSize(HEALTHFRAME_W + 5, HEALTHFRAME_H + 5)
border:SetPoint("CENTER", self.healthBarBg, "CENTER", 0, 0)
border:SetBackdrop({ edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", edgeSize = 15 })
--border:SetBackdropBorderColor(0.2, 0.2, 0.2, 1)
if border.SetFrameLevel then
border:SetFrameLevel(10)
end
-- 创建层数文本
self.layerText = border:CreateFontString(nil, "OVERLAY")
self.layerText:SetFont("Fonts\\SM02-W.TTF", 20, "OUTLINE, MONOCHROME")
self.layerText:SetTextColor(1, 1, 1)
self.layerText:SetPoint("RIGHT", self.healthBarBg, "RIGHT", -20, 0)
self.layerText:SetShadowColor(0 / 255, 0 / 255, 0 / 255) --文本阴影
self.layerText:SetShadowOffset(1, -1);
-- 创建闪光效果纹理
self.flashTexture = self.healthBarBg:CreateTexture(nil, "OVERLAY")
self.flashTexture:SetSize(60, 25)
self.flashTexture:SetPoint("CENTER", self.healthBarBg, "CENTER")
self.flashTexture:SetTexture("Interface\\AddOns\\SM_CoreAddons\\SM3.0\\Creature_MultiLifeMultiplier\\img\\flash")
self.flashTexture:SetBlendMode("ADD")
self.flashTexture:SetAlpha(0)
-- 创建名字文本
self.nameText = self.healthBarBg:CreateFontString(nil, "OVERLAY")
self.nameText:SetFont("Fonts\\ZYKai_T.TTF", 14, "OUTLINE, MONOCHROME")
self.nameText:SetTextColor(255 / 255, 173 / 255, 105 / 255)
self.nameText:SetShadowColor(0, 0, 0)
self.nameText:SetShadowOffset(2, -2)
self.nameText:SetPoint("BOTTOMLEFT", self.healthBarBg, "TOPLEFT", 0, 5)
-- 创建血量文本
self.healthText = self.healthBarBg:CreateFontString(nil, "OVERLAY")
self.healthText:SetFont("Fonts\\ZYKai_T.TTF", 12, "OUTLINE, MONOCHROME")
self.healthText:SetTextColor(1, 1, 1)
self.healthText:SetPoint("TOPRIGHT", self.healthBarBg, "BOTTOMRIGHT", 0, -5)
self.healthText:SetShadowOffset(1, -1);
-- 创建等级和头像框架
self.portraitFrame = CreateFrame("Frame", nil, border)
self.portraitFrame:SetSize(40, 40)
self.portraitFrame:SetPoint("RIGHT", border, "LEFT", -10, 0)
self.portraitFrame:SetBackdrop({
bgFile = "Interface\\AddOns\\SM_CoreAddons\\SM3.0\\Creature_MultiLifeMultiplier\\img\\portraitBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
edgeSize = 8,
insets = { left = 2, right = 2, top = 2, bottom = 2 }
})
self.portraitFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
if self.portraitFrame.SetFrameLevel then
self.portraitFrame:SetFrameLevel(15)
end
-- 创建头像
self.portraitIcon = self.portraitFrame:CreateTexture(nil, "BACKGROUND")
self.portraitIcon:SetSize(34, 34)
self.portraitIcon:SetPoint("CENTER", self.portraitFrame, "CENTER")
-- 创建等级文本
self.levelText = self.portraitFrame:CreateFontString(nil, "OVERLAY")
self.levelText:SetFont("Fonts\\ZYKai_T.TTF", 10, "OUTLINE, MONOCHROME")
self.levelText:SetTextColor(255 / 255, 220 / 255, 0)
self.levelText:SetPoint("BOTTOM", self.portraitFrame, "BOTTOM", 0, 2)
-- 创建Boss图标
self.bossIcon = self.portraitFrame:CreateTexture(nil, "ARTWORK")
self.bossIcon:SetSize(25, 25)
self.bossIcon:SetPoint("LEFT", self.healthBar, "RIGHT", 10, 0)
self.bossIcon:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-Skull")
self.bossIcon:Hide()
-- 初始化动画
self.shakeAnimation = self:CreateShakeAnimation()
self.flashAnimation = self:CreateFlashAnimation()
-- 初始化闪光效果动画
self:CreateFlashEffectAnimation()
-- 初始化伤害跟踪动画
self:CreateDamageTrackAnimation()
end
-- 闪光效果动画
function Creature_MultiLifeMultiplierAddon:CreateFlashEffectAnimation()
if not self.flashEffectBar then return nil end
@ -315,6 +376,44 @@ function Creature_MultiLifeMultiplierAddon:CreateFlashEffectAnimation()
return true
end
-- 总血条闪光效果动画
function Creature_MultiLifeMultiplierAddon:CreateZ_borderFlashEffectAnimation()
if not self.Z_border.flashEffectBar then return nil end
-- 添加动画数据
self.Z_border.flashEffectBar.animationData = {
isAnimating = false,
startTime = nil,
duration = 0.3,
startAlpha = 0.8,
endAlpha = 0
}
-- 设置OnUpdate脚本
self.Z_border.flashEffectBar:SetScript("OnUpdate", function(self, elapsed)
local animData = self.animationData
if not animData or not animData.isAnimating then return end
local currentTime = GetTime()
local elapsed = currentTime - animData.startTime
local progress = elapsed / animData.duration
if progress >= 1 then
self:SetAlpha(0)
animData.isAnimating = false
else
local alpha
if progress < 0.2 then
alpha = animData.startAlpha * (progress / 0.2)
else
alpha = animData.startAlpha * (1 - (progress - 0.2) / 0.8)
end
self:SetAlpha(alpha)
end
end)
return true
end
-- 播放层破碎特效
function Creature_MultiLifeMultiplierAddon:PlayLayerBreakEffect(oldHealth, newHealth, oldLayerColor, newLayerColor)
if not self.damageTrackBar then return end
@ -363,8 +462,8 @@ function Creature_MultiLifeMultiplierAddon:PlayLayerBreakEffect(oldHealth, newHe
self.damageTrackBar:SetAlpha(1.0) -- 更明显的透明度
-- 添加调试输出
print("[调试] 播放层破碎效果,从层", math.floor((oldHealth - 1) / MAX_HEALTH_PER_LAYER) + 1, "到层",
math.floor((newHealth - 1) / MAX_HEALTH_PER_LAYER) + 1)
-- print("[调试] 播放层破碎效果,从层", math.floor((oldHealth - 1) / MAX_HEALTH_PER_LAYER) + 1, "到层",
-- math.floor((newHealth - 1) / MAX_HEALTH_PER_LAYER) + 1)
end
-- 播放强烈闪光效果(用于层破碎)
@ -463,7 +562,7 @@ function Creature_MultiLifeMultiplierAddon:CreateDamageTrackAnimation()
return true
end
-- 跨层特效实现
-- 跨层特效
function Creature_MultiLifeMultiplierAddon:PlayLayerTransitionEffect(oldLayer, newLayer)
if not self.layerTransitionFrame then
-- 跨层特效帧
@ -544,6 +643,19 @@ function Creature_MultiLifeMultiplierAddon:PlayFlashEffect(healthValue)
animData.startTime = GetTime()
end
-- 播放总血条闪光效果
function Creature_MultiLifeMultiplierAddon:PlayTotalHealthBarFlash(healthValue)
if not self.Z_border.flashEffectBar then return end
self.Z_border.flashEffectBar:SetStatusBarColor(1, 1, 1, 0.5)
self.Z_border.flashEffectBar:SetValue(healthValue)
self.Z_border.flashEffectBar:Show()
local animData = self.Z_border.flashEffectBar.animationData
animData.isAnimating = true
animData.startTime = GetTime()
end
-- 播放伤害跟踪效果(同一层内)
function Creature_MultiLifeMultiplierAddon:PlayDamageTrackEffect(oldHealth, newHealth, currentLayerColor)
if not self.damageTrackBar then return end
@ -584,6 +696,8 @@ function Creature_MultiLifeMultiplierAddon:PlayDamageTrackEffect(oldHealth, newH
-- 先播放闪光效果
self:PlayFlashEffect(oldLayerHealth)
--self:PlayTotalHealthBarFlash(oldLayerHealth)
-- 设置动画参数
local animData = self.damageTrackBar.animationData
animData.isAnimating = true
@ -619,16 +733,21 @@ function Creature_MultiLifeMultiplierAddon:UpdateHealthBar(data)
end
-- 计算剩余层数(倒数显示)
local remainingLayers = totalLayers - currentLayer + 1
local remainingLayers = totalLayers - currentLayer
-- 更新背景血条
-- 更新背景血条(修复版本)
if currentLayer < totalLayers then
local nextLayerColor = self:GetColorForLayer(currentLayer + 1, totalLayers)
self.healthBarBg:SetStatusBarColor(nextLayerColor.r, nextLayerColor.g, nextLayerColor.b)
self.healthBarBg:SetValue(MAX_HEALTH_PER_LAYER)
self.healthBarBg:Show()
self.healthBarBg:Show()
else
self.healthBarBg:Hide()
-- 即使是最后一层,也要确保有背景显示
local currentLayerColor = self:GetColorForLayer(currentLayer, totalLayers)
self.healthBarBg:SetStatusBarColor(currentLayerColor.r * 0.3, currentLayerColor.g * 0.3,
currentLayerColor.b * 0.3)
self.healthBarBg:SetValue(MAX_HEALTH_PER_LAYER)
self.healthBarBg:Show() -- 保持显示,不要隐藏
end
-- 更新主血条
@ -639,14 +758,10 @@ function Creature_MultiLifeMultiplierAddon:UpdateHealthBar(data)
-- 检查是否跨层
local oldLayer = math.floor((data.healthPerBar - oldHealth) / MAX_HEALTH_PER_LAYER) + 1
if oldLayer ~= currentLayer then
print("[调试] 检测到跨层:从层", oldLayer, "到层", currentLayer)
print("[调试] 旧血量:", oldHealth, "新血量:", data.currentHealth)
-- 播放声音效果
-- 播放声音效果
PlaySoundFile("Sound\\Interface\\ui_blizzardstore_open.ogg", "Master")
self:PlayLayerTransitionEffect(oldLayer, currentLayer) -- 播放跨层文本效果
self:PlayLayerTransitionEffect(oldLayer, currentLayer)
-- 播放层破碎效果而不是普通跨层效果
if oldHealth > data.currentHealth then
local oldLayerColor = self:GetColorForLayer(oldLayer, totalLayers)
@ -655,17 +770,6 @@ function Creature_MultiLifeMultiplierAddon:UpdateHealthBar(data)
end
local currentTime = GetTime()
if currentTime - self.lastShakeTime > SHAKE_COOLDOWN then
if self.shakeAnimation and self.shakeAnimation:IsPlaying() then
self.shakeAnimation:Stop()
end
if self.shakeAnimation then
self.shakeAnimation:Play()
end
self.lastShakeTime = currentTime
end
if SHAKE_ENABLED and currentTime - self.lastShakeTime > SHAKE_COOLDOWN then
if self.shakeAnimation and self.shakeAnimation:IsPlaying() then
@ -686,14 +790,82 @@ function Creature_MultiLifeMultiplierAddon:UpdateHealthBar(data)
-- 更新层数文本
self.layerText:SetText(string.format("X %d", remainingLayers))
-- 更新血量文本
self.healthText:SetText(string.format("%.0f / %.0f", data.currentHealth, data.healthPerBar))
-- 更新血量文本 - 添加死亡状态显示
if data.currentHealth <= 0 then
self.healthText:SetTextColor(0.7, 0.7, 0.7) -- 设置为灰色
self.healthText:SetText("死亡")
self.nameText:SetTextColor(0.7, 0.7, 0.7) -- 生物名称文本灰色
self.levelText:SetTextColor(0.7, 0.7, 0.7) -- 生物等级文本设置为灰色
self.layerText:SetTextColor(0.5, 0.5, 0.5) -- 血量层数文本设置为灰色
self.HealthPerAttImg:SetTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\HealthPerAttImgB")
self.HealthPerText:SetTextColor(0.5, 0.5, 0.5) -- 总血量百分比文本设置为灰色
self.portraitIcon:SetDesaturated(true)
self.healthText:SetPoint("CENTER", self.CustomHealthFrame, "CENTER", 0, 0) -- 死亡文本在中间
else
self.healthText:SetText(string.format("%.0f / %.0f", data.currentHealth, data.healthPerBar))
self.healthText:SetTextColor(1, 1, 1) -- 恢复白色
self.healthText:SetPoint("BOTTOMRIGHT", self.healthBarBg, "TOPRIGHT", 0, 5) --恢复位置
-- layerTransitionText创建时机不对需要在对象存在时才设置
local color = self:GetColorForLayer(remainingLayers, 99)
if self.layerTransitionText then
self.layerTransitionText:SetTextColor(color.r, color.g, color.b)
end
self.layerText:SetTextColor(color.r, color.g, color.b)
self.nameText:SetTextColor(255 / 255, 255 / 255, 255) -- 生物名称文本恢复颜色
self.levelText:SetTextColor(255 / 255, 255 / 255, 255) -- 生物等级文本恢复颜色
self.HealthPerAttImg:SetTexture("Interface\\AddOns\\SM_BloodVolumeExpansion\\img\\HealthPerAttImg")
self.HealthPerText:SetTextColor(150 / 200, 140 / 255, 0) -- 总血量百分比文本设置为正常
self.portraitIcon:SetDesaturated(false)
end
-- 更新血量百分比文本和总血条遮罩
local currentHealth = tonumber(data.currentHealth) or 0
local healthPerBar = tonumber(data.healthPerBar) or 1
-- 添加数据有效性检查
if currentHealth < 0 or healthPerBar <= 0 or currentHealth > healthPerBar then
print("警告: 数据异常 - currentHealth:", currentHealth, "healthPerBar:", healthPerBar)
return
end
local healthPer = (currentHealth / healthPerBar) * 100
-- 如果血量减少了,播放总血条闪光效果
if oldHealth > data.currentHealth then
self:PlayTotalHealthBarFlash(healthPer) -- 使用已计算好的百分比
end
-- 强制限制百分比范围
healthPer = math.max(0, math.min(100, healthPer))
-- 更新百分比文本
if healthPer >= 99.995 and healthPer <= 100.005 then
self.HealthPerText:SetText("100")
else
local formatted = string.format("%.2f", healthPer)
if formatted:find("%.00$") then
self.HealthPerText:SetText(string.format("%.0f", healthPer))
else
self.HealthPerText:SetText(formatted)
end
end
-- 更新遮罩覆盖层(血量损失的部分)
local lostHealthPercent = 100 - healthPer
local maxWidth = self.Z_border.healthBar:GetWidth()
local maskWidth = (lostHealthPercent / 100) * maxWidth
self.Z_border.maskOverlay:SetWidth(maskWidth)
end
-- 播放伤害效果
function Creature_MultiLifeMultiplierAddon:PlayDamageEffects()
if not SHAKE_ENABLED then return end
if self.shakeAnimation and self.shakeAnimation:IsPlaying() then
self.shakeAnimation:Stop()
end
@ -709,59 +881,56 @@ function Creature_MultiLifeMultiplierAddon:PlayDamageEffects()
end
end
-- 隐藏默认目标框体
function Creature_MultiLifeMultiplierAddon:HideDefaultTargetFrame()
TargetFrame:UnregisterAllEvents()
TargetFrame:Hide()
end
-- 显示默认目标框体
function Creature_MultiLifeMultiplierAddon:ShowDefaultTargetFrame()
TargetFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
TargetFrame:RegisterEvent("UNIT_HEALTH")
TargetFrame:RegisterEvent("UNIT_POWER_UPDATE")
TargetFrame:Show()
end
-- 更新自定义血条框体
function Creature_MultiLifeMultiplierAddon:UpdateCustomHealthFrame()
local targetGUID = UnitGUID("target")
if not targetGUID or not UnitExists("target") then
self.CustomHealthFrame:Hide()
-- 没有目标时,确保隐藏默认框架
TargetFrame:Hide()
return
end
local targetGUID = UnitGUID("target")
-- 重置原始目标框架状态
self.originalTargetFrameState.wasShown = false
-- 如果没有目标,隐藏所有框架
if not targetGUID or not UnitExists("target") then
self.CustomHealthFrame:Hide()
TargetFrame:Hide()
return
end
-- 获取目标Entry
local targetEntry = tonumber(targetGUID:sub(8, 12), 16)
-- 检查是否是扩展血量生物
if self.CreatureTemplates[targetEntry] then
-- 如果还没有数据,主动创建
-- 统一的死亡状态检查
local isDead = UnitIsDeadOrGhost("target")
-- 无论生死都要创建数据(如果不存在)
if not self.SavedData[targetGUID] then
self.SavedData[targetGUID] = {
entry = targetEntry,
healthPerBar = self.CreatureTemplates[targetEntry].healthPerBar,
currentHealth = self.CreatureTemplates[targetEntry].healthPerBar, -- 初始为满血
lastHealth = self.CreatureTemplates[targetEntry].healthPerBar
currentHealth = isDead and 0 or self.CreatureTemplates[targetEntry].healthPerBar,
lastHealth = isDead and 0 or self.CreatureTemplates[targetEntry].healthPerBar
}
end
local data = self.SavedData[targetGUID]
-- 使用安全的隐藏方法
-- 隐藏默认目标框架
self:SafeHideDefaultTargetFrame()
TargetFrame:Hide()
TargetFrame:UnregisterAllEvents()
if UnitIsDeadOrGhost("target") then
-- 根据死亡状态更新血量
if isDead then
data.currentHealth = 0
elseif data.currentHealth == 0 then
-- 如果之前是死亡状态,现在复活了,恢复满血
data.currentHealth = data.healthPerBar
end
self:UpdateHealthBar(data)
self.nameText:SetText(UnitName("target"))
self.levelText:SetText(UnitLevel("target"))
self.levelText:SetText("Lv"..UnitLevel("target"))
-- 安全的头像设置
if UnitExists("target") and not UnitIsPlayer("target") then
@ -774,13 +943,27 @@ function Creature_MultiLifeMultiplierAddon:UpdateCustomHealthFrame()
self.bossIcon:Hide()
end
-- 控制 UpdateBuffs 调用频率
if self.lastBuffUpdateTime == nil or (GetTime() - self.lastBuffUpdateTime) > 1.0 then
self:UpdateBuffs()
self.lastBuffUpdateTime = GetTime()
else
end
self.CustomHealthFrame:Show()
else
-- 对于普通生物,隐藏自定义框架并恢复默认框架
self.CustomHealthFrame:Hide()
self:ShowDefaultTargetFrame()
TargetFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
TargetFrame:RegisterEvent("UNIT_HEALTH")
TargetFrame:RegisterEvent("UNIT_POWER_UPDATE")
TargetFrame:Show()
self.originalTargetFrameState.wasShown = true
end
end
-- 处理插件事件
function Creature_MultiLifeMultiplierAddon:SM_MultiLifeMultiplierEvent(event, ...)
if event == 'CHAT_MSG_ADDON' then
@ -796,6 +979,7 @@ function Creature_MultiLifeMultiplierAddon:SM_MultiLifeMultiplierEvent(event, ..
}
end
elseif Packet == 'SM_S_UPDATE_CREATURE_HEALTH' then
local entry, currentHealth, maxHealth = strsplit(",", Msg)
entry = tonumber(entry)
currentHealth = tonumber(currentHealth)
@ -806,6 +990,7 @@ function Creature_MultiLifeMultiplierAddon:SM_MultiLifeMultiplierEvent(event, ..
local targetEntry = tonumber(targetGUID:sub(8, 12), 16)
if targetEntry == entry then
-- 使用目标GUID作为键值
if not self.SavedData[targetGUID] then
self.SavedData[targetGUID] = {
@ -815,19 +1000,27 @@ function Creature_MultiLifeMultiplierAddon:SM_MultiLifeMultiplierEvent(event, ..
lastHealth = currentHealth
}
else
if currentHealth < self.SavedData[targetGUID].lastHealth then
if currentHealth > self.SavedData[targetGUID].lastHealth then
-- 血量增加自动回血也需要更新UI
self.SavedData[targetGUID].lastHealth = self.SavedData[targetGUID].currentHealth
self.SavedData[targetGUID].currentHealth = currentHealth
-- self:UpdateCustomHealthFrame() --这里不要调用 好频繁
elseif currentHealth < self.SavedData[targetGUID].lastHealth then
-- 血量减少(受到伤害)
self:PlayDamageEffects()
self.SavedData[targetGUID].lastHealth = self.SavedData[targetGUID].currentHealth
self.SavedData[targetGUID].currentHealth = currentHealth
--self:UpdateCustomHealthFrame() --这里不要调用 好频繁
end
self.SavedData[targetGUID].lastHealth = self.SavedData[targetGUID].currentHealth
self.SavedData[targetGUID].currentHealth = currentHealth
end
self:UpdateCustomHealthFrame()
self:UpdateCustomHealthFrame() -- 只调用一次 UpdateCustomHealthFrame
end
end
end
elseif event == "PLAYER_TARGET_CHANGED" then
-- 在目标改变时,先确保默认框架状态正确
self.originalTargetFrameState.wasShown = false
self:UpdateCustomHealthFrame()
end
end
@ -855,7 +1048,7 @@ function Creature_MultiLifeMultiplierAddon:RegisterEvents()
-- 只保存模板数据,减少存储空间
MultiLifeMultiplierData = {
CreatureTemplates = self.CreatureTemplates
}
}
else
self:SM_MultiLifeMultiplierEvent(event, ...)
end
@ -863,4 +1056,6 @@ function Creature_MultiLifeMultiplierAddon:RegisterEvents()
end
-- 初始化插件
Creature_MultiLifeMultiplierAddon:Initialize()
print("血量扩展插件结束")
Creature_MultiLifeMultiplierAddon:Initialize()

View File

@ -0,0 +1,11 @@
## Interface: 30300
## Title: |cffc600a3血量扩展|r - by SM_Core
## Notes-zhCN: |n|cff00ff00功能概览:|r|n|n尚美核心专用插件生物血量突破超大值随意更改百亿、千亿、万亿
## LoadOnDemand: 0
## Author: 尚美
## SavedVariablesPerCharacter: MultiLifeMultiplierData
SM_BloodVolumeExpansion.lua
SM_Blood_Buff.lua

View File

@ -0,0 +1,353 @@
-- 重要buff
local importantBuffs =
{
["无敌"] = true,
["神圣护盾"] = true,
["冰箱"] = true,
-- 可自定义添加更多重要buff
}
-- 初始化函数
function Creature_MultiLifeMultiplierAddon:BuffInitialize()
if not self.Z_border then return end
self.buffFrame = CreateFrame("Frame", nil, self.Z_border)
self.buffFrame:SetSize(200, 32)
self.buffFrame:SetPoint("TOPLEFT", self.Z_border, "BOTTOMLEFT", 0, 0)
if self.buffFrame.SetFrameLevel then
self.buffFrame:SetFrameLevel(6)
end
self.debuffFrame = CreateFrame("Frame", nil, self.Z_border)
self.debuffFrame:SetSize(200, 32)
self.debuffFrame:SetPoint("TOPRIGHT", self.buffFrame, "BOTTOMRIGHT", 0, -2)
if self.debuffFrame.SetFrameLevel then
self.debuffFrame:SetFrameLevel(6)
end
-- 初始化数组
self.buffButtons = {}
self.debuffButtons = {}
-- 创建buff按钮
for i = 1, 8 do
local button = CreateFrame("Button", nil, self.buffFrame)
button:SetSize(18, 18)
button:SetPoint("LEFT", self.buffFrame, "LEFT", (i - 1) * 21, 0)
-- 创建图标纹理
button.icon = button:CreateTexture(nil, "ARTWORK")
button.icon:SetAllPoints(button)
button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
-- 创建边框
button.border = button:CreateTexture(nil, "OVERLAY")
button.border:SetAllPoints(button)
button.border:SetTexture("Interface\\Buttons\\UI-Debuff-Overlays")
button.border:SetTexCoord(0.296875, 0.5703125, 0, 0.515625)
-- 创建时间文本
button.duration = button:CreateFontString(nil, "OVERLAY")
button.duration:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE")
button.duration:SetPoint("BOTTOM", button, "BOTTOM", 0, 2)
button.duration:SetTextColor(1, 1, 1)
-- 创建层数文本
button.count = button:CreateFontString(nil, "OVERLAY")
button.count:SetFont("Fonts\\FRIZQT__.TTF", 12, "OUTLINE")
button.count:SetPoint("TOPRIGHT", button, "TOPRIGHT", 2, 2)
button.count:SetTextColor(1, 1, 1)
button:Hide()
-- 添加鼠标悬停事件
button:SetScript("OnEnter", function(self)
if self.buffIndex and UnitExists("target") then
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip:SetUnitBuff("target", self.buffIndex)
GameTooltip:Show()
end
end)
button:SetScript("OnLeave", function(self)
GameTooltip:Hide()
end)
self.buffButtons[i] = button
end
-- 创建debuff按钮
for i = 1, 8 do
local button = CreateFrame("Button", nil, self.debuffFrame)
button:SetSize(18, 18)
button:SetPoint("LEFT", self.debuffFrame, "LEFT", (i - 1) * 21, 0)
-- 创建图标纹理
button.icon = button:CreateTexture(nil, "ARTWORK")
button.icon:SetAllPoints(button)
button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
-- 创建debuff类型边框
button.border = button:CreateTexture(nil, "OVERLAY")
button.border:SetAllPoints(button)
button.border:SetTexture("Interface\\Buttons\\UI-Debuff-Overlays")
-- 创建时间文本
button.duration = button:CreateFontString(nil, "OVERLAY")
button.duration:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE")
button.duration:SetPoint("BOTTOM", button, "BOTTOM", 0, 2)
button.duration:SetTextColor(1, 1, 1)
-- 创建层数文本
button.count = button:CreateFontString(nil, "OVERLAY")
button.count:SetFont("Fonts\\FRIZQT__.TTF", 12, "OUTLINE")
button.count:SetPoint("TOPRIGHT", button, "TOPRIGHT", 2, 2)
button.count:SetTextColor(1, 1, 1)
button:Hide()
-- 添加鼠标悬停事件
button:SetScript("OnEnter", function(self)
if self.debuffIndex and UnitExists("target") then
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip:SetUnitDebuff("target", self.debuffIndex)
GameTooltip:Show()
end
end)
button:SetScript("OnLeave", function(self)
GameTooltip:Hide()
end)
self.debuffButtons[i] = button
end
end
-- 更新 Buff 显示
function Creature_MultiLifeMultiplierAddon:UpdateBuffs()
-- 安全检查:确保目标存在
if not UnitExists("target") then
return
end
-- 安全检查确保buff/debuff按钮已初始化
if not self.buffButtons or not self.debuffButtons then
return
end
-- 更新 Buffs
local buffIndex = 1
local buffCount = 0
for i = 1, 16 do -- 减少检查数量
local name, rank, icon, count, debuffType, duration, expirationTime = UnitBuff("target", i)
if not name then break end
buffCount = buffCount + 1
if buffIndex <= 8 and self.buffButtons[buffIndex] then
local button = self.buffButtons[buffIndex]
if button and button.icon then
-- 存储buff索引用于tooltip
button.buffIndex = i
-- 设置图标纹理
if icon then
button.icon:SetTexture(icon)
button.icon:SetAlpha(1)
button.icon:Show()
end
-- 设置层数文本(修复后的逻辑)
if count and tonumber(count) and tonumber(count) > 1 and button.count then
button.count:SetText(tostring(count))
button.count:Show()
elseif button.count then
button.count:Hide()
end
if importantBuffs[name] then
-- 为重要buff添加特殊边框
if not button.importantBorder then
button.importantBorder = button:CreateTexture(nil, "OVERLAY")
button.importantBorder:SetAllPoints(button)
button.importantBorder:SetTexture("Interface\\Buttons\\UI-ActionButton-Border")
button.importantBorder:SetVertexColor(1, 0.8, 0) -- 金色边框
end
button.importantBorder:Show()
else
if button.importantBorder then
button.importantBorder:Hide()
end
end
-- 闪烁效果检查
if duration and expirationTime then
local timeLeft = tonumber(expirationTime) - GetTime()
if timeLeft > 0 and timeLeft < 30 then -- 少于30秒时闪烁
-- 添加闪烁动画
if not button.flashAnimation then
button.flashAnimation = button:CreateAnimationGroup()
local flash = button.flashAnimation:CreateAnimation("Alpha")
flash:SetFromAlpha(1)
flash:SetToAlpha(0.3)
flash:SetDuration(0.5)
flash:SetSmoothing("IN_OUT")
button.flashAnimation:SetLooping("BOUNCE")
end
button.flashAnimation:Play()
else
if button.flashAnimation then
button.flashAnimation:Stop()
button:SetAlpha(1)
end
end
end
-- 设置持续时间(如果有的话)
if duration and tonumber(duration) and tonumber(duration) > 0 and button.duration then
if expirationTime and tonumber(expirationTime) and tonumber(expirationTime) > 0 then
local timeLeft = tonumber(expirationTime) - GetTime()
if timeLeft > 0 then
if timeLeft > 60 then
button.duration:SetText(string.format("%.0fm", timeLeft / 60))
else
button.duration:SetText(string.format("%.0f", timeLeft))
end
button.duration:Show()
else
button.duration:Hide()
end
else
button.duration:Hide()
end
elseif button.duration then
button.duration:Hide()
end
button:Show()
buffIndex = buffIndex + 1
else
end
end
end
-- 隐藏未使用的 buff 按钮
for i = buffIndex, 8 do
if self.buffButtons[i] then
self.buffButtons[i]:Hide()
end
end
-- 更新 Debuffs - 同样适配3.3.5a API
local debuffIndex = 1
for i = 1, 16 do
local name, rank, icon, count, debuffType, duration, expirationTime = UnitDebuff("target", i)
if not name then break end
if debuffIndex <= 8 and self.debuffButtons[debuffIndex] then
local button = self.debuffButtons[debuffIndex]
if button and button.icon then
-- 存储debuff索引用于tooltip
button.debuffIndex = i
-- 设置图标纹理
if icon then
button.icon:SetTexture(icon)
button.icon:SetAlpha(1)
button.icon:Show()
end
-- 设置debuff边框颜色
if button.border then
-- 根据debuffType设置颜色3.3.5a中可能是数字)
local typeNum = tonumber(debuffType) or 0
if typeNum == 1 then -- Magic
button.border:SetVertexColor(0.2, 0.6, 1.0)
elseif typeNum == 2 then -- Disease
button.border:SetVertexColor(0.6, 0.4, 0.0)
elseif typeNum == 3 then -- Poison
button.border:SetVertexColor(0.0, 0.6, 0.0)
elseif typeNum == 4 then -- Curse
button.border:SetVertexColor(0.6, 0.0, 1.0)
else
button.border:SetVertexColor(1.0, 0.0, 0.0) -- 默认红色
end
end
-- 设置层数文本
if count and tonumber(count) and tonumber(count) > 1 and button.count then
button.count:SetText(tostring(count))
button.count:Show()
elseif button.count then
button.count:Hide()
end
if importantBuffs[name] then
-- 为重要buff添加特殊边框
if not button.importantBorder then
button.importantBorder = button:CreateTexture(nil, "OVERLAY")
button.importantBorder:SetAllPoints(button)
button.importantBorder:SetTexture("Interface\\Buttons\\UI-ActionButton-Border")
button.importantBorder:SetVertexColor(1, 0.8, 0) -- 金色边框
end
button.importantBorder:Show()
else
if button.importantBorder then
button.importantBorder:Hide()
end
end
-- 闪烁效果检查
if duration and expirationTime then
local timeLeft = tonumber(expirationTime) - GetTime()
if timeLeft > 0 and timeLeft < 30 then -- 少于30秒时闪烁
-- 添加闪烁动画
if not button.flashAnimation then
button.flashAnimation = button:CreateAnimationGroup()
local flash = button.flashAnimation:CreateAnimation("Alpha")
flash:SetFromAlpha(1)
flash:SetToAlpha(0.3)
flash:SetDuration(0.5)
flash:SetSmoothing("IN_OUT")
button.flashAnimation:SetLooping("BOUNCE")
end
button.flashAnimation:Play()
else
if button.flashAnimation then
button.flashAnimation:Stop()
button:SetAlpha(1)
end
end
end
-- 设置持续时间
if duration and tonumber(duration) and tonumber(duration) > 0 and button.duration then
if expirationTime and tonumber(expirationTime) and tonumber(expirationTime) > 0 then
local timeLeft = tonumber(expirationTime) - GetTime()
if timeLeft > 0 then
if timeLeft > 60 then
button.duration:SetText(string.format("%.0fm", timeLeft / 60))
else
button.duration:SetText(string.format("%.0f", timeLeft))
end
button.duration:Show()
else
button.duration:Hide()
end
else
button.duration:Hide()
end
elseif button.duration then
button.duration:Hide()
end
button:Show()
debuffIndex = debuffIndex + 1
end
end
end
-- 隐藏未使用的debuff按钮
for i = debuffIndex, 8 do
if self.debuffButtons[i] then
self.debuffButtons[i]:Hide()
end
end
end