Compare commits
201 Commits
Author | SHA1 | Date | |
---|---|---|---|
42fab8e4a4 | |||
b368558959
|
|||
78cb950a80 | |||
06dcc7ce99 | |||
2c00b23bf5 | |||
590638a156 | |||
e6bd39352c | |||
a4060dff6f | |||
268a6c6fbc | |||
b75112db79 | |||
42e76dde72 | |||
43aa303887 | |||
30ec3750c1
|
|||
73891bca4b
|
|||
66f4492fa7 | |||
6c1c68a0c3 | |||
b17582afab | |||
e94138d201 | |||
8a3f9e19d0
|
|||
1f4a8aefa7
|
|||
1ca424dccb
|
|||
8b9263a2c5 | |||
40efe6a551 | |||
f15dda769d | |||
9b063bed63 | |||
d451969177
|
|||
6c2e759f45 | |||
b0f7c776db | |||
c425206748 | |||
57ddf62f73 | |||
67cd7330ad | |||
5c344cfac1 | |||
681e1f7b55 | |||
038ea16642 | |||
12c509b133 | |||
2ae826654a | |||
acee3f4725
|
|||
2db6ddea57
|
|||
7e4a6ecab6
|
|||
af33ab9781
|
|||
c0262de622
|
|||
cfa86813a7
|
|||
c85c304eb6
|
|||
5321f7c64d
|
|||
6b2eb8d6e2
|
|||
c72b67235d
|
|||
140596b930
|
|||
6ddb056cdf
|
|||
8df330d3b4
|
|||
1f9a1a3100
|
|||
40a25a3315
|
|||
6cee8c738c
|
|||
40fc8187fd
|
|||
b32f090644 | |||
d9cfb3a09c
|
|||
8bc7b1ee90
|
|||
9cd800ee86
|
|||
ca6008780f
|
|||
9a727e4893
|
|||
4d71dcc660
|
|||
343ac7b70b
|
|||
573049f77e
|
|||
8dc173ae81
|
|||
5e04ace0f4
|
|||
37108d3487
|
|||
8cd7c4b044
|
|||
bfffdd82d7
|
|||
24c45f320f
|
|||
1db8545b63
|
|||
18fa31807c
|
|||
594ea0a3e3
|
|||
cb83a3f63f
|
|||
077286fd5f
|
|||
a50a313314
|
|||
271bb38a69
|
|||
0e11a40d3a
|
|||
5020279748
|
|||
cfaa09a541
|
|||
a0ed3ae6e6
|
|||
7709cb9130
|
|||
c1f631b732
|
|||
6c44ddc93a
|
|||
8b45079d38
|
|||
b1adbe8090
|
|||
01a017c179
|
|||
b8aece0da3
|
|||
6b9b4a358c
|
|||
72adca99f9
|
|||
f8e7cf06d6
|
|||
059808c980
|
|||
689df94d55
|
|||
d49884198d
|
|||
8627ad39d5
|
|||
8c62a841fd
|
|||
7496475ff4
|
|||
c5c44edf64
|
|||
59f2792ce8
|
|||
a80daface7
|
|||
f6db2f3b7c
|
|||
5d09cad6cb
|
|||
8fc2e326aa
|
|||
d775603ec0
|
|||
70bba2f186
|
|||
8ac9bee610
|
|||
07bda8e84d
|
|||
5712114eb8
|
|||
2a0db2eb01
|
|||
7d32b6d8c6
|
|||
60d44601d1
|
|||
b3cf33a945
|
|||
3ddc2f9d2f
|
|||
d6adaedc93
|
|||
6a985bc67a
|
|||
3a5e58bf34 | |||
b467af21c0
|
|||
acc400de6e
|
|||
cac0deeb3c
|
|||
e951d40b12
|
|||
46883e355b
|
|||
004df582ef
|
|||
b8cf6e90b0
|
|||
d0c06c7b55
|
|||
8858459b10
|
|||
86e40187a2
|
|||
62bcc17ed6
|
|||
52c9b51e8d
|
|||
aa03a0b332
|
|||
3017b5dd18
|
|||
1f54f7d41d
|
|||
5b73d3b35f
|
|||
decb0017f3
|
|||
a32b75bf44
|
|||
6c506579be
|
|||
701fb1373f
|
|||
20d26d8f5e
|
|||
5a41d9a7f4
|
|||
18d827965c
|
|||
c2183f99a0
|
|||
7ceb70737a
|
|||
faa3d326aa
|
|||
9fc90551e2
|
|||
0af47119e3
|
|||
955fa6efdc
|
|||
41ae17ba9a
|
|||
5bc1f04504
|
|||
09e1832fbe
|
|||
7c3fc54d26
|
|||
8972f7eed5
|
|||
9e68edbc43
|
|||
a259db6b8a
|
|||
d10586d477
|
|||
c804ba178b
|
|||
f04c5db493
|
|||
1de917223f
|
|||
fa064dc866
|
|||
ee72cd1f33
|
|||
777cf01174
|
|||
97e81018c7
|
|||
b65909c570
|
|||
b33a82622f
|
|||
96a8fb2c3d
|
|||
6c623d6965
|
|||
d31872512e
|
|||
d424afdab1
|
|||
9500bdf393
|
|||
6325ed1ade
|
|||
a4c44a5809
|
|||
82db70969a
|
|||
47931922bd
|
|||
af74c9e3fe
|
|||
611f37a1f3
|
|||
5d8b83e5ef
|
|||
53fdb48b05
|
|||
b64294ca11
|
|||
0785265feb
|
|||
4007f1258b
|
|||
c7c92d468e
|
|||
eee20f17b4
|
|||
0aa584d81a
|
|||
51e2debc4d
|
|||
d48ae9b12a
|
|||
83028c159f
|
|||
a8a3da753e
|
|||
9e77fa6831 | |||
e4919fb1fe
|
|||
724a3001ed
|
|||
8226679ccd
|
|||
2c0b3d5f6f
|
|||
a08c2455c6
|
|||
8868b16785
|
|||
fc009492cb
|
|||
e2ef8e6cb1
|
|||
da5498d1a2
|
|||
e8c8172298
|
|||
345d12263c
|
|||
843292eda7
|
|||
58721f4fa6
|
|||
ebbddc0001
|
|||
764a097fe2 | |||
60587b22f8
|
|||
ec80716991
|
22
.github/workflows/release.yml
vendored
@ -23,6 +23,7 @@ jobs:
|
||||
env:
|
||||
CF_API_KEY: ${{ secrets.CF_API_KEY }}
|
||||
WOWI_API_TOKEN: ${{ secrets.WOWI_API_TOKEN }}
|
||||
WAGO_API_TOKEN: ${{ secrets.WAGO_API_TOKEN }}
|
||||
GITHUB_OAUTH: ${{ secrets.GITHUB_TOKEN }} # "GITHUB_TOKEN" is a secret always provided to the workflow
|
||||
# for your own token, the name cannot start with "GITHUB_"
|
||||
|
||||
@ -31,20 +32,33 @@ jobs:
|
||||
|
||||
# we first have to clone the AddOn project, this is a required step
|
||||
- name: Clone project
|
||||
uses: actions/checkout@v1
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0 # gets git history for changelogs
|
||||
|
||||
# once cloned, we just run the GitHub Action for the packager project
|
||||
- name: Package and release
|
||||
uses: BigWigsMods/packager@master
|
||||
uses: BigWigsMods/packager@v2
|
||||
|
||||
# another example where we supply additional arguments, this example is specifically to release
|
||||
# for the Classic version of the game
|
||||
- name: Package and release for Classic
|
||||
uses: BigWigsMods/packager@master
|
||||
uses: BigWigsMods/packager@v2
|
||||
with:
|
||||
args: -g classic -w 0
|
||||
|
||||
- name: Package and release for TBC
|
||||
uses: BigWigsMods/packager@master
|
||||
uses: BigWigsMods/packager@v2
|
||||
with:
|
||||
args: -g bcc -w 0
|
||||
|
||||
- name: Package and release for Wrath
|
||||
uses: BigWigsMods/packager@v2
|
||||
with:
|
||||
args: -g wrath -w 0
|
||||
|
||||
- name: Package and release for Cataclysm
|
||||
uses: BigWigsMods/packager@v2
|
||||
with:
|
||||
args: -g cata -w 0
|
||||
|
20
.pkgmeta
@ -10,6 +10,9 @@ externals:
|
||||
libs/AceEvent-3.0:
|
||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceEvent-3.0
|
||||
tag: latest
|
||||
libs/AceSerializer-3.0:
|
||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceSerializer-3.0
|
||||
tag: latest
|
||||
libs/AceTimer-3.0:
|
||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceTimer-3.0
|
||||
tag: latest
|
||||
@ -37,15 +40,18 @@ externals:
|
||||
libs/AceLocale-3.0:
|
||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceLocale-3.0
|
||||
tag: latest
|
||||
libs/LibRangeCheck-2.0:
|
||||
url: https://github.com/WeakAuras/LibRangeCheck-2.0/
|
||||
libs/AceHook-3.0:
|
||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceHook-3.0
|
||||
tag: latest
|
||||
libs/LibRangeCheck-3.0:
|
||||
url: https://github.com/WeakAuras/LibRangeCheck-3.0/
|
||||
libs/LibSharedMedia-3.0:
|
||||
url: svn://svn.wowace.com/wow/libsharedmedia-3-0/mainline/trunk
|
||||
tag: latest
|
||||
libs/LibDogTag-3.0:
|
||||
url: git://git.wowace.com/wow/libdogtag-3-0/mainline.git
|
||||
url: https://github.com/parnic/LibDogTag-3.0
|
||||
libs/LibDogTag-Unit-3.0:
|
||||
url: git://git.wowace.com/wow/libdogtag-unit-3-0/mainline.git
|
||||
url: https://github.com/parnic/LibDogTag-Unit-3.0
|
||||
libs/LibDBIcon-1.0:
|
||||
url: svn://svn.wowace.com/wow/libdbicon-1-0/mainline/trunk/LibDBIcon-1.0
|
||||
libs/LibDualSpec-1.0:
|
||||
@ -54,17 +60,19 @@ externals:
|
||||
optional-dependencies:
|
||||
- libdogtag-3-0
|
||||
- libdogtag-unit-3-0
|
||||
- librangecheck-2-0
|
||||
- librangecheck-3-0
|
||||
|
||||
move-folders:
|
||||
IceHUD/IceHUD_Options: IceHUD_Options
|
||||
IceHUD/libs/LibRangeCheck-2.0/LibRangeCheck-2.0: IceHUD/libs/LibRangeCheck-2.0
|
||||
IceHUD/libs/LibRangeCheck-3.0/LibRangeCheck-3.0: IceHUD/libs/LibRangeCheck-3.0
|
||||
|
||||
tools-used:
|
||||
- libdatabroker-1-1
|
||||
|
||||
ignore:
|
||||
- readme.md
|
||||
- FUNDING.yml
|
||||
- this_version.md
|
||||
|
||||
manual-changelog: this_version.md
|
||||
|
||||
|
3
FUNDING.yml
Normal file
@ -0,0 +1,3 @@
|
||||
github: parnic
|
||||
ko_fi: parnic
|
||||
custom: "https://www.paypal.me/parnic"
|
@ -996,7 +996,7 @@ function IceBarElement.prototype:CreateBackground()
|
||||
self.frame = CreateFrame("Frame", "IceHUD_"..self.elementName, self.masterFrame)
|
||||
end
|
||||
|
||||
self.frame:SetFrameStrata("BACKGROUND")
|
||||
self.frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame:SetWidth(self.settings.barWidth + (self.moduleSettings.widthModifier or 0))
|
||||
self.frame:SetHeight(self.settings.barHeight)
|
||||
|
||||
@ -1041,6 +1041,7 @@ end
|
||||
-- Creates the actual bar
|
||||
function IceBarElement.prototype:CreateBar()
|
||||
self.barFrame = self:BarFactory(self.barFrame, "LOW", "ARTWORK", "Bar")
|
||||
|
||||
self:SetBarCoord(self.barFrame)
|
||||
|
||||
self.barFrame.bar:SetBlendMode(self.settings.barBlendMode)
|
||||
@ -1055,7 +1056,7 @@ function IceBarElement.prototype:BarFactory(barFrame, frameStrata, textureLayer,
|
||||
barFrame = CreateFrame("Frame", "IceHUD_"..self.elementName.."_"..(nameSuffix or "Bar"), self.frame)
|
||||
end
|
||||
|
||||
barFrame:SetFrameStrata(frameStrata and frameStrata or "LOW")
|
||||
barFrame:SetFrameStrata(IceHUD.IceCore:DetermineStrata(frameStrata and frameStrata or "LOW"))
|
||||
barFrame:SetWidth(self.settings.barWidth + (self.moduleSettings.widthModifier or 0))
|
||||
barFrame:SetHeight(self.settings.barHeight)
|
||||
self:SetBarFramePoints(barFrame)
|
||||
|
206
IceCastBar.lua
@ -3,7 +3,7 @@ IceCastBar = IceCore_CreateClass(IceBarElement)
|
||||
|
||||
local IceHUD = _G.IceHUD
|
||||
|
||||
IceCastBar.Actions = { None = 0, Cast = 1, Channel = 2, Instant = 3, Success = 4, Failure = 5 }
|
||||
IceCastBar.Actions = { None = 0, Cast = 1, Channel = 2, Instant = 3, Success = 4, Failure = 5, ReverseChannel = 6 }
|
||||
|
||||
IceCastBar.prototype.action = nil
|
||||
IceCastBar.prototype.actionStartTime = nil
|
||||
@ -23,6 +23,25 @@ if not UnitCastingInfo then
|
||||
UnitChannelInfo = ChannelInfo
|
||||
end
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(spellID)
|
||||
if not spellID then
|
||||
return nil
|
||||
end
|
||||
|
||||
local spellInfo = C_Spell.GetSpellInfo(spellID)
|
||||
if spellInfo then
|
||||
return spellInfo.name, nil, spellInfo.iconID, spellInfo.castTime, spellInfo.minRange, spellInfo.maxRange, spellInfo.spellID, spellInfo.originalIconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Fulzamoth 2019-09-27 : Use LibClassicCasterino if it's there so we can use TargetCast
|
||||
-- module in Classic WoW
|
||||
if IceHUD.WowClassic then
|
||||
@ -49,6 +68,13 @@ function IceCastBar.prototype:init(name)
|
||||
self:SetDefaultColor("CastChanneling", 242, 242, 10)
|
||||
self:SetDefaultColor("CastSuccess", 242, 242, 70)
|
||||
self:SetDefaultColor("CastFail", 1, 0, 0)
|
||||
if GetUnitEmpowerMinHoldTime then
|
||||
self:SetDefaultColor("EmpowerStage0", 165, 165, 165)
|
||||
self:SetDefaultColor("EmpowerStage1", 242, 42, 10)
|
||||
self:SetDefaultColor("EmpowerStage2", 242, 142, 10)
|
||||
self:SetDefaultColor("EmpowerStage3", 242, 242, 10)
|
||||
self:SetDefaultColor("EmpowerStage4", 242, 242, 242)
|
||||
end
|
||||
self.unit = "player"
|
||||
|
||||
self.delay = 0
|
||||
@ -109,6 +135,12 @@ function IceCastBar.prototype:Enable(core)
|
||||
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE", "SpellCastChannelUpdate") -- unit, spell, rank
|
||||
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", "SpellCastChannelStop") -- unit, spell, rank
|
||||
|
||||
if GetUnitEmpowerHoldAtMaxTime then
|
||||
self:RegisterEvent("UNIT_SPELLCAST_EMPOWER_START", "SpellCastChannelStart")
|
||||
self:RegisterEvent("UNIT_SPELLCAST_EMPOWER_UPDATE", "SpellCastChannelUpdate")
|
||||
self:RegisterEvent("UNIT_SPELLCAST_EMPOWER_STOP", "SpellCastChannelStop")
|
||||
end
|
||||
|
||||
end
|
||||
self:Show(false)
|
||||
end
|
||||
@ -146,7 +178,7 @@ function IceCastBar.prototype:GetOptions()
|
||||
end,
|
||||
order = 39.998
|
||||
}
|
||||
if IceHUD.WowVer < 80000 then
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
opts["showSpellRank"] =
|
||||
{
|
||||
type = 'toggle',
|
||||
@ -311,7 +343,13 @@ function IceCastBar.prototype:PositionIcons()
|
||||
self.barFrame.icon:SetHeight(AuraIconHeight * self.moduleSettings.auraIconScale)
|
||||
end
|
||||
|
||||
function IceCastBar.prototype:GetRemainingCastTime()
|
||||
return self.actionStartTime + self.actionDuration - GetTime()
|
||||
end
|
||||
|
||||
function IceCastBar.prototype:GetCurrentCastDurationMs()
|
||||
return (GetTime() - (self.actionStartTime or GetTime())) * 1000
|
||||
end
|
||||
|
||||
-- OnUpdate handler
|
||||
function IceCastBar.prototype:MyOnUpdate()
|
||||
@ -322,17 +360,15 @@ function IceCastBar.prototype:MyOnUpdate()
|
||||
return
|
||||
end
|
||||
|
||||
local time = GetTime()
|
||||
|
||||
self:Update()
|
||||
self:SetTextAlpha()
|
||||
|
||||
-- handle casting and channeling
|
||||
if (self.action == IceCastBar.Actions.Cast or self.action == IceCastBar.Actions.Channel) then
|
||||
local remainingTime = self.actionStartTime + self.actionDuration - time
|
||||
if (self.action == IceCastBar.Actions.Cast or self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel) then
|
||||
local remainingTime = self:GetRemainingCastTime()
|
||||
local scale = 1 - (self.actionDuration ~= 0 and remainingTime / self.actionDuration or 0)
|
||||
|
||||
if (self.moduleSettings.reverseChannel and self.action == IceCastBar.Actions.Channel) then
|
||||
if self.action == IceCastBar.Actions.ReverseChannel then
|
||||
scale = self.actionDuration ~= 0 and remainingTime / self.actionDuration or 0
|
||||
end
|
||||
|
||||
@ -343,14 +379,22 @@ function IceCastBar.prototype:MyOnUpdate()
|
||||
end
|
||||
|
||||
local timeString = self.moduleSettings.showCastTime and string.format("%.1fs ", remainingTime) or ""
|
||||
self:SetBottomText1(timeString .. self.actionMessage)
|
||||
local empowerString = self.NumStages ~= nil and (L["Stage %d"]):format(self:GetCurrentStage()) or ""
|
||||
local line1 = timeString .. (self.actionMessage or "")
|
||||
if self.moduleSettings.empowerStageTextDisplay == "TOPLINE" then
|
||||
line1 = line1 .. " " .. empowerString
|
||||
end
|
||||
if self.moduleSettings.empowerStageTextDisplay == "BOTTOMLINE" then
|
||||
self:SetBottomText2(empowerString)
|
||||
end
|
||||
self:SetBottomText1(line1)
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
-- stop bar if casting or channeling is done (in theory this should not be needed)
|
||||
if (self.action == IceCastBar.Actions.Cast or self.action == IceCastBar.Actions.Channel) then
|
||||
if (self.action == IceCastBar.Actions.Cast or self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel) then
|
||||
self:StopBar()
|
||||
return
|
||||
end
|
||||
@ -361,17 +405,24 @@ function IceCastBar.prototype:MyOnUpdate()
|
||||
self.action == IceCastBar.Actions.Success or
|
||||
self.action == IceCastBar.Actions.Failure)
|
||||
then
|
||||
local scale = time - self.actionStartTime
|
||||
local scale
|
||||
if self.actionStartTime then
|
||||
scale = GetTime() - self.actionStartTime
|
||||
end
|
||||
|
||||
if (scale > 1) then
|
||||
if scale and (scale > 1) then
|
||||
self:StopBar()
|
||||
return
|
||||
end
|
||||
|
||||
if (self.action == IceCastBar.Actions.Failure) then
|
||||
self:FlashBar("CastFail", 1-scale, self.actionMessage, "CastFail")
|
||||
else
|
||||
self:FlashBar("CastSuccess", 1-scale, self.actionMessage)
|
||||
self:UpdateBar(1, self:GetCurrentCastingColor())
|
||||
|
||||
if scale then
|
||||
if (self.action == IceCastBar.Actions.Failure) then
|
||||
self:FlashBar("CastFail", 1-scale, self.actionMessage, "CastFail")
|
||||
else
|
||||
self:FlashBar("CastSuccess", 1-scale, self.actionMessage)
|
||||
end
|
||||
end
|
||||
return
|
||||
end
|
||||
@ -381,16 +432,70 @@ function IceCastBar.prototype:MyOnUpdate()
|
||||
self:StopBar()
|
||||
end
|
||||
|
||||
function IceCastBar.prototype:GetCurrentCastingColor()
|
||||
local updateColor = "CastCasting"
|
||||
if self.action == IceCastBar.Actions.Channel then
|
||||
updateColor = "CastChanneling"
|
||||
function IceCastBar.prototype:GetStageDuration(stage)
|
||||
if not GetUnitEmpowerMinHoldTime then
|
||||
return 0
|
||||
end
|
||||
return updateColor
|
||||
|
||||
if stage == 0 then
|
||||
return GetUnitEmpowerMinHoldTime(self.unit)
|
||||
end
|
||||
|
||||
return GetUnitEmpowerStageDuration(self.unit, stage);
|
||||
end
|
||||
|
||||
function IceCastBar.prototype:GetDurationUpToStage(stage)
|
||||
if stage == nil or stage < 0 then
|
||||
return 0
|
||||
end
|
||||
|
||||
local total = 0
|
||||
for i=0,stage-1 do
|
||||
total = total + self:GetStageDuration(i)
|
||||
end
|
||||
|
||||
return total
|
||||
end
|
||||
|
||||
function IceCastBar.prototype:GetCurrentStage()
|
||||
if not GetUnitEmpowerMinHoldTime then
|
||||
return 0
|
||||
end
|
||||
|
||||
local castDuration = self:GetCurrentCastDurationMs()
|
||||
for i=1,self.NumStages do
|
||||
if castDuration < self:GetDurationUpToStage(i) then
|
||||
return i - 1
|
||||
end
|
||||
end
|
||||
|
||||
return self.NumStages
|
||||
end
|
||||
|
||||
function IceCastBar.prototype:IsCastingEmpowerSpell()
|
||||
return self.NumStages ~= nil
|
||||
end
|
||||
|
||||
function IceCastBar.prototype:GetCurrentCastingColor()
|
||||
if self:IsCastingEmpowerSpell() then
|
||||
return ("EmpowerStage%d"):format(self:GetCurrentStage())
|
||||
end
|
||||
|
||||
if self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel then
|
||||
return "CastChanneling"
|
||||
end
|
||||
|
||||
return "CastCasting"
|
||||
end
|
||||
|
||||
function IceCastBar.prototype:FlashBar(color, alpha, text, textColor)
|
||||
self.frame:SetAlpha(alpha)
|
||||
if self.moduleSettings.flashInstants == "Never" then
|
||||
return
|
||||
end
|
||||
|
||||
if alpha then
|
||||
self.frame:SetAlpha(alpha)
|
||||
end
|
||||
|
||||
local r, g, b = self.settings.backgroundColor.r, self.settings.backgroundColor.g, self.settings.backgroundColor.b
|
||||
if (self.settings.backgroundToggle) then
|
||||
@ -405,8 +510,8 @@ function IceCastBar.prototype:FlashBar(color, alpha, text, textColor)
|
||||
end
|
||||
|
||||
|
||||
function IceCastBar.prototype:StartBar(action, message)
|
||||
local spell, rank, displayName, icon, startTime, endTime, isTradeSkill
|
||||
function IceCastBar.prototype:StartBar(action, message, spellId)
|
||||
local spell, rank, displayName, icon, startTime, endTime, isTradeSkill, numStages
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
spell, rank, displayName, icon, startTime, endTime, isTradeSkill = UnitCastingInfo(self.unit)
|
||||
else
|
||||
@ -416,7 +521,28 @@ function IceCastBar.prototype:StartBar(action, message)
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
spell, rank, displayName, icon, startTime, endTime = UnitChannelInfo(self.unit)
|
||||
else
|
||||
spell, displayName, icon, startTime, endTime = UnitChannelInfo(self.unit)
|
||||
spell, displayName, icon, startTime, endTime, isTradeSkill, _, _, _, numStages = UnitChannelInfo(self.unit)
|
||||
end
|
||||
end
|
||||
|
||||
if spellId and not spell then
|
||||
spell, rank, icon = GetSpellInfo(spellId)
|
||||
end
|
||||
|
||||
local isChargeSpell = numStages and numStages > 0
|
||||
if isChargeSpell then
|
||||
self.NumStages = numStages
|
||||
endTime = endTime + GetUnitEmpowerHoldAtMaxTime(self.unit)
|
||||
action = IceCastBar.Actions.ReverseChannel
|
||||
else
|
||||
self.NumStages = nil
|
||||
end
|
||||
|
||||
if self.moduleSettings.reverseChannel then
|
||||
if action == IceCastBar.Actions.Channel then
|
||||
action = IceCastBar.Actions.ReverseChannel
|
||||
elseif action == IceCastBar.Actions.ReverseChannel then
|
||||
action = IceCastBar.Actions.Channel
|
||||
end
|
||||
end
|
||||
|
||||
@ -424,7 +550,7 @@ function IceCastBar.prototype:StartBar(action, message)
|
||||
if LibClassicCasterino and not spell then
|
||||
self:StopBar()
|
||||
elseif not spell then
|
||||
return
|
||||
return
|
||||
end
|
||||
|
||||
if icon ~= nil then
|
||||
@ -465,12 +591,13 @@ function IceCastBar.prototype:StopBar()
|
||||
self.actionDuration = nil
|
||||
|
||||
self:SetBottomText1()
|
||||
self:SetBottomText2()
|
||||
self:SetScale(0)
|
||||
self:Show(false)
|
||||
end
|
||||
|
||||
function IceCastBar.prototype:GetShortRank(rank)
|
||||
if IceHUD.WowVer < 80000 and rank then
|
||||
if IceHUD.SpellFunctionsReturnRank and rank then
|
||||
local _, _, sRank = string.find(rank, "(%d+)")
|
||||
if (sRank) then
|
||||
return " (" .. sRank .. ")"
|
||||
@ -499,7 +626,7 @@ function IceCastBar.prototype:SpellCastStart(event, unit, castGuid, spellId)
|
||||
IceHUD:Debug("SpellCastStart", unit, castGuid, spellId)
|
||||
--UnitCastingInfo(unit)
|
||||
|
||||
self:StartBar(IceCastBar.Actions.Cast)
|
||||
self:StartBar(IceCastBar.Actions.Cast, nil, spellId)
|
||||
self.current = castGuid
|
||||
end
|
||||
|
||||
@ -514,11 +641,13 @@ function IceCastBar.prototype:SpellCastStop(event, unit, castGuid, spellId)
|
||||
|
||||
if (self.action ~= IceCastBar.Actions.Success and
|
||||
self.action ~= IceCastBar.Actions.Failure and
|
||||
self.action ~= IceCastBar.Actions.Channel)
|
||||
self.action ~= IceCastBar.Actions.Channel and
|
||||
self.action ~= IceCastBar.Actions.ReverseChannel)
|
||||
then
|
||||
self:StopBar()
|
||||
self.current = nil
|
||||
end
|
||||
|
||||
self.current = nil
|
||||
end
|
||||
|
||||
|
||||
@ -532,7 +661,7 @@ function IceCastBar.prototype:SpellCastFailed(event, unit, castGuid, spellId)
|
||||
end
|
||||
|
||||
-- channeled spells will call ChannelStop, not cast failed
|
||||
if self.action == IceCastBar.Actions.Channel then
|
||||
if self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel then
|
||||
return
|
||||
end
|
||||
|
||||
@ -547,7 +676,7 @@ function IceCastBar.prototype:SpellCastFailed(event, unit, castGuid, spellId)
|
||||
end
|
||||
end
|
||||
|
||||
self:StartBar(IceCastBar.Actions.Failure, "Failed")
|
||||
self:StartBar(IceCastBar.Actions.Failure, "Failed", nil, spellId)
|
||||
end
|
||||
|
||||
function IceCastBar.prototype:SpellCastInterrupted(event, unit, castGuid, spellId)
|
||||
@ -561,7 +690,7 @@ function IceCastBar.prototype:SpellCastInterrupted(event, unit, castGuid, spellI
|
||||
|
||||
self.current = nil
|
||||
|
||||
self:StartBar(IceCastBar.Actions.Failure, "Interrupted")
|
||||
self:StartBar(IceCastBar.Actions.Failure, "Interrupted", spellId)
|
||||
end
|
||||
|
||||
function IceCastBar.prototype:SpellCastDelayed(event, unit, castGuid, spellId)
|
||||
@ -582,7 +711,7 @@ function IceCastBar.prototype:SpellCastSucceeded(event, unit, castGuid, spellId)
|
||||
--IceHUD:Debug("SpellCastSucceeded", unit, castGuid, spellId)
|
||||
|
||||
-- never show on channeled (why on earth does this event even fire when channeling starts?)
|
||||
if (self.action == IceCastBar.Actions.Channel) then
|
||||
if (self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel) then
|
||||
return
|
||||
end
|
||||
|
||||
@ -591,11 +720,11 @@ function IceCastBar.prototype:SpellCastSucceeded(event, unit, castGuid, spellId)
|
||||
return
|
||||
end
|
||||
|
||||
local spell = GetSpellInfo(spellId)
|
||||
local spell = GetSpellName(spellId)
|
||||
|
||||
-- show after normal successfull cast
|
||||
if (self.action == IceCastBar.Actions.Cast) then
|
||||
self:StartBar(IceCastBar.Actions.Success, spell.. self:GetShortRank(rank))
|
||||
self:StartBar(IceCastBar.Actions.Success, spell, spellId)
|
||||
return
|
||||
end
|
||||
|
||||
@ -608,7 +737,12 @@ function IceCastBar.prototype:SpellCastSucceeded(event, unit, castGuid, spellId)
|
||||
end
|
||||
end
|
||||
|
||||
self:StartBar(IceCastBar.Actions.Success, spell.. self:GetShortRank(rank))
|
||||
-- handle special spells that are used for quests or other things that don't apply to the player
|
||||
if self.unit == "player" and not IsPlayerSpell(spellId) then
|
||||
return
|
||||
end
|
||||
|
||||
self:StartBar(IceCastBar.Actions.Success, spell, spellId)
|
||||
end
|
||||
|
||||
|
||||
|
163
IceCore.lua
@ -19,6 +19,25 @@ end
|
||||
|
||||
local DogTag = LibStub("LibDogTag-3.0", true)
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(spellID)
|
||||
if not spellID then
|
||||
return nil
|
||||
end
|
||||
|
||||
local spellInfo = C_Spell.GetSpellInfo(spellID)
|
||||
if spellInfo then
|
||||
return spellInfo.name, nil, spellInfo.iconID, spellInfo.castTime, spellInfo.minRange, spellInfo.maxRange, spellInfo.spellID, spellInfo.originalIconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
IceCore = IceCore_CreateClass()
|
||||
|
||||
IceCore.Side = { Left = "LEFT", Right = "RIGHT" }
|
||||
@ -41,6 +60,26 @@ IceCore.TextDecorationStyle = {
|
||||
NoDecoration = L["No decoration"],
|
||||
}
|
||||
|
||||
local ZM_MAP_ID = 1970
|
||||
IceCore.zmPuzzleIds = {
|
||||
--Fugueal Protolock
|
||||
366046,
|
||||
366108,
|
||||
359488,
|
||||
--Mezzonic Protolock
|
||||
366042,
|
||||
366106,
|
||||
351405,
|
||||
--Cantaric Protolock
|
||||
365840,
|
||||
366107,
|
||||
348792,
|
||||
}
|
||||
IceCore.zmPuzzleMap = {}
|
||||
for i=1, #IceCore.zmPuzzleIds do
|
||||
IceCore.zmPuzzleMap[IceCore.zmPuzzleIds[i]] = true
|
||||
end
|
||||
|
||||
local SUNDER_SPELL_ID = 7386
|
||||
local LACERATE_SPELL_ID = 33745
|
||||
local MAELSTROM_SPELL_ID = 53817
|
||||
@ -95,6 +134,9 @@ function IceCore.prototype:SetupDefaults()
|
||||
bHideDuringPetBattles = true,
|
||||
bHideInBarberShop = true,
|
||||
bHideDuringShellGame = true,
|
||||
bHideDuringCataloging = true,
|
||||
|
||||
addedStrata = 0,
|
||||
},
|
||||
global = {
|
||||
lastRunVersion = 0,
|
||||
@ -259,7 +301,14 @@ function IceCore.prototype:Enable(userToggle)
|
||||
self.IceHUDFrame:RegisterEvent("BARBER_SHOP_OPEN")
|
||||
self.IceHUDFrame:RegisterEvent("BARBER_SHOP_CLOSE")
|
||||
end
|
||||
if C_Map then
|
||||
self.IceHUDFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||
self.IceHUDFrame:RegisterEvent("ZONE_CHANGED")
|
||||
end
|
||||
self.IceHUDFrame:RegisterEvent("UNIT_AURA")
|
||||
self.IceHUDFrame:RegisterEvent("UNIT_ENTERED_VEHICLE")
|
||||
self.IceHUDFrame:RegisterEvent("PLAYER_REGEN_ENABLED", IceHUD.PLAYER_REGEN_ENABLED)
|
||||
self.IceHUDFrame:RegisterEvent("PLAYER_REGEN_DISABLED", IceHUD.PLAYER_REGEN_DISABLED)
|
||||
self.IceHUDFrame:SetScript("OnEvent", function(self, event, ...)
|
||||
if (event == "PET_BATTLE_OPENING_START") then
|
||||
if IceHUD.IceCore.settings.bHideDuringPetBattles then
|
||||
@ -277,15 +326,58 @@ function IceCore.prototype:Enable(userToggle)
|
||||
if IceHUD.IceCore.settings.bHideInBarberShop then
|
||||
self:Show()
|
||||
end
|
||||
elseif (event == "UNIT_AURA") then
|
||||
local unit = ...
|
||||
if IceHUD.IceCore.settings.bHideDuringShellGame and unit == "player" and IceHUD:HasDebuffs("player", {271571})[1] and UnitInVehicle("player") then
|
||||
elseif event == "UNIT_ENTERED_VEHICLE" then
|
||||
if IceHUD.IceCore.settings.bHideDuringCataloging and IceHUD:HasAnyBuff("player", IceHUD.CatalogingSpellIDs) then
|
||||
self:RegisterEvent("UNIT_EXITED_VEHICLE")
|
||||
self:Hide()
|
||||
end
|
||||
elseif (event == "UNIT_AURA") then
|
||||
local unit = ...
|
||||
if unit ~= "player" then
|
||||
return
|
||||
end
|
||||
|
||||
if IceHUD.IceCore.settings.bHideDuringShellGame and IceHUD:HasAnyDebuff("player", {IceHUD.ShellGameSpellID}) and UnitInVehicle("player") then
|
||||
self:RegisterEvent("UNIT_EXITED_VEHICLE")
|
||||
self:Hide()
|
||||
elseif IceHUD.IceCore.settings.bHideDuringCataloging and IceHUD:HasAnyBuff("player", IceHUD.CatalogingSpellIDs) and UnitInVehicle("player") then
|
||||
self:RegisterEvent("UNIT_EXITED_VEHICLE")
|
||||
self:Hide()
|
||||
elseif C_Map then
|
||||
local bestMapID = C_Map.GetBestMapForUnit("player")
|
||||
if bestMapID ~= ZM_MAP_ID then
|
||||
return
|
||||
end
|
||||
|
||||
if IceHUD:HasAnyBuff("player", IceCore.zmPuzzleIds) then
|
||||
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
|
||||
self:Hide()
|
||||
end
|
||||
end
|
||||
elseif (event == "UNIT_EXITED_VEHICLE") then
|
||||
self:UnregisterEvent("UNIT_EXITED_VEHICLE")
|
||||
self:Show()
|
||||
elseif (event == "PLAYER_ENTERING_WORLD" or event == "ZONE_CHANGED") then
|
||||
if C_Map then
|
||||
local bestMapID = C_Map.GetBestMapForUnit("player")
|
||||
if bestMapID == ZM_MAP_ID then
|
||||
if IceHUD:HasAnyBuff("player", IceCore.zmPuzzleIds) then
|
||||
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
|
||||
self:Hide()
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif (event == "COMBAT_LOG_EVENT_UNFILTERED") then
|
||||
local _,subevent,_,_,_,_,_,_,destName,_,_,spellId = CombatLogGetCurrentEventInfo()
|
||||
|
||||
if subevent == "SPELL_AURA_REMOVED" then
|
||||
if destName == UnitName("player") then
|
||||
if IceCore.zmPuzzleMap[spellId] then
|
||||
self:Show()
|
||||
self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
@ -294,13 +386,13 @@ end
|
||||
|
||||
function IceCore.prototype:RedirectRemovedModules()
|
||||
local _, class = UnitClass("player")
|
||||
if class == "WARRIOR" and self.settings.modules["SunderCount"] and GetSpellInfo(SUNDER_SPELL_ID) and IceHUD.WowVer < 60000 then
|
||||
if class == "WARRIOR" and self.settings.modules["SunderCount"] and GetSpellName(SUNDER_SPELL_ID) and IceHUD.WowVer < 60000 then
|
||||
if self.settings.modules["SunderCount"].enabled or self.settings.modules["SunderCount"].enabled == nil then
|
||||
local bFound = false
|
||||
|
||||
for k,v in pairs(self.elements) do
|
||||
if v.moduleSettings.customBarType == "Counter" and v.moduleSettings.auraName
|
||||
and string.upper(v.moduleSettings.auraName) == string.upper(GetSpellInfo(SUNDER_SPELL_ID)) then
|
||||
and string.upper(v.moduleSettings.auraName) == string.upper(GetSpellName(SUNDER_SPELL_ID)) then
|
||||
bFound = true
|
||||
break
|
||||
end
|
||||
@ -323,7 +415,7 @@ function IceCore.prototype:RedirectRemovedModules()
|
||||
newCounter.moduleSettings.maxCount = 3
|
||||
newCounter.moduleSettings.auraTarget = "target"
|
||||
newCounter.moduleSettings.auraType = "debuff"
|
||||
newCounter.moduleSettings.auraName = GetSpellInfo(SUNDER_SPELL_ID)
|
||||
newCounter.moduleSettings.auraName = GetSpellName(SUNDER_SPELL_ID)
|
||||
newCounter:Enable()
|
||||
end
|
||||
end
|
||||
@ -331,12 +423,12 @@ function IceCore.prototype:RedirectRemovedModules()
|
||||
self.settings.modules["SunderCount"] = nil
|
||||
end
|
||||
|
||||
if class == "DRUID" and self.settings.modules["LacerateCount"] and GetSpellInfo(LACERATE_SPELL_ID) then
|
||||
if class == "DRUID" and self.settings.modules["LacerateCount"] and GetSpellName(LACERATE_SPELL_ID) then
|
||||
if self.settings.modules["LacerateCount"].enabled or self.settings.modules["LacerateCount"].enabled == nil then
|
||||
local bFound = false
|
||||
for k,v in pairs(self.elements) do
|
||||
if v.moduleSettings.customBarType == "Counter" and v.moduleSettings.auraName
|
||||
and string.upper(v.moduleSettings.auraName) == string.upper(GetSpellInfo(LACERATE_SPELL_ID)) then
|
||||
and string.upper(v.moduleSettings.auraName) == string.upper(GetSpellName(LACERATE_SPELL_ID)) then
|
||||
bFound = true
|
||||
break
|
||||
end
|
||||
@ -360,7 +452,7 @@ function IceCore.prototype:RedirectRemovedModules()
|
||||
newCounter.moduleSettings.maxCount = 3
|
||||
newCounter.moduleSettings.auraTarget = "target"
|
||||
newCounter.moduleSettings.auraType = "debuff"
|
||||
newCounter.moduleSettings.auraName = GetSpellInfo(LACERATE_SPELL_ID)
|
||||
newCounter.moduleSettings.auraName = GetSpellName(LACERATE_SPELL_ID)
|
||||
newCounter:Enable()
|
||||
end
|
||||
end
|
||||
@ -368,12 +460,12 @@ function IceCore.prototype:RedirectRemovedModules()
|
||||
self.settings.modules["LacerateCount"] = nil
|
||||
end
|
||||
|
||||
if class == "SHAMAN" and self.settings.modules["MaelstromCount"] and GetSpellInfo(MAELSTROM_SPELL_ID) then
|
||||
if class == "SHAMAN" and self.settings.modules["MaelstromCount"] and GetSpellName(MAELSTROM_SPELL_ID) then
|
||||
if self.settings.modules["MaelstromCount"].enabled or self.settings.modules["MaelstromCount"].enabled == nil then
|
||||
local bFound = false
|
||||
for k,v in pairs(self.elements) do
|
||||
if v.moduleSettings.customBarType == "Counter" and v.moduleSettings.auraName
|
||||
and string.upper(v.moduleSettings.auraName) == string.upper(GetSpellInfo(MAELSTROM_SPELL_ID)) then
|
||||
and string.upper(v.moduleSettings.auraName) == string.upper(GetSpellName(MAELSTROM_SPELL_ID)) then
|
||||
bFound = true
|
||||
break
|
||||
end
|
||||
@ -393,7 +485,7 @@ function IceCore.prototype:RedirectRemovedModules()
|
||||
newCounter.moduleSettings.countMode = self.settings.modules["MaelstromCount"].maelstromMode or newCounter.moduleSettings.countMode
|
||||
newCounter.moduleSettings.countGap = self.settings.modules["MaelstromCount"].maelstromGap or newCounter.moduleSettings.countGap
|
||||
newCounter.moduleSettings.gradient = self.settings.modules["MaelstromCount"].gradient or newCounter.moduleSettings.gradient
|
||||
newCounter.moduleSettings.auraName = GetSpellInfo(MAELSTROM_SPELL_ID)
|
||||
newCounter.moduleSettings.auraName = GetSpellName(MAELSTROM_SPELL_ID)
|
||||
newCounter:Enable()
|
||||
end
|
||||
end
|
||||
@ -539,7 +631,7 @@ function IceCore.prototype:IsEnabled()
|
||||
end
|
||||
|
||||
function IceCore.prototype:DrawFrame()
|
||||
self.IceHUDFrame:SetFrameStrata("BACKGROUND")
|
||||
self.IceHUDFrame:SetFrameStrata(self:DetermineStrata("BACKGROUND"))
|
||||
self.IceHUDFrame:SetWidth(self.settings.gap)
|
||||
self.IceHUDFrame:SetHeight(20)
|
||||
|
||||
@ -584,10 +676,11 @@ function IceCore.prototype:GetModuleOptions()
|
||||
|
||||
for i = 1, table.getn(self.elements) do
|
||||
local modName = self.elements[i]:GetElementName()
|
||||
local modDesc = self.elements[i]:GetElementDescription()
|
||||
local opt = self.elements[i]:GetOptions()
|
||||
options[modName] = {
|
||||
type = 'group',
|
||||
desc = L["Module options"],
|
||||
desc = modDesc,
|
||||
name = modName,
|
||||
args = opt
|
||||
}
|
||||
@ -859,6 +952,48 @@ function IceCore.prototype:SetColor(color, r, g, b)
|
||||
self:Redraw()
|
||||
end
|
||||
|
||||
function IceCore.prototype:GetAddedStrata()
|
||||
return self.settings.addedStrata
|
||||
end
|
||||
|
||||
function IceCore.prototype:SetAddedStrata(value)
|
||||
self.settings.addedStrata = value
|
||||
end
|
||||
|
||||
-- Preventing ugly if-else blocks in module creations
|
||||
-- (but could probably itself be smarter/prettier)
|
||||
-- Frisbees/AddonWhiner
|
||||
function IceCore.prototype:DetermineStrata(baseStrata)
|
||||
if self.settings.addedStrata == 0 then
|
||||
return baseStrata
|
||||
end
|
||||
|
||||
if self.settings.addedStrata == 1 then
|
||||
if baseStrata == "BACKGROUND" then
|
||||
return "LOW"
|
||||
elseif baseStrata == "LOW" then
|
||||
return "MEDIUM"
|
||||
elseif baseStrata == "MEDIUM" then
|
||||
return "HIGH"
|
||||
elseif baseStrata == "HIGH" then
|
||||
return "DIALOG"
|
||||
end
|
||||
end
|
||||
|
||||
if self.settings.addedStrata == 2 then
|
||||
if baseStrata == "BACKGROUND" then
|
||||
return "MEDIUM"
|
||||
elseif baseStrata == "LOW" then
|
||||
return "HIGH"
|
||||
elseif baseStrata == "MEDIUM" then
|
||||
return "DIALOG"
|
||||
elseif baseStrata == "HIGH" then
|
||||
return "FULLSCREEN"
|
||||
end
|
||||
end
|
||||
|
||||
return baseStrata -- failsafe
|
||||
end
|
||||
|
||||
function IceCore.prototype:IsInConfigMode()
|
||||
return self.bConfigMode
|
||||
|
@ -63,6 +63,10 @@ function IceElement.prototype:GetElementName()
|
||||
return self.elementName
|
||||
end
|
||||
|
||||
function IceElement.prototype:GetElementDescription()
|
||||
return L["Module options"]
|
||||
end
|
||||
|
||||
|
||||
function IceElement.prototype:Create(parent)
|
||||
assert(parent, "IceElement 'parent' can't be nil")
|
||||
@ -70,7 +74,7 @@ function IceElement.prototype:Create(parent)
|
||||
self.parent = parent
|
||||
if not self.masterFrame then
|
||||
self.masterFrame = CreateFrame("Frame", "IceHUD_Element_"..self.elementName, self.parent)
|
||||
self.masterFrame:SetFrameStrata("MEDIUM")
|
||||
self.masterFrame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("MEDIUM"))
|
||||
end
|
||||
self:CreateFrame()
|
||||
self:Show(false)
|
||||
|
371
IceHUD.lua
@ -1,5 +1,5 @@
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
||||
IceHUD = LibStub("AceAddon-3.0"):NewAddon("IceHUD", "AceConsole-3.0")
|
||||
IceHUD = LibStub("AceAddon-3.0"):NewAddon("IceHUD", "AceConsole-3.0", "AceHook-3.0")
|
||||
|
||||
local IceHUD = IceHUD
|
||||
|
||||
@ -7,34 +7,99 @@ local SML = LibStub("LibSharedMedia-3.0")
|
||||
local ACR = LibStub("AceConfigRegistry-3.0")
|
||||
local ConfigDialog = LibStub("AceConfigDialog-3.0")
|
||||
local icon = LibStub("LibDBIcon-1.0", true)
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
local AceSerializer = LibStub("AceSerializer-3.0", 1)
|
||||
|
||||
local pendingModuleLoads = {}
|
||||
local bReadyToRegisterModules = false
|
||||
|
||||
local LoadAddOn = C_AddOns and C_AddOns.LoadAddOn or LoadAddOn
|
||||
|
||||
IceHUD.UnitAura = UnitAura
|
||||
if not IceHUD.UnitAura then
|
||||
IceHUD.UnitAura = function(unitToken, index, filter)
|
||||
local auraData = C_UnitAuras.GetAuraDataByIndex(unitToken, index, filter)
|
||||
if not auraData then
|
||||
return nil
|
||||
end
|
||||
|
||||
return AuraUtil.UnpackAuraData(auraData)
|
||||
end
|
||||
end
|
||||
|
||||
IceHUD.CurrTagVersion = 3
|
||||
IceHUD.debugging = false
|
||||
|
||||
IceHUD.WowVer = select(4, GetBuildInfo())
|
||||
IceHUD.WowMain = not WOW_PROJECT_ID or WOW_PROJECT_ID == WOW_PROJECT_MAINLINE
|
||||
IceHUD.WowClassic = WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_CLASSIC
|
||||
IceHUD.WowClassicBC = WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_BURNING_CRUSADE_CLASSIC
|
||||
if GetClassicExpansionLevel then
|
||||
IceHUD.WowClassic = GetClassicExpansionLevel() == 0
|
||||
IceHUD.WowClassicBC = GetClassicExpansionLevel() == 1
|
||||
IceHUD.WowClassicWrath = GetClassicExpansionLevel() == 2
|
||||
IceHUD.WowClassicCataclysm = GetClassicExpansionLevel() == 3
|
||||
else
|
||||
IceHUD.WowClassic = WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_CLASSIC
|
||||
IceHUD.WowClassicBC = false
|
||||
IceHUD.WowClassicWrath = false
|
||||
IceHUD.WowClassicCataclysm = false
|
||||
if WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_BURNING_CRUSADE_CLASSIC then
|
||||
if not LE_EXPANSION_LEVEL_CURRENT or LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_BURNING_CRUSADE then
|
||||
IceHUD.WowClassicBC = true
|
||||
elseif LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_WRATH_OF_THE_LICH_KING then
|
||||
IceHUD.WowClassicWrath = true
|
||||
end
|
||||
elseif WOW_PROJECT_WRATH_CLASSIC and WOW_PROJECT_ID == WOW_PROJECT_WRATH_CLASSIC then
|
||||
IceHUD.WowClassicWrath = true
|
||||
elseif WOW_PROJECT_CATACLYSM_CLASSIC and WOW_PROJECT_ID == WOW_PROJECT_CATACLYSM_CLASSIC then
|
||||
IceHUD.WowClassicCataclysm = true
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(spellID)
|
||||
if not spellID then
|
||||
return nil
|
||||
end
|
||||
|
||||
local spellInfo = C_Spell.GetSpellInfo(spellID)
|
||||
if spellInfo then
|
||||
return spellInfo.name, nil, spellInfo.iconID, spellInfo.castTime, spellInfo.minRange, spellInfo.maxRange, spellInfo.spellID, spellInfo.originalIconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
-- compatibility/feature flags
|
||||
IceHUD.CanShowTargetCasting = not IceHUD.WowClassic or LibClassicCasterino or (IceHUD.WowClassic and IceHUD.WowVer >= 11500)
|
||||
IceHUD.GetPlayerAuraBySpellID = _G["C_UnitAuras"] and C_UnitAuras.GetPlayerAuraBySpellID
|
||||
IceHUD.SpellFunctionsReturnRank = IceHUD.WowMain and IceHUD.WowVer < 80000
|
||||
IceHUD.EventExistsPlayerPetChanged = IceHUD.WowVer < 80000 and not IceHUD.WowClassic and not IceHUD.WowClassicBC
|
||||
IceHUD.EventExistsPetBarChanged = IceHUD.WowVer < 80000 and not IceHUD.WowClassic and not IceHUD.WowClassicBC
|
||||
IceHUD.EventExistsPlayerPetChanged = IceHUD.WowMain and IceHUD.WowVer < 80000
|
||||
IceHUD.EventExistsPetBarChanged = IceHUD.WowMain and IceHUD.WowVer < 80000
|
||||
IceHUD.EventExistsPlayerComboPoints = IceHUD.WowMain and IceHUD.WowVer < 30000
|
||||
IceHUD.EventExistsUnitComboPoints = IceHUD.WowMain and IceHUD.WowVer < 70000
|
||||
IceHUD.EventExistsUnitMaxPower = IceHUD.WowMain and IceHUD.WowVer < 80000
|
||||
IceHUD.EventExistsGroupRosterUpdate = IceHUD.WowVer >= 50000 or IceHUD.WowClassic or IceHUD.WowClassicBC
|
||||
IceHUD.EventExistsUnitMaxPower = IceHUD.WowMain and IceHUD.WowVer >= 40000
|
||||
IceHUD.EventExistsGroupRosterUpdate = IceHUD.WowVer >= 50000 or not IceHUD.WowMain
|
||||
IceHUD.EventExistsUnitDynamicFlags = IceHUD.WowMain and IceHUD.WowVer < 80000
|
||||
IceHUD.EventExistsUnitHealthFrequent = not IceHUD.WowMain or (IceHUD.WowVer >= 40000 and IceHUD.WowVer < 90000)
|
||||
IceHUD.PerPowerEventsExist = IceHUD.WowMain and IceHUD.WowVer < 40000
|
||||
IceHUD.PerTargetComboPoints = IceHUD.WowVer < 60000
|
||||
IceHUD.CanTrackOtherUnitBuffs = not IceHUD.WowClassic
|
||||
IceHUD.CanTrackGCD = not IceHUD.WowClassic
|
||||
IceHUD.CanTrackOtherUnitBuffs = not IceHUD.WowClassic or IceHUD.WowVer >= 11500
|
||||
IceHUD.CanTrackGCD = not IceHUD.WowClassic or IceHUD.WowVer >= 11500
|
||||
IceHUD.GetSpellInfoReturnsFunnel = IceHUD.WowMain and IceHUD.WowVer < 60000
|
||||
IceHUD.CanHookDestroyTotem = IceHUD.WowClassic or IceHUD.WowClassicBC or IceHUD.WowClassicWrath or IceHUD.WowClassicCataclysm
|
||||
IceHUD.ShouldUpdateTargetHealthEveryTick = (IceHUD.WowClassic or IceHUD.WowClassicBC) and GetCVarBool("predictedHealth")
|
||||
IceHUD.UsesUIPanelButtonTemplate = IceHUD.WowVer >= 50000 or not IceHUD.WowMain
|
||||
IceHUD.EventExistsSpellcastInterruptible = IceHUD.WowVer >= 30200 and not IceHUD.WowClassicWrath
|
||||
IceHUD.DeathKnightUnholyFrostRunesSwapped = IceHUD.WowVer < 70300 and not IceHUD.WowClassicWrath and not IceHUD.WowClassicCataclysm
|
||||
IceHUD.SupportsHealPrediction = IceHUD.WowVer >= 40000 or IceHUD.WowClassicWrath
|
||||
IceHUD.UnitGroupRolesReturnsRoleString = IceHUD.WowVer >= 40000 or IceHUD.WowClassicWrath
|
||||
IceHUD.ShellGameSpellID = 271571
|
||||
IceHUD.HasShellGame = GetSpellName(IceHUD.ShellGameSpellID)
|
||||
IceHUD.CatalogingSpellIDs = {366290, 372817, 385025, 385635, 386070, 386504, 400043, 403115}
|
||||
IceHUD.HasCataloging = GetSpellName(366290)
|
||||
|
||||
IceHUD.UnitPowerEvent = "UNIT_POWER_UPDATE"
|
||||
|
||||
@ -66,6 +131,43 @@ end
|
||||
|
||||
IceHUD.deepcopy = deepcopy
|
||||
|
||||
function IceHUD:removeDefaults(db, defaults, blocker)
|
||||
-- remove all metatables from the db, so we don't accidentally create new sub-tables through them
|
||||
setmetatable(db, nil)
|
||||
-- loop through the defaults and remove their content
|
||||
for k,v in pairs(defaults) do
|
||||
if type(v) == "table" and type(db[k]) == "table" then
|
||||
-- if a blocker was set, dive into it, to allow multi-level defaults
|
||||
self:removeDefaults(db[k], v, blocker and blocker[k])
|
||||
if next(db[k]) == nil then
|
||||
db[k] = nil
|
||||
end
|
||||
else
|
||||
-- check if the current value matches the default, and that its not blocked by another defaults table
|
||||
if db[k] == defaults[k] and (not blocker or blocker[k] == nil) then
|
||||
db[k] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function IceHUD:populateDefaults(db, defaults, blocker)
|
||||
-- remove all metatables from the db, so we don't accidentally create new sub-tables through them
|
||||
setmetatable(db, nil)
|
||||
-- loop through the defaults and add their content
|
||||
for k,v in pairs(defaults) do
|
||||
if type(v) == "table" and type(db[k]) == "table" then
|
||||
-- if a blocker was set, dive into it, to allow multi-level defaults
|
||||
self:populateDefaults(db[k], v, blocker and blocker[k])
|
||||
else
|
||||
-- check if the current value matches the default, and that its not blocked by another defaults table
|
||||
if db[k] == nil then
|
||||
db[k] = defaults[k]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
IceHUD.Location = "Interface\\AddOns\\IceHUD"
|
||||
|
||||
StaticPopupDialogs["ICEHUD_CUSTOM_BAR_CREATED"] =
|
||||
@ -341,13 +443,18 @@ end
|
||||
-- blizzard interface options
|
||||
local blizOptionsPanel = CreateFrame("FRAME", "IceHUDConfigPanel", UIParent)
|
||||
blizOptionsPanel.name = "IceHUD"
|
||||
blizOptionsPanel.button = CreateFrame("BUTTON", "IceHUDOpenConfigButton", blizOptionsPanel, (IceHUD.WowVer >= 50000 or IceHUD.WowClassic or IceHUD.WowClassicBC) and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
|
||||
blizOptionsPanel.button = CreateFrame("BUTTON", "IceHUDOpenConfigButton", blizOptionsPanel, IceHUD.UsesUIPanelButtonTemplate and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
|
||||
blizOptionsPanel.button:SetText("Open IceHUD configuration")
|
||||
blizOptionsPanel.button:SetWidth(240)
|
||||
blizOptionsPanel.button:SetHeight(30)
|
||||
blizOptionsPanel.button:SetScript("OnClick", function(self) HideUIPanel(InterfaceOptionsFrame) HideUIPanel(GameMenuFrame) IceHUD:OpenConfig() end)
|
||||
blizOptionsPanel.button:SetPoint('TOPLEFT', blizOptionsPanel, 'TOPLEFT', 20, -20)
|
||||
InterfaceOptions_AddCategory(blizOptionsPanel)
|
||||
if InterfaceOptions_AddCategory then
|
||||
InterfaceOptions_AddCategory(blizOptionsPanel)
|
||||
elseif Settings then
|
||||
local category = Settings.RegisterCanvasLayoutCategory(blizOptionsPanel, "IceHUD")
|
||||
Settings.RegisterAddOnCategory(category)
|
||||
end
|
||||
|
||||
function IceHUD:OpenConfig()
|
||||
if not ConfigDialog then return end
|
||||
@ -415,7 +522,7 @@ end
|
||||
|
||||
function IceHUD:GetAuraCount(auraType, unit, ability, onlyMine, matchByName)
|
||||
if not unit or not ability then
|
||||
return 0
|
||||
return 0, nil
|
||||
end
|
||||
|
||||
if unit == "main hand weapon" or unit == "off hand weapon" then
|
||||
@ -423,36 +530,46 @@ function IceHUD:GetAuraCount(auraType, unit, ability, onlyMine, matchByName)
|
||||
= GetWeaponEnchantInfo()
|
||||
|
||||
if unit == "main hand weapon" and hasMainHandEnchant then
|
||||
return mainHandCharges
|
||||
return mainHandCharges, nil
|
||||
elseif unit == "off hand weapon" and hasOffHandEnchant then
|
||||
return offHandCharges
|
||||
return offHandCharges, nil
|
||||
end
|
||||
|
||||
return 0
|
||||
return 0, nil
|
||||
end
|
||||
|
||||
-- Support for Spell IDs
|
||||
if (IceHUD.GetPlayerAuraBySpellID and tonumber(ability) ~= nil) then
|
||||
local aura = C_UnitAuras.GetPlayerAuraBySpellID(ability)
|
||||
if aura ~= nil then
|
||||
return aura.applications, nil
|
||||
else
|
||||
return 0, nil
|
||||
end
|
||||
end
|
||||
|
||||
local i = 1
|
||||
local name, _, texture, applications
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
name, _, texture, applications = UnitAura(unit, i, auraType..(onlyMine and "|PLAYER" or ""))
|
||||
name, _, texture, applications = IceHUD.UnitAura(unit, i, auraType..(onlyMine and "|PLAYER" or ""))
|
||||
else
|
||||
name, texture, applications = UnitAura(unit, i, auraType..(onlyMine and "|PLAYER" or ""))
|
||||
name, texture, applications = IceHUD.UnitAura(unit, i, auraType..(onlyMine and "|PLAYER" or ""))
|
||||
end
|
||||
while name do
|
||||
if (not matchByName and string.match(texture:upper(), ability:upper()))
|
||||
or (matchByName and string.match(name:upper(), ability:upper())) then
|
||||
return applications
|
||||
return applications, i
|
||||
end
|
||||
|
||||
i = i + 1
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
name, _, texture, applications = UnitAura(unit, i, auraType..(onlyMine and "|PLAYER" or ""))
|
||||
name, _, texture, applications = IceHUD.UnitAura(unit, i, auraType..(onlyMine and "|PLAYER" or ""))
|
||||
else
|
||||
name, texture, applications = UnitAura(unit, i, auraType..(onlyMine and "|PLAYER" or ""))
|
||||
name, texture, applications = IceHUD.UnitAura(unit, i, auraType..(onlyMine and "|PLAYER" or ""))
|
||||
end
|
||||
end
|
||||
|
||||
return 0
|
||||
return 0, nil
|
||||
end
|
||||
|
||||
do
|
||||
@ -466,9 +583,9 @@ do
|
||||
local i = 1
|
||||
local name, _, texture, applications, _, _, _, _, _, _, auraID
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
name, _, texture, applications, _, _, _, _, _, _, auraID = UnitAura(unit, i, filter)
|
||||
name, _, texture, applications, _, _, _, _, _, _, auraID = IceHUD.UnitAura(unit, i, filter)
|
||||
else
|
||||
name, texture, applications, _, _, _, _, _, _, auraID = UnitAura(unit, i, filter)
|
||||
name, texture, applications, _, _, _, _, _, _, auraID = IceHUD.UnitAura(unit, i, filter)
|
||||
end
|
||||
while name do
|
||||
for i=1, #spellIDs do
|
||||
@ -480,9 +597,9 @@ do
|
||||
|
||||
i = i + 1
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
name, _, texture, applications, _, _, _, _, _, _, auraID = UnitAura(unit, i, filter)
|
||||
name, _, texture, applications, _, _, _, _, _, _, auraID = IceHUD.UnitAura(unit, i, filter)
|
||||
else
|
||||
name, texture, applications, _, _, _, _, _, _, auraID = UnitAura(unit, i, filter)
|
||||
name, texture, applications, _, _, _, _, _, _, auraID = IceHUD.UnitAura(unit, i, filter)
|
||||
end
|
||||
end
|
||||
|
||||
@ -492,6 +609,30 @@ do
|
||||
function IceHUD:HasDebuffs(unit, spellIDs, filter)
|
||||
return IceHUD:HasBuffs(unit, spellIDs, filter and filter.."|HARMFUL" or "HARMFUL")
|
||||
end
|
||||
|
||||
function IceHUD:HasAnyBuff(unit, spellIDs, filter)
|
||||
local buffs = IceHUD:HasBuffs(unit, spellIDs, filter)
|
||||
|
||||
for i=1, #buffs do
|
||||
if buffs[i] then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function IceHUD:HasAnyDebuff(unit, spellIDs, filter)
|
||||
local debuffs = IceHUD:HasDebuffs(unit, spellIDs, filter)
|
||||
|
||||
for i=1, #debuffs do
|
||||
if debuffs[i] then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function IceHUD:OnDisable()
|
||||
@ -631,14 +772,14 @@ function IceHUD:GetIsInLFGGroup()
|
||||
end
|
||||
|
||||
local mode, submode
|
||||
if IceHUD.WowVer >= 50000 then
|
||||
if LE_LFG_CATEGORY_LFD then
|
||||
mode, submode = GetLFGMode(LE_LFG_CATEGORY_LFD)
|
||||
else
|
||||
mode, submode = GetLFGMode()
|
||||
end
|
||||
local IsInLFGGroup = CheckLFGMode(mode)
|
||||
|
||||
if IceHUD.WowVer < 50000 then
|
||||
if not LE_LFG_CATEGORY_LFD then
|
||||
return IsInLFGGroup
|
||||
end
|
||||
|
||||
@ -658,134 +799,52 @@ function IceHUD:GetIsInLFGGroup()
|
||||
return IsInLFGGroup
|
||||
end
|
||||
|
||||
local BLACKLISTED_UNIT_MENU_OPTIONS = {
|
||||
SET_FOCUS = "ICEHUD_SET_FOCUS",
|
||||
CLEAR_FOCUS = "ICEHUD_CLEAR_FOCUS",
|
||||
PET_DISMISS = "ICEHUD_PET_DISMISS",
|
||||
LOCK_FOCUS_FRAME = true,
|
||||
UNLOCK_FOCUS_FRAME = true,
|
||||
}
|
||||
|
||||
UnitPopupButtons["ICEHUD_SET_FOCUS"] = {
|
||||
text = L["Type %s to set focus"]:format(SLASH_FOCUS1),
|
||||
tooltipText = L["Blizzard currently does not provide a proper way to right-click focus with custom unit frames."],
|
||||
dist = 0,
|
||||
}
|
||||
|
||||
UnitPopupButtons["ICEHUD_CLEAR_FOCUS"] = {
|
||||
text = L["Type %s to clear focus"]:format(SLASH_CLEARFOCUS1),
|
||||
tooltipText = L["Blizzard currently does not provide a proper way to right-click focus with custom unit frames."],
|
||||
dist = 0,
|
||||
}
|
||||
|
||||
UnitPopupButtons["ICEHUD_PET_DISMISS"] = {
|
||||
text = L["Use your Dismiss Pet spell to dismiss a pet"],
|
||||
tooltipText = L["Blizzard currently does not provide a proper way to right-click dismiss a pet with custom unit frames."],
|
||||
dist = 0,
|
||||
}
|
||||
|
||||
local munged_unit_menus = {}
|
||||
local function munge_unit_menu(menu)
|
||||
local result = munged_unit_menus[menu]
|
||||
if result then
|
||||
return result
|
||||
function IceHUD:OutOfCombatWrapper(func)
|
||||
return function(...)
|
||||
return IceHUD:RunOnLeaveCombat(func, ...)
|
||||
end
|
||||
|
||||
if not UnitPopupMenus then
|
||||
munged_unit_menus[menu] = menu
|
||||
return menu
|
||||
end
|
||||
|
||||
local data = UnitPopupMenus[menu]
|
||||
if not data then
|
||||
munged_unit_menus[menu] = menu
|
||||
return menu
|
||||
end
|
||||
|
||||
local found = false
|
||||
local _, v
|
||||
for _, v in ipairs(data) do
|
||||
if BLACKLISTED_UNIT_MENU_OPTIONS[v] then
|
||||
found = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not found then
|
||||
-- nothing to remove or add, we're all fine here.
|
||||
munged_unit_menus[menu] = menu
|
||||
return menu
|
||||
end
|
||||
|
||||
local new_data = {}
|
||||
for _, v in ipairs(data) do
|
||||
local blacklisted = BLACKLISTED_UNIT_MENU_OPTIONS[v]
|
||||
if v == "PET_DISMISS" and select(2, UnitClass("player")) == "WARLOCK" then
|
||||
blacklisted = false
|
||||
end
|
||||
if not blacklisted then
|
||||
new_data[#new_data+1] = v
|
||||
elseif blacklisted ~= true then
|
||||
new_data[#new_data+1] = blacklisted
|
||||
end
|
||||
end
|
||||
local new_menu_name = "ICEHUD_" .. menu
|
||||
|
||||
UnitPopupMenus[new_menu_name] = new_data
|
||||
munged_unit_menus[menu] = new_menu_name
|
||||
return new_menu_name
|
||||
end
|
||||
IceHUD.MungeUnitMenu = munge_unit_menu
|
||||
|
||||
local function figure_unit_menu(unit)
|
||||
if unit == "focus" then
|
||||
return "FOCUS"
|
||||
end
|
||||
|
||||
if UnitIsUnit(unit, "player") then
|
||||
return "SELF"
|
||||
end
|
||||
|
||||
if UnitIsUnit(unit, "vehicle") then
|
||||
-- NOTE: vehicle check must come before pet check for accuracy's sake because
|
||||
-- a vehicle may also be considered your pet
|
||||
return "VEHICLE"
|
||||
end
|
||||
|
||||
if UnitIsUnit(unit, "pet") then
|
||||
return "PET"
|
||||
end
|
||||
|
||||
if not UnitIsPlayer(unit) then
|
||||
return "TARGET"
|
||||
end
|
||||
|
||||
local id = UnitInRaid(unit)
|
||||
if id then
|
||||
return "RAID_PLAYER", id
|
||||
end
|
||||
|
||||
if UnitInParty(unit) then
|
||||
return "PARTY"
|
||||
end
|
||||
|
||||
return "PLAYER"
|
||||
end
|
||||
|
||||
IceHUD_UnitFrame_DropDown = CreateFrame("Frame", "IceHUD_UnitFrame_DropDown", UIParent, "UIDropDownMenuTemplate")
|
||||
if UnitPopupFrames then
|
||||
UnitPopupFrames[#UnitPopupFrames+1] = "IceHUD_UnitFrame_DropDown"
|
||||
do
|
||||
local in_combat = false
|
||||
local in_lockdown = false
|
||||
local actions_to_perform = {}
|
||||
local pool = setmetatable({}, {__mode='k'})
|
||||
function IceHUD:PLAYER_REGEN_ENABLED()
|
||||
in_combat = false
|
||||
in_lockdown = false
|
||||
for i, t in ipairs(actions_to_perform) do
|
||||
t.f(unpack(t, 1, t.n))
|
||||
actions_to_perform[i] = nil
|
||||
wipe(t)
|
||||
pool[t] = true
|
||||
end
|
||||
end
|
||||
function IceHUD:PLAYER_REGEN_DISABLED()
|
||||
in_combat = true
|
||||
end
|
||||
function IceHUD:RunOnLeaveCombat(func, ...)
|
||||
if not in_combat then
|
||||
-- out of combat, call right away and return
|
||||
func(...)
|
||||
return
|
||||
end
|
||||
if not in_lockdown then
|
||||
in_lockdown = InCombatLockdown() -- still in PLAYER_REGEN_DISABLED
|
||||
if not in_lockdown then
|
||||
func(...)
|
||||
return
|
||||
end
|
||||
end
|
||||
local t = next(pool) or {}
|
||||
pool[t] = nil
|
||||
|
||||
t.f = func
|
||||
local n = select('#', ...)
|
||||
t.n = n
|
||||
for i = 1, n do
|
||||
t[i] = select(i, ...)
|
||||
end
|
||||
actions_to_perform[#actions_to_perform+1] = t
|
||||
end
|
||||
end
|
||||
|
||||
IceHUD.DropdownUnit = nil
|
||||
UIDropDownMenu_Initialize(IceHUD_UnitFrame_DropDown, function()
|
||||
if not IceHUD.DropdownUnit then
|
||||
return
|
||||
end
|
||||
|
||||
local menu, id = figure_unit_menu(IceHUD.DropdownUnit)
|
||||
if menu then
|
||||
menu = IceHUD.MungeUnitMenu(menu)
|
||||
UnitPopup_ShowMenu(IceHUD_UnitFrame_DropDown, menu, IceHUD.DropdownUnit, nil, id)
|
||||
end
|
||||
end, "MENU", nil)
|
||||
|
32
IceHUD.toc
@ -1,7 +1,9 @@
|
||||
## Interface: 90100
|
||||
## Interface-Retail: 90100
|
||||
## Interface-Classic: 11306
|
||||
## Interface-BCC: 20501
|
||||
## Interface: 110105
|
||||
## Interface-Retail: 110105
|
||||
## Interface-Classic: 11507
|
||||
## Interface-BCC: 20504
|
||||
## Interface-Wrath: 30403
|
||||
## Interface-Cata: 40402
|
||||
## Author: Parnic, originally created by Iceroth
|
||||
## Name: IceHUD
|
||||
## Title: IceHUD |cff7fff7f-Ace3-|r
|
||||
@ -13,11 +15,25 @@
|
||||
# ## Version: @project-version@
|
||||
#@end-non-debug@
|
||||
## SavedVariables: IceCoreDB
|
||||
## OptionalDeps: Ace3, LibSharedMedia-3.0, LibDogTag-3.0, LibDogTag-Unit-3.0, LibRangeCheck-2.0, LibDualSpec-1.0, LibDBIcon-1.0, AceGUI-3.0-SharedMediaWidgets
|
||||
## IconTexture: Interface\Icons\Spell_Frost_Frost
|
||||
## OptionalDeps: Ace3, LibSharedMedia-3.0, LibDogTag-3.0, LibDogTag-Unit-3.0, LibRangeCheck-3.0, LibDualSpec-1.0, LibDBIcon-1.0, AceGUI-3.0-SharedMediaWidgets
|
||||
## X-Category: HUDs
|
||||
## X-Website: https://www.wowace.com/projects/ice-hud
|
||||
## X-Curse-Project-ID: 5394
|
||||
## X-WoWI-ID: 8149
|
||||
## X-Wago-ID: 5bGolJN0
|
||||
## Category-enUS: Unit Frames
|
||||
## Category-deDE: Einheitenfenster
|
||||
## Category-esES: Marcos de unidades
|
||||
## Category-esMX: Marcos de unidades
|
||||
## Category-frFR: Portraits d'unités
|
||||
## Category-itIT: Riquadri delle unità
|
||||
## Category-koKR: 개체창
|
||||
## Category-ptBR: Quadros de unidade
|
||||
## Category-ruRU: Рамки юнитов
|
||||
## Category-zhCN: 单位框体
|
||||
## Category-zhTW: 單位框架
|
||||
## Group: IceHUD
|
||||
|
||||
#@no-lib-strip@
|
||||
# Libraries
|
||||
@ -97,7 +113,13 @@ modules\Stagger.lua
|
||||
modules\PlayerAltMana.lua
|
||||
modules\ArcaneCharges.lua
|
||||
modules\RollTheBones.lua
|
||||
modules\EssencePower.lua
|
||||
modules\DruidEnergy.lua
|
||||
modules\DragonridingVigor.lua
|
||||
|
||||
#@do-not-package@
|
||||
IceHUD_Options\Json.lua
|
||||
IceHUD_Options\JsonDecode.lua
|
||||
IceHUD_Options\JsonEncode.lua
|
||||
IceHUD_Options\Options.lua
|
||||
#@end-do-not-package@
|
||||
|
@ -1,7 +1,9 @@
|
||||
## Interface: 90100
|
||||
## Interface-Retail: 90100
|
||||
## Interface-Classic: 11306
|
||||
## Interface-BCC: 20501
|
||||
## Interface: 110105
|
||||
## Interface-Retail: 110105
|
||||
## Interface-Classic: 11507
|
||||
## Interface-BCC: 20504
|
||||
## Interface-Wrath: 30403
|
||||
## Interface-Cata: 40402
|
||||
## Title: IceHUD |cff7fff7f-Options-|r
|
||||
## Author: Parnic
|
||||
## Version: @project-version@
|
||||
@ -9,5 +11,21 @@
|
||||
## OptionalDeps: AceGUI-3.0-SharedMediaWidgets
|
||||
## Dependencies: IceHUD
|
||||
## LoadOnDemand: 1
|
||||
## IconTexture: Interface\Icons\Spell_Frost_Frost
|
||||
## Category-enUS: Unit Frames
|
||||
## Category-deDE: Einheitenfenster
|
||||
## Category-esES: Marcos de unidades
|
||||
## Category-esMX: Marcos de unidades
|
||||
## Category-frFR: Portraits d'unités
|
||||
## Category-itIT: Riquadri delle unità
|
||||
## Category-koKR: 개체창
|
||||
## Category-ptBR: Quadros de unidade
|
||||
## Category-ruRU: Рамки юнитов
|
||||
## Category-zhCN: 单位框体
|
||||
## Category-zhTW: 單位框架
|
||||
## Group: IceHUD
|
||||
|
||||
Json.lua
|
||||
JsonDecode.lua
|
||||
JsonEncode.lua
|
||||
Options.lua
|
||||
|
1
IceHUD_Options/Json.lua
Normal file
@ -0,0 +1 @@
|
||||
IceHUD.json = {}
|
241
IceHUD_Options/JsonDecode.lua
Normal file
@ -0,0 +1,241 @@
|
||||
local parse
|
||||
|
||||
local function create_set(...)
|
||||
local res = {}
|
||||
for i = 1, select("#", ...) do
|
||||
res[select(i, ...)] = true
|
||||
end
|
||||
return res
|
||||
end
|
||||
|
||||
local space_chars = create_set(" ", "\t", "\r", "\n")
|
||||
local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",")
|
||||
local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u")
|
||||
local literals = create_set("true", "false", "null")
|
||||
|
||||
local literal_map = {
|
||||
["true"] = true,
|
||||
["false"] = false,
|
||||
["null"] = nil,
|
||||
}
|
||||
|
||||
|
||||
local function next_char(str, idx, set, negate)
|
||||
for i = idx, #str do
|
||||
if set[str:sub(i, i)] ~= negate then
|
||||
return i
|
||||
end
|
||||
end
|
||||
return #str + 1
|
||||
end
|
||||
|
||||
local function decode_error(str, idx, msg)
|
||||
local line_count = 1
|
||||
local col_count = 1
|
||||
for i = 1, idx - 1 do
|
||||
col_count = col_count + 1
|
||||
if str:sub(i, i) == "\n" then
|
||||
line_count = line_count + 1
|
||||
col_count = 1
|
||||
end
|
||||
end
|
||||
|
||||
return string.format("%s at line %d col %d", msg, line_count, col_count)
|
||||
end
|
||||
|
||||
local function codepoint_to_utf8(n)
|
||||
-- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa
|
||||
local f = math.floor
|
||||
if n <= 0x7f then
|
||||
return string.char(n)
|
||||
elseif n <= 0x7ff then
|
||||
return string.char(f(n / 64) + 192, n % 64 + 128)
|
||||
elseif n <= 0xffff then
|
||||
return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128)
|
||||
elseif n <= 0x10ffff then
|
||||
return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128,
|
||||
f(n % 4096 / 64) + 128, n % 64 + 128)
|
||||
end
|
||||
return "", string.format("invalid unicode codepoint '%x'", n)
|
||||
end
|
||||
|
||||
local function parse_unicode_escape(s)
|
||||
local n1 = tonumber(s:sub(1, 4), 16)
|
||||
local n2 = tonumber(s:sub(7, 10), 16)
|
||||
-- Surrogate pair?
|
||||
if n2 then
|
||||
return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000)
|
||||
else
|
||||
return codepoint_to_utf8(n1)
|
||||
end
|
||||
end
|
||||
|
||||
local function parse_string(str, i)
|
||||
local res = ""
|
||||
local j = i + 1
|
||||
local k = j
|
||||
|
||||
while j <= #str do
|
||||
local x = str:byte(j)
|
||||
|
||||
if x < 32 then
|
||||
return str, j, decode_error(str, j, "control character in string")
|
||||
|
||||
elseif x == 92 then -- `\`: Escape
|
||||
res = res .. str:sub(k, j - 1)
|
||||
j = j + 1
|
||||
local c = str:sub(j, j)
|
||||
if c == "u" then
|
||||
local hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1)
|
||||
or str:match("^%x%x%x%x", j + 1)
|
||||
or false
|
||||
if hex == false then
|
||||
return str, j-1, decode_error(str, j - 1, "invalid unicode escape in string")
|
||||
end
|
||||
res = res .. parse_unicode_escape(hex)
|
||||
j = j + #hex
|
||||
else
|
||||
if not escape_chars[c] then
|
||||
return str, j-1, decode_error(str, j - 1, "invalid escape char '" .. c .. "' in string")
|
||||
end
|
||||
res = res .. escape_char_map_inv[c]
|
||||
end
|
||||
k = j + 1
|
||||
|
||||
elseif x == 34 then -- `"`: End of string
|
||||
res = res .. str:sub(k, j - 1)
|
||||
return res, j + 1
|
||||
end
|
||||
|
||||
j = j + 1
|
||||
end
|
||||
|
||||
return str, i, decode_error(str, i, "expected closing quote for string")
|
||||
end
|
||||
|
||||
local function parse_number(str, i)
|
||||
local x = next_char(str, i, delim_chars)
|
||||
local s = str:sub(i, x - 1)
|
||||
local n = tonumber(s)
|
||||
if not n then
|
||||
return -1, -1, decode_error(str, i, "invalid number '" .. s .. "'")
|
||||
end
|
||||
return n, x
|
||||
end
|
||||
|
||||
local function parse_literal(str, i)
|
||||
local x = next_char(str, i, delim_chars)
|
||||
local word = str:sub(i, x - 1)
|
||||
if not literals[word] then
|
||||
return false, -1, decode_error(str, i, "invalid literal '" .. word .. "'")
|
||||
end
|
||||
return literal_map[word], x
|
||||
end
|
||||
|
||||
local function parse_array(str, i)
|
||||
local res = {}
|
||||
local n = 1
|
||||
i = i + 1
|
||||
while 1 do
|
||||
local x
|
||||
i = next_char(str, i, space_chars, true)
|
||||
-- Empty / end of array?
|
||||
if str:sub(i, i) == "]" then
|
||||
i = i + 1
|
||||
break
|
||||
end
|
||||
-- Read token
|
||||
x, i = parse(str, i)
|
||||
res[n] = x
|
||||
n = n + 1
|
||||
-- Next token
|
||||
i = next_char(str, i, space_chars, true)
|
||||
local chr = str:sub(i, i)
|
||||
i = i + 1
|
||||
if chr == "]" then break end
|
||||
if chr ~= "," then return nil, -1, decode_error(str, i, "expected ']' or ','") end
|
||||
end
|
||||
return res, i
|
||||
end
|
||||
|
||||
local function parse_object(str, i)
|
||||
local res = {}
|
||||
i = i + 1
|
||||
while 1 do
|
||||
local key, val
|
||||
i = next_char(str, i, space_chars, true)
|
||||
-- Empty / end of object?
|
||||
if str:sub(i, i) == "}" then
|
||||
i = i + 1
|
||||
break
|
||||
end
|
||||
-- Read key
|
||||
if str:sub(i, i) ~= '"' then
|
||||
return nil, -1, decode_error(str, i, "expected string for key")
|
||||
end
|
||||
key, i = parse(str, i)
|
||||
-- Read ':' delimiter
|
||||
i = next_char(str, i, space_chars, true)
|
||||
if str:sub(i, i) ~= ":" then
|
||||
return nil, -1, decode_error(str, i, "expected ':' after key")
|
||||
end
|
||||
i = next_char(str, i + 1, space_chars, true)
|
||||
-- Read value
|
||||
val, i = parse(str, i)
|
||||
-- Set
|
||||
res[key] = val
|
||||
-- Next token
|
||||
i = next_char(str, i, space_chars, true)
|
||||
local chr = str:sub(i, i)
|
||||
i = i + 1
|
||||
if chr == "}" then break end
|
||||
if chr ~= "," then return nil, -1, decode_error(str, i, "expected '}' or ','") end
|
||||
end
|
||||
return res, i
|
||||
end
|
||||
|
||||
local char_func_map = {
|
||||
['"'] = parse_string,
|
||||
["0"] = parse_number,
|
||||
["1"] = parse_number,
|
||||
["2"] = parse_number,
|
||||
["3"] = parse_number,
|
||||
["4"] = parse_number,
|
||||
["5"] = parse_number,
|
||||
["6"] = parse_number,
|
||||
["7"] = parse_number,
|
||||
["8"] = parse_number,
|
||||
["9"] = parse_number,
|
||||
["-"] = parse_number,
|
||||
["t"] = parse_literal,
|
||||
["f"] = parse_literal,
|
||||
["n"] = parse_literal,
|
||||
["["] = parse_array,
|
||||
["{"] = parse_object,
|
||||
}
|
||||
|
||||
|
||||
parse = function(str, idx)
|
||||
local chr = str:sub(idx, idx)
|
||||
local f = char_func_map[chr]
|
||||
if f then
|
||||
return f(str, idx)
|
||||
end
|
||||
return false, -1, decode_error(str, idx, "unexpected character '" .. chr .. "'")
|
||||
end
|
||||
|
||||
|
||||
function IceHUD.json.decode(str)
|
||||
if type(str) ~= "string" then
|
||||
return nil, "expected argument of type string, got " .. type(str)
|
||||
end
|
||||
local res, idx, err = parse(str, next_char(str, 1, space_chars, true))
|
||||
if err ~= nil then
|
||||
return nil, err
|
||||
end
|
||||
idx = next_char(str, idx, space_chars, true)
|
||||
if idx <= #str then
|
||||
return nil, decode_error(str, idx, "trailing garbage")
|
||||
end
|
||||
return res, nil
|
||||
end
|
100
IceHUD_Options/JsonEncode.lua
Normal file
@ -0,0 +1,100 @@
|
||||
local encode
|
||||
|
||||
local escape_char_map = {
|
||||
["\\"] = "\\",
|
||||
["\""] = "\"",
|
||||
["\b"] = "b",
|
||||
["\f"] = "f",
|
||||
["\n"] = "n",
|
||||
["\r"] = "r",
|
||||
["\t"] = "t",
|
||||
}
|
||||
|
||||
local escape_char_map_inv = { ["/"] = "/" }
|
||||
for k, v in pairs(escape_char_map) do
|
||||
escape_char_map_inv[v] = k
|
||||
end
|
||||
|
||||
|
||||
local function escape_char(c)
|
||||
return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte()))
|
||||
end
|
||||
|
||||
local function encode_nil(val)
|
||||
return "null"
|
||||
end
|
||||
|
||||
local function encode_table(val, stack)
|
||||
local res = {}
|
||||
stack = stack or {}
|
||||
|
||||
-- Circular reference?
|
||||
if stack[val] then error("circular reference") end
|
||||
|
||||
stack[val] = true
|
||||
|
||||
if rawget(val, 1) ~= nil or next(val) == nil then
|
||||
-- Treat as array -- check keys are valid and it is not sparse
|
||||
local n = 0
|
||||
for k in pairs(val) do
|
||||
if type(k) ~= "number" then
|
||||
error("invalid table: mixed or invalid key types")
|
||||
end
|
||||
n = n + 1
|
||||
end
|
||||
if n ~= #val then
|
||||
error("invalid table: sparse array")
|
||||
end
|
||||
-- Encode
|
||||
for i, v in ipairs(val) do
|
||||
table.insert(res, encode(v, stack))
|
||||
end
|
||||
stack[val] = nil
|
||||
return "[" .. table.concat(res, ",") .. "]"
|
||||
|
||||
else
|
||||
-- Treat as an object
|
||||
for k, v in pairs(val) do
|
||||
if type(k) ~= "string" then
|
||||
error("invalid table: mixed or invalid key types")
|
||||
end
|
||||
table.insert(res, encode(k, stack) .. ":" .. encode(v, stack))
|
||||
end
|
||||
stack[val] = nil
|
||||
return "{" .. table.concat(res, ",") .. "}"
|
||||
end
|
||||
end
|
||||
|
||||
local function encode_string(val)
|
||||
return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"'
|
||||
end
|
||||
|
||||
local function encode_number(val)
|
||||
-- Check for NaN, -inf and inf
|
||||
if val ~= val or val <= -math.huge or val >= math.huge then
|
||||
error("unexpected number value '" .. tostring(val) .. "'")
|
||||
end
|
||||
return string.format("%.14g", val)
|
||||
end
|
||||
|
||||
local type_func_map = {
|
||||
["nil"] = encode_nil,
|
||||
["table"] = encode_table,
|
||||
["string"] = encode_string,
|
||||
["number"] = encode_number,
|
||||
["boolean"] = tostring,
|
||||
}
|
||||
|
||||
|
||||
encode = function(val, stack)
|
||||
local t = type(val)
|
||||
local f = type_func_map[t]
|
||||
if f then
|
||||
return f(val, stack)
|
||||
end
|
||||
error("unexpected type '" .. t .. "'")
|
||||
end
|
||||
|
||||
function IceHUD.json.encode(val)
|
||||
return (encode(val))
|
||||
end
|
@ -1,6 +1,8 @@
|
||||
local LibDualSpec = LibStub('LibDualSpec-1.0', true)
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
||||
local icon = LibStub("LibDBIcon-1.0", true)
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
local AceSerializer = LibStub("AceSerializer-3.0", 1)
|
||||
local lastCustomModule = "Bar"
|
||||
|
||||
IceHUD_Options = {}
|
||||
@ -83,13 +85,13 @@ If you have |cff42ffffDogTags|r enabled, you can open the Text Settings for the
|
||||
This is a side effect of the animation API that I'm co-opting to force a rotation without having to provide duplicates of every bar texture in the mod. Any bar moving sufficiently quickly and updating rapidly will cause this. |cff9999ffIceHUD|r is intended to be a vertically-oriented mod, so the rotation feature is there for people who are willing to accept the side effects that come with it. My suggestion is to use one of the many horizontally-oriented bar mods out there if you're wanting horizontal bars. |cff42ffffQuartz|r is a good castbar replacement that you can use and disable |cff9999ffIceHUD|r's built-in castbar, for example.
|
||||
|
||||
|cff9999ff18. How do I get rid of the bars that showed up beneath the player in the 7.0 patch?|r
|
||||
Blizzard added a "Personal Resource Display" feature in the 7.0 game client. You can disable it in the Game options -> Interface -> Names -> Personal Resource Display.
|
||||
Blizzard added a "Personal Resource Display" feature in the 7.0 game client. You can disable it in the Game options -> |cffffdc42Interface|r -> |cffffdc42Names|r -> |cffffdc42Personal Resource Display|r (or Options -> |cffffdc42Combat|r -> |cffffdc42Personal Resource Display|r, in 10.0+).
|
||||
|
||||
|cff9999ff19. Why is there no target castbar for Classic?|r
|
||||
The Classic game client doesn't offer a reliable way to show castbars for anyone except the player. You can install the LibCasterCasterino addon to enable support, but it's a best guess and not at all accurate.
|
||||
The Classic game client doesn't offer a reliable way to show castbars for anyone except the player. You can install the |cff42ffffLibCasterCasterino|r addon to enable support, but it's a best guess and not at all accurate.
|
||||
|
||||
|cff9999ff20. Why do buff/debuff timers not work in Classic?|r
|
||||
The Classic game client doesn't provide this information to addons because it wasn't a feature when the game first released. You can install the LibClassicDurations addon to enable support, but it's a best guess and not at all accurate.]]
|
||||
The Classic game client doesn't provide this information to addons because it wasn't a feature when the game first released. You can install the |cff42ffffLibClassicDurations|r addon to enable support, but it's a best guess and not at all accurate.]]
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -159,7 +161,7 @@ The Classic game client doesn't provide this information to addons because it wa
|
||||
IceHUD.IceCore:SetScale(v)
|
||||
end,
|
||||
min = 0.2,
|
||||
max = 2.0,
|
||||
max = 4.0,
|
||||
step = 0.05,
|
||||
isPercent = true,
|
||||
order = 14,
|
||||
@ -421,32 +423,47 @@ The Classic game client doesn't provide this information to addons because it wa
|
||||
IceHUD.IceCore.IceHUDFrame:Show()
|
||||
end
|
||||
end,
|
||||
hidden = IceHUD.WowVer < 80000,
|
||||
hidden = not IceHUD.HasShellGame,
|
||||
order = 36,
|
||||
},
|
||||
|
||||
bHideDuringCataloging = {
|
||||
type = 'toggle',
|
||||
name = L["Hide during cataloging"],
|
||||
desc = L["This will hide the entire mod when using the Dragonflight Cataloging camera."],
|
||||
width = 'double',
|
||||
get = function()
|
||||
return IceHUD.IceCore.settings.bHideDuringCataloging
|
||||
end,
|
||||
set = function(info, value)
|
||||
IceHUD.IceCore.settings.bHideDuringCataloging = value
|
||||
if not value then
|
||||
IceHUD.IceCore.IceHUDFrame:Show()
|
||||
end
|
||||
end,
|
||||
hidden = not IceHUD.HasCataloging,
|
||||
order = 36,
|
||||
},
|
||||
|
||||
bIncreaseStrata = {
|
||||
type = 'range',
|
||||
name = L["Added strata"],
|
||||
desc = L["Push IceHUD modules to the foreground. Increase if other addons are covering IceHUD. Requires reload."],
|
||||
get = function()
|
||||
return IceHUD.IceCore:GetAddedStrata()
|
||||
end,
|
||||
set = function(info, v)
|
||||
IceHUD.IceCore:SetAddedStrata(v)
|
||||
end,
|
||||
min = 0,
|
||||
max = 2,
|
||||
step = 1,
|
||||
order = 37,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
textSettings = {
|
||||
type = 'select',
|
||||
dialogControl = "LSM30_Font",
|
||||
name = L["Font"],
|
||||
desc = L["IceHUD Font"],
|
||||
order = 19,
|
||||
get = function(info)
|
||||
return IceHUD.IceCore:GetFontFamily()
|
||||
end,
|
||||
set = function(info, value)
|
||||
IceHUD.IceCore:SetFontFamily(value)
|
||||
end,
|
||||
disabled = function()
|
||||
return not IceHUD.IceCore:IsEnabled()
|
||||
end,
|
||||
values = AceGUIWidgetLSMlists.font,
|
||||
order = 94.75,
|
||||
},
|
||||
|
||||
barSettings = {
|
||||
type = 'group',
|
||||
name = L["Bar Settings"],
|
||||
@ -744,6 +761,26 @@ The Classic game client doesn't provide this information to addons because it wa
|
||||
}
|
||||
}
|
||||
|
||||
if AceGUIWidgetLSMlists then
|
||||
options.args.textSettings = {
|
||||
type = 'select',
|
||||
dialogControl = "LSM30_Font",
|
||||
name = L["Font"],
|
||||
desc = L["IceHUD Font"],
|
||||
get = function(info)
|
||||
return IceHUD.IceCore:GetFontFamily()
|
||||
end,
|
||||
set = function(info, value)
|
||||
IceHUD.IceCore:SetFontFamily(value)
|
||||
end,
|
||||
disabled = function()
|
||||
return not IceHUD.IceCore:IsEnabled()
|
||||
end,
|
||||
values = AceGUIWidgetLSMlists.font,
|
||||
order = 94.75,
|
||||
}
|
||||
end
|
||||
|
||||
IceHUD_Options.options = options
|
||||
|
||||
function IceHUD_Options:GenerateModuleOptions(firstLoad)
|
||||
@ -753,23 +790,6 @@ function IceHUD_Options:GenerateModuleOptions(firstLoad)
|
||||
end
|
||||
end
|
||||
|
||||
function IceHUD_Options:OnLoad()
|
||||
self:GenerateModuleOptions(true)
|
||||
self.options.args.colors.args = IceHUD.IceCore:GetColorOptions()
|
||||
self.options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(IceHUD.db)
|
||||
|
||||
-- Add dual-spec support
|
||||
if IceHUD.db ~= nil and LibDualSpec then
|
||||
LibDualSpec:EnhanceOptions(IceHUD_Options.options.args.profiles, IceHUD.db)
|
||||
end
|
||||
|
||||
LibStub("AceConfig-3.0"):RegisterOptionsTable("IceHUD", options, "icehudcl")
|
||||
end
|
||||
|
||||
if IceHUD and IceHUD.IceCore then
|
||||
IceHUD_Options:OnLoad()
|
||||
end
|
||||
|
||||
function IceHUD_Options:SetupProfileImportButtons()
|
||||
if AceSerializer then
|
||||
AceSerializer:Embed(self)
|
||||
@ -787,30 +807,12 @@ function IceHUD_Options:SetupProfileImportButtons()
|
||||
editbox:SetLabel("Profile")
|
||||
editbox:SetFullWidth(true)
|
||||
editbox:SetFullHeight(true)
|
||||
local profileTable = deepcopy(IceHUD.db.profile)
|
||||
local profileTable = IceHUD.deepcopy(IceHUD.db.profile)
|
||||
IceHUD:removeDefaults(profileTable, IceHUD.IceCore.defaults.profile)
|
||||
editbox:SetText(IceHUD:Serialize(profileTable))
|
||||
editbox:SetText(IceHUD.json.encode(profileTable))
|
||||
editbox:DisableButton(true)
|
||||
frame:AddChild(editbox)
|
||||
end,
|
||||
hidden =
|
||||
-- hello, snooper! this feature doesn't actually work yet, so enabling it won't help you much :)
|
||||
--[===[@non-debug@
|
||||
true
|
||||
--@end-non-debug@]===]
|
||||
--@debug@
|
||||
false
|
||||
--@end-debug@
|
||||
,
|
||||
disabled =
|
||||
-- hello, snooper! this feature doesn't actually work yet, so enabling it won't help you much :)
|
||||
--[===[@non-debug@
|
||||
true
|
||||
--@end-non-debug@]===]
|
||||
--@debug@
|
||||
false
|
||||
--@end-debug@
|
||||
,
|
||||
order = 98.1
|
||||
}
|
||||
|
||||
@ -824,11 +826,15 @@ function IceHUD_Options:SetupProfileImportButtons()
|
||||
frame:SetStatusText("Exported profile details")
|
||||
frame:SetLayout("Flow")
|
||||
frame:SetCallback("OnClose", function(widget)
|
||||
local success, newTable = IceHUD:Deserialize(widget.children[1]:GetText())
|
||||
if success then
|
||||
local newTable, err = IceHUD.json.decode(widget.children[1]:GetText())
|
||||
if err ~= nil then
|
||||
print("failed to import profile: "..err)
|
||||
else
|
||||
-- print("importing profile")
|
||||
IceHUD:PreProfileChanged()
|
||||
IceHUD:populateDefaults(newTable, IceHUD.IceCore.defaults.profile)
|
||||
IceHUD.db.profile = deepcopy(newTable)
|
||||
IceHUD.db.profile = IceHUD.deepcopy(newTable)
|
||||
IceHUD.db.profiles[IceHUD.db:GetCurrentProfile()] = IceHUD.db.profile
|
||||
IceHUD:PostProfileChanged()
|
||||
end
|
||||
AceGUI:Release(widget)
|
||||
@ -840,29 +846,25 @@ function IceHUD_Options:SetupProfileImportButtons()
|
||||
editbox:DisableButton(true)
|
||||
frame:AddChild(editbox)
|
||||
end,
|
||||
hidden =
|
||||
-- hello, snooper! this feature doesn't actually work yet, so enabling it won't help you much :)
|
||||
--[===[@non-debug@
|
||||
true
|
||||
--@end-non-debug@]===]
|
||||
--@debug@
|
||||
false
|
||||
--@end-debug@
|
||||
,
|
||||
disabled =
|
||||
-- hello, snooper! this feature doesn't actually work yet, so enabling it won't help you much :)
|
||||
--[===[@non-debug@
|
||||
true
|
||||
--@end-non-debug@]===]
|
||||
--@debug@
|
||||
false
|
||||
--@end-debug@
|
||||
,
|
||||
order = 98.2
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
--@debug@
|
||||
IceHUD_Options:SetupProfileImportButtons()
|
||||
--@end-debug@
|
||||
function IceHUD_Options:OnLoad()
|
||||
self:GenerateModuleOptions(true)
|
||||
self.options.args.colors.args = IceHUD.IceCore:GetColorOptions()
|
||||
self.options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(IceHUD.db)
|
||||
self:SetupProfileImportButtons()
|
||||
|
||||
-- Add dual-spec support
|
||||
if IceHUD.db ~= nil and LibDualSpec then
|
||||
LibDualSpec:EnhanceOptions(IceHUD_Options.options.args.profiles, IceHUD.db)
|
||||
end
|
||||
|
||||
LibStub("AceConfig-3.0"):RegisterOptionsTable("IceHUD", options, "icehudcl")
|
||||
end
|
||||
|
||||
if IceHUD and IceHUD.IceCore then
|
||||
IceHUD_Options:OnLoad()
|
||||
end
|
||||
|
37
IceHUD_Options/TablePrint.lua
Normal file
@ -0,0 +1,37 @@
|
||||
local function table_print(tt, indent, done)
|
||||
done = done or {}
|
||||
indent = indent or 0
|
||||
if type(tt) == "table" then
|
||||
local sb = {}
|
||||
for key, value in pairs(tt) do
|
||||
table.insert(sb, string.rep(" ", indent)) -- indent it
|
||||
if type(value) == "table" and not done[value] then
|
||||
done[value] = true
|
||||
table.insert(sb, key .. " = {\n");
|
||||
table.insert(sb, table_print(value, indent + 2, done))
|
||||
table.insert(sb, string.rep(" ", indent)) -- indent it
|
||||
table.insert(sb, "}\n");
|
||||
elseif "number" == type(key) then
|
||||
table.insert(sb, string.format("\"%s\"\n", tostring(value)))
|
||||
else
|
||||
table.insert(sb, string.format(
|
||||
"%s = \"%s\"\n", tostring(key), tostring(value)))
|
||||
end
|
||||
end
|
||||
return table.concat(sb)
|
||||
else
|
||||
return tt .. "\n"
|
||||
end
|
||||
end
|
||||
|
||||
local function to_string(tbl)
|
||||
if "nil" == type(tbl) then
|
||||
return tostring(nil)
|
||||
elseif "table" == type(tbl) then
|
||||
return table_print(tbl)
|
||||
elseif "string" == type(tbl) then
|
||||
return tbl
|
||||
else
|
||||
return tostring(tbl)
|
||||
end
|
||||
end
|
@ -3,6 +3,21 @@ local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
||||
local validUnits = {"player", "target", "focus", "pet", "vehicle", "targettarget", "main hand weapon", "off hand weapon"}
|
||||
local buffOrDebuff = {"buff", "debuff", "charges", "spell count"}
|
||||
|
||||
local GetSpellCharges = GetSpellCharges
|
||||
if not GetSpellCharges and C_Spell then
|
||||
GetSpellCharges = function(spellID)
|
||||
local spellChargeInfo = C_Spell.GetSpellCharges(spellID)
|
||||
if spellChargeInfo then
|
||||
return spellChargeInfo.currentCharges, spellChargeInfo.maxCharges, spellChargeInfo.cooldownStartTime, spellChargeInfo.cooldownDuration, spellChargeInfo.chargeModRate
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellCount = GetSpellCount
|
||||
if not GetSpellCount and C_Spell then
|
||||
GetSpellCount = C_Spell.GetSpellCastCount
|
||||
end
|
||||
|
||||
-- OVERRIDE
|
||||
function IceStackCounter_GetOptions(frame, opts)
|
||||
opts["customHeader"] = {
|
||||
@ -52,7 +67,13 @@ function IceStackCounter_GetOptions(frame, opts)
|
||||
opts["auraName"] = {
|
||||
type = 'input',
|
||||
name = L["Aura to track"],
|
||||
desc = L["Which buff/debuff this counter will be tracking. \n\nRemember to press ENTER after filling out this box with the name you want or it will not save."],
|
||||
desc = function()
|
||||
if IceHUD.GetPlayerAuraBySpellID then
|
||||
return L["Which buff/debuff this counter will be tracking. Can use the name or spell id. \n\nRemember to press ENTER after filling out this box with the name you want or it will not save."]
|
||||
else
|
||||
return L["Which buff/debuff this counter will be tracking. \n\nRemember to press ENTER after filling out this box with the name you want or it will not save."]
|
||||
end
|
||||
end,
|
||||
get = function()
|
||||
return frame.moduleSettings.auraName
|
||||
end,
|
||||
|
@ -19,10 +19,11 @@ IceUnitBar.prototype.hasPet = nil
|
||||
|
||||
IceUnitBar.prototype.noFlash = nil
|
||||
|
||||
local SPELL_POWER_INSANITY, SPELL_POWER_RAGE = SPELL_POWER_INSANITY, SPELL_POWER_RAGE
|
||||
local SPELL_POWER_INSANITY, SPELL_POWER_RAGE, SPELL_POWER_RUNIC_POWER = SPELL_POWER_INSANITY, SPELL_POWER_RAGE, SPELL_POWER_RUNIC_POWER
|
||||
if Enum and Enum.PowerType then
|
||||
SPELL_POWER_INSANITY = Enum.PowerType.Insanity
|
||||
SPELL_POWER_RAGE = Enum.PowerType.Rage
|
||||
SPELL_POWER_RUNIC_POWER = Enum.PowerType.RunicPower
|
||||
end
|
||||
|
||||
-- Constructor --
|
||||
@ -87,7 +88,7 @@ function IceUnitBar.prototype:GetOptions()
|
||||
self:Redraw()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled or not self.moduleSettings.lowThresholdFlash
|
||||
return not self.moduleSettings.enabled or not (self.moduleSettings.lowThresholdFlash or self.moduleSettings.lowThresholdColor)
|
||||
end,
|
||||
min = 0,
|
||||
max = 1,
|
||||
@ -105,10 +106,14 @@ function IceUnitBar.prototype:GetOptions()
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.moduleSettings.lowThresholdFlash = v
|
||||
self:Redraw()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
hidden = function()
|
||||
return self.noFlash
|
||||
end,
|
||||
order = 30.092
|
||||
}
|
||||
opts["lowThresholdColor"] = {
|
||||
@ -123,7 +128,7 @@ function IceUnitBar.prototype:GetOptions()
|
||||
self:Redraw()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled or not (self.moduleSettings.scaleHealthColor and self.moduleSettings.scaleManaColor)
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
order = 30.093
|
||||
}
|
||||
@ -174,7 +179,7 @@ function IceUnitBar.prototype:CreateFlashFrame()
|
||||
self.flashFrame = CreateFrame("Frame", "IceHUD_"..self.elementName.."_Flash", self.frame)
|
||||
end
|
||||
|
||||
self.flashFrame:SetFrameStrata("BACKGROUND")
|
||||
self.flashFrame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.flashFrame:SetWidth(self.settings.barWidth + (self.moduleSettings.widthModifier or 0))
|
||||
self.flashFrame:SetHeight(self.settings.barHeight)
|
||||
|
||||
@ -235,7 +240,9 @@ function IceUnitBar.prototype:Update()
|
||||
-- so this technically doesn't get us the answer we want most of the time. too risky to change at this point, though.
|
||||
self.mana = UnitPower(self.unit, UnitPowerType(self.unit))
|
||||
self.maxMana = UnitPowerMax(self.unit, UnitPowerType(self.unit))
|
||||
if UnitPowerType(self.unit) == SPELL_POWER_RAGE and self.maxMana == 1000 then
|
||||
local powerType = UnitPowerType(self.unit)
|
||||
if (powerType == SPELL_POWER_RAGE and self.maxMana == 1000)
|
||||
or (powerType == SPELL_POWER_RUNIC_POWER and self.maxMana >= 1000) then
|
||||
self.mana = IceHUD:MathRound(self.mana / 10)
|
||||
self.maxMana = IceHUD:MathRound(self.maxMana / 10)
|
||||
end
|
||||
@ -278,14 +285,14 @@ function IceUnitBar.prototype:Update()
|
||||
-- This looks slightly quirky. Basically the easiest way for me to achieve this is to have lowThresholdColor override
|
||||
-- the scaled color. You'll need to switch them both on to get things to work.
|
||||
if( self.moduleSettings.lowThresholdColor ) then
|
||||
if( self.healthPercentage < self.moduleSettings.lowThreshold ) then
|
||||
if( self.healthPercentage <= self.moduleSettings.lowThreshold ) then
|
||||
self.settings.colors[ "ScaledHealthColor" ] = self.settings.colors[ "MinHealthColor" ]
|
||||
else
|
||||
elseif not self.moduleSettings.scaleHealthColor then
|
||||
self.settings.colors[ "ScaledHealthColor" ] = self.settings.colors[ "MaxHealthColor" ]
|
||||
end
|
||||
if( self.manaPercentage < self.moduleSettings.lowThreshold ) then
|
||||
if( self.manaPercentage <= self.moduleSettings.lowThreshold ) then
|
||||
self.settings.colors[ "ScaledManaColor" ] = self.settings.colors[ "MinManaColor" ]
|
||||
else
|
||||
elseif not self.moduleSettings.scaleManaColor then
|
||||
self.settings.colors[ "ScaledManaColor" ] = self.settings.colors[ "MaxManaColor" ]
|
||||
end
|
||||
end
|
||||
|
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021-2022 parnic
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
359
changelog.md
@ -1,5 +1,360 @@
|
||||
# Changelog
|
||||
|
||||
v1.15.14:
|
||||
|
||||
- Support WoW 11.1.5
|
||||
- Update TWW TOC to 11.1.5
|
||||
|
||||
v1.15.13:
|
||||
|
||||
- Update TOCs
|
||||
|
||||
v1.15.12:
|
||||
|
||||
- Update TOCs
|
||||
|
||||
v1.15.11:
|
||||
|
||||
- Fix imported profiles not saving across reloads
|
||||
|
||||
v1.15.10:
|
||||
|
||||
- Fix Chi not updating properly when the player's maximum amount of Chi points changes (e.g. via Ascension talent).
|
||||
- Update TOCs
|
||||
|
||||
v1.15.9:
|
||||
|
||||
- Update Cataclysm Classic TOC to 4.4.1
|
||||
- Update Classic-era TOC to 1.15.4
|
||||
- Update TWW TOC to 11.0.5
|
||||
|
||||
v1.15.8:
|
||||
|
||||
- Fix reported error with custom cooldown bars set to "when ready" mode due to deprecation in 11.x (wowace issue #368)
|
||||
|
||||
v1.15.7:
|
||||
|
||||
- Fix cooldown display for overridden spells (such as Evoker spells where Font of Magic replaces the base spell with an override with the same name).
|
||||
|
||||
v1.15.6:
|
||||
|
||||
- Package new version of LibDogTag-Unit to fix an error with some units on 11.0.2
|
||||
|
||||
v1.15.5:
|
||||
|
||||
- Fix error when using an invalid spell with a custom bar on 11.x
|
||||
|
||||
v1.15.4:
|
||||
|
||||
- Update TOC for TWW
|
||||
|
||||
v1.15.3:
|
||||
|
||||
- Fix custom cooldown bars not working in 11.x (wowace issue #363)
|
||||
|
||||
v1.15.2:
|
||||
|
||||
- Re-enable right-click context menus on 11.x.
|
||||
- Update TOC for Classic-era
|
||||
|
||||
v1.15.1:
|
||||
|
||||
- Fix error opening options.
|
||||
|
||||
v1.15.0:
|
||||
|
||||
- Support The War Within/11.0
|
||||
- Add support for exporting and importing profiles through text.
|
||||
|
||||
v1.14.42:
|
||||
|
||||
- Fix Vengeance module in Cataclysm Classic
|
||||
|
||||
v1.14.41:
|
||||
|
||||
- Fix swapped DK runes in Cataclysm Classic
|
||||
- Possible fix for castbar flashing sometimes when set to "Never"
|
||||
- Fix IceHUD Vigor bar not showing up for some types of dragons such as the Algarian Stormrider
|
||||
|
||||
v1.14.40:
|
||||
|
||||
- Update TOC for Dragonflight to 10.2.7
|
||||
|
||||
v1.14.39:
|
||||
|
||||
- Support Cataclysm Classic 4.4.0
|
||||
|
||||
v1.14.38:
|
||||
|
||||
- Update TOCs
|
||||
|
||||
v1.14.37:
|
||||
|
||||
- Update LibRangeCheck version to address taint issues (wowace ticket #353)
|
||||
|
||||
v1.14.36:
|
||||
|
||||
- Really fix IceHUD stomping on other uses of the PowerBarContainer such as the Digging bar for the Archive event.
|
||||
|
||||
v1.14.35:
|
||||
|
||||
- Fix IceHUD stomping on other uses of the PowerBarContainer such as the Digging bar for the Archive event.
|
||||
|
||||
v1.14.34:
|
||||
|
||||
- Fix Vigor showing up sometimes when it shouldn't.
|
||||
|
||||
v1.14.33:
|
||||
|
||||
- Update TOC for Dragonflight to 10.2.5
|
||||
|
||||
v1.14.32:
|
||||
|
||||
- Enable GlobalCoolDown module in Classic Era 1.15.0+
|
||||
- Enable tracking target buffs/debuffs in Classic Era 1.15.0+
|
||||
|
||||
v1.14.31:
|
||||
|
||||
- Fix nil concatenation error (wowace ticket #351)
|
||||
|
||||
v1.14.30:
|
||||
|
||||
- Update Classic-era TOC for 1.15.0
|
||||
- Enable TargetCastBar module on Classic-era 1.15+
|
||||
|
||||
v1.14.29:
|
||||
|
||||
- Fix Stagger bar error for 10.2.0 (wowace ticket #348)
|
||||
|
||||
v1.14.28:
|
||||
|
||||
- Update TOC for Dragonflight to 10.2.0
|
||||
|
||||
v1.14.27:
|
||||
|
||||
- Update TOC for Dragonflight to 10.1.7
|
||||
|
||||
v1.14.26:
|
||||
|
||||
- Update TOC for classic-era to 1.14.4
|
||||
|
||||
v1.14.25:
|
||||
|
||||
- Fixed lua error that would appear when targetting webwrapped players in heroic alpha/beta titan rune dungeons.
|
||||
- Added ability to adjust strata globally.
|
||||
|
||||
v1.14.24:
|
||||
|
||||
- Fixed an error when targeting a player and right-clicking a module that should show a menu in 10.1.5.
|
||||
|
||||
v1.14.23:
|
||||
|
||||
- Update Dragonflight TOC for 10.1.5
|
||||
|
||||
v1.14.22:
|
||||
|
||||
- Fixed reported issue with a Lua error on Wrath Classic clients. <https://www.wowace.com/projects/ice-hud/issues/344>
|
||||
- Fixed Vigor module not working when riding Grotto Netherwing Drake (and theoretically all future Dragonriding mount types).
|
||||
- Updated TOC for Wrath-Classic.
|
||||
|
||||
v1.14.21:
|
||||
|
||||
- Increased maximum scale/zoom to 400%, by request.
|
||||
- Fixed TargetCC/FocusCC modules on Wrath Classic.
|
||||
- Fixed disabled Buff/Debuff Watchers showing a static gray bar when set to When Missing or Always display modes.
|
||||
- Fixed Buff/Debuff Watchers showing an empty bar when set to Missing mode. If the background was disabled, this looked like just a floating spell icon.
|
||||
- Fixed spell icons sometimes not showing up for custom bars until the tracked spell had been cast once.
|
||||
|
||||
v1.14.20:
|
||||
|
||||
- Added Winding Slitherdrake as recognized for the Dragonriding Vigor module
|
||||
|
||||
v1.14.19:
|
||||
|
||||
- Updated TOCs for 10.1.0
|
||||
- Added addon icon for 10.1.0 clients
|
||||
- Fixed Dragonriding Vigor charges not showing up in 10.1.0
|
||||
- Fixed Vigor not always updating correctly when loading into the game or a new zone
|
||||
|
||||
v1.14.18:
|
||||
|
||||
- Fixed Runic Power showing on a scale of 0-1000+ instead of 0-100+ with DogTags off
|
||||
- Added option (enabled by default) to hide mod during cataloging.
|
||||
- Fixed "Hide Blizzard Buffs" option on PlayerInfo causing errors and "?" icons when toggling off.
|
||||
- Also hide Debuff frame if it exists (Dragonflight+) when enabling "Hide Blizzard Buffs" in the PlayerInfo module.
|
||||
|
||||
v1.14.17:
|
||||
|
||||
- Updated TOCs for 10.0.7
|
||||
|
||||
v1.14.16:
|
||||
|
||||
- Exposed the option in the Totems module to hide the Blizzard Totems frame or not, and changed the default value to not hide when on a version of the game that doesn't support right-clicking to destroy totems (any version after Wrath). This enables using the default Totems frame to cancel totems early.
|
||||
- Fixed a reported error when playing Darkmoon Faire games.
|
||||
- Added a few more Polymorph ranks to TargetCC for Classic. I'm sure there are more missing.
|
||||
|
||||
v1.14.15:
|
||||
|
||||
- Updated TOCs for 10.0.5
|
||||
|
||||
v1.14.14:
|
||||
|
||||
- Fixed PlayerAlternatePower bar showing up when it shouldn't have, such as when casting Power Word: Shield before ever having done anything to trigger a game-level "alternate power" event, such as mounting a Dragonriding mount.
|
||||
|
||||
v1.14.13:
|
||||
|
||||
- Fixed Vigor module hiding default Climbing, Film, etc. UIs. (wowace ticket #336)
|
||||
|
||||
v1.14.12:
|
||||
|
||||
- Added a module for showing Dragonriding Vigor points.
|
||||
|
||||
v1.14.11:
|
||||
|
||||
- Packaged a new version of LibDogTag-Unit to fix the Guild roster resetting its scroll position every 20 seconds.
|
||||
|
||||
v1.14.10:
|
||||
|
||||
- Fix an error in TargetTargetHealth/Mana and CustomHealth when Low Threshold Color was checked and Scale by Health % was un-checked.
|
||||
|
||||
v1.14.9:
|
||||
|
||||
- Fix Low Threshold to be usable even when Color By Health/Mana % is disabled. (ticket #334)
|
||||
|
||||
v1.14.8:
|
||||
|
||||
- Fix Color By Health % to work with Low Threshold Color option. Previously, if Low Threshold was set, the color was always either MaxHealth/MaxMana or MinHealth/MinMana, it would never be colored by health %. Now if both are set, it will scale by health % until it reaches the low threshold, at which point it will switch to the Min color.
|
||||
- Fix Low Threshold color and flashing to work at the same percentage. Previously these were slightly different such that it would start flashing at 40% but not turn to the Min color until 39.9999%, for example.
|
||||
|
||||
v1.14.7:
|
||||
|
||||
- Add option to scale absorb bar by the unit's maximum health.
|
||||
|
||||
v1.14.6:
|
||||
|
||||
- Add ability for buff/debuff watchers to only display when the specified buff/debuff is missing. This also adds the ability to require that the given unit exists. So if you had Unit set to Target, Display mode set to Missing, and Only if unit exists checked, you'd show the bar if you have a target and they don't have the given buff/debuff.
|
||||
- Don't flash the castbar for instant-cast spells that the player didn't cast (such as internal quest spells).
|
||||
- Add DruidEnergy module (disabled by default). This module will show the player's Energy level if they're a Druid and currently shapeshifted to a non-energy-using form (eligible forms are configurable by the user).
|
||||
|
||||
v1.14.5:
|
||||
|
||||
- Fix castbar flashing. There are controls on the player castbar module for flashing when a spell succeeds or fails, and separate controls for flashing when an instant cast completes. Those were broken, but now work again.
|
||||
- Add "@" after the number when the Combo Points module is in Numeric mode, "Show Charged points" is enabled, and the current combo point is charged.
|
||||
- Fix Charged point support in the ComboPointsBar module.
|
||||
|
||||
v1.14.4:
|
||||
|
||||
- Update TOC for 10.0.2
|
||||
|
||||
v1.14.3:
|
||||
|
||||
- Add Spell ID support for aura tracking.
|
||||
- Add Evoker support.
|
||||
- Add Empowered Casting (hold-to-cast levels) support.
|
||||
|
||||
v1.14.2:
|
||||
|
||||
- Fix CC and Invuln modules not showing immediately when they should.
|
||||
|
||||
v1.14.1:
|
||||
|
||||
- Fix Hide Party feature on pre-10.0 clients.
|
||||
|
||||
v1.14.0:
|
||||
|
||||
- 10.0 compatibility
|
||||
- Renamed Anima Charged combo points to Charged, and removed specific references to Kyrian.
|
||||
|
||||
v1.13.17.3:
|
||||
|
||||
- Packaged latest LibDogTag-Unit to work around crash in Wrath Classic client.
|
||||
|
||||
v1.13.17.2:
|
||||
|
||||
- Fixed Runes disappearing for Death Knights on Wrath Classic when using the dual spec feature.
|
||||
|
||||
v1.13.17.1:
|
||||
|
||||
- Fixed Priests hanging on login on the retail client.
|
||||
|
||||
v1.13.17:
|
||||
|
||||
- Internal maintainability updates. There are so many versions of the game now, updates need to be as easy and safe as possible.
|
||||
- Improved reliability of Slice-n-Dice predicted length when changing talents.
|
||||
- Improved various modules's ability to respond to the player's maximum power type changing (going from 5 max combo points to 6, for example).
|
||||
- Fixed invalid texture layers specified on a variety of textures (10.0 fix).
|
||||
- Removed HolyPowerNumeric text from the configuration options of several modules that it didn't belong with.
|
||||
- Fixed combo points in Classic Era clients.
|
||||
|
||||
v1.13.16:
|
||||
|
||||
- Enabled Incoming Heal Prediction on Wrath-Classic.
|
||||
- Added detection for the full Wrath Classic build (not just the pre-patch).
|
||||
|
||||
v1.13.15:
|
||||
|
||||
- Updated TOC for Retail (9.2.7).
|
||||
- Added Wrath-Classic compatibility.
|
||||
|
||||
v1.13.14.3:
|
||||
|
||||
- Restored right-click menus on Info and Health bars when targeting other players.
|
||||
|
||||
v1.13.14.2:
|
||||
|
||||
- Restored right-click menus on Info and Health bars.
|
||||
|
||||
v1.13.14.1:
|
||||
|
||||
- Restored guard around array that doesn't exist on Classic clients.
|
||||
|
||||
v1.13.14:
|
||||
|
||||
- Fixed target health updating infrequently on Classic.
|
||||
- Fixed compatibility with WoW 9.2.5.
|
||||
- Updated TOC for all game flavors.
|
||||
|
||||
v1.13.13:
|
||||
|
||||
- Slight optimization of Zereth Mortis puzzle detection logic.
|
||||
- Fixed target health updating infrequently on Classic-BC.
|
||||
- Fixed reported error in TargetInvuln module.
|
||||
|
||||
v1.13.12:
|
||||
|
||||
- Hide IceHUD during Zereth Mortis puzzles
|
||||
- Fixed default player and target frames coming back sometimes (github issue #19)
|
||||
- Updated TOC for 9.2.0 and 1.14.2
|
||||
|
||||
v1.13.11:
|
||||
|
||||
- Fixed totem bar dismissal for BC-Classic and Classic
|
||||
- Updated TOC for BC-Clasic
|
||||
|
||||
v1.13.10:
|
||||
|
||||
- Updated TOCs for 9.1.5 and 1.14.1
|
||||
|
||||
v1.13.9:
|
||||
|
||||
- Fixed FocusMana modules attempting to register invalid events in Classic builds.
|
||||
- Add support for multiple anima-charged combo points to display at once.
|
||||
- Update TOC for Classic 1.14.0
|
||||
|
||||
v1.13.8.1:
|
||||
|
||||
- Updated TOC for BC-Classic and Classic.
|
||||
|
||||
v1.13.8:
|
||||
|
||||
- Fixed Paladin GCD not functioning in BC-Classic.
|
||||
|
||||
v1.13.7:
|
||||
|
||||
- Fixed energy ticker when zoning back into an instance after dying (Classic builds)
|
||||
- Added newer Fear spell to CC modules.
|
||||
- Fixed the straight textures (Tanks) not showing the lowest or highest values appropriately (10% could look empty, 90% could look full).
|
||||
|
||||
v1.13.6:
|
||||
|
||||
- Updated TOC to 9.1
|
||||
@ -219,7 +574,7 @@ v1.10.13:
|
||||
|
||||
v1.10.12:
|
||||
|
||||
- Tweaked a few Druid CCs in the CC modules. If you've got a more up-to-date list of any of the CCs, please send them along to icehud@parnic.com
|
||||
- Tweaked a few Druid CCs in the CC modules. If you've got a more up-to-date list of any of the CCs, please send them along to <icehud@parnic.com>
|
||||
- Fixed a problem that could cause a custom counter to loop forever and cause framerate problems. (ticket #230)
|
||||
- Updated default text values for Health and Mana modules to show values in shortened form so they're more readable. Anyone who has customized their text will not be affected by this change and the shortened form only kicks in once values reach 10,000.
|
||||
|
||||
@ -1236,7 +1591,7 @@ v1.3.17:
|
||||
- fixed <http://www.wowace.com/projects/ice-hud/tickets/8-module-target-info-long-targetnames-overwrites-the/> : target name in the TargetInfo module no longer spills to the next line or gets cut off if it's too long
|
||||
- made the threat module only display while the player is in combat or the player has some threat on his target
|
||||
- added an option to only display the threat module while in a group. set by default
|
||||
- adding HungerForBlood user-submitted module. I don't have an assassination rogue and don't plan on having one, so this is _untested_ by me. the author is responsible for fixing bugs in it
|
||||
- adding HungerForBlood user-submitted module. I don't have an assassination rogue and don't plan on having one, so this is *untested* by me. the author is responsible for fixing bugs in it
|
||||
- also updated a few settings in SliceAndDice to conform with the rest of the mod
|
||||
- fix for malygos fight where the player uses combo points while in a vehicle
|
||||
- made runes flash when they become active whether the cooldown or alpha setting is being used
|
||||
|
@ -7,13 +7,15 @@
|
||||
<Include file="libs\AceGUI-3.0\AceGUI-3.0.xml"/>
|
||||
<Include file="libs\AceConfig-3.0\AceConfig-3.0.xml"/>
|
||||
<Include file="libs\AceEvent-3.0\AceEvent-3.0.xml"/>
|
||||
<Include file="libs\AceSerializer-3.0\AceSerializer-3.0.xml"/>
|
||||
<Include file="libs\AceTimer-3.0\AceTimer-3.0.xml"/>
|
||||
<Include file="libs\AceConsole-3.0\AceConsole-3.0.xml"/>
|
||||
<Include file="libs\AceAddon-3.0\AceAddon-3.0.xml"/>
|
||||
<Include file="libs\AceLocale-3.0\AceLocale-3.0.xml"/>
|
||||
<Include file="libs\AceHook-3.0\AceHook-3.0.xml"/>
|
||||
<Include file="libs\LibDogTag-3.0\lib.xml"/>
|
||||
<Include file="libs\LibDogTag-Unit-3.0\lib.xml"/>
|
||||
<Script file="libs\LibRangeCheck-2.0\LibRangeCheck-2.0.lua"/>
|
||||
<Script file="libs\LibRangeCheck-3.0\LibRangeCheck-3.0.lua"/>
|
||||
<Include file="libs\LibSharedMedia-3.0\lib.xml"/>
|
||||
<Include file="libs\AceGUI-3.0-SharedMediaWidgets\widget.xml"/>
|
||||
<Script file="LibDataBroker-1.1.lua"/>
|
||||
|
@ -61,6 +61,6 @@ end
|
||||
|
||||
-- Load us up
|
||||
local _, unitClass = UnitClass("player")
|
||||
if (unitClass == "MAGE" and IceHUD.WowVer >= 70000) then
|
||||
if (unitClass == "MAGE" and MageArcaneChargesFrame) then
|
||||
IceHUD.ArcaneCharges = ArcaneCharges:new()
|
||||
end
|
||||
|
@ -3,6 +3,26 @@ local CastBar = IceCore_CreateClass(IceCastBar)
|
||||
|
||||
local IceHUD = _G.IceHUD
|
||||
|
||||
local CastingBarFrame = CastingBarFrame
|
||||
if not CastingBarFrame then
|
||||
CastingBarFrame = PlayerCastingBarFrame
|
||||
end
|
||||
|
||||
local IsSpellInRange = IsSpellInRange
|
||||
if not IsSpellInRange and C_Spell then
|
||||
IsSpellInRange = C_Spell.IsSpellInRange
|
||||
end
|
||||
|
||||
local GetSpellCooldown = GetSpellCooldown
|
||||
if not GetSpellCooldown and C_Spell then
|
||||
GetSpellCooldown = function(spellID)
|
||||
local spellCooldownInfo = C_Spell.GetSpellCooldown(spellID)
|
||||
if spellCooldownInfo then
|
||||
return spellCooldownInfo.startTime, spellCooldownInfo.duration, spellCooldownInfo.isEnabled, spellCooldownInfo.modRate
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
CastBar.prototype.spellCastSent = nil
|
||||
|
||||
-- Constructor --
|
||||
@ -34,6 +54,9 @@ function CastBar.prototype:GetDefaultSettings()
|
||||
settings["rangeColor"] = true
|
||||
settings["bAllowExpand"] = false
|
||||
settings["respectLagTolerance"] = true
|
||||
settings["lockUpperTextAlpha"] = true
|
||||
settings["lockLowerTextAlpha"] = true
|
||||
settings["empowerStageTextDisplay"] = "TOPLINE"
|
||||
|
||||
return settings
|
||||
end
|
||||
@ -231,6 +254,7 @@ function CastBar.prototype:GetOptions()
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.moduleSettings.lockUpperTextAlpha = v
|
||||
self.moduleSettings.lockLowerTextAlpha = v
|
||||
self:Redraw()
|
||||
end,
|
||||
order = 13
|
||||
@ -303,7 +327,26 @@ function CastBar.prototype:GetOptions()
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
}
|
||||
},
|
||||
|
||||
empowerStageText = {
|
||||
type = 'select',
|
||||
name = L["Empower stage label display"],
|
||||
desc = L["How to display the stage of an empowered spell"],
|
||||
get = function()
|
||||
return self.moduleSettings.empowerStageTextDisplay
|
||||
end,
|
||||
set = function(info, value)
|
||||
self.moduleSettings.empowerStageTextDisplay = value
|
||||
end,
|
||||
values = { NONE = L["Don't show"], TOPLINE = L["After spell name"], BOTTOMLINE = L["Below spell name"] },
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
hidden = function()
|
||||
return not GetUnitEmpowerMinHoldTime
|
||||
end,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,8 @@ IceClassPowerCounter.prototype.unmodifiedMaxPerRune = 10
|
||||
IceClassPowerCounter.prototype.unit = "player"
|
||||
IceClassPowerCounter.prototype.round = ceil
|
||||
IceClassPowerCounter.prototype.growModes = { width = 1, height = 2 }
|
||||
IceClassPowerCounter.prototype.currentGrowMode = nil
|
||||
IceClassPowerCounter.prototype.currentGrowMode = IceClassPowerCounter.prototype.growModes["height"]
|
||||
IceClassPowerCounter.prototype.shouldRegisterDisplayPower = true
|
||||
|
||||
-- Constructor --
|
||||
function IceClassPowerCounter.prototype:init(name)
|
||||
@ -101,7 +102,7 @@ function IceClassPowerCounter.prototype:GetOptions()
|
||||
opts["displayMode"] = {
|
||||
type = 'select',
|
||||
name = L["Display mode"],
|
||||
desc = L["Choose whether you'd like a graphical or numeric representation of the runes.\n\nNOTE: The color of 'Numeric' mode can be controlled by the HolyPowerNumeric color."],
|
||||
desc = L["Choose whether you'd like a graphical or numeric representation of the runes."],
|
||||
get = function(info)
|
||||
return IceHUD:GetSelectValue(info, self.moduleSettings.runeMode)
|
||||
end,
|
||||
@ -391,7 +392,7 @@ function IceClassPowerCounter.prototype:GetDefaultSettings()
|
||||
defaults["hideFriendly"] = false
|
||||
defaults["pulseWhenFull"] = true
|
||||
defaults["overrideAlpha"] = true
|
||||
defaults["numericVerticalOffset"] = 0
|
||||
defaults["numericVerticalOffset"] = -25
|
||||
defaults["alwaysShowNumeric"] = false
|
||||
|
||||
return defaults
|
||||
@ -462,12 +463,21 @@ function IceClassPowerCounter.prototype:CheckValidSpec()
|
||||
end
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:GetPowerEvent()
|
||||
return IceHUD.UnitPowerEvent
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:DisplayCounter()
|
||||
self:UnregisterEvent("PLAYER_LEVEL_UP")
|
||||
|
||||
self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateRunePower")
|
||||
self:RegisterEvent("UNIT_DISPLAYPOWER", "UpdateRunePower")
|
||||
self:RegisterEvent(self:GetPowerEvent(), "UpdateRunePower")
|
||||
if self.shouldRegisterDisplayPower then
|
||||
self:RegisterEvent("UNIT_DISPLAYPOWER", "UpdateRunePower")
|
||||
end
|
||||
self:RegisterEvent("PLAYER_ENTERING_WORLD", "EnteringWorld")
|
||||
if IceHUD.EventExistsUnitMaxPower then
|
||||
self:RegisterEvent("UNIT_MAXPOWER", "UpdateRunePower")
|
||||
end
|
||||
|
||||
if (self.moduleSettings.hideBlizz) then
|
||||
self:HideBlizz()
|
||||
@ -490,15 +500,29 @@ function IceClassPowerCounter.prototype:EnteringWorld()
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:UpdateRunePower(event, arg1, arg2)
|
||||
if event and (event == IceHUD.UnitPowerEvent or event == "UNIT_POWER_FREQUENT") and arg1 ~= "player" and arg1 ~= "vehicle" then
|
||||
if event and (event == self:GetPowerEvent() or event == "UNIT_POWER_FREQUENT") and arg1 ~= "player" and arg1 ~= "vehicle" then
|
||||
return
|
||||
end
|
||||
|
||||
if IceHUD.WowVer >= 70000 then
|
||||
local numMax = UnitPowerMax(self.unit, self.unitPower)
|
||||
if numMax ~= self.numRunes then
|
||||
local oldMax = self.numRunes
|
||||
self.numRunes = numMax
|
||||
self:CreateFrame()
|
||||
self:SetDisplayMode()
|
||||
|
||||
for i=self.numRunes+1, oldMax do
|
||||
if self.frame.graphical[i] then
|
||||
self.frame.graphical[i]:Hide()
|
||||
end
|
||||
end
|
||||
for i=oldMax+1, self.numRunes do
|
||||
if self:GetRuneMode() ~= "Numeric" then
|
||||
self.frame.graphical[i]:Show()
|
||||
end
|
||||
self:HideRune(i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -506,10 +530,15 @@ function IceClassPowerCounter.prototype:UpdateRunePower(event, arg1, arg2)
|
||||
local percentReady = self.shouldShowUnmodified and (UnitPower("player", self.unitPower, true) / self.unmodifiedMaxPerRune) or numReady
|
||||
|
||||
if self:GetRuneMode() == "Numeric" or self.moduleSettings.alsoShowNumeric then
|
||||
local displayPercent = percentReady
|
||||
if self.partialReadyPercent then
|
||||
displayPercent = percentReady + self.partialReadyPercent
|
||||
end
|
||||
|
||||
if self.numericFormat then
|
||||
self.frame.numeric:SetText(format(self.numericFormat, percentReady))
|
||||
self.frame.numeric:SetText(format(self.numericFormat, displayPercent))
|
||||
else
|
||||
self.frame.numeric:SetText(tostring(percentReady))
|
||||
self.frame.numeric:SetText(tostring(displayPercent))
|
||||
end
|
||||
self.frame.numeric:SetTextColor(self:GetColor(self.numericColor))
|
||||
end
|
||||
@ -518,7 +547,7 @@ function IceClassPowerCounter.prototype:UpdateRunePower(event, arg1, arg2)
|
||||
for i=1, self.numRunes do
|
||||
if i <= self.round(percentReady) then
|
||||
if self:GetRuneMode() == "Graphical" then
|
||||
self.frame.graphical[i].rune:SetVertexColor(1, 1, 1)
|
||||
self:SetRuneGraphicalTexture(i)
|
||||
else
|
||||
self:SetCustomColor(i)
|
||||
end
|
||||
@ -528,33 +557,14 @@ function IceClassPowerCounter.prototype:UpdateRunePower(event, arg1, arg2)
|
||||
end
|
||||
|
||||
if i > numReady or self.numRunes == 1 then
|
||||
local left, right, top, bottom = 0, 1, 0, 1
|
||||
if self:GetRuneMode() == "Graphical" then
|
||||
left, right, top, bottom = unpack(self.runeCoords[i])
|
||||
end
|
||||
|
||||
local currPercent = percentReady - numReady
|
||||
if self.numRunes == 1 then
|
||||
currPercent = numReady / UnitPowerMax("player", self.unitPower)
|
||||
end
|
||||
|
||||
if self.currentGrowMode == self.growModes["height"] then
|
||||
top = bottom - (currPercent * (bottom - top))
|
||||
self.frame.graphical[i].rune:SetHeight(currPercent * self.runeHeight)
|
||||
elseif self.currentGrowMode == self.growModes["width"] then
|
||||
right = left + (currPercent * (right - left))
|
||||
self.frame.graphical[i].rune:SetWidth(currPercent * self.runeWidth)
|
||||
end
|
||||
self.frame.graphical[i].rune:SetTexCoord(left, right, top, bottom)
|
||||
self:SetRuneCoords(i, currPercent)
|
||||
elseif i > self.lastNumReady then
|
||||
if self.runeCoords ~= nil and #self.runeCoords >= i then
|
||||
local left, right, top, bottom = 0, 1, 0, 1
|
||||
if self:GetRuneMode() == "Graphical" then
|
||||
left, right, top, bottom = unpack(self.runeCoords[i])
|
||||
end
|
||||
self.frame.graphical[i].rune:SetTexCoord(left, right, top, bottom)
|
||||
self.frame.graphical[i].rune:SetHeight(self.runeHeight)
|
||||
end
|
||||
self:SetRuneCoords(i, 1)
|
||||
|
||||
if self.moduleSettings.flashWhenBecomingReady then
|
||||
local fadeInfo={
|
||||
@ -567,11 +577,18 @@ function IceClassPowerCounter.prototype:UpdateRunePower(event, arg1, arg2)
|
||||
end
|
||||
end
|
||||
else
|
||||
if self.moduleSettings.inactiveDisplayMode == "Darkened" then
|
||||
self.frame.graphical[i].rune:SetVertexColor(0, 0, 0)
|
||||
elseif self.moduleSettings.inactiveDisplayMode == "Hidden" then
|
||||
self.frame.graphical[i]:Hide()
|
||||
if self.partialReady then
|
||||
if i == self.partialReady then
|
||||
self:SetRuneCoords(i, self.partialReadyPercent)
|
||||
if self:GetRuneMode() == "Graphical" then
|
||||
self:SetRuneGraphicalTexture(i, true)
|
||||
end
|
||||
else
|
||||
self:SetRuneCoords(i, 0)
|
||||
end
|
||||
end
|
||||
|
||||
self:HideRune(i)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -592,6 +609,43 @@ function IceClassPowerCounter.prototype:UpdateRunePower(event, arg1, arg2)
|
||||
end
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:SetRuneCoords(rune, percent)
|
||||
if self.runeCoords == nil or #self.runeCoords < rune then
|
||||
return
|
||||
end
|
||||
|
||||
local left, right, top, bottom = 0, 1, 0, 1
|
||||
if self:GetRuneMode() == "Graphical" then
|
||||
local coords = self.runeCoords[rune]
|
||||
if coords then
|
||||
left, right, top, bottom = unpack(coords)
|
||||
end
|
||||
end
|
||||
|
||||
if self.currentGrowMode == self.growModes["height"] then
|
||||
top = bottom - (percent * (bottom - top))
|
||||
self.frame.graphical[rune].rune:SetHeight(percent * self.runeHeight)
|
||||
elseif self.currentGrowMode == self.growModes["width"] then
|
||||
right = left + (percent * (right - left))
|
||||
self.frame.graphical[rune].rune:SetWidth(percent * self.runeWidth)
|
||||
end
|
||||
|
||||
self.frame.graphical[rune].rune:SetTexCoord(left, right, top, bottom)
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:HideRune(i)
|
||||
if self:GetRuneMode() == "Numeric" then
|
||||
self.frame.graphical[i].Hide()
|
||||
return
|
||||
end
|
||||
|
||||
if self.moduleSettings.inactiveDisplayMode == "Darkened" then
|
||||
self.frame.graphical[i].rune:SetVertexColor(0, 0, 0)
|
||||
elseif self.moduleSettings.inactiveDisplayMode == "Hidden" then
|
||||
self.frame.graphical[i]:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:StartRunesFullAnimation()
|
||||
if not self.AnimUpdate then
|
||||
self.AnimUpdate = function() self:UpdateRuneAnimation() end
|
||||
@ -662,10 +716,22 @@ function IceClassPowerCounter.prototype:GetShineAtlas(rune)
|
||||
return nil
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:GetFrameAtlas(rune)
|
||||
return nil
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:GetBackgroundAtlas(rune)
|
||||
return nil
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:GetPartialRuneAtlas(rune)
|
||||
return nil
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:CreateFrame()
|
||||
IceClassPowerCounter.super.prototype.CreateFrame(self)
|
||||
|
||||
self.frame:SetFrameStrata("LOW")
|
||||
self.frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("LOW"))
|
||||
self.frame:SetHeight(self.runeHeight)
|
||||
self.frame:ClearAllPoints()
|
||||
self.frame:SetPoint("TOP", self.parent, "BOTTOM", self.moduleSettings.hpos, self.moduleSettings.vpos)
|
||||
@ -682,6 +748,7 @@ end
|
||||
function IceClassPowerCounter.prototype:SetDisplayMode()
|
||||
if self:GetRuneMode() == "Numeric" or self.moduleSettings.alsoShowNumeric then
|
||||
self.frame.numeric:Show()
|
||||
self.frame.numeric:SetPoint("CENTER", self.frame.numericParent, "CENTER", 0, self.moduleSettings.runeMode == "Numeric" and 0 or self.moduleSettings.numericVerticalOffset)
|
||||
for i=1, self.numRunes do
|
||||
self.frame.graphical[i]:Hide()
|
||||
end
|
||||
@ -693,6 +760,21 @@ function IceClassPowerCounter.prototype:SetDisplayMode()
|
||||
for i=1, self.numRunes do
|
||||
self:SetupRuneTexture(i)
|
||||
self.frame.graphical[i]:Show()
|
||||
|
||||
if self.frame.graphical[i].frame then
|
||||
if self:GetRuneMode() == "Graphical" then
|
||||
self.frame.graphical[i].frame:Show()
|
||||
else
|
||||
self.frame.graphical[i].frame:Hide()
|
||||
end
|
||||
end
|
||||
if self.frame.graphical[i].bg then
|
||||
if self:GetRuneMode() == "Graphical" then
|
||||
self.frame.graphical[i].bg:Show()
|
||||
else
|
||||
self.frame.graphical[i].bg:Hide()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -707,7 +789,6 @@ function IceClassPowerCounter.prototype:CreateRuneFrame()
|
||||
|
||||
self.frame.numeric:SetJustifyH("CENTER")
|
||||
|
||||
self.frame.numeric:SetPoint("CENTER", self.frame.numericParent, "CENTER", 0, self.moduleSettings.numericVerticalOffset)
|
||||
self.frame.numeric:Hide()
|
||||
|
||||
if (not self.frame.graphical) then
|
||||
@ -717,15 +798,18 @@ function IceClassPowerCounter.prototype:CreateRuneFrame()
|
||||
for i=1, self.numRunes do
|
||||
self:CreateRune(i)
|
||||
end
|
||||
for i=self.numRunes+1, #self.frame.graphical do
|
||||
self.frame.graphical[i]:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:CreateRune(i)
|
||||
-- create runes
|
||||
if (not self.frame.graphical[i]) then
|
||||
self.frame.graphical[i] = CreateFrame("Frame", nil, self.frame)
|
||||
self.frame.graphical[i]:SetFrameStrata("BACKGROUND")
|
||||
self.frame.graphical[i]:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
|
||||
self.frame.graphical[i].rune = self.frame.graphical[i]:CreateTexture(nil, "ARTWORK")
|
||||
self.frame.graphical[i].rune = self.frame.graphical[i]:CreateTexture(nil, "BORDER")
|
||||
self.frame.graphical[i].rune:SetVertexColor(0, 0, 0)
|
||||
self:SetupRuneTexture(i)
|
||||
|
||||
@ -734,7 +818,7 @@ function IceClassPowerCounter.prototype:CreateRune(i)
|
||||
self.frame.graphical[i].shine:SetAtlas(self:GetShineAtlas(i))
|
||||
else
|
||||
self.frame.graphical[i].shine:SetTexture("Interface\\ComboFrame\\ComboPoint")
|
||||
self.frame.graphical[i].shine:SetTexCoord(0.5625, 1, 0, 1)
|
||||
self.frame.graphical[i].shine:SetTexCoord(0.5625, 1, 0, 1)
|
||||
end
|
||||
self.frame.graphical[i].shine:SetBlendMode("ADD")
|
||||
self.frame.graphical[i].shine:ClearAllPoints()
|
||||
@ -744,6 +828,22 @@ function IceClassPowerCounter.prototype:CreateRune(i)
|
||||
self.frame.graphical[i].shine:SetHeight(self.runeHeight + 10)
|
||||
self.frame.graphical[i].shine:Hide()
|
||||
|
||||
local frameAtlas = self:GetFrameAtlas(i)
|
||||
if frameAtlas then
|
||||
self.frame.graphical[i].frame = self.frame.graphical[i]:CreateTexture(nil, "ARTWORK")
|
||||
self.frame.graphical[i].frame:SetAtlas(frameAtlas)
|
||||
self.frame.graphical[i].frame:ClearAllPoints()
|
||||
self.frame.graphical[i].frame:SetPoint("CENTER", self.frame.graphical[i], "CENTER")
|
||||
end
|
||||
|
||||
local bgAtlas = self:GetBackgroundAtlas(i)
|
||||
if bgAtlas then
|
||||
self.frame.graphical[i].bg = self.frame.graphical[i]:CreateTexture(nil, "BACKGROUND")
|
||||
self.frame.graphical[i].bg:SetAtlas(bgAtlas)
|
||||
self.frame.graphical[i].bg:ClearAllPoints()
|
||||
self.frame.graphical[i].bg:SetAllPoints(self.frame.graphical[i])
|
||||
end
|
||||
|
||||
self.frame.graphical[i]:Hide()
|
||||
end
|
||||
|
||||
@ -751,6 +851,10 @@ function IceClassPowerCounter.prototype:CreateRune(i)
|
||||
self.frame.graphical[i]:SetHeight(self.runeHeight)
|
||||
self.frame.graphical[i].rune:SetWidth(self.runeWidth)
|
||||
self.frame.graphical[i].rune:SetHeight(self.runeHeight)
|
||||
if self.frame.graphical[i].frame then
|
||||
self.frame.graphical[i].frame:SetWidth(self.runeWidth + 10)
|
||||
self.frame.graphical[i].frame:SetHeight(self.runeHeight + 10)
|
||||
end
|
||||
if self.currentGrowMode == self.growModes["width"] then
|
||||
self.frame.graphical[i].rune:SetPoint("LEFT", self.frame.graphical[i], "LEFT")
|
||||
else
|
||||
@ -758,7 +862,13 @@ function IceClassPowerCounter.prototype:CreateRune(i)
|
||||
end
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:SetupNewRune(rune)
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:SetupRuneTexture(rune)
|
||||
if rune > #self.runeCoords then
|
||||
self:SetupNewRune(rune)
|
||||
end
|
||||
if not rune or rune < 1 or rune > #self.runeCoords then
|
||||
return
|
||||
end
|
||||
@ -767,7 +877,10 @@ function IceClassPowerCounter.prototype:SetupRuneTexture(rune)
|
||||
local a,b,c,d = 0, 1, 0, 1
|
||||
if self:GetRuneMode() == "Graphical" then
|
||||
width = self.runeWidth
|
||||
a,b,c,d = unpack(self.runeCoords[rune])
|
||||
local coords = self.runeCoords[rune]
|
||||
if coords then
|
||||
a,b,c,d = unpack(coords)
|
||||
end
|
||||
end
|
||||
|
||||
-- make sure any texture aside from the special one is square and has the proper coordinates
|
||||
@ -782,12 +895,7 @@ function IceClassPowerCounter.prototype:SetupRuneTexture(rune)
|
||||
end
|
||||
|
||||
if self:GetRuneMode() == "Graphical" then
|
||||
local tex = self:GetRuneTexture(rune)
|
||||
if tex then
|
||||
self.frame.graphical[rune].rune:SetTexture(tex)
|
||||
else
|
||||
self.frame.graphical[rune].rune:SetAtlas(self:GetRuneAtlas(rune), self:UseAtlasSize(rune))
|
||||
end
|
||||
self:SetRuneGraphicalTexture(rune)
|
||||
elseif self:GetRuneMode() == "Graphical Bar" then
|
||||
self.frame.graphical[rune].rune:SetTexture(IceElement.TexturePath .. "Combo")
|
||||
elseif self:GetRuneMode() == "Graphical Circle" then
|
||||
@ -799,6 +907,19 @@ function IceClassPowerCounter.prototype:SetupRuneTexture(rune)
|
||||
end
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:SetRuneGraphicalTexture(rune, partial)
|
||||
self.frame.graphical[rune].rune:SetVertexColor(1, 1, 1)
|
||||
|
||||
local tex = self:GetRuneTexture(rune)
|
||||
if tex then
|
||||
self.frame.graphical[rune].rune:SetTexture(tex)
|
||||
else
|
||||
local partialAtlas = self:GetPartialRuneAtlas(rune)
|
||||
local atlas = (partial and partialAtlas) and partialAtlas or self:GetRuneAtlas(rune)
|
||||
self.frame.graphical[rune].rune:SetAtlas(atlas, self:UseAtlasSize(rune))
|
||||
end
|
||||
end
|
||||
|
||||
function IceClassPowerCounter.prototype:GetAlphaAdd()
|
||||
return 0.15
|
||||
end
|
||||
|
@ -3,8 +3,27 @@ local ComboPoints = IceCore_CreateClass(IceElement)
|
||||
|
||||
local IceHUD = _G.IceHUD
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(spellID)
|
||||
if not spellID then
|
||||
return nil
|
||||
end
|
||||
|
||||
local spellInfo = C_Spell.GetSpellInfo(spellID)
|
||||
if spellInfo then
|
||||
return spellInfo.name, nil, spellInfo.iconID, spellInfo.castTime, spellInfo.minRange, spellInfo.maxRange, spellInfo.spellID, spellInfo.originalIconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
local AnticipationSpellId = 114015
|
||||
local AnticipationExists = GetSpellInfo(AnticipationSpellId) and IceHUD.WowVer < 70000
|
||||
local AnticipationExists = GetSpellName(AnticipationSpellId) and IceHUD.WowVer < 70000
|
||||
|
||||
ComboPoints.prototype.comboSize = 20
|
||||
|
||||
@ -13,13 +32,6 @@ if Enum and Enum.PowerType then
|
||||
SPELL_POWER_COMBO_POINTS = Enum.PowerType.ComboPoints
|
||||
end
|
||||
|
||||
local GetUnitChargedPowerPoints = GetUnitChargedPowerPoints
|
||||
if not GetUnitChargedPowerPoints then
|
||||
GetUnitChargedPowerPoints = function()
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
-- Constructor --
|
||||
function ComboPoints.prototype:init()
|
||||
ComboPoints.super.prototype.init(self, "ComboPoints")
|
||||
@ -28,7 +40,7 @@ function ComboPoints.prototype:init()
|
||||
if AnticipationExists then
|
||||
self:SetDefaultColor("AnticipationPoints", 1, 0, 1)
|
||||
end
|
||||
self:SetDefaultColor("KyrianAnimaComboPoint", 0.3137254901960784, 0.3725490196078432, 1)
|
||||
self:SetDefaultColor("ChargedComboPoint", 0.3137254901960784, 0.3725490196078432, 1)
|
||||
self.scalingEnabled = true
|
||||
end
|
||||
|
||||
@ -229,25 +241,26 @@ function ComboPoints.prototype:GetOptions()
|
||||
order = 35
|
||||
}
|
||||
|
||||
if IceHUD.WowVer >= 90000 then
|
||||
opts["bShowAnimaCharged"] = {
|
||||
type = 'toggle',
|
||||
width = 'double',
|
||||
name = L["Show Anima-charged points"],
|
||||
desc = L["Whether or not to color an anima-charged combo point a separate color. Set the KyrianAnimaComboPoint color to the color you would like it to be."],
|
||||
get = function()
|
||||
return self.moduleSettings.bShowAnimaCharged
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.moduleSettings.bShowAnimaCharged = v
|
||||
self:UpdateChargedComboPoints()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
order = 36
|
||||
}
|
||||
end
|
||||
opts["bShowCharged"] = {
|
||||
type = 'toggle',
|
||||
width = 'double',
|
||||
name = L["Show Charged points"],
|
||||
desc = L["Whether or not to color a charged combo point a separate color. Set the ChargedComboPoint color to the color you would like it to be."],
|
||||
get = function()
|
||||
return self.moduleSettings.bShowCharged
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.moduleSettings.bShowCharged = v
|
||||
self:UpdateChargedComboPoints()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
hidden = function()
|
||||
return not GetUnitChargedPowerPoints
|
||||
end,
|
||||
order = 36
|
||||
}
|
||||
|
||||
return opts
|
||||
end
|
||||
@ -267,7 +280,7 @@ function ComboPoints.prototype:GetDefaultSettings()
|
||||
defaults["comboGap"] = 0
|
||||
defaults["showAnticipation"] = true
|
||||
defaults["bShowWithNoTarget"] = true
|
||||
defaults["bShowAnimaCharged"] = true
|
||||
defaults["bShowCharged"] = true
|
||||
return defaults
|
||||
end
|
||||
|
||||
@ -291,7 +304,7 @@ function ComboPoints.prototype:Enable(core)
|
||||
self:RegisterEvent("UNIT_COMBO_POINTS", "UpdateComboPoints")
|
||||
else
|
||||
self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateComboPoints")
|
||||
if IceHUD.WowVer < 80000 then
|
||||
if IceHUD.EventExistsUnitMaxPower then
|
||||
self:RegisterEvent("UNIT_MAXPOWER", "UpdateMaxComboPoints")
|
||||
end
|
||||
end
|
||||
@ -307,7 +320,7 @@ function ComboPoints.prototype:Enable(core)
|
||||
self:RegisterEvent("PLAYER_COMBO_POINTS", "UpdateComboPoints")
|
||||
end
|
||||
|
||||
if IceHUD.WowVer >= 90000 then
|
||||
if GetUnitChargedPowerPoints then
|
||||
self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateChargedComboPoints")
|
||||
end
|
||||
|
||||
@ -330,10 +343,11 @@ function ComboPoints.prototype:UpdateMaxComboPoints(event, unit, powerType)
|
||||
end
|
||||
|
||||
function ComboPoints.prototype:UpdateChargedComboPoints()
|
||||
local chargedPowerPoints = GetUnitChargedPowerPoints("player")
|
||||
self.chargedPowerPointIndex = chargedPowerPoints and chargedPowerPoints[1]
|
||||
self:CreateComboFrame()
|
||||
self:UpdateComboPoints()
|
||||
if GetUnitChargedPowerPoints then
|
||||
self.chargedPowerPoints = GetUnitChargedPowerPoints("player")
|
||||
self:CreateComboFrame()
|
||||
self:UpdateComboPoints()
|
||||
end
|
||||
end
|
||||
|
||||
-- 'Protected' methods --------------------------------------------------------
|
||||
@ -342,7 +356,7 @@ end
|
||||
function ComboPoints.prototype:CreateFrame()
|
||||
ComboPoints.super.prototype.CreateFrame(self)
|
||||
|
||||
self.frame:SetFrameStrata("BACKGROUND")
|
||||
self.frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
if self.moduleSettings.graphicalLayout == "Horizontal" then
|
||||
self.frame:SetWidth((self.comboSize - 5)*self:GetMaxComboPoints())
|
||||
self.frame:SetHeight(1)
|
||||
@ -401,7 +415,7 @@ function ComboPoints.prototype:CreateComboFrame(forceTextureUpdate)
|
||||
end
|
||||
end
|
||||
|
||||
self.frame.graphicalBG[i]:SetFrameStrata("BACKGROUND")
|
||||
self.frame.graphicalBG[i]:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame.graphicalBG[i]:SetWidth(self.comboSize)
|
||||
self.frame.graphicalBG[i]:SetHeight(self.comboSize)
|
||||
if self.moduleSettings.graphicalLayout == "Horizontal" then
|
||||
@ -437,7 +451,7 @@ function ComboPoints.prototype:CreateComboFrame(forceTextureUpdate)
|
||||
end
|
||||
end
|
||||
|
||||
self.frame.graphical[i]:SetFrameStrata("LOW")
|
||||
self.frame.graphical[i]:SetFrameStrata(IceHUD.IceCore:DetermineStrata("LOW"))
|
||||
self.frame.graphical[i]:SetAllPoints(self.frame.graphicalBG[i])
|
||||
|
||||
local r, g, b = self:GetColor("ComboPoints")
|
||||
@ -445,8 +459,8 @@ function ComboPoints.prototype:CreateComboFrame(forceTextureUpdate)
|
||||
g = g - ((1 / maxComboPoints)*i)
|
||||
end
|
||||
|
||||
if i == self.chargedPowerPointIndex and self.moduleSettings.bShowAnimaCharged then
|
||||
self.frame.graphical[i].texture:SetVertexColor(self:GetColor("KyrianAnimaComboPoint"))
|
||||
if self.moduleSettings.bShowCharged and self:IsChargedPoint(i) then
|
||||
self.frame.graphical[i].texture:SetVertexColor(self:GetColor("ChargedComboPoint"))
|
||||
else
|
||||
self.frame.graphical[i].texture:SetVertexColor(r, g, b)
|
||||
end
|
||||
@ -476,7 +490,7 @@ function ComboPoints.prototype:CreateComboFrame(forceTextureUpdate)
|
||||
end
|
||||
end
|
||||
|
||||
self.frame.graphicalAnt[i]:SetFrameStrata("LOW")
|
||||
self.frame.graphicalAnt[i]:SetFrameStrata(IceHUD.IceCore:DetermineStrata("LOW"))
|
||||
self.frame.graphicalAnt[i]:SetFrameLevel(self.frame.graphical[i]:GetFrameLevel() + 1)
|
||||
self.frame.graphicalAnt[i]:SetWidth(math.floor(self.comboSize / 2))
|
||||
self.frame.graphicalAnt[i]:SetHeight(math.floor(self.comboSize / 2))
|
||||
@ -494,6 +508,20 @@ function ComboPoints.prototype:CreateComboFrame(forceTextureUpdate)
|
||||
end
|
||||
end
|
||||
|
||||
function ComboPoints.prototype:IsChargedPoint(point)
|
||||
if not self.chargedPowerPoints then
|
||||
return false
|
||||
end
|
||||
|
||||
for i=1, #self.chargedPowerPoints do
|
||||
if self.chargedPowerPoints[i] == point then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function ComboPoints.prototype:UpdateComboPoints(...)
|
||||
if select('#', ...) >= 3 and select(1, ...) == IceHUD.UnitPowerEvent and select(3, ...) ~= "COMBO_POINTS" then
|
||||
return
|
||||
@ -502,7 +530,7 @@ function ComboPoints.prototype:UpdateComboPoints(...)
|
||||
local points, anticipate, _
|
||||
if IceHUD.IceCore:IsInConfigMode() then
|
||||
points = self:GetMaxComboPoints()
|
||||
elseif IceHUD.WowVer >= 30000 or IceHUD.WowClassic or IceHUD.WowClassicBC then
|
||||
elseif UnitHasVehicleUI then
|
||||
-- Parnic: apparently some fights have combo points while the player is in a vehicle?
|
||||
local isInVehicle = UnitHasVehicleUI and UnitHasVehicleUI("player")
|
||||
local checkUnit = isInVehicle and "vehicle" or "player"
|
||||
@ -513,12 +541,12 @@ function ComboPoints.prototype:UpdateComboPoints(...)
|
||||
end
|
||||
|
||||
if AnticipationExists then
|
||||
_, _, _, anticipate = UnitAura("player", GetSpellInfo(AnticipationSpellId))
|
||||
_, _, _, anticipate = IceHUD.UnitAura("player", GetSpellName(AnticipationSpellId))
|
||||
else
|
||||
anticipate = 0
|
||||
end
|
||||
else
|
||||
points = GetComboPoints("target")
|
||||
points = GetComboPoints("player", "target")
|
||||
end
|
||||
|
||||
points = points or 0
|
||||
@ -536,6 +564,9 @@ function ComboPoints.prototype:UpdateComboPoints(...)
|
||||
self.frame.numeric:SetTextColor(r, g, b, 0.7)
|
||||
|
||||
local pointsText = tostring(points)
|
||||
if self.moduleSettings.bShowCharged and self:IsChargedPoint(points) then
|
||||
pointsText = pointsText.."@"
|
||||
end
|
||||
if anticipate > 0 then
|
||||
pointsText = pointsText.."+"..tostring(anticipate)
|
||||
end
|
||||
@ -580,10 +611,10 @@ do
|
||||
function ComboPoints.prototype:CheckAnticipation(e, unit) -- UNIT_AURA handler
|
||||
if UnitIsUnit(unit, "player") then
|
||||
local _, _, _, newAntStacks
|
||||
if IceHUD.WowVer < 80000 then
|
||||
_, _, _, newAntStacks = UnitAura("player", GetSpellInfo(AnticipationSpellId))
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
_, _, _, newAntStacks = IceHUD.UnitAura("player", GetSpellName(AnticipationSpellId))
|
||||
else
|
||||
_, _, newAntStacks = UnitAura("player", GetSpellInfo(AnticipationSpellId))
|
||||
_, _, newAntStacks = IceHUD.UnitAura("player", GetSpellName(AnticipationSpellId))
|
||||
end
|
||||
if newAntStacks ~= antStacks then
|
||||
antStacks = newAntStacks
|
||||
|
@ -6,18 +6,12 @@ if Enum and Enum.PowerType then
|
||||
SPELL_POWER_COMBO_POINTS = Enum.PowerType.ComboPoints
|
||||
end
|
||||
|
||||
local GetUnitChargedPowerPoints = GetUnitChargedPowerPoints
|
||||
if not GetUnitChargedPowerPoints then
|
||||
GetUnitChargedPowerPoints = function()
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
function ComboPointsBar.prototype:init()
|
||||
ComboPointsBar.super.prototype.init(self, "ComboPointsBar")
|
||||
|
||||
self:SetDefaultColor("ComboPointsBarMin", 1, 1, 0)
|
||||
self:SetDefaultColor("ComboPointsBarMax", 0, 1, 0)
|
||||
self:SetDefaultColor("ChargedComboPointBar", 0.3137254901960784, 0.3725490196078432, 1)
|
||||
|
||||
self.bTreatEmptyAsFull = true
|
||||
end
|
||||
@ -59,6 +53,26 @@ function ComboPointsBar.prototype:GetOptions()
|
||||
end,
|
||||
}
|
||||
|
||||
opts["bShowCharged"] = {
|
||||
type = 'toggle',
|
||||
width = 'double',
|
||||
name = L["Show Charged points"],
|
||||
desc = L["Whether or not to color a charged combo point a separate color and append an @ sign to the number. Set the ChargedComboPointBar color to the color you would like it to be."],
|
||||
get = function()
|
||||
return self.moduleSettings.bShowCharged
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.moduleSettings.bShowCharged = v
|
||||
self:UpdateComboPoints()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
hidden = function()
|
||||
return not GetUnitChargedPowerPoints
|
||||
end,
|
||||
}
|
||||
|
||||
return opts
|
||||
end
|
||||
|
||||
@ -69,6 +83,7 @@ function ComboPointsBar.prototype:GetDefaultSettings()
|
||||
defaults.alwaysDisplay = false
|
||||
defaults.desiredLerpTime = 0.05
|
||||
defaults.bShowWithNoTarget = true
|
||||
defaults.bShowCharged = true
|
||||
return defaults
|
||||
end
|
||||
|
||||
@ -90,17 +105,9 @@ function ComboPointsBar.prototype:Enable(core)
|
||||
self:RegisterEvent("PLAYER_COMBO_POINTS", "UpdateComboPoints")
|
||||
end
|
||||
|
||||
if IceHUD.WowVer >= 90000 then
|
||||
self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateChargedComboPoints")
|
||||
if GetUnitChargedPowerPoints then
|
||||
self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateComboPoints")
|
||||
end
|
||||
|
||||
self:UpdateChargedComboPoints()
|
||||
end
|
||||
|
||||
function ComboPointsBar.prototype:UpdateChargedComboPoints()
|
||||
local chargedPowerPoints = GetUnitChargedPowerPoints("player")
|
||||
self.chargedPowerPointIndex = chargedPowerPoints and chargedPowerPoints[1]
|
||||
self:UpdateComboPoints()
|
||||
end
|
||||
|
||||
function ComboPointsBar.prototype:CreateFrame()
|
||||
@ -119,7 +126,7 @@ function ComboPointsBar.prototype:UpdateComboPoints(...)
|
||||
local points
|
||||
if IceHUD.IceCore:IsInConfigMode() then
|
||||
points = UnitPowerMax("player", SPELL_POWER_COMBO_POINTS)
|
||||
elseif IceHUD.WowVer >= 30000 or IceHUD.WowClassic or IceHUD.WowClassicBC then
|
||||
elseif UnitHasVehicleUI then
|
||||
-- Parnic: apparently some fights have combo points while the player is in a vehicle?
|
||||
local isInVehicle = UnitHasVehicleUI and UnitHasVehicleUI("player")
|
||||
local checkUnit = isInVehicle and "vehicle" or "player"
|
||||
@ -129,25 +136,53 @@ function ComboPointsBar.prototype:UpdateComboPoints(...)
|
||||
points = UnitPower(checkUnit, SPELL_POWER_COMBO_POINTS)
|
||||
end
|
||||
else
|
||||
points = GetComboPoints("target")
|
||||
points = GetComboPoints("player", "target")
|
||||
end
|
||||
|
||||
if (points == 0) then
|
||||
points = nil
|
||||
end
|
||||
|
||||
local isCharged = self:IsChargedPoint(points) and self.moduleSettings.bShowCharged
|
||||
|
||||
if points == nil or points == 0 or (not UnitExists("target") and not self.moduleSettings.bShowWithNoTarget) then
|
||||
self:Show(self.moduleSettings.alwaysDisplay)
|
||||
self:UpdateBar(0, "undef")
|
||||
else
|
||||
self:Show(true)
|
||||
self:SetScaledColor(color, (points - 1) / 4.0, self.settings.colors["ComboPointsBarMax"], self.settings.colors["ComboPointsBarMin"])
|
||||
if isCharged then
|
||||
color.r, color.g, color.b = self:GetColor("ChargedComboPointBar")
|
||||
else
|
||||
self:SetScaledColor(color, (points - 1) / 4.0, self.settings.colors["ComboPointsBarMax"], self.settings.colors["ComboPointsBarMin"])
|
||||
end
|
||||
self:UpdateBar(points / UnitPowerMax("player", SPELL_POWER_COMBO_POINTS), "undef")
|
||||
self.barFrame.bar:SetVertexColor(color.r, color.g, color.b, self.alpha)
|
||||
end
|
||||
|
||||
self:SetBottomText1(points or "0")
|
||||
self:SetBottomText2(self.chargedPowerPointIndex)
|
||||
local pointsText = tostring(points or 0)
|
||||
if isCharged then
|
||||
pointsText = pointsText .. "@"
|
||||
end
|
||||
self:SetBottomText1(pointsText or "0")
|
||||
end
|
||||
|
||||
function ComboPointsBar.prototype:IsChargedPoint(point)
|
||||
if not GetUnitChargedPowerPoints or not point then
|
||||
return false
|
||||
end
|
||||
|
||||
local chargedPoints = GetUnitChargedPowerPoints("player")
|
||||
if not chargedPoints then
|
||||
return false
|
||||
end
|
||||
|
||||
for i=1, #chargedPoints do
|
||||
if chargedPoints[i] == point then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function ComboPointsBar.prototype:Update()
|
||||
|
@ -10,6 +10,26 @@ local buffOrDebuff = {"buff", "debuff"}
|
||||
local validBuffTimers = {"none", "seconds", "minutes:seconds", "minutes"}
|
||||
local AuraIconWidth = 20
|
||||
local AuraIconHeight = 20
|
||||
local displayModes = {NORMAL = L["When present"], ALWAYS = L["Always"], WHEN_TARGETING = L["Always, when targeting"], MISSING = L["When missing"]}
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(id)
|
||||
if not id then
|
||||
return nil
|
||||
end
|
||||
|
||||
local info = C_Spell.GetSpellInfo(id)
|
||||
if info then
|
||||
return info.name, nil, info.iconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
IceCustomBar.prototype.auraDuration = -1
|
||||
IceCustomBar.prototype.auraEndTime = -1
|
||||
@ -28,6 +48,16 @@ end
|
||||
function IceCustomBar.prototype:Enable(core)
|
||||
IceCustomBar.super.prototype.Enable(self, core)
|
||||
|
||||
-- fix up for new display mode setting
|
||||
if self.moduleSettings.displayWhenTargeting then
|
||||
self.moduleSettings.displayMode = displayModes.WHEN_TARGETING
|
||||
self.moduleSettings.displayWhenTargeting = nil
|
||||
end
|
||||
if self.moduleSettings.displayWhenEmpty then
|
||||
self.moduleSettings.displayMode = displayModes.ALWAYS
|
||||
self.moduleSettings.displayWhenEmpty = nil
|
||||
end
|
||||
|
||||
if IceHUD.IceCore:ShouldUseDogTags() then
|
||||
DogTag = LibStub("LibDogTag-3.0", true)
|
||||
if DogTag then
|
||||
@ -72,6 +102,7 @@ function IceCustomBar.prototype:Enable(core)
|
||||
self:FixupTextColors()
|
||||
self:SetCustomTextColor(self.frame.bottomUpperText, self.moduleSettings.upperTextColor)
|
||||
self:SetCustomTextColor(self.frame.bottomLowerText, self.moduleSettings.lowerTextColor)
|
||||
self:UpdateAuraIcon()
|
||||
end
|
||||
|
||||
function IceCustomBar.prototype:Disable(core)
|
||||
@ -149,8 +180,7 @@ function IceCustomBar.prototype:GetDefaultSettings()
|
||||
settings["buffOrDebuff"] = "buff"
|
||||
settings["barColor"] = {r=1, g=0, b=0, a=1}
|
||||
settings["trackOnlyMine"] = true
|
||||
settings["displayWhenEmpty"] = false
|
||||
settings["displayWhenTargeting"] = false
|
||||
settings["displayMode"] = displayModes.NORMAL
|
||||
settings["hideAnimationSettings"] = true
|
||||
settings["buffTimerDisplay"] = "minutes"
|
||||
settings["maxDuration"] = 0
|
||||
@ -171,7 +201,7 @@ function IceCustomBar.prototype:CreateBar()
|
||||
IceCustomBar.super.prototype.CreateBar(self)
|
||||
|
||||
if not self.barFrame.icon then
|
||||
self.barFrame.icon = self.masterFrame:CreateTexture(nil, "LOW")
|
||||
self.barFrame.icon = self.masterFrame:CreateTexture(nil, "BACKGROUND")
|
||||
-- this cuts off the border around the buff icon
|
||||
self.barFrame.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
|
||||
self.barFrame.icon:SetDrawLayer("OVERLAY")
|
||||
@ -194,6 +224,7 @@ end
|
||||
function IceCustomBar.prototype:Redraw()
|
||||
IceCustomBar.super.prototype.Redraw(self)
|
||||
|
||||
self:UpdateAuraIcon()
|
||||
self:UpdateCustomBar(self.unit)
|
||||
end
|
||||
|
||||
@ -329,16 +360,18 @@ function IceCustomBar.prototype:GetOptions()
|
||||
opts["buffToTrack"] = {
|
||||
type = 'input',
|
||||
name = L["Aura to track"],
|
||||
desc = L["Which buff/debuff this bar will be tracking.\n\nRemember to press ENTER after filling out this box with the name you want or it will not save."],
|
||||
desc = function()
|
||||
if IceHUD.GetPlayerAuraBySpellID then
|
||||
return L["Which buff/debuff this bar will be tracking. Can use the name or spell id. \n\nRemember to press ENTER after filling out this box with the name you want or it will not save."]
|
||||
else
|
||||
return L["Which buff/debuff this bar will be tracking.\n\nRemember to press ENTER after filling out this box with the name you want or it will not save."]
|
||||
end
|
||||
end,
|
||||
get = function()
|
||||
return self.moduleSettings.buffToTrack
|
||||
end,
|
||||
set = function(info, v)
|
||||
local orig = v
|
||||
--Parnic: we now allow spell IDs to be used directly
|
||||
--if tonumber(v) ~= nil then
|
||||
-- v = GetSpellInfo(tonumber(v))
|
||||
--end
|
||||
if v == nil then
|
||||
v = orig
|
||||
end
|
||||
@ -429,38 +462,39 @@ function IceCustomBar.prototype:GetOptions()
|
||||
order = 30.8,
|
||||
}
|
||||
|
||||
opts["displayWhenEmpty"] = {
|
||||
type = 'toggle',
|
||||
name = L["Display when empty"],
|
||||
desc = L["Whether or not to display this bar even if the buff/debuff specified is not present."],
|
||||
get = function()
|
||||
return self.moduleSettings.displayWhenEmpty
|
||||
opts["displayMode"] = {
|
||||
type = 'select',
|
||||
values = displayModes,
|
||||
name = L["Display mode"],
|
||||
desc = L["When to show the bar"],
|
||||
get = function(info)
|
||||
return IceHUD:GetSelectValue(info, self.moduleSettings.displayMode)
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.moduleSettings.displayWhenEmpty = v
|
||||
self.moduleSettings.displayMode = info.option.values[v]
|
||||
self:UpdateCustomBar()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
order = 30.9
|
||||
order = 30.9,
|
||||
}
|
||||
|
||||
opts["displayWhenTargeting"] = {
|
||||
opts["displayWhenUnitExists"] = {
|
||||
type = 'toggle',
|
||||
name = L["Display when targeting"],
|
||||
desc = L["Whether to display this bar when you target a unit, even if the buff/debuff specified is not present."],
|
||||
get = function()
|
||||
return self.moduleSettings.displayWhenTargeting
|
||||
name = L["Only if unit exists"],
|
||||
desc = L["If checked, the bar will only be displayed (according to the 'Display mode' rules) when the Unit to Track exists (e.g. if set to Target and you're targeting something)."],
|
||||
get = function(info)
|
||||
return self.moduleSettings.displayWhenUnitExists
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.moduleSettings.displayWhenTargeting = v
|
||||
self.moduleSettings.displayWhenUnitExists = v
|
||||
self:UpdateCustomBar()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
order = 30.91
|
||||
order = 30.91,
|
||||
}
|
||||
|
||||
opts["buffTimerDisplay"] = {
|
||||
@ -671,9 +705,9 @@ function IceCustomBar.prototype:GetAuraDuration(unitName, buffName)
|
||||
local buffFilter = (isBuff and "HELPFUL" or "HARMFUL") .. (self.moduleSettings.trackOnlyMine and "|PLAYER" or "")
|
||||
local buff, rank, texture, count, type, duration, endTime, unitCaster, _, _, spellId
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
buff, rank, texture, count, type, duration, endTime, unitCaster, _, _, spellId = UnitAura(unitName, i, buffFilter)
|
||||
buff, rank, texture, count, type, duration, endTime, unitCaster, _, _, spellId = IceHUD.UnitAura(unitName, i, buffFilter)
|
||||
else
|
||||
buff, texture, count, type, duration, endTime, unitCaster, _, _, spellId = UnitAura(unitName, i, buffFilter)
|
||||
buff, texture, count, type, duration, endTime, unitCaster, _, _, spellId = IceHUD.UnitAura(unitName, i, buffFilter)
|
||||
end
|
||||
local isMine = unitCaster == "player"
|
||||
local mySpellId = tonumber(self.moduleSettings.buffToTrack)
|
||||
@ -701,9 +735,9 @@ function IceCustomBar.prototype:GetAuraDuration(unitName, buffName)
|
||||
i = i + 1;
|
||||
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
buff, rank, texture, count, type, duration, endTime, unitCaster, _, _, spellId = UnitAura(unitName, i, buffFilter)
|
||||
buff, rank, texture, count, type, duration, endTime, unitCaster, _, _, spellId = IceHUD.UnitAura(unitName, i, buffFilter)
|
||||
else
|
||||
buff, texture, count, type, duration, endTime, unitCaster, _, _, spellId = UnitAura(unitName, i, buffFilter)
|
||||
buff, texture, count, type, duration, endTime, unitCaster, _, _, spellId = IceHUD.UnitAura(unitName, i, buffFilter)
|
||||
end
|
||||
isMine = unitCaster == "player"
|
||||
end
|
||||
@ -758,7 +792,7 @@ function IceCustomBar.prototype:UpdateCustomBar(unit, fromUpdate)
|
||||
self:GetAuraDuration(self.unit, self.moduleSettings.buffToTrack)
|
||||
else
|
||||
self.auraDuration, remaining, self.auraBuffCount, auraIcon, endTime =
|
||||
self:GetAuraDuration(self.unit, GetSpellInfo(self.moduleSettings.buffToTrack))
|
||||
self:GetAuraDuration(self.unit, GetSpellName(self.moduleSettings.buffToTrack))
|
||||
end
|
||||
|
||||
if endTime == 0 then
|
||||
@ -809,7 +843,11 @@ function IceCustomBar.prototype:UpdateCustomBar(unit, fromUpdate)
|
||||
|
||||
self:UpdateBar(self.auraDuration ~= 0 and remaining / self.auraDuration or 0, "undef")
|
||||
else
|
||||
self:UpdateBar(0, "undef")
|
||||
local updateVal = 0
|
||||
if self.moduleSettings.displayMode == displayModes.MISSING then
|
||||
updateVal = 1
|
||||
end
|
||||
self:UpdateBar(updateVal, "undef")
|
||||
self:Show(false)
|
||||
if not self:ShouldAlwaysSubscribe() then
|
||||
self.handlesOwnUpdates = false
|
||||
@ -864,9 +902,21 @@ function IceCustomBar.prototype:Show(bShouldShow, bForceHide)
|
||||
return
|
||||
end
|
||||
|
||||
if self.moduleSettings.displayWhenTargeting and self.target then
|
||||
IceCustomBar.super.prototype.Show(self, true)
|
||||
elseif self.moduleSettings.displayWhenEmpty then
|
||||
if self.moduleSettings.displayWhenUnitExists and not UnitExists(self.unit) then
|
||||
IceCustomBar.super.prototype.Show(self, false)
|
||||
return
|
||||
end
|
||||
|
||||
if self.moduleSettings.displayMode == displayModes.MISSING then
|
||||
local show = not bShouldShow
|
||||
if show and not self:IsEnabled() then
|
||||
show = false
|
||||
end
|
||||
|
||||
IceCustomBar.super.prototype.Show(self, show)
|
||||
elseif self.moduleSettings.displayMode == displayModes.WHEN_TARGETING and self.target then
|
||||
IceCustomBar.super.prototype.Show(self, self:IsEnabled())
|
||||
elseif self.moduleSettings.displayMode == displayModes.ALWAYS then
|
||||
if not self.bIsVisible then
|
||||
IceCustomBar.super.prototype.Show(self, true)
|
||||
end
|
||||
@ -874,3 +924,13 @@ function IceCustomBar.prototype:Show(bShouldShow, bForceHide)
|
||||
IceCustomBar.super.prototype.Show(self, bShouldShow)
|
||||
end
|
||||
end
|
||||
|
||||
function IceCustomBar.prototype:UpdateAuraIcon()
|
||||
if not self.barFrame or not self.barFrame.icon then
|
||||
return
|
||||
end
|
||||
|
||||
local _, _, auraIcon = GetSpellInfo(self.moduleSettings.buffToTrack)
|
||||
|
||||
self.barFrame.icon:SetTexture(auraIcon)
|
||||
end
|
||||
|
@ -17,6 +17,55 @@ local COOLDOWN_TYPE_ITEM = 2
|
||||
|
||||
local localizedInventorySlotNames = {}
|
||||
|
||||
local IsSpellInRange = IsSpellInRange
|
||||
if not IsSpellInRange and C_Spell then
|
||||
IsSpellInRange = C_Spell.IsSpellInRange
|
||||
end
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(id)
|
||||
if not id then
|
||||
return nil
|
||||
end
|
||||
|
||||
local info = C_Spell.GetSpellInfo(id)
|
||||
if info then
|
||||
return info.name, nil, info.iconID, info.spellID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellCooldown = GetSpellCooldown
|
||||
if not GetSpellCooldown and C_Spell then
|
||||
GetSpellCooldown = function(spellID)
|
||||
local spellCooldownInfo = C_Spell.GetSpellCooldown(spellID)
|
||||
if spellCooldownInfo then
|
||||
return spellCooldownInfo.startTime, spellCooldownInfo.duration, spellCooldownInfo.isEnabled, spellCooldownInfo.modRate
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetItemInfo = GetItemInfo
|
||||
if not GetItemInfo and C_Item then
|
||||
GetItemInfo = C_Item.GetItemInfo
|
||||
end
|
||||
|
||||
local IsUsableSpell = IsUsableSpell
|
||||
if not IsUsableSpell and C_Spell then
|
||||
IsUsableSpell = C_Spell.IsSpellUsable
|
||||
end
|
||||
|
||||
local SpellHasRange = SpellHasRange
|
||||
if not SpellHasRange and C_Spell then
|
||||
SpellHasRange = C_Spell.SpellHasRange
|
||||
end
|
||||
|
||||
IceCustomCDBar.prototype.cooldownDuration = 0
|
||||
IceCustomCDBar.prototype.cooldownEndTime = 0
|
||||
IceCustomCDBar.prototype.coolingDown = false
|
||||
@ -131,7 +180,7 @@ function IceCustomCDBar.prototype:CreateBar()
|
||||
IceCustomCDBar.super.prototype.CreateBar(self)
|
||||
|
||||
if not self.barFrame.icon then
|
||||
self.barFrame.icon = self.masterFrame:CreateTexture(nil, "LOW")
|
||||
self.barFrame.icon = self.masterFrame:CreateTexture(nil, "BACKGROUND")
|
||||
-- this cuts off the border around the buff icon
|
||||
self.barFrame.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
|
||||
self.barFrame.icon:SetDrawLayer("OVERLAY")
|
||||
@ -161,7 +210,7 @@ function IceCustomCDBar.prototype:GetDisplayText(fromValue)
|
||||
|
||||
if not self.moduleSettings.cooldownType or self.moduleSettings.cooldownType == COOLDOWN_TYPE_SPELL then
|
||||
if tonumber(fromValue) ~= nil then
|
||||
local spellName = GetSpellInfo(tonumber(fromValue))
|
||||
local spellName = GetSpellName(tonumber(fromValue))
|
||||
if spellName then
|
||||
v = spellName
|
||||
end
|
||||
@ -278,7 +327,7 @@ function IceCustomCDBar.prototype:GetOptions()
|
||||
set = function(info, v)
|
||||
local orig = v
|
||||
if tonumber(v) ~= nil then
|
||||
v = GetSpellInfo(tonumber(v))
|
||||
v = GetSpellName(tonumber(v))
|
||||
end
|
||||
if v == nil then
|
||||
v = orig
|
||||
@ -592,17 +641,27 @@ end
|
||||
|
||||
-- 'Protected' methods --------------------------------------------------------
|
||||
|
||||
function IceCustomCDBar.prototype:GetCooldownDurationOverride(spellID)
|
||||
if spellID and FindSpellOverrideByID then
|
||||
local override = FindSpellOverrideByID(spellID)
|
||||
if override and override ~= spellID then
|
||||
return self:GetCooldownDuration(override)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function IceCustomCDBar.prototype:GetCooldownDuration(buffName)
|
||||
buffName = self:GetSpellNameOrId(buffName)
|
||||
local spellID
|
||||
buffName, spellID = self:GetSpellNameOrId(buffName)
|
||||
|
||||
local now = GetTime()
|
||||
local localRemaining = nil
|
||||
local localStart, localDuration, hasCooldown = GetSpellCooldown(buffName)
|
||||
|
||||
if (hasCooldown == 1) then
|
||||
if hasCooldown then
|
||||
-- the item has a potential cooldown
|
||||
if (localDuration <= 1.5) then
|
||||
return nil, nil
|
||||
if localDuration <= 1.5 then
|
||||
return self:GetCooldownDurationOverride(spellID)
|
||||
end
|
||||
|
||||
localRemaining = localDuration + (localStart - now)
|
||||
@ -613,7 +672,7 @@ function IceCustomCDBar.prototype:GetCooldownDuration(buffName)
|
||||
|
||||
return localDuration, localRemaining
|
||||
else
|
||||
return nil, nil
|
||||
return self:GetCooldownDurationOverride(spellID)
|
||||
end
|
||||
end
|
||||
|
||||
@ -696,7 +755,7 @@ function IceCustomCDBar.prototype:UpdateItemUnitInventoryChanged(event, unit)
|
||||
end
|
||||
|
||||
function IceCustomCDBar.prototype:UpdateCustomBarEvent(event, unit)
|
||||
if unit ~= self.unit then
|
||||
if unit and unit ~= self.unit then
|
||||
return
|
||||
end
|
||||
if not self.moduleSettings.cooldownType or self.moduleSettings.cooldownType == COOLDOWN_TYPE_SPELL then
|
||||
@ -824,7 +883,8 @@ function IceCustomCDBar.prototype:IsReady()
|
||||
end
|
||||
|
||||
function IceCustomCDBar.prototype:GetSpellNameOrId(spellName)
|
||||
return spellName
|
||||
local id = select(4, GetSpellInfo(spellName))
|
||||
return spellName, id
|
||||
end
|
||||
|
||||
function IceCustomCDBar.prototype:Show(bShouldShow, bForceHide)
|
||||
|
@ -326,7 +326,7 @@ end
|
||||
function IceCustomCount.prototype:CreateFrame()
|
||||
IceCustomCount.super.prototype.CreateFrame(self)
|
||||
|
||||
self.frame:SetFrameStrata("BACKGROUND")
|
||||
self.frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
if self.moduleSettings.graphicalLayout == "Horizontal" then
|
||||
self.frame:SetWidth((self.countSize + self.moduleSettings.countGap)*IceStackCounter_GetMaxCount(self))
|
||||
self.frame:SetHeight(1)
|
||||
@ -382,7 +382,7 @@ function IceCustomCount.prototype:CreateCustomFrame(doTextureUpdate)
|
||||
end
|
||||
end
|
||||
|
||||
self.frame.graphicalBG[i]:SetFrameStrata("BACKGROUND")
|
||||
self.frame.graphicalBG[i]:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame.graphicalBG[i]:SetWidth(self.countSize)
|
||||
self.frame.graphicalBG[i]:SetHeight(self.countSize)
|
||||
if self.moduleSettings.graphicalLayout == "Horizontal" then
|
||||
@ -416,7 +416,7 @@ function IceCustomCount.prototype:CreateCustomFrame(doTextureUpdate)
|
||||
end
|
||||
end
|
||||
|
||||
self.frame.graphical[i]:SetFrameStrata("BACKGROUND")
|
||||
self.frame.graphical[i]:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame.graphical[i]:SetAllPoints(self.frame.graphicalBG[i])
|
||||
|
||||
self.frame.graphical[i]:Hide()
|
||||
|
@ -7,6 +7,20 @@ local AuraIconWidth = 20
|
||||
local AuraIconHeight = 20
|
||||
local DefaultAuraIcon = "Interface\\Icons\\Spell_Frost_Frost"
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(id)
|
||||
if not id then
|
||||
return nil
|
||||
end
|
||||
|
||||
local info = C_Spell.GetSpellInfo(id)
|
||||
if info then
|
||||
return info.name, nil, info.iconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function IceCustomCounterBar.prototype:init()
|
||||
IceCustomCounterBar.super.prototype.init(self, "CustomCounterBar")
|
||||
|
||||
@ -277,7 +291,7 @@ function IceCustomCounterBar.prototype:CreateFrame()
|
||||
IceCustomCounterBar.super.prototype.CreateFrame(self)
|
||||
|
||||
if not self.barFrame.icon then
|
||||
self.barFrame.icon = self.masterFrame:CreateTexture(nil, "LOW")
|
||||
self.barFrame.icon = self.masterFrame:CreateTexture(nil, "BACKGROUND")
|
||||
self.barFrame.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
|
||||
self.barFrame.icon:SetDrawLayer("OVERLAY")
|
||||
self.barFrame.icon:Hide()
|
||||
|
@ -144,6 +144,8 @@ function IceCustomHealth.prototype:Update(unit)
|
||||
|
||||
if (self.moduleSettings.scaleHealthColor) then
|
||||
self.color = "ScaledHealthColor"
|
||||
elseif self.moduleSettings.lowThresholdColor and self.healthPercentage and self.healthPercentage <= self.moduleSettings.lowThreshold then
|
||||
self.color = "ScaledHealthColor"
|
||||
end
|
||||
|
||||
if (self.tapped) then
|
||||
|
232
modules/DragonridingVigor.lua
Normal file
@ -0,0 +1,232 @@
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
||||
local DragonridingVigor = IceCore_CreateClass(IceClassPowerCounter)
|
||||
|
||||
local DragonridingBuffs = {
|
||||
360954, -- Highland Drake
|
||||
368896, -- Renewed Proto-Drake
|
||||
368899, -- Windborn Velocidrake
|
||||
368901, -- Cliffside Wylderdrake
|
||||
368893, -- Winding Slitherdrake
|
||||
412088, -- Grotto Netherwing Drake
|
||||
}
|
||||
|
||||
local vigorWidgetSetID = 283
|
||||
local vigorWidgetType = 24
|
||||
local defaultVigorWidgetID = 4460
|
||||
local vigorWidgetIDs = nil
|
||||
local knowsAlternateMountEnum = Enum and Enum.PowerType and Enum.PowerType.AlternateMount
|
||||
local unitPowerType = Enum and Enum.PowerType and Enum.PowerType.AlternateMount
|
||||
unitPowerType = unitPowerType or ALTERNATE_POWER_INDEX
|
||||
|
||||
function DragonridingVigor.prototype:init()
|
||||
DragonridingVigor.super.prototype.init(self, "Vigor")
|
||||
|
||||
self:SetDefaultColor("VigorNumeric", 150, 150, 255)
|
||||
|
||||
self.unit = "player"
|
||||
self.numericColor = "VigorNumeric"
|
||||
self.unitPower = unitPowerType
|
||||
self.minLevel = 0
|
||||
self.bTreatEmptyAsFull = false
|
||||
self.runeWidth = self.runeHeight
|
||||
self.shouldRegisterDisplayPower = false
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:Enable(core)
|
||||
self.numRunes = UnitPowerMax(self.unit, unitPowerType)
|
||||
self.runeCoords = { }
|
||||
for i = 1, self.numRunes do
|
||||
self:SetupNewRune(i)
|
||||
end
|
||||
|
||||
DragonridingVigor.super.prototype.Enable(self, core)
|
||||
self:Show(false)
|
||||
|
||||
self:RegisterEvent("UNIT_AURA", "CheckShouldShow")
|
||||
self:RegisterEvent("UPDATE_UI_WIDGET", "UpdateVigorRecharge")
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:EnteringWorld()
|
||||
DragonridingVigor.super.prototype.EnteringWorld(self)
|
||||
|
||||
self:CheckShouldShow("PLAYER_ENTERING_WORLD", "player")
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:CheckShouldShow(event, unit, info)
|
||||
if not vigorWidgetIDs or #vigorWidgetIDs == 0 then
|
||||
self:PopulateVigorWidgetIDs()
|
||||
end
|
||||
|
||||
if unit ~= "player" or not vigorWidgetIDs then
|
||||
return
|
||||
end
|
||||
|
||||
local shown = false
|
||||
for i=1,#vigorWidgetIDs do
|
||||
local info = C_UIWidgetManager.GetFillUpFramesWidgetVisualizationInfo(vigorWidgetIDs[i])
|
||||
if info and info.shownState ~= 0 then
|
||||
shown = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not shown then
|
||||
self:Show(false)
|
||||
self.suppressHideBlizz = true
|
||||
if self.moduleSettings.hideBlizz then
|
||||
self:ShowBlizz()
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
self:Show(true)
|
||||
|
||||
-- if knowsAlternateMountEnum and UnitPowerMax(self.unit, unitPowerType) > 0 then
|
||||
-- self:Show(true)
|
||||
-- elseif not knowsAlternateMountEnum and IceHUD:HasAnyBuff("player", DragonridingBuffs) then
|
||||
-- self:Show(true)
|
||||
-- else
|
||||
-- self:Show(false)
|
||||
-- if self.moduleSettings.hideBlizz then
|
||||
-- self:ShowBlizz()
|
||||
-- end
|
||||
-- end
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:UpdateRunePower(event, arg1, arg2)
|
||||
self:UpdateVigorRecharge("internal")
|
||||
DragonridingVigor.super.prototype.UpdateRunePower(self, event, arg1, arg2)
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:PopulateVigorWidgetIDs()
|
||||
local widgets = C_UIWidgetManager.GetAllWidgetsBySetID(vigorWidgetSetID)
|
||||
if not widgets then
|
||||
return
|
||||
end
|
||||
|
||||
for i=1,#widgets do
|
||||
if widgets[i].widgetType == vigorWidgetType then
|
||||
if not vigorWidgetIDs then
|
||||
vigorWidgetIDs = {}
|
||||
end
|
||||
|
||||
table.insert(vigorWidgetIDs, widgets[i].widgetID)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:UpdateVigorRecharge(event, widget)
|
||||
if not vigorWidgetIDs or #vigorWidgetIDs == 0 then
|
||||
self:PopulateVigorWidgetIDs()
|
||||
end
|
||||
if not vigorWidgetIDs or #vigorWidgetIDs == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
self.partialReady = nil
|
||||
self.partialReadyPercent = nil
|
||||
if event ~= "internal" and (not widget or widget.widgetSetID ~= vigorWidgetSetID) then
|
||||
return
|
||||
end
|
||||
|
||||
local widgetID = defaultVigorWidgetID
|
||||
if widget then
|
||||
widgetID = widget.widgetID
|
||||
end
|
||||
|
||||
local info = C_UIWidgetManager.GetFillUpFramesWidgetVisualizationInfo(widgetID)
|
||||
if not info then
|
||||
return
|
||||
end
|
||||
|
||||
self.suppressHideBlizz = not info or info.shownState == 0
|
||||
|
||||
if event ~= "internal" then
|
||||
if self.moduleSettings.hideBlizz then
|
||||
self:HideBlizz()
|
||||
else
|
||||
self:ShowBlizz()
|
||||
end
|
||||
end
|
||||
|
||||
if info.numFullFrames == info.numTotalFrames then
|
||||
return
|
||||
end
|
||||
if info.fillMax == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
self.partialReady = IceHUD:Clamp(info.numFullFrames + 1, 0, info.numTotalFrames)
|
||||
self.partialReadyPercent = info.fillValue / info.fillMax
|
||||
if event ~= "internal" then
|
||||
self:UpdateRunePower()
|
||||
end
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:SetupNewRune(rune)
|
||||
self.runeCoords[rune] = {0, 1, 0, 1}
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:GetDefaultSettings()
|
||||
local defaults = DragonridingVigor.super.prototype.GetDefaultSettings(self)
|
||||
|
||||
defaults.pulseWhenFull = false
|
||||
defaults.runeGap = 4
|
||||
defaults.inactiveDisplayMode = "Shown"
|
||||
defaults.hideBlizz = true
|
||||
defaults.vpos = -25
|
||||
|
||||
return defaults
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:GetOptions()
|
||||
local opts = DragonridingVigor.super.prototype.GetOptions(self)
|
||||
|
||||
opts.inactiveDisplayMode.hidden = function() return true end
|
||||
|
||||
return opts
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:GetRuneAtlas(rune)
|
||||
return "dragonriding_vigor_fillfull"
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:GetShineAtlas(rune)
|
||||
return "Mage-ArcaneCharge-SmallSpark"
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:GetFrameAtlas(rune)
|
||||
return "dragonriding_vigor_frame"
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:GetBackgroundAtlas(rune)
|
||||
return "dragonriding_vigor_background"
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:GetPartialRuneAtlas(rune)
|
||||
return "dragonriding_vigor_fill"
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:ShowBlizz()
|
||||
local info = C_UIWidgetManager.GetFillUpFramesWidgetVisualizationInfo(defaultVigorWidgetID)
|
||||
if not info or info.shownState == 0 then
|
||||
return
|
||||
end
|
||||
UIWidgetPowerBarContainerFrame.widgetFrames[defaultVigorWidgetID]:Show()
|
||||
end
|
||||
|
||||
function DragonridingVigor.prototype:HideBlizz()
|
||||
if not UIWidgetPowerBarContainerFrame.widgetFrames or not UIWidgetPowerBarContainerFrame.widgetFrames[defaultVigorWidgetID] then
|
||||
return
|
||||
end
|
||||
|
||||
if not self.suppressHideBlizz then
|
||||
UIWidgetPowerBarContainerFrame.widgetFrames[defaultVigorWidgetID]:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
-- Load us up
|
||||
if unitPowerType and C_UIWidgetManager and C_UIWidgetManager.GetFillUpFramesWidgetVisualizationInfo then
|
||||
IceHUD.DragonridingVigor = DragonridingVigor:new()
|
||||
end
|
123
modules/DruidEnergy.lua
Normal file
@ -0,0 +1,123 @@
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
||||
local DruidEnergy = IceCore_CreateClass(IceUnitBar)
|
||||
|
||||
DruidEnergy.prototype.DruidEnergy = nil
|
||||
DruidEnergy.prototype.DruidEnergyMax = nil
|
||||
|
||||
local _, unitClass = UnitClass("player")
|
||||
|
||||
local FORM_NONE = 0
|
||||
local FORM_BEAR = 1
|
||||
local FORM_TRAVEL = 3
|
||||
|
||||
local SPELL_POWER_ENERGY = SPELL_POWER_ENERGY
|
||||
if Enum and Enum.PowerType then
|
||||
SPELL_POWER_ENERGY = Enum.PowerType.Energy
|
||||
end
|
||||
|
||||
local shapeshiftFormValues = {NONE = L["No form"], BEAR = L["Bear"], TRAVEL = L["Travel"], OTHER = L["Other"]}
|
||||
local shapeshiftFormIds = {NONE = FORM_NONE, BEAR = FORM_BEAR, TRAVEL = FORM_TRAVEL}
|
||||
|
||||
function DruidEnergy.prototype:init()
|
||||
DruidEnergy.super.prototype.init(self, "DruidEnergy", "player")
|
||||
|
||||
self.side = IceCore.Side.Left
|
||||
self.offset = 5
|
||||
|
||||
self:SetDefaultColor("DruidEnergy", 218, 231, 31)
|
||||
end
|
||||
|
||||
function DruidEnergy.prototype:GetDefaultSettings()
|
||||
local settings = DruidEnergy.super.prototype.GetDefaultSettings(self)
|
||||
|
||||
settings["side"] = IceCore.Side.Left
|
||||
settings["offset"] = 5
|
||||
settings["textVisible"] = {upper = true, lower = false}
|
||||
settings["upperText"] = "[PercentMP(type='Energy'):Round]"
|
||||
settings["lowerText"] = "[FractionalMP(type='Energy'):Color('dae71f'):Bracket]"
|
||||
settings.enabled = false
|
||||
settings.whileInForm = {["BEAR"] = true}
|
||||
|
||||
return settings
|
||||
end
|
||||
|
||||
function DruidEnergy.prototype:GetOptions()
|
||||
local opts = DruidEnergy.super.prototype.GetOptions(self)
|
||||
|
||||
opts["whileInForm"] = {
|
||||
type = 'multiselect',
|
||||
values = shapeshiftFormValues,
|
||||
name = L["Show in form"],
|
||||
desc = L["When the player is in one of the chosen shapeshift forms the bar will be shown, otherwise it will be hidden."],
|
||||
get = function(info, v)
|
||||
for key, value in pairs(self.moduleSettings.whileInForm) do
|
||||
if key == v then
|
||||
return value
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end,
|
||||
set = function(info, v, state)
|
||||
self.moduleSettings.whileInForm[v] = state
|
||||
self:Update()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
}
|
||||
|
||||
return opts
|
||||
end
|
||||
|
||||
function DruidEnergy.prototype:Enable(core)
|
||||
DruidEnergy.super.prototype.Enable(self, core)
|
||||
|
||||
self:RegisterEvent("UPDATE_SHAPESHIFT_FORM", "Update")
|
||||
self:RegisterEvent("UNIT_POWER_FREQUENT", "Update")
|
||||
self:RegisterEvent("UNIT_MAXPOWER", "Update")
|
||||
end
|
||||
|
||||
function DruidEnergy.prototype:GetElementDescription()
|
||||
return L["Always shows the Druid's Energy level while in non-energy-using forms."]
|
||||
end
|
||||
|
||||
|
||||
function DruidEnergy.prototype:ShouldShow(unit)
|
||||
local currentForm = GetShapeshiftForm()
|
||||
for k, v in pairs(self.moduleSettings.whileInForm) do
|
||||
if currentForm > FORM_TRAVEL and k == "OTHER" then
|
||||
return v
|
||||
elseif currentForm == shapeshiftFormIds[k] then
|
||||
return v
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function DruidEnergy.prototype:Update()
|
||||
DruidEnergy.super.prototype.Update(self)
|
||||
|
||||
self.DruidEnergy = UnitPower(self.unit, SPELL_POWER_ENERGY)
|
||||
self.DruidEnergyMax = UnitPowerMax(self.unit, SPELL_POWER_ENERGY)
|
||||
self.DruidEnergyPercentage = self.DruidEnergyMax ~= 0 and (self.DruidEnergy/self.DruidEnergyMax) or 0
|
||||
|
||||
if (not self.alive or not self:ShouldShow(self.unit) or not self.DruidEnergy or not self.DruidEnergyMax or self.DruidEnergyMax == 0) then
|
||||
self:Show(false)
|
||||
return
|
||||
else
|
||||
self:Show(true)
|
||||
end
|
||||
|
||||
if not IceHUD.IceCore:ShouldUseDogTags() and self.frame:IsVisible() then
|
||||
self:SetBottomText1(math.floor(self.DruidEnergyPercentage * 100))
|
||||
self:SetBottomText2(self:GetFormattedText(self:Round(self.DruidEnergy), self:Round(self.DruidEnergyMax)), "DruidEnergy")
|
||||
end
|
||||
|
||||
self:UpdateBar(self.DruidEnergyMax ~= 0 and self.DruidEnergy / self.DruidEnergyMax or 0, "DruidEnergy")
|
||||
end
|
||||
|
||||
if unitClass == "DRUID" then
|
||||
IceHUD.DruidEnergy = DruidEnergy:new()
|
||||
end
|
@ -107,7 +107,7 @@ function EclipseBar.prototype:CreateFrame()
|
||||
end
|
||||
|
||||
function EclipseBar.prototype:CreateSolarBar()
|
||||
self.solarBar = self:BarFactory(self.solarBar,"BACKGROUND", "ARTWORK", "Solar")
|
||||
self.solarBar = self:BarFactory(self.solarBar, "BACKGROUND", "ARTWORK", "Solar")
|
||||
self:SetBarCoord(self.solarBar, 0.5, true)
|
||||
|
||||
self.solarBar.bar:SetVertexColor(self:GetColor("EclipseSolar", 1))
|
||||
@ -119,7 +119,7 @@ function EclipseBar.prototype:UpdateShown()
|
||||
|
||||
if form == MOONKIN_FORM or not form then
|
||||
local PrimaryTalentTree = 0
|
||||
if IceHUD.WowVer >= 50000 then
|
||||
if GetSpecialization then
|
||||
PrimaryTalentTree = GetSpecialization()
|
||||
else
|
||||
PrimaryTalentTree = GetPrimaryTalentTree()
|
||||
@ -190,6 +190,6 @@ function EclipseBar.prototype:MyOnUpdate()
|
||||
end
|
||||
|
||||
local _, unitClass = UnitClass("player")
|
||||
if (unitClass == "DRUID" and IceHUD.WowVer >= 40000 and IceHUD.WowVer < 70000) then
|
||||
if (unitClass == "DRUID" and GetEclipseDirection) then
|
||||
IceHUD.EclipseBar = EclipseBar:new()
|
||||
end
|
||||
|
74
modules/EssencePower.lua
Normal file
@ -0,0 +1,74 @@
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
||||
local EssencePower = IceCore_CreateClass(IceClassPowerCounter)
|
||||
|
||||
local SPELL_POWER_ESSENCE = SPELL_POWER_ESSENCE
|
||||
if Enum and Enum.PowerType then
|
||||
SPELL_POWER_ESSENCE = Enum.PowerType.Essence
|
||||
end
|
||||
|
||||
function EssencePower.prototype:init()
|
||||
EssencePower.super.prototype.init(self, "EssencePower")
|
||||
|
||||
self:SetDefaultColor("EssencePowerNumeric", 150, 150, 255)
|
||||
|
||||
self.unit = "player"
|
||||
self.numericColor = "EssencePowerNumeric"
|
||||
self.unitPower = SPELL_POWER_ESSENCE
|
||||
self.minLevel = 0
|
||||
self.bTreatEmptyAsFull = false
|
||||
self.runeWidth = self.runeHeight
|
||||
end
|
||||
|
||||
function EssencePower.prototype:Enable(core)
|
||||
self.numRunes = UnitPowerMax(self.unit, SPELL_POWER_ESSENCE)
|
||||
self.runeCoords = { }
|
||||
for i = 1, self.numRunes do
|
||||
self:SetupNewRune(i)
|
||||
end
|
||||
|
||||
EssencePower.super.prototype.Enable(self, core)
|
||||
end
|
||||
|
||||
function EssencePower.prototype:SetupNewRune(rune)
|
||||
self.runeCoords[rune] = {0, 1, 0, 1}
|
||||
end
|
||||
|
||||
function EssencePower.prototype:GetPowerEvent()
|
||||
return "UNIT_POWER_FREQUENT"
|
||||
end
|
||||
|
||||
function EssencePower.prototype:GetDefaultSettings()
|
||||
local defaults = EssencePower.super.prototype.GetDefaultSettings(self)
|
||||
|
||||
defaults["pulseWhenFull"] = false
|
||||
|
||||
return defaults
|
||||
end
|
||||
|
||||
function EssencePower.prototype:GetOptions()
|
||||
local opts = EssencePower.super.prototype.GetOptions(self)
|
||||
|
||||
opts.hideBlizz.hidden = function() return true end
|
||||
|
||||
return opts
|
||||
end
|
||||
|
||||
function EssencePower.prototype:GetRuneAtlas(rune)
|
||||
return "UF-Essence-Icon"
|
||||
end
|
||||
|
||||
function EssencePower.prototype:GetShineAtlas(rune)
|
||||
return "Mage-ArcaneCharge-SmallSpark"
|
||||
end
|
||||
|
||||
function EssencePower.prototype:ShowBlizz()
|
||||
end
|
||||
|
||||
function EssencePower.prototype:HideBlizz()
|
||||
end
|
||||
|
||||
-- Load us up
|
||||
local _, unitClass = UnitClass("player")
|
||||
if unitClass == "EVOKER" then
|
||||
IceHUD.EssencePower = EssencePower:new()
|
||||
end
|
@ -364,6 +364,8 @@ function FocusHealth.prototype:Update(unit)
|
||||
|
||||
if (self.moduleSettings.scaleHealthColor) then
|
||||
self.color = "ScaledHealthColor"
|
||||
elseif self.moduleSettings.lowThresholdColor and self.healthPercentage <= self.moduleSettings.lowThreshold then
|
||||
self.color = "ScaledHealthColor"
|
||||
end
|
||||
|
||||
if (self.tapped) then
|
||||
@ -420,9 +422,9 @@ end
|
||||
|
||||
function FocusHealth.prototype:UpdateRaidFocusIcon()
|
||||
if self.moduleSettings.raidIconOnTop then
|
||||
self.frame.raidIcon:SetFrameStrata("MEDIUM")
|
||||
self.frame.raidIcon:SetFrameStrata(IceHUD.IceCore:DetermineStrata("MEDIUM"))
|
||||
else
|
||||
self.frame.raidIcon:SetFrameStrata("LOW")
|
||||
self.frame.raidIcon:SetFrameStrata(IceHUD.IceCore:DetermineStrata("LOW"))
|
||||
end
|
||||
|
||||
if not (UnitExists(self.unit)) or not self.moduleSettings.showRaidIcon then
|
||||
|
@ -39,9 +39,9 @@ end
|
||||
function FocusMana.prototype:Enable(core)
|
||||
FocusMana.super.prototype.Enable(self, core)
|
||||
|
||||
if IceHUD.WowVer >= 40000 then
|
||||
if not IceHUD.PerPowerEventsExist then
|
||||
self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateEvent")
|
||||
if IceHUD.WowVer < 80000 then
|
||||
if IceHUD.EventExistsUnitMaxPower then
|
||||
self:RegisterEvent("UNIT_MAXPOWER", "UpdateEvent")
|
||||
end
|
||||
else
|
||||
@ -88,6 +88,8 @@ function FocusMana.prototype:Update(unit)
|
||||
local color = "FocusMana"
|
||||
if (self.moduleSettings.scaleManaColor) then
|
||||
color = "ScaledManaColor"
|
||||
elseif self.moduleSettings.lowThresholdColor and self.manaPercentage <= self.moduleSettings.lowThreshold then
|
||||
color = "ScaledManaColor"
|
||||
end
|
||||
if (manaType == SPELL_POWER_RAGE) then
|
||||
color = "FocusRage"
|
||||
|
@ -1,6 +1,35 @@
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
||||
local GlobalCoolDown = IceCore_CreateClass(IceBarElement)
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(id)
|
||||
if not id then
|
||||
return nil
|
||||
end
|
||||
|
||||
local info = C_Spell.GetSpellInfo(id)
|
||||
if info then
|
||||
return info.name, nil, info.iconID, info.castTime
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellCooldown = GetSpellCooldown
|
||||
if not GetSpellCooldown and C_Spell then
|
||||
GetSpellCooldown = function(spellID)
|
||||
local spellCooldownInfo = C_Spell.GetSpellCooldown(spellID)
|
||||
if spellCooldownInfo then
|
||||
return spellCooldownInfo.startTime, spellCooldownInfo.duration, spellCooldownInfo.isEnabled, spellCooldownInfo.modRate
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Constructor --
|
||||
function GlobalCoolDown.prototype:init()
|
||||
GlobalCoolDown.super.prototype.init(self, "GlobalCoolDown")
|
||||
@ -38,7 +67,7 @@ function GlobalCoolDown.prototype:Enable(core)
|
||||
|
||||
self:Show(false)
|
||||
|
||||
self.frame:SetFrameStrata("LOW")
|
||||
self.frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("LOW"))
|
||||
|
||||
self.CDSpellId = self:GetSpellId()
|
||||
end
|
||||
@ -267,7 +296,7 @@ function GlobalCoolDown.prototype:CreateLagBar()
|
||||
end
|
||||
|
||||
function GlobalCoolDown.prototype:GetSpellId()
|
||||
if GetSpellInfo(61304) then
|
||||
if GetSpellName(61304) then
|
||||
return 61304
|
||||
else
|
||||
local defaultSpells
|
||||
@ -286,6 +315,16 @@ function GlobalCoolDown.prototype:GetSpellId()
|
||||
MONK=100780, -- jab
|
||||
}
|
||||
|
||||
if not GetSpellName(defaultSpells["PALADIN"]) then
|
||||
defaultSpells["PALADIN"] = 635
|
||||
end
|
||||
if not GetSpellName(defaultSpells["MAGE"]) then
|
||||
defaultSpells["MAGE"] = 133
|
||||
end
|
||||
if not GetSpellName(defaultSpells["WARRIOR"]) then
|
||||
defaultSpells["WARRIOR"] = 6673
|
||||
end
|
||||
|
||||
local _, unitClass = UnitClass("player")
|
||||
return defaultSpells[unitClass]
|
||||
end
|
||||
|
@ -2,6 +2,9 @@ local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
||||
local HarmonyPower = IceCore_CreateClass(IceClassPowerCounter)
|
||||
|
||||
local SPELL_POWER_CHI = SPELL_POWER_CHI
|
||||
if not SPELL_POWER_CHI then
|
||||
SPELL_POWER_CHI = SPELL_POWER_LIGHT_FORCE
|
||||
end
|
||||
if Enum and Enum.PowerType then
|
||||
SPELL_POWER_CHI = Enum.PowerType.Chi
|
||||
end
|
||||
@ -23,11 +26,7 @@ function HarmonyPower.prototype:init()
|
||||
}
|
||||
self.numRunes = 4
|
||||
self.numericColor = "ChiNumeric"
|
||||
if IceHUD.WowVer >= 50100 then
|
||||
self.unitPower = SPELL_POWER_CHI
|
||||
else
|
||||
self.unitPower = SPELL_POWER_LIGHT_FORCE
|
||||
end
|
||||
self.unitPower = SPELL_POWER_CHI
|
||||
if IceHUD.WowVer >= 70000 then
|
||||
self.requiredSpec = SPEC_MONK_WINDWALKER
|
||||
end
|
||||
@ -41,6 +40,13 @@ function HarmonyPower.prototype:Enable(core)
|
||||
HarmonyPower.super.prototype.Enable(self, core)
|
||||
|
||||
self:RegisterEvent("UNIT_POWER_FREQUENT", "UpdateRunePower")
|
||||
if IceHUD.EventExistsUnitMaxPower then
|
||||
self:RegisterEvent("UNIT_MAXPOWER", "PlayerChiUpdate")
|
||||
end
|
||||
end
|
||||
|
||||
function HarmonyPower.prototype:PlayerChiUpdate()
|
||||
self:Redraw()
|
||||
end
|
||||
|
||||
function HarmonyPower.prototype:UpdateRunePower(event, arg1, arg2)
|
||||
@ -117,6 +123,6 @@ end
|
||||
|
||||
-- Load us up
|
||||
local _, unitClass = UnitClass("player")
|
||||
if (unitClass == "MONK" and IceHUD.WowVer >= 50000) then
|
||||
if unitClass == "MONK" then
|
||||
IceHUD.HarmonyPower = HarmonyPower:new()
|
||||
end
|
||||
|
@ -38,7 +38,7 @@ function HolyPower.prototype:init()
|
||||
self.bTreatEmptyAsFull = true
|
||||
self.unit = "player"
|
||||
self.numRunes = 5
|
||||
if IceHUD.WowVer >= 50000 then
|
||||
if HOLY_POWER_FULL then
|
||||
self.numConsideredFull = HOLY_POWER_FULL
|
||||
else
|
||||
self.numConsideredFull = 3
|
||||
@ -134,7 +134,7 @@ end
|
||||
|
||||
-- Load us up
|
||||
local _, unitClass = UnitClass("player")
|
||||
if (unitClass == "PALADIN" and IceHUD.WowVer >= 40000) then
|
||||
if (unitClass == "PALADIN" and (PaladinPowerBar or PaladinPowerBarFrame)) then
|
||||
IceHUD.HolyPower = HolyPower:new()
|
||||
end
|
||||
|
||||
|
@ -49,7 +49,7 @@ function PetHealth.prototype:Enable(core)
|
||||
self:RegisterEvent("UNIT_PET", "CheckPet");
|
||||
|
||||
self:RegisterEvent("UNIT_HEALTH", "UpdateEvent")
|
||||
if IceHUD.WowVer < 90000 then
|
||||
if IceHUD.EventExistsUnitHealthFrequent then
|
||||
self:RegisterEvent("UNIT_HEALTH_FREQUENT", "UpdateEvent")
|
||||
end
|
||||
self:RegisterEvent("UNIT_MAXHEALTH", "UpdateEvent")
|
||||
@ -93,6 +93,8 @@ function PetHealth.prototype:Update(unit)
|
||||
|
||||
if (self.moduleSettings.scaleHealthColor) then
|
||||
color = "ScaledHealthColor"
|
||||
elseif self.moduleSettings.lowThresholdColor and self.healthPercentage <= self.moduleSettings.lowThreshold then
|
||||
color = "ScaledHealthColor"
|
||||
end
|
||||
|
||||
if not (self.alive) then
|
||||
|
@ -173,6 +173,8 @@ function PetMana.prototype:Update(unit)
|
||||
local color = "PetMana"
|
||||
if (self.moduleSettings.scaleManaColor) then
|
||||
color = "ScaledManaColor"
|
||||
elseif self.moduleSettings.lowThresholdColor and self.manaPercentage <= self.moduleSettings.lowThreshold then
|
||||
color = "ScaledManaColor"
|
||||
end
|
||||
if not (self.alive) then
|
||||
color = "Dead"
|
||||
|
@ -1,9 +1,9 @@
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
||||
IceHUDPlayerAlternatePower = IceCore_CreateClass(IceUnitBar)
|
||||
local PlayerAlternatePower = IceCore_CreateClass(IceUnitBar)
|
||||
|
||||
-- Constructor --
|
||||
function IceHUDPlayerAlternatePower.prototype:init(moduleName, unit)
|
||||
IceHUDPlayerAlternatePower.super.prototype.init(self, moduleName or "PlayerAlternatePower", "player")
|
||||
function PlayerAlternatePower.prototype:init(moduleName, unit)
|
||||
PlayerAlternatePower.super.prototype.init(self, moduleName or "PlayerAlternatePower", "player")
|
||||
|
||||
self.bTreatEmptyAsFull = true
|
||||
self.power = 0
|
||||
@ -13,8 +13,8 @@ function IceHUDPlayerAlternatePower.prototype:init(moduleName, unit)
|
||||
self.powerName = "MANA"
|
||||
end
|
||||
|
||||
function IceHUDPlayerAlternatePower.prototype:GetDefaultSettings()
|
||||
local settings = IceHUDPlayerAlternatePower.super.prototype.GetDefaultSettings(self)
|
||||
function PlayerAlternatePower.prototype:GetDefaultSettings()
|
||||
local settings = PlayerAlternatePower.super.prototype.GetDefaultSettings(self)
|
||||
|
||||
settings["side"] = IceCore.Side.Left
|
||||
settings["offset"] = -1
|
||||
@ -25,11 +25,11 @@ function IceHUDPlayerAlternatePower.prototype:GetDefaultSettings()
|
||||
return settings
|
||||
end
|
||||
|
||||
function IceHUDPlayerAlternatePower.prototype:Enable(core)
|
||||
IceHUDPlayerAlternatePower.super.prototype.Enable(self, core)
|
||||
function PlayerAlternatePower.prototype:Enable(core)
|
||||
PlayerAlternatePower.super.prototype.Enable(self, core)
|
||||
|
||||
self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateEvent")
|
||||
if IceHUD.WowVer < 80000 then
|
||||
if IceHUD.EventExistsUnitMaxPower then
|
||||
self:RegisterEvent("UNIT_MAXPOWER", "UpdateEvent")
|
||||
end
|
||||
self:RegisterEvent("UNIT_POWER_BAR_SHOW", "PowerBarShow")
|
||||
@ -39,40 +39,50 @@ function IceHUDPlayerAlternatePower.prototype:Enable(core)
|
||||
|
||||
if self.maxPower == 0 then
|
||||
self:Show(false)
|
||||
else
|
||||
self.wantToShow = true
|
||||
end
|
||||
if self.moduleSettings.hideBlizz then
|
||||
self:HideBlizz()
|
||||
end
|
||||
end
|
||||
|
||||
function IceHUDPlayerAlternatePower.prototype:PowerBarShow(event, unit)
|
||||
function PlayerAlternatePower.prototype:PowerBarShow(event, unit)
|
||||
if unit ~= self.unit then
|
||||
return
|
||||
end
|
||||
|
||||
self.wantToShow = true
|
||||
self:Show(true)
|
||||
self:Update(self.unit)
|
||||
end
|
||||
|
||||
function IceHUDPlayerAlternatePower.prototype:PowerBarHide(event, unit)
|
||||
function PlayerAlternatePower.prototype:PowerBarHide(event, unit)
|
||||
if unit ~= self.unit then
|
||||
return
|
||||
end
|
||||
|
||||
self.wantToShow = false
|
||||
self:Show(false)
|
||||
self:Update(self.unit)
|
||||
end
|
||||
|
||||
function IceHUDPlayerAlternatePower.prototype:UpdateEvent(event, unit)
|
||||
function PlayerAlternatePower.prototype:UpdateEvent(event, unit)
|
||||
self:Update(unit)
|
||||
end
|
||||
|
||||
function IceHUDPlayerAlternatePower.prototype:Update(unit)
|
||||
IceHUDPlayerAlternatePower.super.prototype.Update(self)
|
||||
function PlayerAlternatePower.prototype:Update(unit)
|
||||
PlayerAlternatePower.super.prototype.Update(self)
|
||||
if (unit and (unit ~= self.unit)) then
|
||||
return
|
||||
end
|
||||
|
||||
if IceHUD.DragonridingVigor and IceHUD.DragonridingVigor.bIsVisible then
|
||||
self:Show(false)
|
||||
elseif self.wantToShow then
|
||||
self:Show(true)
|
||||
end
|
||||
|
||||
self.maxPower = UnitPowerMax(self.unit, self.powerIndex)
|
||||
self.power = UnitPower(self.unit, self.powerIndex)
|
||||
if self.maxPower > 0 then
|
||||
@ -92,8 +102,8 @@ function IceHUDPlayerAlternatePower.prototype:Update(unit)
|
||||
end
|
||||
end
|
||||
|
||||
function IceHUDPlayerAlternatePower.prototype:GetOptions()
|
||||
local opts = IceHUDPlayerAlternatePower.super.prototype.GetOptions(self)
|
||||
function PlayerAlternatePower.prototype:GetOptions()
|
||||
local opts = PlayerAlternatePower.super.prototype.GetOptions(self)
|
||||
|
||||
opts["lowThresholdColor"] = nil
|
||||
|
||||
@ -121,11 +131,11 @@ function IceHUDPlayerAlternatePower.prototype:GetOptions()
|
||||
return opts
|
||||
end
|
||||
|
||||
function IceHUDPlayerAlternatePower.prototype:ShowBlizz()
|
||||
function PlayerAlternatePower.prototype:ShowBlizz()
|
||||
PlayerPowerBarAlt:GetScript("OnLoad")(PlayerPowerBarAlt)
|
||||
end
|
||||
|
||||
function IceHUDPlayerAlternatePower.prototype:HideBlizz()
|
||||
function PlayerAlternatePower.prototype:HideBlizz()
|
||||
PlayerPowerBarAlt:Hide()
|
||||
|
||||
PlayerPowerBarAlt:UnregisterAllEvents()
|
||||
@ -133,5 +143,5 @@ end
|
||||
|
||||
-- Load us up
|
||||
if ALTERNATE_POWER_INDEX then
|
||||
IceHUD.PlayerAlternatePower = IceHUDPlayerAlternatePower:new()
|
||||
IceHUD.PlayerAlternatePower = PlayerAlternatePower:new()
|
||||
end
|
||||
|
@ -10,6 +10,7 @@ PlayerHealth.prototype.absorbAmount = 0
|
||||
local configMode = false
|
||||
local HealComm
|
||||
local incomingHealAmt = 0
|
||||
local groupEvent = IceHUD.EventExistsGroupRosterUpdate and "GROUP_ROSTER_UPDATE" or "PARTY_MEMBERS_CHANGED"
|
||||
|
||||
-- Constructor --
|
||||
function PlayerHealth.prototype:init()
|
||||
@ -68,7 +69,7 @@ function PlayerHealth.prototype:Enable(core)
|
||||
PlayerHealth.super.prototype.Enable(self, core)
|
||||
|
||||
self:RegisterEvent("UNIT_HEALTH", "UpdateEvent")
|
||||
if IceHUD.WowVer < 90000 then
|
||||
if IceHUD.EventExistsUnitHealthFrequent then
|
||||
self:RegisterEvent("UNIT_HEALTH_FREQUENT", "UpdateEvent")
|
||||
end
|
||||
self:RegisterEvent("UNIT_MAXHEALTH", "UpdateEvent")
|
||||
@ -81,11 +82,7 @@ function PlayerHealth.prototype:Enable(core)
|
||||
self:RegisterEvent("PLAYER_REGEN_DISABLED", "CheckCombat")
|
||||
|
||||
self:RegisterEvent("PARTY_LEADER_CHANGED", "CheckLeader")
|
||||
if IceHUD.EventExistsGroupRosterUpdate then
|
||||
self:RegisterEvent("GROUP_ROSTER_UPDATE", "CheckLeader")
|
||||
else
|
||||
self:RegisterEvent("PARTY_MEMBERS_CHANGED", "CheckLeader")
|
||||
end
|
||||
self:RegisterEvent(groupEvent, "CheckLeader")
|
||||
if GetLFGProposal then
|
||||
self:RegisterEvent("LFG_PROPOSAL_UPDATE", "CheckPartyRole")
|
||||
self:RegisterEvent("LFG_PROPOSAL_FAILED", "CheckPartyRole")
|
||||
@ -105,7 +102,7 @@ function PlayerHealth.prototype:Enable(core)
|
||||
self:RegisterEvent("UNIT_EXITED_VEHICLE", "ExitingVehicle")
|
||||
end
|
||||
|
||||
if IceHUD.WowVer < 40000 then
|
||||
if not IceHUD.SupportsHealPrediction then
|
||||
HealComm = LibStub("LibHealComm-4.0", true)
|
||||
if HealComm then
|
||||
HealComm.RegisterCallback(self, "HealComm_HealStarted", function(event, casterGUID, spellID, spellType, endTime, ...) self:HealComm_HealEvent(event, casterGUID, spellID, spellType, endTime, ...) end)
|
||||
@ -169,7 +166,7 @@ function PlayerHealth.prototype:HealComm_ModifierChanged(event, guid)
|
||||
end
|
||||
|
||||
function PlayerHealth.prototype:IncomingHealPrediction(event, unit)
|
||||
if IceHUD.WowVer >= 40000 then
|
||||
if IceHUD.SupportsHealPrediction then
|
||||
if unit and unit ~= self.unit then
|
||||
return
|
||||
end
|
||||
@ -321,7 +318,7 @@ function PlayerHealth.prototype:GetOptions()
|
||||
self:Update()
|
||||
end,
|
||||
disabled = function()
|
||||
return not (self.moduleSettings.enabled and (IceHUD.WowVer >= 40000 or HealComm))
|
||||
return not (self.moduleSettings.enabled and (IceHUD.SupportsHealPrediction or HealComm))
|
||||
end,
|
||||
order = 43.6
|
||||
}
|
||||
@ -367,7 +364,7 @@ function PlayerHealth.prototype:GetOptions()
|
||||
self:Update()
|
||||
end,
|
||||
disabled = function()
|
||||
return not (self.moduleSettings.enabled and IceHUD.WowVer >= 70000)
|
||||
return not (self.moduleSettings.enabled and UnitGetTotalAbsorbs)
|
||||
end,
|
||||
order = 43.8
|
||||
}
|
||||
@ -925,13 +922,6 @@ function PlayerHealth.prototype:CreateBackground(redraw)
|
||||
end
|
||||
end
|
||||
|
||||
if not self.frame.button.menu then
|
||||
self.frame.button.menu = function(this, unit)
|
||||
IceHUD.DropdownUnit = unit
|
||||
ToggleDropDownMenu(1, nil, IceHUD_UnitFrame_DropDown, "cursor")
|
||||
end
|
||||
end
|
||||
|
||||
self:EnableClickTargeting(self.moduleSettings.allowMouseInteraction)
|
||||
end
|
||||
|
||||
@ -942,7 +932,7 @@ function PlayerHealth.prototype:CreateHealBar()
|
||||
|
||||
self:UpdateBar(1, "undef")
|
||||
|
||||
if not self.moduleSettings.showIncomingHeals or (IceHUD.WowVer < 40000 and not HealComm) then
|
||||
if not self.moduleSettings.showIncomingHeals or (not IceHUD.SupportsHealPrediction and not HealComm) then
|
||||
self.healFrame.bar:Hide()
|
||||
end
|
||||
end
|
||||
@ -954,7 +944,7 @@ function PlayerHealth.prototype:CreateAbsorbBar()
|
||||
|
||||
self:UpdateBar(1, "undef")
|
||||
|
||||
if not self.moduleSettings.showAbsorbs or UnitGetTotalAbsorbs == nil then
|
||||
if not self.moduleSettings.showAbsorbs or not UnitGetTotalAbsorbs then
|
||||
self.absorbFrame.bar:Hide()
|
||||
end
|
||||
end
|
||||
@ -965,7 +955,7 @@ function PlayerHealth.prototype:EnableClickTargeting(bEnable)
|
||||
self.frame.button:EnableMouse(true)
|
||||
self.frame.button:RegisterForClicks("AnyUp")
|
||||
self.frame.button:SetAttribute("type1", "target")
|
||||
self.frame.button:SetAttribute("type2", "menu")
|
||||
self.frame.button:SetAttribute("type2", "togglemenu")
|
||||
self.frame.button:SetAttribute("unit", self.unit)
|
||||
|
||||
-- set up click casting
|
||||
@ -1094,7 +1084,7 @@ function PlayerHealth.prototype:CheckPartyRole()
|
||||
proposalExists, id, typeID, subtypeID, name, texture, role, hasResponded, totalEncounters, completedEncounters, numMembers, isleader = GetLFGProposal()
|
||||
|
||||
local p = self.unit
|
||||
if IceHUD.WowVer < 40000 then
|
||||
if not IceHUD.UnitGroupRolesReturnsRoleString then
|
||||
isTank, isHeal, isDPS = UnitGroupRolesAssigned(p)
|
||||
else
|
||||
local grpRole = UnitGroupRolesAssigned(p)
|
||||
@ -1279,6 +1269,8 @@ function PlayerHealth.prototype:Update(unit)
|
||||
|
||||
if (self.moduleSettings.scaleHealthColor) then
|
||||
color = "ScaledHealthColor"
|
||||
elseif self.moduleSettings.lowThresholdColor and self.healthPercentage <= self.moduleSettings.lowThreshold then
|
||||
color = "ScaledHealthColor"
|
||||
end
|
||||
|
||||
if not (self.alive) then
|
||||
@ -1407,15 +1399,56 @@ end
|
||||
|
||||
|
||||
function PlayerHealth.prototype:ShowBlizz()
|
||||
PlayerFrame:Show()
|
||||
PlayerFrame:GetScript("OnLoad")(PlayerFrame)
|
||||
PlayerFrame:SetParent(self.OriginalPlayerFrameParent or UIParent)
|
||||
end
|
||||
|
||||
|
||||
function PlayerHealth.prototype:HideBlizz()
|
||||
PlayerFrame:Hide()
|
||||
if not self.PlayerFrameParent then
|
||||
self.PlayerFrameParent = CreateFrame("Frame")
|
||||
self.PlayerFrameParent:Hide()
|
||||
end
|
||||
|
||||
PlayerFrame:UnregisterAllEvents()
|
||||
self.OriginalPlayerFrameParent = PlayerFrame:GetParent()
|
||||
PlayerFrame:SetParent(self.PlayerFrameParent)
|
||||
end
|
||||
|
||||
local parents = {}
|
||||
local hide_frame = IceHUD:OutOfCombatWrapper(function(self) self:Hide() end)
|
||||
|
||||
local function hook_frames(...)
|
||||
for i = 1, select("#", ...) do
|
||||
local frame = select(i, ...)
|
||||
frame:UnregisterAllEvents()
|
||||
if not IceHUD:IsHooked(frame, "OnShow") then
|
||||
IceHUD:SecureHookScript(frame, "OnShow", hide_frame)
|
||||
end
|
||||
frame:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
local function unhook_frame(frame)
|
||||
if IceHUD:IsHooked(frame, "OnShow") then
|
||||
IceHUD:Unhook(frame, "OnShow")
|
||||
local parent = parents[frame]
|
||||
if parent then
|
||||
frame:SetParent(parent)
|
||||
end
|
||||
elseif IceHUD:IsHooked(frame, "Show") then
|
||||
IceHUD:Unhook(frame, "Show")
|
||||
IceHUD:Unhook(frame, "SetPoint")
|
||||
end
|
||||
end
|
||||
|
||||
local function unhook_frames(...)
|
||||
for i = 1, select("#", ...) do
|
||||
local frame = select(i, ...)
|
||||
unhook_frame(frame)
|
||||
local handler = frame:GetScript("OnLoad")
|
||||
if handler then
|
||||
handler(frame)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function PlayerHealth.prototype:HideBlizzardParty()
|
||||
@ -1424,37 +1457,34 @@ function PlayerHealth.prototype:HideBlizzardParty()
|
||||
return
|
||||
end
|
||||
|
||||
-- Both Pitbull 4 and Xperl use these exact code, so we use it too.
|
||||
for i = 1, MAX_PARTY_MEMBERS do
|
||||
local party = _G['PartyMemberFrame'..i]
|
||||
party:UnregisterAllEvents()
|
||||
party:Hide()
|
||||
party.Show = function() end
|
||||
if PartyFrame then
|
||||
PartyFrame:Hide()
|
||||
PartyFrame:UnregisterEvent(groupEvent)
|
||||
else
|
||||
for i = 1, MAX_PARTY_MEMBERS do
|
||||
local frame = _G["PartyMemberFrame" .. i]
|
||||
frame:SetAttribute("statehidden", true)
|
||||
hook_frames(frame)
|
||||
end
|
||||
UIParent:UnregisterEvent(groupEvent)
|
||||
end
|
||||
|
||||
UIParent:UnregisterEvent('RAID_ROSTER_UPDATE')
|
||||
|
||||
end
|
||||
|
||||
|
||||
function PlayerHealth.prototype:ShowBlizzardParty()
|
||||
-- Both Pitbull 4 and Xperl use these exact code, so we use it too.
|
||||
for i = 1, MAX_PARTY_MEMBERS do
|
||||
local frame = _G["PartyMemberFrame"..i]
|
||||
if frame then
|
||||
frame.Show = nil
|
||||
frame:GetScript("OnLoad")(frame)
|
||||
if IceHUD.WowVer >= 50000 then
|
||||
frame:GetScript("OnEvent")(frame, "GROUP_ROSTER_UPDATE")
|
||||
else
|
||||
frame:GetScript("OnEvent")(frame, "PARTY_MEMBERS_CHANGED")
|
||||
end
|
||||
|
||||
PartyMemberFrame_UpdateMember(frame)
|
||||
if PartyFrame then
|
||||
PartyFrame:Show()
|
||||
PartyFrame:Layout()
|
||||
PartyFrame:RegisterEvent(groupEvent)
|
||||
else
|
||||
for i = 1, MAX_PARTY_MEMBERS do
|
||||
local frame = _G["PartyMemberFrame" .. i]
|
||||
frame:SetAttribute("statehidden", nil)
|
||||
unhook_frames(frame)
|
||||
frame:GetScript("OnEvent")(frame, groupEvent)
|
||||
end
|
||||
UIParent:RegisterEvent(groupEvent)
|
||||
end
|
||||
|
||||
UIParent:RegisterEvent("RAID_ROSTER_UPDATE")
|
||||
end
|
||||
|
||||
--function PlayerHealth.prototype:ShowBlizzParty()
|
||||
|
@ -115,15 +115,33 @@ end
|
||||
|
||||
function PlayerInfo.prototype:ShowBlizz()
|
||||
BuffFrame:Show()
|
||||
TemporaryEnchantFrame:Show()
|
||||
if DebuffFrame then
|
||||
DebuffFrame:Show()
|
||||
DebuffFrame:GetScript("OnLoad")(DebuffFrame)
|
||||
if DebuffFrame.Update then
|
||||
DebuffFrame:Update()
|
||||
end
|
||||
end
|
||||
if TemporaryEnchantFrame then
|
||||
TemporaryEnchantFrame:Show()
|
||||
end
|
||||
|
||||
BuffFrame:GetScript("OnLoad")(BuffFrame)
|
||||
if BuffFrame.Update then
|
||||
BuffFrame:Update()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function PlayerInfo.prototype:HideBlizz()
|
||||
BuffFrame:Hide()
|
||||
TemporaryEnchantFrame:Hide()
|
||||
if DebuffFrame then
|
||||
DebuffFrame:Hide()
|
||||
DebuffFrame:UnregisterAllEvents()
|
||||
end
|
||||
if TemporaryEnchantFrame then
|
||||
TemporaryEnchantFrame:Hide()
|
||||
end
|
||||
|
||||
BuffFrame:UnregisterAllEvents()
|
||||
end
|
||||
|
@ -203,7 +203,7 @@ function PlayerMana.prototype:CheckVehicle()
|
||||
end
|
||||
|
||||
function PlayerMana.prototype:ShouldUseTicker()
|
||||
return IceHUD.WowVer < 30000 or (IceHUD.WowVer < 70100 and not GetCVarBool("predictedPower"))
|
||||
return IceHUD.WowVer < 30000 or (IceHUD.WowVer < 70100 and not GetCVarBool("predictedPower") and not IceHUD.WowClassicWrath)
|
||||
end
|
||||
|
||||
function PlayerMana.prototype:SetupOnUpdate(enable)
|
||||
@ -280,7 +280,7 @@ function PlayerMana.prototype:ManaType(event, unit)
|
||||
|
||||
if self:ShouldUseTicker() then
|
||||
-- register ticker for rogue energy
|
||||
if (self.moduleSettings.tickerEnabled and (self.manaType == SPELL_POWER_ENERGY) and self.alive) then
|
||||
if self.moduleSettings.tickerEnabled and self.manaType == SPELL_POWER_ENERGY then
|
||||
self.tickerFrame:Show()
|
||||
self.tickerFrame:SetScript("OnUpdate", function() self:EnergyTick() end)
|
||||
else
|
||||
@ -344,6 +344,8 @@ function PlayerMana.prototype:Update(unit, powertype)
|
||||
color = "Dead"
|
||||
elseif (self.moduleSettings.scaleManaColor and (UnitPowerType(self.unit) == SPELL_POWER_MANA or self.moduleSettings.scaleManaColorForAll)) then
|
||||
color = "ScaledManaColor"
|
||||
elseif self.moduleSettings.lowThresholdColor and self.manaPercentage <= self.moduleSettings.lowThreshold then
|
||||
color = "ScaledManaColor"
|
||||
else
|
||||
if (self.manaType == SPELL_POWER_RAGE) then
|
||||
color = "PlayerRage"
|
||||
@ -353,13 +355,13 @@ function PlayerMana.prototype:Update(unit, powertype)
|
||||
color = "PlayerRunicPower"
|
||||
elseif (self.manaType == SPELL_POWER_FOCUS) then
|
||||
color = "PlayerFocus"
|
||||
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_INSANITY) then
|
||||
elseif (self.manaType == SPELL_POWER_INSANITY) then
|
||||
color = "PlayerInsanity"
|
||||
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_FURY) then
|
||||
elseif (self.manaType == SPELL_POWER_FURY) then
|
||||
color = "PlayerFury"
|
||||
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_MAELSTROM) then
|
||||
elseif (self.manaType == SPELL_POWER_MAELSTROM) then
|
||||
color = "PlayerMaelstrom"
|
||||
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_PAIN) then
|
||||
elseif (self.manaType == SPELL_POWER_PAIN) then
|
||||
color = "PlayerPain"
|
||||
end
|
||||
end
|
||||
@ -438,7 +440,7 @@ function PlayerMana.prototype:EnergyTick()
|
||||
return
|
||||
end
|
||||
|
||||
if not (self.tickStart) then
|
||||
if not self.tickStart or not self.alive then
|
||||
self.tickerFrame:Hide()
|
||||
return
|
||||
end
|
||||
@ -473,7 +475,7 @@ function PlayerMana.prototype:CreateTickerFrame()
|
||||
self.tickerFrame = CreateFrame("Frame", nil, self.barFrame)
|
||||
end
|
||||
|
||||
self.tickerFrame:SetFrameStrata("BACKGROUND")
|
||||
self.tickerFrame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.tickerFrame:SetWidth(self.settings.barWidth)
|
||||
self.tickerFrame:SetHeight(self.settings.barHeight)
|
||||
|
||||
|
@ -11,7 +11,7 @@ function RangeCheck.prototype:init()
|
||||
|
||||
self.scalingEnabled = true
|
||||
|
||||
LibRange = LibStub("LibRangeCheck-2.0", true)
|
||||
LibRange = LibStub("LibRangeCheck-3.0", true)
|
||||
end
|
||||
|
||||
function RangeCheck.prototype:Enable(core)
|
||||
@ -126,7 +126,7 @@ function RangeCheck.prototype:CreateFrame(redraw)
|
||||
end
|
||||
|
||||
self.frame:SetScale(self.moduleSettings.scale)
|
||||
self.frame:SetFrameStrata("BACKGROUND")
|
||||
self.frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame:SetWidth(200)
|
||||
self.frame:SetHeight(32)
|
||||
self.frame:ClearAllPoints()
|
||||
|
@ -4,6 +4,25 @@ local Resolve = IceCore_CreateClass(IceUnitBar)
|
||||
local RESOLVE_SPELL_ID = 158300
|
||||
local RESOLVE_MAX = 240
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(spellID)
|
||||
if not spellID then
|
||||
return nil
|
||||
end
|
||||
|
||||
local spellInfo = C_Spell.GetSpellInfo(spellID)
|
||||
if spellInfo then
|
||||
return spellInfo.name, nil, spellInfo.iconID, spellInfo.castTime, spellInfo.minRange, spellInfo.maxRange, spellInfo.spellID, spellInfo.originalIconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
Resolve.prototype.current = nil
|
||||
Resolve.prototype.max = RESOLVE_MAX
|
||||
|
||||
@ -49,14 +68,19 @@ end
|
||||
|
||||
-- scan the tooltip and extract the Resolve value
|
||||
do
|
||||
local spellName = GetSpellInfo(RESOLVE_SPELL_ID)
|
||||
local spellName = GetSpellName(RESOLVE_SPELL_ID)
|
||||
|
||||
function Resolve.prototype:UpdateCurrent(event, unit)
|
||||
if (unit and (unit ~= self.unit)) then
|
||||
return
|
||||
end
|
||||
|
||||
self.current = select(IceHUD.SpellFunctionsReturnRank and 15 or 14, UnitAura(self.unit, spellName)) or 0
|
||||
if UnitAura then
|
||||
self.current = select(IceHUD.SpellFunctionsReturnRank and 15 or 14, UnitAura(self.unit, spellName)) or 0
|
||||
else
|
||||
local auraInfo = C_UnitAuras.GetAuraDataBySpellName(self.unit, spellName)
|
||||
self.current = auraInfo and auraInfo.timeMod or 0
|
||||
end
|
||||
|
||||
self:Update()
|
||||
end
|
||||
@ -79,7 +103,7 @@ end
|
||||
|
||||
-- Load for tanks only
|
||||
local _, unitClass = UnitClass("player")
|
||||
if ((unitClass == "DEATHKNIGHT" or unitClass == "DRUID" or unitClass == "PALADIN" or unitClass == "WARRIOR" or unitClass == "MONK")
|
||||
and IceHUD.WowVer >= 60000 and IceHUD.WowVer < 70000) then
|
||||
if (unitClass == "DEATHKNIGHT" or unitClass == "DRUID" or unitClass == "PALADIN" or unitClass == "WARRIOR" or unitClass == "MONK")
|
||||
and GetSpellName(RESOLVE_SPELL_ID) then
|
||||
IceHUD.Resolve = Resolve:new()
|
||||
end
|
||||
|
@ -26,6 +26,37 @@ if Enum and Enum.PowerType then
|
||||
SPELL_POWER_COMBO_POINTS = Enum.PowerType.ComboPoints
|
||||
end
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(spellID)
|
||||
if not spellID then
|
||||
return nil
|
||||
end
|
||||
|
||||
local spellInfo = C_Spell.GetSpellInfo(spellID)
|
||||
if spellInfo then
|
||||
return spellInfo.name, nil, spellInfo.iconID, spellInfo.castTime, spellInfo.minRange, spellInfo.maxRange, spellInfo.spellID, spellInfo.originalIconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
local UnitBuff = UnitBuff
|
||||
if not UnitBuff and C_UnitAuras and AuraUtil then
|
||||
UnitBuff = function(unitToken, index, filter)
|
||||
local auraData = C_UnitAuras.GetBuffDataByIndex(unitToken, index, filter)
|
||||
if not auraData then
|
||||
return nil
|
||||
end
|
||||
|
||||
return AuraUtil.UnpackAuraData(auraData)
|
||||
end
|
||||
end
|
||||
|
||||
-- Constructor --
|
||||
function RollTheBones.prototype:init()
|
||||
RollTheBones.super.prototype.init(self, "RollTheBones", "player")
|
||||
@ -235,7 +266,7 @@ end
|
||||
function RollTheBones.prototype:GetBuffDuration(unitName, ids)
|
||||
local i = 1
|
||||
local buff, _, type, duration, endTime, spellId
|
||||
if IceHUD.WowVer < 80000 then
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
buff, _, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
|
||||
else
|
||||
buff, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
|
||||
@ -256,7 +287,7 @@ function RollTheBones.prototype:GetBuffDuration(unitName, ids)
|
||||
|
||||
i = i + 1;
|
||||
|
||||
if IceHUD.WowVer < 80000 then
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
buff, _, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
|
||||
else
|
||||
buff, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
|
||||
@ -274,7 +305,7 @@ end
|
||||
function RollTheBones.prototype:MyOnUpdate()
|
||||
RollTheBones.super.prototype.MyOnUpdate(self)
|
||||
if self.bUpdateRtb then
|
||||
self:UpdateRollTheBones(nil, self.unit, true)
|
||||
self:UpdateRollTheBones("internal", self.unit)
|
||||
end
|
||||
if self.target or self.moduleSettings.bShowWithNoTarget then
|
||||
self:UpdateDurationBar()
|
||||
@ -288,21 +319,22 @@ end
|
||||
-- use this to figure out if Roll the Bones is available or not. neither IsSpellKnown nor IsPlayerSpell are correct for it
|
||||
-- when SnD is known, but this is.
|
||||
local function HasSpell(id)
|
||||
local spell = GetSpellInfo(id)
|
||||
return spell == GetSpellInfo(spell)
|
||||
local spell = GetSpellName(id)
|
||||
return spell == GetSpellName(spell)
|
||||
end
|
||||
|
||||
local function ShouldHide()
|
||||
return not HasSpell(193316)
|
||||
end
|
||||
|
||||
function RollTheBones.prototype:UpdateRollTheBones(event, unit, fromUpdate)
|
||||
function RollTheBones.prototype:UpdateRollTheBones(event, unit)
|
||||
if unit and unit ~= self.unit then
|
||||
return
|
||||
end
|
||||
|
||||
local now = GetTime()
|
||||
local remaining = nil
|
||||
local fromUpdate = event == "internal"
|
||||
|
||||
if not fromUpdate then
|
||||
rtbDuration, remaining, rtbCount = self:GetBuffDuration(self.unit, RtBSet)
|
||||
@ -376,14 +408,18 @@ function RollTheBones.prototype:UpdateDurationBar(event, unit)
|
||||
end
|
||||
|
||||
local points = RTBGetComboPoints(self.unit)
|
||||
-- check for Deeper Stratagem
|
||||
local _, _, _, DeeperStratagem = GetTalentInfoByID(sixComboPointsTalentID, GetActiveSpecGroup())
|
||||
|
||||
if DeeperStratagem then
|
||||
-- first, set the cached upper limit of RtB duration
|
||||
CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints + 1)
|
||||
if UnitPowerMax then
|
||||
CurrMaxRtBDuration = self:GetMaxBuffTime(UnitPowerMax(self.unit, SPELL_POWER_COMBO_POINTS))
|
||||
else
|
||||
CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints)
|
||||
-- check for Deeper Stratagem
|
||||
local _, _, _, DeeperStratagem = GetTalentInfoByID(sixComboPointsTalentID, GetActiveSpecGroup())
|
||||
|
||||
if DeeperStratagem then
|
||||
-- first, set the cached upper limit of RtB duration
|
||||
CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints + 1)
|
||||
else
|
||||
CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints)
|
||||
end
|
||||
end
|
||||
|
||||
if event then
|
||||
@ -441,7 +477,11 @@ function RollTheBones.prototype:GetItemIdFromItemLink(linkStr)
|
||||
local _
|
||||
|
||||
if linkStr then
|
||||
_, itemId, _, _, _, _, _, _, _ = strsplit(":", linkStr)
|
||||
_, itemId, itemId2, _, _, _, _, _, _ = strsplit(":", linkStr)
|
||||
end
|
||||
|
||||
if not tonumber(itemId) then
|
||||
itemId = itemId2
|
||||
end
|
||||
|
||||
return itemId or 0
|
||||
|
@ -3,21 +3,23 @@ local Runes = IceCore_CreateClass(IceElement)
|
||||
|
||||
local IceHUD = _G.IceHUD
|
||||
|
||||
local RunesReturnedByMaxPower = IceHUD.WowVer >= 70000
|
||||
|
||||
local CooldownFrame_SetTimer = CooldownFrame_SetTimer
|
||||
if CooldownFrame_Set then
|
||||
CooldownFrame_SetTimer = CooldownFrame_Set
|
||||
end
|
||||
|
||||
local RUNETYPE_BLOOD = 1;
|
||||
local RUNETYPE_DEATH = IceHUD.WowVer < 70300 and 2 or 3;
|
||||
local RUNETYPE_FROST = IceHUD.WowVer < 70300 and 3 or 2;
|
||||
local RUNETYPE_DEATH = IceHUD.DeathKnightUnholyFrostRunesSwapped and 2 or 3;
|
||||
local RUNETYPE_FROST = IceHUD.DeathKnightUnholyFrostRunesSwapped and 3 or 2;
|
||||
local RUNETYPE_CHROMATIC = 4;
|
||||
local RUNETYPE_LEGION = 5; -- not real, but makes for an easy update
|
||||
|
||||
local GetRuneType = GetRuneType
|
||||
if IceHUD.WowVer >= 70000 and IceHUD.WowVer < 70300 then
|
||||
GetRuneType = function() return RUNETYPE_LEGION end
|
||||
elseif IceHUD.WowVer >= 70300 then
|
||||
elseif IceHUD.WowVer >= 70300 and GetSpecialization then
|
||||
GetRuneType = function() return GetSpecialization() end
|
||||
end
|
||||
|
||||
@ -132,6 +134,9 @@ function Runes.prototype:GetOptions()
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
hidden = function()
|
||||
return not PlayerFrame_HideVehicleTexture
|
||||
end,
|
||||
order = 32
|
||||
}
|
||||
|
||||
@ -265,7 +270,7 @@ end
|
||||
|
||||
-- OVERRIDE
|
||||
function Runes.prototype:Enable(core)
|
||||
if IceHUD.WowVer >= 70000 then
|
||||
if RunesReturnedByMaxPower then
|
||||
self.numRunes = UnitPowerMax("player", SPELL_POWER_RUNES)
|
||||
end
|
||||
|
||||
@ -283,7 +288,9 @@ function Runes.prototype:Enable(core)
|
||||
self:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED", "UpdateRuneColors")
|
||||
end
|
||||
self:RegisterEvent("PLAYER_ENTERING_WORLD", "EnteringWorld")
|
||||
self:RegisterEvent("UNIT_MAXPOWER", "CheckMaxNumRunes")
|
||||
if RunesReturnedByMaxPower then
|
||||
self:RegisterEvent("UNIT_MAXPOWER", "CheckMaxNumRunes")
|
||||
end
|
||||
|
||||
if (self.moduleSettings.hideBlizz) then
|
||||
self:HideBlizz()
|
||||
@ -449,7 +456,7 @@ end
|
||||
function Runes.prototype:CreateFrame()
|
||||
Runes.super.prototype.CreateFrame(self)
|
||||
|
||||
self.frame:SetFrameStrata("BACKGROUND")
|
||||
self.frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame:SetWidth(self.runeSize*self.numRunes)
|
||||
self.frame:SetHeight(1)
|
||||
self.frame:ClearAllPoints()
|
||||
@ -503,13 +510,13 @@ function Runes.prototype:CreateRune(i, type, name)
|
||||
-- create runes
|
||||
if (not self.frame.graphical[i]) then
|
||||
self.frame.graphical[i] = CreateFrame("Frame", nil, self.frame)
|
||||
self.frame.graphical[i].rune = self.frame.graphical[i]:CreateTexture(nil, "LOW")
|
||||
self.frame.graphical[i].rune = self.frame.graphical[i]:CreateTexture(nil, "BACKGROUND")
|
||||
self.frame.graphical[i].rune:SetAllPoints(self.frame.graphical[i])
|
||||
self.frame.graphical[i].cd = CreateFrame("Cooldown", nil, self.frame.graphical[i], "CooldownFrameTemplate")
|
||||
self.frame.graphical[i].shine = self.frame.graphical[i]:CreateTexture(nil, "OVERLAY")
|
||||
end
|
||||
|
||||
self.frame.graphical[i]:SetFrameStrata("BACKGROUND")
|
||||
self.frame.graphical[i]:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame.graphical[i]:SetWidth(self.runeSize)
|
||||
self.frame.graphical[i]:SetHeight(self.runeSize)
|
||||
|
||||
@ -539,7 +546,7 @@ function Runes.prototype:CreateRune(i, type, name)
|
||||
self.frame.graphical[i]:Hide()
|
||||
end
|
||||
|
||||
self.frame.graphical[i].cd:SetFrameStrata("BACKGROUND")
|
||||
self.frame.graphical[i].cd:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame.graphical[i].cd:SetFrameLevel(self.frame.graphical[i]:GetFrameLevel()+1)
|
||||
self.frame.graphical[i].cd:ClearAllPoints()
|
||||
self.frame.graphical[i].cd:SetAllPoints(self.frame.graphical[i])
|
||||
@ -577,6 +584,10 @@ local function hook_playerframe()
|
||||
end
|
||||
|
||||
function Runes.prototype:HideBlizz()
|
||||
if not PlayerFrame_HideVehicleTexture then
|
||||
return
|
||||
end
|
||||
|
||||
RuneFrame:Hide()
|
||||
RuneFrame:UnregisterAllEvents()
|
||||
|
||||
|
@ -131,7 +131,7 @@ function ShardCounter.prototype:UpdatePowerType(event)
|
||||
|
||||
self.shouldShowUnmodified = false
|
||||
self.requiredSpec = CurrentSpec
|
||||
self.currentGrowMode = nil
|
||||
self.currentGrowMode = self.growModes["height"]
|
||||
|
||||
if CurrentSpec == SPEC_WARLOCK_AFFLICTION then
|
||||
self.runeCoords = AfflictionCoords
|
||||
@ -276,6 +276,6 @@ end
|
||||
|
||||
-- Load us up
|
||||
local _, unitClass = UnitClass("player")
|
||||
if (unitClass == "WARLOCK" and IceHUD.WowVer >= 40000) then
|
||||
if (unitClass == "WARLOCK" and WarlockPowerFrame) then
|
||||
IceHUD.ShardCounter = ShardCounter:new()
|
||||
end
|
||||
|
@ -42,6 +42,10 @@ elseif IceHUD.WowClassicBC then
|
||||
impSndBonusPerRank = 0.15
|
||||
impSndTalentPage = 2
|
||||
impSndTalentIdx = 4
|
||||
elseif IceHUD.WowClassicWrath then
|
||||
impSndBonusPerRank = 0.25
|
||||
impSndTalentPage = 2
|
||||
impSndTalentIdx = 23
|
||||
end
|
||||
|
||||
local SPELL_POWER_COMBO_POINTS = SPELL_POWER_COMBO_POINTS
|
||||
@ -49,6 +53,18 @@ if Enum and Enum.PowerType then
|
||||
SPELL_POWER_COMBO_POINTS = Enum.PowerType.ComboPoints
|
||||
end
|
||||
|
||||
local UnitBuff = UnitBuff
|
||||
if not UnitBuff and C_UnitAuras and AuraUtil then
|
||||
UnitBuff = function(unitToken, index, filter)
|
||||
local auraData = C_UnitAuras.GetBuffDataByIndex(unitToken, index, filter)
|
||||
if not auraData then
|
||||
return nil
|
||||
end
|
||||
|
||||
return AuraUtil.UnpackAuraData(auraData)
|
||||
end
|
||||
end
|
||||
|
||||
-- Constructor --
|
||||
function SliceAndDice.prototype:init()
|
||||
SliceAndDice.super.prototype.init(self, "SliceAndDice", "player")
|
||||
@ -81,6 +97,10 @@ function SliceAndDice.prototype:Enable(core)
|
||||
self:CheckMaxComboPoints()
|
||||
end
|
||||
|
||||
if IceHUD.EventExistsUnitMaxPower then
|
||||
self:RegisterEvent("UNIT_MAXPOWER", "CheckMaxComboPoints")
|
||||
end
|
||||
|
||||
if not self.moduleSettings.alwaysFullAlpha then
|
||||
self:Show(false)
|
||||
else
|
||||
@ -91,8 +111,12 @@ function SliceAndDice.prototype:Enable(core)
|
||||
end
|
||||
|
||||
function SliceAndDice.prototype:CheckMaxComboPoints()
|
||||
local talentID, name, texture, selected, available, spellID, unknown, row, column, known, grantedByAura = GetTalentInfoByID(sixComboPointsTalentID, GetActiveSpecGroup())
|
||||
maxComboPoints = selected and 6 or 5
|
||||
if UnitPowerMax then
|
||||
maxComboPoints = UnitPowerMax(self.unit, SPELL_POWER_COMBO_POINTS)
|
||||
else
|
||||
local talentID, name, texture, selected, available, spellID, unknown, row, column, known, grantedByAura = GetTalentInfoByID(sixComboPointsTalentID, GetActiveSpecGroup())
|
||||
maxComboPoints = selected and 6 or 5
|
||||
end
|
||||
end
|
||||
|
||||
function SliceAndDice.prototype:Disable(core)
|
||||
@ -202,7 +226,7 @@ function SliceAndDice.prototype:CreateFrame()
|
||||
end
|
||||
|
||||
function SliceAndDice.prototype:CreateDurationBar()
|
||||
self.durationFrame = self:BarFactory(self.durationFrame, "BACKGROUND","ARTWORK", "Duration")
|
||||
self.durationFrame = self:BarFactory(self.durationFrame, "BACKGROUND", "ARTWORK", "Duration")
|
||||
|
||||
-- Rokiyo: Do we need to call this here?
|
||||
self.CurrScale = 0
|
||||
@ -265,7 +289,7 @@ end
|
||||
function SliceAndDice.prototype:MyOnUpdate()
|
||||
SliceAndDice.super.prototype.MyOnUpdate(self)
|
||||
if self.bUpdateSnd then
|
||||
self:UpdateSliceAndDice(nil, self.unit, true)
|
||||
self:UpdateSliceAndDice("internal", self.unit)
|
||||
end
|
||||
if self.target or self.moduleSettings.bShowWithNoTarget then
|
||||
self:UpdateDurationBar()
|
||||
@ -282,15 +306,8 @@ local function SNDGetComboPoints(unit)
|
||||
end
|
||||
end
|
||||
|
||||
-- use this to figure out if Roll the Bones is available or not. neither IsSpellKnown nor IsPlayerSpell are correct for it
|
||||
-- when SnD is known, but this is.
|
||||
local function HasSpell(id)
|
||||
local spell = GetSpellInfo(id)
|
||||
return spell == GetSpellInfo(spell)
|
||||
end
|
||||
|
||||
local function ShouldHide()
|
||||
if IceHUD.WowVer >= 90000 or IceHUD.WowClassicBC then
|
||||
if IceHUD.WowVer >= 90000 or IceHUD.WowClassicBC or IceHUD.WowClassicWrath then
|
||||
return false
|
||||
end
|
||||
|
||||
@ -300,13 +317,14 @@ local function ShouldHide()
|
||||
-- with different durations
|
||||
end
|
||||
|
||||
function SliceAndDice.prototype:UpdateSliceAndDice(event, unit, fromUpdate)
|
||||
function SliceAndDice.prototype:UpdateSliceAndDice(event, unit)
|
||||
if unit and unit ~= self.unit then
|
||||
return
|
||||
end
|
||||
|
||||
local now = GetTime()
|
||||
local remaining = nil
|
||||
local fromUpdate = event == "internal"
|
||||
|
||||
if not fromUpdate or IceHUD.WowVer < 30000 then
|
||||
sndDuration, remaining = self:GetBuffDuration(self.unit, sndBuffName)
|
||||
@ -411,13 +429,11 @@ function SliceAndDice.prototype:UpdateDurationBar(event, unit)
|
||||
end
|
||||
|
||||
function SliceAndDice.prototype:GetMaxBuffTime(numComboPoints)
|
||||
local maxduration
|
||||
|
||||
if numComboPoints == 0 then
|
||||
return 0
|
||||
end
|
||||
|
||||
maxduration = baseTime + ((numComboPoints - 1) * gapPerComboPoint)
|
||||
local maxduration = baseTime + ((numComboPoints - 1) * gapPerComboPoint)
|
||||
|
||||
if self:HasNetherbladeBonus() then
|
||||
maxduration = maxduration + netherbladeBonus
|
||||
@ -516,7 +532,11 @@ function SliceAndDice.prototype:GetItemIdFromItemLink(linkStr)
|
||||
local _
|
||||
|
||||
if linkStr then
|
||||
_, itemId, _, _, _, _, _, _, _ = strsplit(":", linkStr)
|
||||
_, itemId, itemId2, _, _, _, _, _, _ = strsplit(":", linkStr)
|
||||
end
|
||||
|
||||
if not tonumber(itemId) then
|
||||
itemId = itemId2
|
||||
end
|
||||
|
||||
return itemId or 0
|
||||
|
@ -17,6 +17,43 @@ local staggerIds = {LightID, ModerateID, HeavyID}
|
||||
|
||||
local MinLevel = 10
|
||||
|
||||
local STAGGER_YELLOW_TRANSITION, STAGGER_RED_TRANSITION = STAGGER_YELLOW_TRANSITION, STAGGER_RED_TRANSITION
|
||||
if STAGGER_STATES then
|
||||
STAGGER_YELLOW_TRANSITION = STAGGER_STATES.YELLOW.threshold
|
||||
STAGGER_RED_TRANSITION = STAGGER_STATES.RED.threshold
|
||||
end
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(spellID)
|
||||
if not spellID then
|
||||
return nil
|
||||
end
|
||||
|
||||
local spellInfo = C_Spell.GetSpellInfo(spellID)
|
||||
if spellInfo then
|
||||
return spellInfo.name, nil, spellInfo.iconID, spellInfo.castTime, spellInfo.minRange, spellInfo.maxRange, spellInfo.spellID, spellInfo.originalIconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
local UnitDebuff = UnitDebuff
|
||||
if not UnitDebuff and C_UnitAuras and AuraUtil then
|
||||
UnitDebuff = function(unitToken, index, filter)
|
||||
local auraData = C_UnitAuras.GetDebuffDataByIndex(unitToken, index, filter)
|
||||
if not auraData then
|
||||
return nil
|
||||
end
|
||||
|
||||
return AuraUtil.UnpackAuraData(auraData)
|
||||
end
|
||||
end
|
||||
|
||||
StaggerBar.prototype.StaggerDuration = 0
|
||||
StaggerBar.prototype.StaggerEndTime = 0
|
||||
|
||||
@ -113,9 +150,9 @@ function StaggerBar.prototype:Enable(core)
|
||||
StaggerBar.super.prototype.Enable(self, core)
|
||||
|
||||
playerName = UnitName(self.unit)
|
||||
staggerNames[1] = GetSpellInfo(LightID)
|
||||
staggerNames[2] = GetSpellInfo(ModerateID)
|
||||
staggerNames[3] = GetSpellInfo(HeavyID)
|
||||
staggerNames[1] = GetSpellName(LightID)
|
||||
staggerNames[2] = GetSpellName(ModerateID)
|
||||
staggerNames[3] = GetSpellName(HeavyID)
|
||||
|
||||
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
|
||||
self:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||
@ -137,7 +174,7 @@ function StaggerBar.prototype:CreateFrame()
|
||||
end
|
||||
|
||||
function StaggerBar.prototype:CreateTimerBar()
|
||||
self.timerFrame = self:BarFactory(self.timerFrame, "MEDIUM","ARTWORK", "Timer")
|
||||
self.timerFrame = self:BarFactory(self.timerFrame, "MEDIUM", "ARTWORK", "Timer")
|
||||
|
||||
self.CurrScale = 0
|
||||
|
||||
@ -185,13 +222,13 @@ function StaggerBar.prototype:GetDebuffInfo()
|
||||
local staggerLevel = 1
|
||||
|
||||
for i = 1, IceCore.BuffLimit do
|
||||
local debuffID = select(IceHUD.WowVer < 80000 and 11 or 10, UnitDebuff(self.unit, i))
|
||||
local debuffID = select(IceHUD.SpellFunctionsReturnRank and 11 or 10, UnitDebuff(self.unit, i))
|
||||
|
||||
if debuffID == LightID or debuffID == ModerateID or debuffID == HeavyID then
|
||||
local spellName = UnitDebuff(self.unit, i)
|
||||
|
||||
duration = select(IceHUD.SpellFunctionsReturnRank and 6 or 5, UnitAura(self.unit, spellName, "", "HARMFUL"))
|
||||
amount = select(IceHUD.SpellFunctionsReturnRank and 15 or 14, UnitAura(self.unit, spellName, "", "HARMFUL"))
|
||||
duration = select(IceHUD.SpellFunctionsReturnRank and 6 or 5, IceHUD.UnitAura(self.unit, spellName, "", "HARMFUL"))
|
||||
amount = select(IceHUD.SpellFunctionsReturnRank and 15 or 14, IceHUD.UnitAura(self.unit, spellName, "", "HARMFUL"))
|
||||
staggerLevel = (debuffID == LightID) and 1 or (debuffID == ModerateID) and 2 or 3
|
||||
|
||||
break
|
||||
@ -236,7 +273,7 @@ end
|
||||
|
||||
function StaggerBar.prototype:GetDebuffDuration(unitName, buffId)
|
||||
local name, _, duration, endTime
|
||||
if IceHUD.WowVer < 80000 then
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
name, _, _, _, _, duration, endTime = UnitDebuff(unitName, buffName)
|
||||
else
|
||||
for i = 1, IceCore.BuffLimit do
|
||||
|
@ -1,3 +1,4 @@
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
||||
IceTargetAbsorb = IceCore_CreateClass(IceUnitBar)
|
||||
|
||||
IceTargetAbsorb.prototype.highestAbsorbSinceLastZero = 0
|
||||
@ -29,6 +30,28 @@ function IceTargetAbsorb.prototype:GetDefaultSettings()
|
||||
return settings
|
||||
end
|
||||
|
||||
function IceTargetAbsorb.prototype:GetOptions()
|
||||
local opts = IceTargetAbsorb.super.prototype.GetOptions(self)
|
||||
|
||||
opts["scaleToUnitHealth"] = {
|
||||
type = 'toggle',
|
||||
name = L["Scale to health"],
|
||||
desc = L["Whether the bar's maximum value should be set to the unit's maximum health or not. If set, any absorb above that amount will not be shown."],
|
||||
get = function()
|
||||
return self.moduleSettings.scaleToUnitHealth
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.moduleSettings.scaleToUnitHealth = v
|
||||
self:Update()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end
|
||||
}
|
||||
|
||||
return opts
|
||||
end
|
||||
|
||||
function IceTargetAbsorb.prototype:Enable(core)
|
||||
IceTargetAbsorb.super.prototype.Enable(self, core)
|
||||
|
||||
@ -47,6 +70,7 @@ function IceTargetAbsorb.prototype:MyUnregisterCustomEvents()
|
||||
end
|
||||
|
||||
function IceTargetAbsorb.prototype:Update()
|
||||
IceTargetAbsorb.super.prototype.Update(self)
|
||||
self:UpdateAbsorbAmount()
|
||||
end
|
||||
|
||||
@ -63,13 +87,17 @@ function IceTargetAbsorb.prototype:UpdateAbsorbAmount(event, unit)
|
||||
self.highestAbsorbSinceLastZero = absorbAmount
|
||||
end
|
||||
|
||||
self.absorbPercent = self.highestAbsorbSinceLastZero ~= 0 and absorbAmount / self.highestAbsorbSinceLastZero or 0
|
||||
local maxAbsorb = self.highestAbsorbSinceLastZero
|
||||
if self.moduleSettings.scaleToUnitHealth then
|
||||
maxAbsorb = self.maxHealth
|
||||
end
|
||||
self.absorbPercent = maxAbsorb ~= 0 and IceHUD:Clamp(absorbAmount / maxAbsorb, 0, 1) or 0
|
||||
|
||||
if absorbAmount <= 0 or self.highestAbsorbSinceLastZero <= 0 then
|
||||
if absorbAmount <= 0 or maxAbsorb <= 0 then
|
||||
self:Show(false)
|
||||
else
|
||||
self:Show(true)
|
||||
self:UpdateBar(absorbAmount / self.highestAbsorbSinceLastZero, self.ColorName)
|
||||
self:UpdateBar(self.absorbPercent, self.ColorName)
|
||||
end
|
||||
|
||||
if not IceHUD.IceCore:ShouldUseDogTags() and self.frame:IsVisible() then
|
||||
|
@ -7,11 +7,30 @@ TargetCC.prototype.debuffRemaining = 0
|
||||
TargetCC.prototype.debuffDuration = 0
|
||||
|
||||
local GetNumPartyMembers, GetNumRaidMembers = GetNumPartyMembers, GetNumRaidMembers
|
||||
if IceHUD.WowVer >= 50000 then
|
||||
if GetNumGroupMembers then
|
||||
GetNumPartyMembers = GetNumGroupMembers
|
||||
GetNumRaidMembers = GetNumGroupMembers
|
||||
end
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(spellID)
|
||||
if not spellID then
|
||||
return nil
|
||||
end
|
||||
|
||||
local spellInfo = C_Spell.GetSpellInfo(spellID)
|
||||
if spellInfo then
|
||||
return spellInfo.name, nil, spellInfo.iconID, spellInfo.castTime, spellInfo.minRange, spellInfo.maxRange, spellInfo.spellID, spellInfo.originalIconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
-- list of spell ID's for each CC type so we can avoid localization issues
|
||||
local StunCCList = {
|
||||
-- kidney shot
|
||||
@ -72,10 +91,20 @@ local IncapacitateCCList = {
|
||||
19503,
|
||||
-- Sleep
|
||||
700,
|
||||
-- Polymorph
|
||||
-- Polymorph (rank 1)
|
||||
118,
|
||||
-- Also Polymorph
|
||||
65801,
|
||||
-- Polymorph rank 2
|
||||
12824,
|
||||
-- Polymorph rank 3
|
||||
12825,
|
||||
-- Polymorph rank 4
|
||||
12826,
|
||||
-- Polymorph: Pig
|
||||
28272,
|
||||
-- Also Polymorph: Pig
|
||||
28285,
|
||||
-- Polymorph: Turtle
|
||||
28271,
|
||||
-- Polymorph: Penguin
|
||||
@ -113,6 +142,8 @@ local IncapacitateCCList = {
|
||||
local FearCCList = {
|
||||
-- Psychic Scream
|
||||
8122,
|
||||
-- Fear (Retail)
|
||||
118699,
|
||||
-- Fear
|
||||
5782,
|
||||
-- Howl of Terror
|
||||
@ -247,7 +278,7 @@ function TargetCC.prototype:PopulateSpellList(debuffListVar, ccList, ccName)
|
||||
local spellName
|
||||
|
||||
for i=1,#ccList do
|
||||
spellName = GetSpellInfo(ccList[i])
|
||||
spellName = GetSpellName(ccList[i])
|
||||
|
||||
if spellName and spellName ~= "" then
|
||||
debuffListVar[spellName] = ccName
|
||||
@ -337,9 +368,9 @@ function TargetCC.prototype:GetMaxDebuffDuration(unitName, debuffNames)
|
||||
local i = 1
|
||||
local debuff, rank, texture, count, debuffType, duration, endTime, unitCaster, _, _, spellId
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
debuff, rank, texture, count, debuffType, duration, endTime, unitCaster, _, _, spellId = UnitAura(unitName, i, "HARMFUL")
|
||||
debuff, rank, texture, count, debuffType, duration, endTime, unitCaster, _, _, spellId = IceHUD.UnitAura(unitName, i, "HARMFUL")
|
||||
else
|
||||
debuff, texture, count, debuffType, duration, endTime, unitCaster, _, _, spellId = UnitAura(unitName, i, "HARMFUL")
|
||||
debuff, texture, count, debuffType, duration, endTime, unitCaster, _, _, spellId = IceHUD.UnitAura(unitName, i, "HARMFUL")
|
||||
end
|
||||
local isMine = unitCaster == "player"
|
||||
local result = {nil, nil, nil}
|
||||
@ -348,7 +379,7 @@ function TargetCC.prototype:GetMaxDebuffDuration(unitName, debuffNames)
|
||||
while debuff do
|
||||
remaining = endTime - GetTime()
|
||||
|
||||
if debuffNames[spellId] and (not self.moduleSettings.onlyShowForMyDebuffs or isMine) then
|
||||
if (debuffNames[spellId] or debuffNames[debuff]) and (not self.moduleSettings.onlyShowForMyDebuffs or isMine) then
|
||||
if result[0] then
|
||||
if result[2] < remaining then
|
||||
result = {debuff, duration, remaining}
|
||||
@ -361,9 +392,9 @@ function TargetCC.prototype:GetMaxDebuffDuration(unitName, debuffNames)
|
||||
i = i + 1;
|
||||
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
debuff, rank, texture, count, debuffType, duration, endTime, unitCaster, _, _, spellId = UnitAura(unitName, i, "HARMFUL")
|
||||
debuff, rank, texture, count, debuffType, duration, endTime, unitCaster, _, _, spellId = IceHUD.UnitAura(unitName, i, "HARMFUL")
|
||||
else
|
||||
debuff, texture, count, debuffType, duration, endTime, unitCaster, _, _, spellId = UnitAura(unitName, i, "HARMFUL")
|
||||
debuff, texture, count, debuffType, duration, endTime, unitCaster, _, _, spellId = IceHUD.UnitAura(unitName, i, "HARMFUL")
|
||||
end
|
||||
isMine = unitCaster == "player"
|
||||
end
|
||||
@ -373,11 +404,12 @@ end
|
||||
|
||||
function TargetCC.prototype:MyOnUpdate()
|
||||
TargetCC.super.prototype.MyOnUpdate(self)
|
||||
self:UpdateTargetDebuffs(nil, self.unit, true)
|
||||
self:UpdateTargetDebuffs("internal", self.unit)
|
||||
end
|
||||
|
||||
function TargetCC.prototype:UpdateTargetDebuffs(event, unit, isUpdate)
|
||||
function TargetCC.prototype:UpdateTargetDebuffs(event, unit)
|
||||
local name, duration, remaining
|
||||
local isUpdate = event == "internal"
|
||||
|
||||
if not isUpdate or not self.lastUpdateTime then
|
||||
self.debuffName, self.debuffDuration, self.debuffRemaining = self:GetMaxDebuffDuration(self.unit, self.debuffList)
|
||||
|
@ -15,7 +15,7 @@ end
|
||||
function TargetCast.prototype:Enable(core)
|
||||
TargetCast.super.prototype.Enable(self, core)
|
||||
|
||||
if IceHUD.WowVer >= 30200 then
|
||||
if IceHUD.EventExistsSpellcastInterruptible then
|
||||
self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE", "SpellCastInterruptible")
|
||||
self:RegisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE", "SpellCastNotInterruptible")
|
||||
end
|
||||
@ -183,11 +183,11 @@ function TargetCast.prototype:StartBar(action, message)
|
||||
local spell, notInterruptible
|
||||
if UnitCastingInfo then
|
||||
spell = UnitCastingInfo(self.unit)
|
||||
notInterruptible = select(IceHUD.WowVer < 80000 and 9 or 8, UnitCastingInfo(self.unit))
|
||||
notInterruptible = select(IceHUD.SpellFunctionsReturnRank and 9 or 8, UnitCastingInfo(self.unit))
|
||||
end
|
||||
if UnitChannelInfo and not spell then
|
||||
spell = UnitChannelInfo(self.unit)
|
||||
notInterruptible = select(IceHUD.WowVer < 80000 and 8 or 7, UnitChannelInfo(self.unit))
|
||||
notInterruptible = select(IceHUD.SpellFunctionsReturnRank and 8 or 7, UnitChannelInfo(self.unit))
|
||||
|
||||
if not spell then
|
||||
return
|
||||
@ -204,6 +204,6 @@ end
|
||||
|
||||
-- Fulzamoth 2019-09-27 : load in Classic if LibClassicCasterino exists
|
||||
-- Load us up
|
||||
if not IceHUD.WowClassic or LibClassicCasterino then
|
||||
if IceHUD.CanShowTargetCasting then
|
||||
IceHUD.TargetCast = TargetCast:new()
|
||||
end
|
||||
|
@ -3,6 +3,11 @@ IceTargetHealth = IceCore_CreateClass(IceUnitBar)
|
||||
|
||||
local IceHUD = _G.IceHUD
|
||||
|
||||
local IsAddOnLoaded = IsAddOnLoaded
|
||||
if not IsAddOnLoaded and C_AddOns then
|
||||
IsAddOnLoaded = C_AddOns.IsAddOnLoaded
|
||||
end
|
||||
|
||||
IceTargetHealth.prototype.color = nil
|
||||
IceTargetHealth.prototype.determineColor = true
|
||||
IceTargetHealth.prototype.registerEvents = true
|
||||
@ -642,6 +647,10 @@ function IceTargetHealth.prototype:Enable(core)
|
||||
self:RegisterEvent("LFG_PROPOSAL_FAILED", "CheckPartyRole")
|
||||
self:RegisterEvent("LFG_ROLE_UPDATE", "CheckPartyRole")
|
||||
end
|
||||
|
||||
if IceHUD.ShouldUpdateTargetHealthEveryTick and self.unit == "target" then
|
||||
self.frame:SetScript("OnUpdate", function() self:Update(self.unit) end)
|
||||
end
|
||||
end
|
||||
|
||||
if (self.moduleSettings.hideBlizz) then
|
||||
@ -659,6 +668,10 @@ function IceTargetHealth.prototype:Disable(core)
|
||||
|
||||
UnregisterUnitWatch(self.frame)
|
||||
|
||||
if self.registerEvents and IceHUD.ShouldUpdateTargetHealthEveryTick and self.unit == "target" then
|
||||
self.frame:SetScript("OnUpdate", nil)
|
||||
end
|
||||
|
||||
if self.moduleSettings.hideBlizz then
|
||||
self:ShowBlizz()
|
||||
end
|
||||
@ -700,13 +713,6 @@ function IceTargetHealth.prototype:CreateBackground(redraw)
|
||||
self.frame.button:SetPoint("BOTTOMRIGHT", self.frame, "BOTTOMRIGHT", -1 * self.frame:GetWidth() / 1.5, 0)
|
||||
end
|
||||
end
|
||||
|
||||
if not self.frame.button.menu then
|
||||
self.frame.button.menu = function(this, unit)
|
||||
IceHUD.DropdownUnit = unit
|
||||
ToggleDropDownMenu(1, nil, IceHUD_UnitFrame_DropDown, "cursor")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -720,7 +726,7 @@ function IceTargetHealth.prototype:EnableClickTargeting(bEnable)
|
||||
self.frame.button:EnableMouse(true)
|
||||
self.frame.button:RegisterForClicks("AnyUp")
|
||||
self.frame.button:SetAttribute("type1", "target")
|
||||
self.frame.button:SetAttribute("type2", "menu")
|
||||
self.frame.button:SetAttribute("type2", "togglemenu")
|
||||
self.frame.button:SetAttribute("unit", self.unit)
|
||||
|
||||
-- set up click casting
|
||||
@ -833,6 +839,8 @@ function IceTargetHealth.prototype:Update(unit)
|
||||
|
||||
if (self.moduleSettings.scaleHealthColor) then
|
||||
self.color = "ScaledHealthColor"
|
||||
elseif self.moduleSettings.lowThresholdColor and self.healthPercentage <= self.moduleSettings.lowThreshold then
|
||||
self.color = "ScaledHealthColor"
|
||||
end
|
||||
|
||||
if (self.tapped) then
|
||||
@ -974,9 +982,9 @@ end
|
||||
|
||||
function IceTargetHealth.prototype:UpdateRaidTargetIcon()
|
||||
if self.moduleSettings.raidIconOnTop then
|
||||
self.frame.raidIcon:SetFrameStrata("MEDIUM")
|
||||
self.frame.raidIcon:SetFrameStrata(IceHUD.IceCore:DetermineStrata("MEDIUM"))
|
||||
else
|
||||
self.frame.raidIcon:SetFrameStrata("LOW")
|
||||
self.frame.raidIcon:SetFrameStrata(IceHUD.IceCore:DetermineStrata("LOW"))
|
||||
end
|
||||
|
||||
if not self.moduleSettings.showRaidIcon or (not UnitExists(self.unit) and (not self.configMode and not IceHUD.IceCore:IsInConfigMode())) then
|
||||
@ -1057,20 +1065,25 @@ end
|
||||
|
||||
|
||||
function IceTargetHealth.prototype:ShowBlizz()
|
||||
TargetFrame:Show()
|
||||
TargetFrame:GetScript("OnLoad")(TargetFrame)
|
||||
|
||||
ComboFrame:Show()
|
||||
ComboFrame:GetScript("OnLoad")(ComboFrame)
|
||||
TargetFrame:SetParent(self.OriginalTargetFrameParent or UIParent)
|
||||
ComboFrame:SetParent(self.OriginalComboFrameParent or UIParent)
|
||||
end
|
||||
|
||||
|
||||
function IceTargetHealth.prototype:HideBlizz()
|
||||
TargetFrame:Hide()
|
||||
TargetFrame:UnregisterAllEvents()
|
||||
if not self.TargetFrameParent then
|
||||
self.TargetFrameParent = CreateFrame("Frame")
|
||||
self.TargetFrameParent:Hide()
|
||||
end
|
||||
if not self.ComboFrameParent then
|
||||
self.ComboFrameParent = CreateFrame("Frame")
|
||||
self.ComboFrameParent:Hide()
|
||||
end
|
||||
|
||||
ComboFrame:Hide()
|
||||
ComboFrame:UnregisterAllEvents()
|
||||
self.OriginalTargetFrameParent = TargetFrame:GetParent()
|
||||
TargetFrame:SetParent(self.TargetFrameParent)
|
||||
self.OriginalComboFrameParent = ComboFrame:GetParent()
|
||||
ComboFrame:SetParent(self.ComboFrameParent)
|
||||
end
|
||||
|
||||
function IceTargetHealth.prototype:UpdateBar(scale, color, alpha)
|
||||
@ -1095,7 +1108,7 @@ function IceTargetHealth.prototype:CheckPartyRole()
|
||||
proposalExists, id, typeID, subtypeID, name, texture, role, hasResponded, totalEncounters, completedEncounters, numMembers, isleader = GetLFGProposal()
|
||||
|
||||
local p = self.unit
|
||||
if IceHUD.WowVer < 40000 then
|
||||
if not IceHUD.UnitGroupRolesReturnsRoleString then
|
||||
isTank, isHeal, isDPS = UnitGroupRolesAssigned(p)
|
||||
else
|
||||
local grpRole = UnitGroupRolesAssigned(p)
|
||||
|
@ -1136,7 +1136,7 @@ do -- OVERRIDE: IceTargetInfo.prototype:CreateFrame(redraw)
|
||||
|
||||
self.frame:SetScale(self.moduleSettings.scale)
|
||||
|
||||
self.frame:SetFrameStrata("BACKGROUND")
|
||||
self.frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame:SetWidth(self.width)
|
||||
self.frame:SetHeight(32)
|
||||
self.frame:ClearAllPoints()
|
||||
@ -1150,7 +1150,7 @@ do -- OVERRIDE: IceTargetInfo.prototype:CreateFrame(redraw)
|
||||
self.frame:SetScript("OnLeave", function(frame) self:OnLeave(frame) end)
|
||||
|
||||
self.frame:SetAttribute("type1", "target")
|
||||
self.frame:SetAttribute("type2", "menu")
|
||||
self.frame:SetAttribute("type2", "togglemenu")
|
||||
|
||||
-- set up click casting
|
||||
ClickCastFrames = ClickCastFrames or {}
|
||||
@ -1173,13 +1173,6 @@ do -- OVERRIDE: IceTargetInfo.prototype:CreateFrame(redraw)
|
||||
|
||||
self.frame:SetAttribute("unit", self.unit)
|
||||
|
||||
if not self.frame.menu then
|
||||
self.frame.menu = function(this, unit)
|
||||
IceHUD.DropdownUnit = unit
|
||||
ToggleDropDownMenu(1, nil, IceHUD_UnitFrame_DropDown, "cursor")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- create a fancy highlight frame for mouse over
|
||||
if (not self.frame.highLight) then
|
||||
@ -1220,7 +1213,7 @@ function IceTargetInfo.prototype:CreateAuraFrame(aura, redraw)
|
||||
|
||||
if (not self.frame[auraFrame]) then
|
||||
self.frame[auraFrame] = CreateFrame("Frame", nil, self.frame)
|
||||
self.frame[auraFrame]:SetFrameStrata("BACKGROUND")
|
||||
self.frame[auraFrame]:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame[auraFrame]:SetWidth(1)
|
||||
self.frame[auraFrame]:SetHeight(1)
|
||||
self.frame[auraFrame]:Show()
|
||||
@ -1244,7 +1237,7 @@ end
|
||||
do
|
||||
local function FrameFactory(frameType, parentFrame, inheritsFrame)
|
||||
local frame = CreateFrame(frameType, nil, parentFrame, inheritsFrame)
|
||||
frame:SetFrameStrata("BACKGROUND")
|
||||
frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
frame:ClearAllPoints()
|
||||
return frame
|
||||
end
|
||||
@ -1420,11 +1413,11 @@ function IceTargetInfo.prototype:UpdateBuffType(aura)
|
||||
---- end change by Fulzamoth
|
||||
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable = UnitAura(self.unit, i, reaction .. (filter and "|PLAYER" or ""))
|
||||
name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable = IceHUD.UnitAura(self.unit, i, reaction .. (filter and "|PLAYER" or ""))
|
||||
else
|
||||
---- Fulzamoth - 2019-09-04 : support for cooldowns on target buffs/debuffs (classic)
|
||||
-- 1. in addition to other info, get the spellID for for the (de)buff
|
||||
name, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, _, spellID = UnitAura(self.unit, i, reaction .. (filter and "|PLAYER" or ""))
|
||||
name, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, _, spellID = IceHUD.UnitAura(self.unit, i, reaction .. (filter and "|PLAYER" or ""))
|
||||
if duration == 0 and LibClassicDurations then
|
||||
-- 2. if no duration defined for the (de)buff, look up the spell in LibClassicDurations
|
||||
local classicDuration, classicExpirationTime = LibClassicDurations:GetAuraDurationByUnit(self.unit, spellID, caster)
|
||||
@ -1453,7 +1446,7 @@ function IceTargetInfo.prototype:UpdateBuffType(aura)
|
||||
end
|
||||
else
|
||||
self.frame[auraFrame].iconFrames[i]:Hide()
|
||||
buffData[aura][i] = nil
|
||||
table.remove(buffData[aura], i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -7,11 +7,30 @@ TargetInvuln.prototype.buffRemaining = 0
|
||||
TargetInvuln.prototype.buffDuration = 0
|
||||
|
||||
local GetNumPartyMembers, GetNumRaidMembers = GetNumPartyMembers, GetNumRaidMembers
|
||||
if IceHUD.WowVer >= 50000 then
|
||||
if GetNumGroupMembers then
|
||||
GetNumPartyMembers = GetNumGroupMembers
|
||||
GetNumRaidMembers = GetNumGroupMembers
|
||||
end
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(spellID)
|
||||
if not spellID then
|
||||
return nil
|
||||
end
|
||||
|
||||
local spellInfo = C_Spell.GetSpellInfo(spellID)
|
||||
if spellInfo then
|
||||
return spellInfo.name, nil, spellInfo.iconID, spellInfo.castTime, spellInfo.minRange, spellInfo.maxRange, spellInfo.spellID, spellInfo.originalIconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
-- list of spell ID's for each CC type so we can avoid localization issues
|
||||
local InvulnList= {
|
||||
-- Anti-Magic Shell
|
||||
@ -76,7 +95,7 @@ function TargetInvuln.prototype:PopulateSpellList(buffListVar, ccList, ccName)
|
||||
local spellName
|
||||
|
||||
for i=1,#ccList do
|
||||
spellName = GetSpellInfo(ccList[i])
|
||||
spellName = GetSpellName(ccList[i])
|
||||
|
||||
if spellName and spellName ~= "" then
|
||||
buffListVar[spellName] = ccName
|
||||
@ -148,9 +167,9 @@ function TargetInvuln.prototype:GetMaxbuffDuration(unitName, buffNames)
|
||||
local i = 1
|
||||
local buff, rank, texture, count, buffType, duration, endTime, unitCaster
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
buff, rank, texture, count, buffType, duration, endTime, unitCaster = UnitAura(unitName, i, "HELPFUL")
|
||||
buff, rank, texture, count, buffType, duration, endTime, unitCaster = IceHUD.UnitAura(unitName, i, "HELPFUL")
|
||||
else
|
||||
buff, texture, count, buffType, duration, endTime, unitCaster = UnitAura(unitName, i, "HELPFUL")
|
||||
buff, texture, count, buffType, duration, endTime, unitCaster = IceHUD.UnitAura(unitName, i, "HELPFUL")
|
||||
end
|
||||
local isMine = unitCaster == "player"
|
||||
local result = {nil, nil, nil}
|
||||
@ -179,9 +198,9 @@ function TargetInvuln.prototype:GetMaxbuffDuration(unitName, buffNames)
|
||||
i = i + 1;
|
||||
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
buff, rank, texture, count, buffType, duration, endTime, unitCaster = UnitAura(unitName, i, "HELPFUL")
|
||||
buff, rank, texture, count, buffType, duration, endTime, unitCaster = IceHUD.UnitAura(unitName, i, "HELPFUL")
|
||||
else
|
||||
buff, texture, count, buffType, duration, endTime, unitCaster = UnitAura(unitName, i, "HELPFUL")
|
||||
buff, texture, count, buffType, duration, endTime, unitCaster = IceHUD.UnitAura(unitName, i, "HELPFUL")
|
||||
end
|
||||
isMine = unitCaster == "player"
|
||||
end
|
||||
@ -191,13 +210,14 @@ end
|
||||
|
||||
function TargetInvuln.prototype:MyOnUpdate()
|
||||
TargetInvuln.super.prototype.MyOnUpdate(self)
|
||||
self:UpdateTargetBuffs(nil, self.unit, true)
|
||||
self:UpdateTargetBuffs("internal", self.unit)
|
||||
end
|
||||
|
||||
function TargetInvuln.prototype:UpdateTargetBuffs(event, unit, isUpdate)
|
||||
function TargetInvuln.prototype:UpdateTargetBuffs(event, unit)
|
||||
local name, duration, remaining
|
||||
local isUpdate = event == "internal"
|
||||
|
||||
if not isUpdate then
|
||||
if not isUpdate or not self.lastUpdateTime then
|
||||
self.buffName, self.buffDuration, self.buffRemaining = self:GetMaxbuffDuration(self.unit, self.buffList)
|
||||
else
|
||||
self.buffRemaining = math.max(0, self.buffRemaining - (GetTime() - self.lastUpdateTime))
|
||||
|
@ -83,7 +83,7 @@ function IceTargetMana.prototype:Enable(core)
|
||||
self:RegisterEvent("UNIT_FOCUS", "UpdateEvent")
|
||||
|
||||
-- DK rune stuff
|
||||
if IceHUD.WowVer >= 30000 then
|
||||
if SPELL_POWER_RUNIC_POWER then
|
||||
self:RegisterEvent("UNIT_RUNIC_POWER", "UpdateEvent")
|
||||
self:RegisterEvent("UNIT_MAXRUNIC_POWER", "UpdateEvent")
|
||||
end
|
||||
@ -125,6 +125,8 @@ function IceTargetMana.prototype:Update(unit)
|
||||
|
||||
if (self.moduleSettings.scaleManaColor) then
|
||||
self.color = "ScaledManaColor"
|
||||
elseif self.moduleSettings.lowThresholdColor and self.manaPercentage <= self.moduleSettings.lowThreshold then
|
||||
self.color = "ScaledManaColor"
|
||||
end
|
||||
|
||||
if (manaType == SPELL_POWER_RAGE) then
|
||||
@ -135,13 +137,13 @@ function IceTargetMana.prototype:Update(unit)
|
||||
self.color = "TargetEnergy"
|
||||
elseif (manaType == SPELL_POWER_RUNIC_POWER) then
|
||||
self.color = "TargetRunicPower"
|
||||
elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_INSANITY) then
|
||||
elseif (manaType == SPELL_POWER_INSANITY) then
|
||||
self.color = "TargetInsanity"
|
||||
elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_FURY) then
|
||||
elseif (manaType == SPELL_POWER_FURY) then
|
||||
self.color = "TargetFury"
|
||||
elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_MAELSTROM) then
|
||||
elseif (manaType == SPELL_POWER_MAELSTROM) then
|
||||
self.color = "TargetMaelstrom"
|
||||
elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_PAIN) then
|
||||
elseif (manaType == SPELL_POWER_PAIN) then
|
||||
self.color = "TargetPain"
|
||||
end
|
||||
|
||||
|
@ -4,6 +4,18 @@ local DogTag = nil
|
||||
|
||||
local TargetOfTarget = IceCore_CreateClass(IceElement)
|
||||
|
||||
local UnitDebuff = UnitDebuff
|
||||
if not UnitDebuff and C_UnitAuras and AuraUtil then
|
||||
UnitDebuff = function(unitToken, index, filter)
|
||||
local auraData = C_UnitAuras.GetDebuffDataByIndex(unitToken, index, filter)
|
||||
if not auraData then
|
||||
return nil
|
||||
end
|
||||
|
||||
return AuraUtil.UnpackAuraData(auraData)
|
||||
end
|
||||
end
|
||||
|
||||
TargetOfTarget.prototype.stackedDebuffs = nil
|
||||
TargetOfTarget.prototype.buffSize = nil
|
||||
TargetOfTarget.prototype.height = nil
|
||||
@ -124,24 +136,26 @@ function TargetOfTarget.prototype:GetOptions()
|
||||
order = 34
|
||||
}
|
||||
|
||||
opts["texture"] = {
|
||||
type = 'select',
|
||||
dialogControl = "LSM30_Statusbar",
|
||||
name = L["Texture"],
|
||||
desc = L["ToT frame texture"],
|
||||
get = function(info)
|
||||
return self.moduleSettings.texture
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.moduleSettings.texture = v
|
||||
self:Redraw()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
values = AceGUIWidgetLSMlists.statusbar,
|
||||
order = 35
|
||||
}
|
||||
if AceGUIWidgetLSMlists then
|
||||
opts["texture"] = {
|
||||
type = 'select',
|
||||
dialogControl = "LSM30_Statusbar",
|
||||
name = L["Texture"],
|
||||
desc = L["ToT frame texture"],
|
||||
get = function(info)
|
||||
return self.moduleSettings.texture
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.moduleSettings.texture = v
|
||||
self:Redraw()
|
||||
end,
|
||||
disabled = function()
|
||||
return not self.moduleSettings.enabled
|
||||
end,
|
||||
values = AceGUIWidgetLSMlists.statusbar,
|
||||
order = 35
|
||||
}
|
||||
end
|
||||
|
||||
opts["sizeToGap"] = {
|
||||
type = 'toggle',
|
||||
@ -314,7 +328,7 @@ function TargetOfTarget.prototype:CreateFrame()
|
||||
self.frame:SetAttribute("unit", self.unit)
|
||||
end
|
||||
|
||||
self.frame:SetFrameStrata("BACKGROUND")
|
||||
self.frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
if self.moduleSettings.sizeToGap then
|
||||
self.frame:SetWidth(self.settings.gap)
|
||||
else
|
||||
@ -368,7 +382,7 @@ function TargetOfTarget.prototype:CreateBarFrame()
|
||||
|
||||
self.frame.bg:SetTexture(0,0,0)
|
||||
|
||||
self.frame.bar:SetFrameStrata("BACKGROUND")
|
||||
self.frame.bar:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
if self.moduleSettings.sizeToGap then
|
||||
self.frame.bg:SetWidth(self.settings.gap + 2)
|
||||
self.frame.bar:SetWidth(self.settings.gap)
|
||||
@ -410,7 +424,7 @@ function TargetOfTarget.prototype:CreateToTFrame()
|
||||
|
||||
self.frame.totName:SetHeight(self.moduleSettings.moduleHeight)
|
||||
self.frame.totName:SetJustifyH("LEFT")
|
||||
self.frame.totName:SetJustifyV("CENTER")
|
||||
self.frame.totName:SetJustifyV("MIDDLE")
|
||||
|
||||
self.frame.totName:SetPoint("LEFT", self.frame, "LEFT", 0, -1)
|
||||
self.frame.totName:Show()
|
||||
@ -422,7 +436,7 @@ function TargetOfTarget.prototype:CreateToTHPFrame()
|
||||
|
||||
self.frame.totHealth:SetHeight(self.moduleSettings.moduleHeight)
|
||||
self.frame.totHealth:SetJustifyH("RIGHT")
|
||||
self.frame.totHealth:SetJustifyV("CENTER")
|
||||
self.frame.totHealth:SetJustifyV("MIDDLE")
|
||||
|
||||
self.frame.totHealth:SetPoint("RIGHT", self.frame, "RIGHT", 0, 0)
|
||||
self.frame.totHealth:Show()
|
||||
@ -435,7 +449,7 @@ function TargetOfTarget.prototype:CreateDebuffFrame()
|
||||
end
|
||||
self.frame.debuffFrame = CreateFrame("Frame", nil, self.frame)
|
||||
|
||||
self.frame.debuffFrame:SetFrameStrata("BACKGROUND")
|
||||
self.frame.debuffFrame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame.debuffFrame:SetWidth(10)
|
||||
self.frame.debuffFrame:SetHeight(self.height)
|
||||
|
||||
@ -451,7 +465,7 @@ function TargetOfTarget.prototype:CreateIconFrames(parent)
|
||||
|
||||
for i = 1, IceCore.BuffLimit do
|
||||
buffs[i] = CreateFrame("Frame", nil, parent)
|
||||
buffs[i]:SetFrameStrata("BACKGROUND")
|
||||
buffs[i]:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
buffs[i]:SetWidth(self.buffSize)
|
||||
buffs[i]:SetHeight(self.buffSize)
|
||||
buffs[i]:SetPoint("LEFT", (i-1) * self.buffSize + (i-1), 0)
|
||||
|
@ -136,6 +136,8 @@ function TargetTargetHealth.prototype:Update(unit)
|
||||
|
||||
if (self.moduleSettings.scaleHealthColor) then
|
||||
self.color = "ScaledHealthColor"
|
||||
elseif self.moduleSettings.lowThresholdColor and self.healthPercentage and self.healthPercentage <= self.moduleSettings.lowThreshold then
|
||||
self.color = "ScaledHealthColor"
|
||||
end
|
||||
|
||||
if (self.tapped) then
|
||||
|
@ -83,6 +83,8 @@ function TargetTargetMana.prototype:Update(unit)
|
||||
|
||||
if (self.moduleSettings.scaleManaColor) then
|
||||
self.color = "ScaledManaColor"
|
||||
elseif self.moduleSettings.lowThresholdColor and self.manaPercentage and self.manaPercentage <= self.moduleSettings.lowThreshold then
|
||||
self.color = "ScaledManaColor"
|
||||
end
|
||||
|
||||
if (manaType == 1) then
|
||||
|
@ -30,6 +30,11 @@ if not UnitGroupRolesAssigned then
|
||||
end
|
||||
end
|
||||
|
||||
local GetItemInfo = GetItemInfo
|
||||
if not GetItemInfo and C_Item then
|
||||
GetItemInfo = C_Item.GetItemInfo
|
||||
end
|
||||
|
||||
local MAX_NUM_RAID_MEMBERS = 40
|
||||
local MAX_NUM_PARTY_MEMBERS = 5
|
||||
|
||||
@ -231,7 +236,7 @@ end
|
||||
|
||||
-- create the aggro range indicator bar
|
||||
function IceThreat.prototype:CreateAggroBar()
|
||||
self.aggroBar = self:BarFactory(self.aggroBar, "BACKGROUND","ARTWORK", "Aggro")
|
||||
self.aggroBar = self:BarFactory(self.aggroBar, "BACKGROUND", "ARTWORK", "Aggro")
|
||||
|
||||
local r, g, b = self:GetColor("ThreatPullAggro")
|
||||
if (self.settings.backgroundToggle) then
|
||||
|
@ -89,11 +89,11 @@ function Totems.prototype:GetOptions()
|
||||
end,
|
||||
order = 31
|
||||
}
|
||||
--[[
|
||||
|
||||
opts["hideBlizz"] = {
|
||||
type = "toggle",
|
||||
name = L["Hide Blizzard Frame"],
|
||||
desc = L["Hides Blizzard Rune frame and disables all events related to it"],
|
||||
desc = L["Hides Blizzard frame and disables all events related to it.\n\nNOTE: Blizzard attaches this UI to the player's unitframe, so if you have that hidden in PlayerHealth, then this won't do anything."],
|
||||
get = function()
|
||||
return self.moduleSettings.hideBlizz
|
||||
end,
|
||||
@ -110,7 +110,7 @@ function Totems.prototype:GetOptions()
|
||||
end,
|
||||
order = 32
|
||||
}
|
||||
--]]
|
||||
|
||||
opts["displayMode"] = {
|
||||
type = 'select',
|
||||
name = L["Totem orientation"],
|
||||
@ -193,7 +193,7 @@ function Totems.prototype:GetDefaultSettings()
|
||||
defaults["totemFontSize"] = 20
|
||||
defaults["totemMode"] = "Graphical"
|
||||
defaults["usesDogTagStrings"] = false
|
||||
defaults["hideBlizz"] = true
|
||||
defaults["hideBlizz"] = IceHUD.CanHookDestroyTotem
|
||||
defaults["alwaysFullAlpha"] = false
|
||||
defaults["displayMode"] = "Horizontal"
|
||||
defaults["cooldownMode"] = "Cooldown"
|
||||
@ -265,7 +265,7 @@ end
|
||||
function Totems.prototype:CreateFrame()
|
||||
Totems.super.prototype.CreateFrame(self)
|
||||
|
||||
self.frame:SetFrameStrata("BACKGROUND")
|
||||
self.frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame:SetWidth(self.totemSize*self.numTotems)
|
||||
self.frame:SetHeight(1)
|
||||
self.frame:ClearAllPoints()
|
||||
@ -287,10 +287,9 @@ function Totems.prototype:CreateTotemFrame()
|
||||
self.frame.graphical = {}
|
||||
end
|
||||
|
||||
local totemType
|
||||
for i=1, self.numTotems do
|
||||
slot = TOTEM_PRIORITIES[i]
|
||||
self:CreateTotem(slot, self.totemNames[slot])
|
||||
local slot = TOTEM_PRIORITIES[i]
|
||||
self:CreateTotem(slot, self.totemNames[slot])
|
||||
end
|
||||
end
|
||||
|
||||
@ -340,19 +339,17 @@ function Totems.prototype:CreateTotem(i, name)
|
||||
return
|
||||
end
|
||||
local haveTotem, name, startTime, duration, icon = GetTotemInfo(i)
|
||||
local bWasNewFrame = false
|
||||
if (not self.frame.graphical[i]) then
|
||||
self.frame.graphical[i] = CreateFrame("Frame", nil, self.frame)
|
||||
self.frame.graphical[i].totem = self.frame.graphical[i]:CreateTexture(nil, "LOW")
|
||||
self.frame.graphical[i].totem = self.frame.graphical[i]:CreateTexture(nil, "BACKGROUND")
|
||||
self.frame.graphical[i].cd = CreateFrame("Cooldown", nil, self.frame.graphical[i], "CooldownFrameTemplate")
|
||||
self.frame.graphical[i].shine = self.frame.graphical[i]:CreateTexture(nil, "OVERLAY")
|
||||
|
||||
self.frame.graphical[i].totem:SetTexture(icon)
|
||||
self.frame.graphical[i].totem:SetAllPoints(self.frame.graphical[i])
|
||||
bWasNewFrame = true
|
||||
end
|
||||
|
||||
self.frame.graphical[i]:SetFrameStrata("BACKGROUND")
|
||||
self.frame.graphical[i]:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame.graphical[i]:SetWidth(self.totemSize)
|
||||
self.frame.graphical[i]:SetHeight(self.totemSize)
|
||||
|
||||
@ -376,14 +373,14 @@ function Totems.prototype:CreateTotem(i, name)
|
||||
self.graphicalOnLeave = function() GameTooltip:Hide() end
|
||||
end
|
||||
if not self.graphicalOnMouseUp then
|
||||
self.graphicalOnMouseUp = function (self, mouseButton)
|
||||
self.graphicalOnMouseUp = function (button, mouseButton)
|
||||
if mouseButton == "RightButton" then
|
||||
DestroyTotem(self.slot)
|
||||
DestroyTotem(button.slot)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self.frame.graphical[i].cd:SetFrameStrata("BACKGROUND")
|
||||
self.frame.graphical[i].cd:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
|
||||
self.frame.graphical[i].cd:SetFrameLevel(self.frame.graphical[i]:GetFrameLevel()+1)
|
||||
self.frame.graphical[i].cd:ClearAllPoints()
|
||||
self.frame.graphical[i].cd:SetAllPoints(self.frame.graphical[i])
|
||||
@ -406,18 +403,19 @@ function Totems.prototype:CreateTotem(i, name)
|
||||
self.frame.graphical[i]:EnableMouse(true)
|
||||
self.frame.graphical[i]:SetScript("OnEnter", self.graphicalOnEnter)
|
||||
self.frame.graphical[i]:SetScript("OnLeave", self.graphicalOnLeave)
|
||||
if IceHUD.CanHookDestroyTotem then
|
||||
self.frame.graphical[i]:SetScript("OnMouseUp", self.graphicalOnMouseUp)
|
||||
end
|
||||
else
|
||||
self.frame.graphical[i]:EnableMouse(false)
|
||||
self.frame.graphical[i]:SetScript("OnEnter", nil)
|
||||
self.frame.graphical[i]:SetScript("OnLeave", nil)
|
||||
if IceHUD.CanHookDestroyTotem then
|
||||
self.frame.graphical[i]:SetScript("OnMouseUp", nil)
|
||||
end
|
||||
end
|
||||
self.frame.graphical[i].slot = i
|
||||
self.frame.graphical[i].name = name
|
||||
|
||||
-- it looks like HookScript will continue to add handlers every time instead of replacing them like SetScript
|
||||
if (bWasNewFrame) then
|
||||
--self.frame.graphical[i]:HookScript("OnMouseUp", self.graphicalOnMouseUp)
|
||||
end
|
||||
end
|
||||
|
||||
-- Load us up
|
||||
|
@ -3,6 +3,25 @@ local Vengeance = IceCore_CreateClass(IceUnitBar)
|
||||
|
||||
local VENGEANCE_SPELL_ID = 93098
|
||||
|
||||
local GetSpellInfo = GetSpellInfo
|
||||
if not GetSpellInfo and C_Spell and C_Spell.GetSpellInfo then
|
||||
GetSpellInfo = function(spellID)
|
||||
if not spellID then
|
||||
return nil
|
||||
end
|
||||
|
||||
local spellInfo = C_Spell.GetSpellInfo(spellID)
|
||||
if spellInfo then
|
||||
return spellInfo.name, nil, spellInfo.iconID, spellInfo.castTime, spellInfo.minRange, spellInfo.maxRange, spellInfo.spellID, spellInfo.originalIconID
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetSpellName = GetSpellInfo
|
||||
if C_Spell and C_Spell.GetSpellName then
|
||||
GetSpellName = C_Spell.GetSpellName
|
||||
end
|
||||
|
||||
Vengeance.prototype.current = nil
|
||||
Vengeance.prototype.max = nil
|
||||
|
||||
@ -50,43 +69,25 @@ end
|
||||
-- scan the tooltip and extract the vengeance value
|
||||
do
|
||||
-- making these local as they're not used anywhere else
|
||||
local regions = {}
|
||||
local spellName = GetSpellInfo(VENGEANCE_SPELL_ID)
|
||||
local tooltipBuffer = CreateFrame("GameTooltip","tooltipBuffer",nil,"GameTooltipTemplate")
|
||||
tooltipBuffer:SetOwner(WorldFrame, "ANCHOR_NONE")
|
||||
|
||||
-- suggested by Antiarc as a way to repopulate the same table instead of repeatedly creating a new one
|
||||
local function makeTable(t, ...)
|
||||
wipe(t)
|
||||
for i = 1, select("#", ...) do
|
||||
t[i] = select(i, ...)
|
||||
end
|
||||
end
|
||||
local spellName = GetSpellName(VENGEANCE_SPELL_ID)
|
||||
|
||||
function Vengeance.prototype:UpdateCurrent(event, unit)
|
||||
if (unit and (unit ~= self.unit)) then
|
||||
return
|
||||
end
|
||||
|
||||
local name = UnitAura(self.unit, spellName)
|
||||
if name then
|
||||
-- Buff found, copy it into the buffer for scanning
|
||||
tooltipBuffer:ClearLines()
|
||||
tooltipBuffer:SetUnitBuff(self.unit, name)
|
||||
|
||||
-- Grab all regions, stuff em into our table
|
||||
makeTable(regions, tooltipBuffer:GetRegions())
|
||||
|
||||
-- Convert FontStrings to strings, replace anything else with ""
|
||||
for i=1, #regions do
|
||||
local region = regions[i]
|
||||
regions[i] = region:GetObjectType() == "FontString" and region:GetText() or ""
|
||||
if C_UnitAuras and C_UnitAuras.GetAuraDataBySpellName then
|
||||
local data = C_UnitAuras.GetAuraDataBySpellName(self.unit, spellName)
|
||||
if data and data.points and #data.points > 0 then
|
||||
self.current = (data and data.points and #data.points > 0) and data.points[1] or 0
|
||||
end
|
||||
|
||||
-- Find the number, save it
|
||||
self.current = tonumber(string.match(table.concat(regions),"%d+")) or 0
|
||||
else
|
||||
self.current = 0
|
||||
local _, idx = IceHUD:GetBuffCount(self.unit, spellName, true, true)
|
||||
if idx then
|
||||
self.current = select(17, IceHUD.UnitAura(self.unit, idx))
|
||||
else
|
||||
self.current = 0
|
||||
end
|
||||
end
|
||||
|
||||
self:Update()
|
||||
|
@ -1,7 +1,5 @@
|
||||
# IceHUD
|
||||
|
||||
## If you are getting a `PLAYER_TALENT_UPDATE` error in LibRangeCheck-2.0 on BC-Classic, please see https://www.wowace.com/projects/ice-hud/issues/303 - this is not IceHUD's fault.
|
||||
|
||||
IceHUD is a highly configurable and customizable HUD addon in the spirit of DHUD, MetaHUD, and others designed to keep your focus in the center of the screen where your character is.
|
||||
|
||||
## **What it is**
|
||||
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 37 KiB |
@ -1,6 +1,67 @@
|
||||
# Changelog
|
||||
|
||||
v1.13.6:
|
||||
v1.15.14:
|
||||
|
||||
- Updated TOC to 9.1
|
||||
- Packaged an updated DogTag library with a fix for Classic-era `[Class]` tags.
|
||||
- Support WoW 11.1.5
|
||||
- Update TWW TOC to 11.1.5
|
||||
|
||||
v1.15.13:
|
||||
|
||||
- Update TOCs
|
||||
|
||||
v1.15.12:
|
||||
|
||||
- Update TOCs
|
||||
|
||||
v1.15.11:
|
||||
|
||||
- Fix imported profiles not saving across reloads
|
||||
|
||||
v1.15.10:
|
||||
|
||||
- Fix Chi not updating properly when the player's maximum amount of Chi points changes (e.g. via Ascension talent).
|
||||
- Update TOCs
|
||||
|
||||
v1.15.9:
|
||||
|
||||
- Update Cataclysm Classic TOC to 4.4.1
|
||||
- Update Classic-era TOC to 1.15.4
|
||||
- Update TWW TOC to 11.0.5
|
||||
|
||||
v1.15.8:
|
||||
|
||||
- Fix reported error with custom cooldown bars set to "when ready" mode due to deprecation in 11.x (wowace issue #368)
|
||||
|
||||
v1.15.7:
|
||||
|
||||
- Fix cooldown display for overridden spells (such as Evoker spells where Font of Magic replaces the base spell with an override with the same name).
|
||||
|
||||
v1.15.6:
|
||||
|
||||
- Package new version of LibDogTag-Unit to fix an error with some units on 11.0.2
|
||||
|
||||
v1.15.5:
|
||||
|
||||
- Fix error when using an invalid spell with a custom bar on 11.x
|
||||
|
||||
v1.15.4:
|
||||
|
||||
- Update TOC for TWW
|
||||
|
||||
v1.15.3:
|
||||
|
||||
- Fix custom cooldown bars not working in 11.x (wowace issue #363)
|
||||
|
||||
v1.15.2:
|
||||
|
||||
- Re-enable right-click context menus on 11.x.
|
||||
- Update TOC for Classic-era
|
||||
|
||||
v1.15.1:
|
||||
|
||||
- Fix error opening options.
|
||||
|
||||
v1.15.0:
|
||||
|
||||
- Support The War Within/11.0
|
||||
- Add support for exporting and importing profiles through text.
|
||||
|