-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathPowerSpark.lua
More file actions
150 lines (146 loc) · 5.3 KB
/
Copy pathPowerSpark.lua
File metadata and controls
150 lines (146 loc) · 5.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
PowerSparkDB = PowerSparkDB
or {
enabled = true,
DruidBarFrame = true,
SUF = true,
ElvUI = true,
Statusbars2 = true,
maxManaHide = true,
maxEnergyHide = true,
}
local playerClass = select(2, UnitClass('player'))
if playerClass == 'WARRIOR' then return end -- 战士不需要
local frame = CreateFrame('Frame')
-- 初始化
function frame:init(bar, powerType)
if not bar or bar.spark then return end
bar.spark = bar:CreateTexture()
bar.spark:SetTexture('Interface\\CastingBar\\UI-CastingBar-Spark')
bar.spark:SetBlendMode('ADD')
bar.spark:SetSize(28, 28)
bar.spark:SetAlpha(0.8)
if powerType then bar.powerType = powerType end
bar:HookScript('OnUpdate', function(self)
local now = GetTimePreciseSec()
if self.rate and now < self.rate then return end
self.rate = now + 0.01 --刷新率
local powerType = self.powerType or UnitPowerType('player')
if
UnitIsDeadOrGhost('player')
or powerType ~= 0 and powerType ~= 3
or not InCombatLockdown()
and UnitPower('player', powerType) >= UnitPowerMax('player', powerType)
and (powerType == 0 and PowerSparkDB.maxManaHide or powerType == 3 and not IsStealthed() and not UnitCanAttack(
'player',
'target'
) and PowerSparkDB.maxEnergyHide)
then
self.spark:Hide()
return
end
self.spark:Show()
local interval = frame.interval or 2 -- 恢复间隔
local width = self:GetWidth()
if powerType == 0 then
if type(frame.waitTime) == 'number' and frame.waitTime > now then
self.spark:SetPoint('CENTER', self, 'LEFT', width * (frame.waitTime - now) / 5, 0)
elseif type(frame.manaTime) == 'number' and now > frame.manaTime then
self.spark:SetPoint('CENTER', self, 'LEFT', width * (mod(now - frame.manaTime, interval) / interval), 0)
end
elseif powerType == 3 and type(frame.energyTime) == 'number' and now > frame.energyTime then
self.spark:SetPoint('CENTER', self, 'LEFT', width * (mod(now - frame.energyTime, interval) / interval), 0)
end
end)
end
for _, event in pairs({
'PLAYER_ENTERING_WORLD', -- 进入世界
'PLAYER_LEAVING_WORLD', -- 离开世界(/reload、退出游戏)
'COMBAT_LOG_EVENT_UNFILTERED', -- 战斗日志
'ACTIVE_TALENT_GROUP_CHANGED', -- 天赋切换
'UNIT_POWER_UPDATE', -- 法力/能量值变化
}) do
frame:RegisterEvent(event)
end
frame:SetScript('OnEvent', function(self, event, arg1, arg2)
local now = GetTimePreciseSec()
local powerType = UnitPowerType('player')
if event == 'PLAYER_ENTERING_WORLD' then
if PowerSparkDB.enabled then
if powerType == 0 or playerClass == 'DRUID' then -- 法力
self.lastMana = UnitPower('player', 0)
end
if powerType == 3 then -- 能量
self.lastEnergy = UnitPower('player', 3)
end
self.manaTime = PowerSparkDB.manaTime or now
self.energyTime = PowerSparkDB.energyTime or now
self:init(PlayerFrameManaBar)
if playerClass == 'DRUID' then
self:init(PlayerFrameAlternateManaBar, 0)
self:init(PlayerFrameDruidBar, 0) -- 兼容 BiechuUnitFrames 德鲁伊法力条
if PowerSparkDB.DruidBarFrame then self:init(DruidBarFrame, 0) end -- 兼容 DruidBarFrame
end
if ElvUF_Player and PowerSparkDB.ElvUI then self:init(ElvUF_Player.Power) end -- 兼容 ElvUI
if PowerSparkDB.Statusbars2 then self:init(StatusBars2_playerPowerBar) end -- 兼容 Statusbars2
-- 兼容 SUF
if SUFUnitplayer and PowerSparkDB.SUF then
self:init(SUFUnitplayer.powerBar)
if playerClass == 'DRUID' then self:init(SUFUnitplayer.druidBar, 0) end
end
end
elseif event == 'COMBAT_LOG_EVENT_UNFILTERED' then
local guid = UnitGUID('player')
local _, subevent, _, _, _, _, _, destGUID, _, _, _, spellId, _, _, _, _, powerType = CombatLogGetCurrentEventInfo()
if destGUID == guid then -- 施法目标自己
if spellId == 13750 then -- 冲动
if subevent == 'SPELL_AURA_APPLIED' then -- 冲动 开始
self.interval = 1
elseif subevent == 'SPELL_AURA_REMOVED' then -- 冲动 结束
self.interval = nil
end
elseif spellId == 29166 then -- 激活
if subevent == 'SPELL_AURA_APPLIED' then -- 激活 开始
self.ignore = true
elseif subevent == 'SPELL_AURA_REMOVED' then -- 激活 结束
self.ignore = nil
end
elseif subevent == 'SPELL_ENERGIZE' or subevent == 'SPELL_PERIODIC_ENERGIZE' then -- 法力药水 生命分流 法力之泉 菊花茶 跳过
self.skip = powerType
end
end
elseif event == 'PLAYER_LEAVING_WORLD' then
PowerSparkDB.manaTime = self.manaTime
PowerSparkDB.energyTime = self.energyTime
elseif event == 'ACTIVE_TALENT_GROUP_CHANGED' then
self.skip = 0
elseif event == 'UNIT_POWER_UPDATE' then
if arg1 ~= 'player' then return end
if arg2 == 'MANA' then -- 法力
local mana = UnitPower('player', 0)
if self.skip == 0 then -- 跳过 法力恢复
self.skip = nil
else
if self.ignore then
self.waitTime = nil
else
if type(self.lastMana) == 'number' then
if mana < self.lastMana then
self.waitTime = now + 5
elseif mana > self.lastMana then
self.manaTime = now
end
end
end
end
self.lastMana = mana
elseif arg2 == 'ENERGY' then -- 能量
local energy = UnitPower('player', 3)
if self.skip == 3 then -- 跳过能量恢复
self.skip = nil
elseif type(self.lastEnergy) == 'number' and energy > self.lastEnergy then -- 能量增加
self.energyTime = now
end
self.lastEnergy = energy
end
end
end)