mirror of
https://github.com/parnic/ice-hud.git
synced 2025-06-16 22:51:53 -05:00
Compare commits
43 Commits
Author | SHA1 | Date | |
---|---|---|---|
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
|
13
.github/workflows/release.yml
vendored
13
.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,25 +32,27 @@ jobs:
|
||||
|
||||
# we first have to clone the AddOn project, this is a required step
|
||||
- name: Clone project
|
||||
uses: actions/checkout@v1
|
||||
uses: actions/checkout@v3
|
||||
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@master
|
||||
uses: BigWigsMods/packager@v2
|
||||
with:
|
||||
args: -g wrath -w 0
|
||||
|
9
.pkgmeta
9
.pkgmeta
@ -37,15 +37,18 @@ externals:
|
||||
libs/AceLocale-3.0:
|
||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceLocale-3.0
|
||||
tag: latest
|
||||
libs/AceHook-3.0:
|
||||
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceHook-3.0
|
||||
tag: latest
|
||||
libs/LibRangeCheck-2.0:
|
||||
url: https://github.com/WeakAuras/LibRangeCheck-2.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:
|
||||
@ -65,6 +68,8 @@ tools-used:
|
||||
|
||||
ignore:
|
||||
- readme.md
|
||||
- FUNDING.yml
|
||||
- this_version.md
|
||||
|
||||
manual-changelog: this_version.md
|
||||
|
||||
|
3
FUNDING.yml
Normal file
3
FUNDING.yml
Normal file
@ -0,0 +1,3 @@
|
||||
github: parnic
|
||||
ko_fi: parnic
|
||||
custom: "https://www.paypal.me/parnic"
|
158
IceCastBar.lua
158
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
|
||||
@ -49,6 +49,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 +116,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
|
||||
@ -311,7 +324,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 +341,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 +360,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
|
||||
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,13 +386,15 @@ function IceCastBar.prototype:MyOnUpdate()
|
||||
self.action == IceCastBar.Actions.Success or
|
||||
self.action == IceCastBar.Actions.Failure)
|
||||
then
|
||||
local scale = time - self.actionStartTime
|
||||
local scale = GetTime() - self.actionStartTime
|
||||
|
||||
if (scale > 1) then
|
||||
self:StopBar()
|
||||
return
|
||||
end
|
||||
|
||||
self:UpdateBar(1, self:GetCurrentCastingColor())
|
||||
|
||||
if (self.action == IceCastBar.Actions.Failure) then
|
||||
self:FlashBar("CastFail", 1-scale, self.actionMessage, "CastFail")
|
||||
else
|
||||
@ -381,12 +408,60 @@ 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)
|
||||
@ -405,8 +480,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 +491,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 +520,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,6 +561,7 @@ function IceCastBar.prototype:StopBar()
|
||||
self.actionDuration = nil
|
||||
|
||||
self:SetBottomText1()
|
||||
self:SetBottomText2()
|
||||
self:SetScale(0)
|
||||
self:Show(false)
|
||||
end
|
||||
@ -499,7 +596,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 +611,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 +631,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 +646,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 +660,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 +681,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
|
||||
|
||||
@ -595,7 +694,7 @@ function IceCastBar.prototype:SpellCastSucceeded(event, unit, castGuid, 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.. self:GetShortRank(rank), spellId)
|
||||
return
|
||||
end
|
||||
|
||||
@ -608,7 +707,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.. self:GetShortRank(rank), spellId)
|
||||
end
|
||||
|
||||
|
||||
|
@ -284,6 +284,8 @@ function IceCore.prototype:Enable(userToggle)
|
||||
self.IceHUDFrame:RegisterEvent("ZONE_CHANGED")
|
||||
end
|
||||
self.IceHUDFrame:RegisterEvent("UNIT_AURA")
|
||||
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
|
||||
@ -643,10 +645,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
|
||||
}
|
||||
|
@ -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")
|
||||
|
63
IceHUD.lua
63
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
|
||||
|
||||
@ -36,6 +36,7 @@ else
|
||||
end
|
||||
|
||||
-- compatibility/feature flags
|
||||
IceHUD.GetPlayerAuraBySpellID = _G["C_UnitAuras"] and C_UnitAuras.GetPlayerAuraBySpellID
|
||||
IceHUD.SpellFunctionsReturnRank = IceHUD.WowMain and IceHUD.WowVer < 80000
|
||||
IceHUD.EventExistsPlayerPetChanged = IceHUD.WowMain and IceHUD.WowVer < 80000
|
||||
IceHUD.EventExistsPetBarChanged = IceHUD.WowMain and IceHUD.WowVer < 80000
|
||||
@ -494,6 +495,16 @@ function IceHUD:GetAuraCount(auraType, unit, ability, onlyMine, matchByName)
|
||||
return 0
|
||||
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
|
||||
else
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
local i = 1
|
||||
local name, _, texture, applications
|
||||
if IceHUD.SpellFunctionsReturnRank then
|
||||
@ -963,3 +974,53 @@ UIDropDownMenu_Initialize(IceHUD_UnitFrame_DropDown, function()
|
||||
UnitPopup_ShowMenu(IceHUD_UnitFrame_DropDown, menu, IceHUD.DropdownUnit, nil, id)
|
||||
end
|
||||
end, "MENU", nil)
|
||||
|
||||
function IceHUD:OutOfCombatWrapper(func)
|
||||
return function(...)
|
||||
return IceHUD:RunOnLeaveCombat(func, ...)
|
||||
end
|
||||
end
|
||||
|
||||
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
|
||||
|
@ -1,5 +1,5 @@
|
||||
## Interface: 90207
|
||||
## Interface-Retail: 90207
|
||||
## Interface: 100002
|
||||
## Interface-Retail: 100002
|
||||
## Interface-Classic: 11403
|
||||
## Interface-BCC: 20504
|
||||
## Interface-Wrath: 30400
|
||||
@ -19,6 +19,7 @@
|
||||
## X-Website: https://www.wowace.com/projects/ice-hud
|
||||
## X-Curse-Project-ID: 5394
|
||||
## X-WoWI-ID: 8149
|
||||
## X-Wago-ID: 5bGolJN0
|
||||
|
||||
#@no-lib-strip@
|
||||
# Libraries
|
||||
@ -98,6 +99,8 @@ modules\Stagger.lua
|
||||
modules\PlayerAltMana.lua
|
||||
modules\ArcaneCharges.lua
|
||||
modules\RollTheBones.lua
|
||||
modules\EssencePower.lua
|
||||
modules\DruidEnergy.lua
|
||||
|
||||
#@do-not-package@
|
||||
IceHUD_Options\Json.lua
|
||||
|
@ -1,5 +1,5 @@
|
||||
## Interface: 90207
|
||||
## Interface-Retail: 90207
|
||||
## Interface: 100002
|
||||
## Interface-Retail: 100002
|
||||
## Interface-Classic: 11403
|
||||
## Interface-BCC: 20504
|
||||
## Interface-Wrath: 30400
|
||||
|
@ -85,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.]]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -52,7 +52,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,
|
||||
|
@ -87,7 +87,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 +105,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 +127,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
|
||||
}
|
||||
@ -278,14 +282,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
|
||||
|
2
LICENSE
2
LICENSE
@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 parnic
|
||||
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
|
||||
|
64
changelog.md
64
changelog.md
@ -1,5 +1,69 @@
|
||||
# Changelog
|
||||
|
||||
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.
|
||||
|
@ -11,6 +11,7 @@
|
||||
<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"/>
|
||||
|
@ -3,6 +3,11 @@ local CastBar = IceCore_CreateClass(IceCastBar)
|
||||
|
||||
local IceHUD = _G.IceHUD
|
||||
|
||||
local CastingBarFrame = CastingBarFrame
|
||||
if not CastingBarFrame then
|
||||
CastingBarFrame = PlayerCastingBarFrame
|
||||
end
|
||||
|
||||
CastBar.prototype.spellCastSent = nil
|
||||
|
||||
-- Constructor --
|
||||
@ -34,6 +39,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 +239,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 +312,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,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -462,12 +462,19 @@ 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(self:GetPowerEvent(), "UpdateRunePower")
|
||||
self:RegisterEvent("UNIT_DISPLAYPOWER", "UpdateRunePower")
|
||||
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 +497,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
|
||||
|
||||
@ -567,11 +588,7 @@ 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()
|
||||
end
|
||||
self:HideRune(i)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -592,6 +609,19 @@ function IceClassPowerCounter.prototype:UpdateRunePower(event, arg1, arg2)
|
||||
end
|
||||
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
|
||||
@ -717,6 +747,9 @@ 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)
|
||||
@ -758,7 +791,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
|
||||
|
@ -21,7 +21,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
|
||||
|
||||
@ -222,16 +222,16 @@ function ComboPoints.prototype:GetOptions()
|
||||
order = 35
|
||||
}
|
||||
|
||||
opts["bShowAnimaCharged"] = {
|
||||
opts["bShowCharged"] = {
|
||||
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."],
|
||||
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.bShowAnimaCharged
|
||||
return self.moduleSettings.bShowCharged
|
||||
end,
|
||||
set = function(info, v)
|
||||
self.moduleSettings.bShowAnimaCharged = v
|
||||
self.moduleSettings.bShowCharged = v
|
||||
self:UpdateChargedComboPoints()
|
||||
end,
|
||||
disabled = function()
|
||||
@ -261,7 +261,7 @@ function ComboPoints.prototype:GetDefaultSettings()
|
||||
defaults["comboGap"] = 0
|
||||
defaults["showAnticipation"] = true
|
||||
defaults["bShowWithNoTarget"] = true
|
||||
defaults["bShowAnimaCharged"] = true
|
||||
defaults["bShowCharged"] = true
|
||||
return defaults
|
||||
end
|
||||
|
||||
@ -440,8 +440,8 @@ function ComboPoints.prototype:CreateComboFrame(forceTextureUpdate)
|
||||
g = g - ((1 / maxComboPoints)*i)
|
||||
end
|
||||
|
||||
if self.moduleSettings.bShowAnimaCharged and self:IsAnimaChargedPoint(i) 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
|
||||
@ -489,7 +489,7 @@ function ComboPoints.prototype:CreateComboFrame(forceTextureUpdate)
|
||||
end
|
||||
end
|
||||
|
||||
function ComboPoints.prototype:IsAnimaChargedPoint(point)
|
||||
function ComboPoints.prototype:IsChargedPoint(point)
|
||||
if not self.chargedPowerPoints then
|
||||
return false
|
||||
end
|
||||
@ -545,6 +545,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
|
||||
|
@ -11,6 +11,7 @@ function ComboPointsBar.prototype:init()
|
||||
|
||||
self:SetDefaultColor("ComboPointsBarMin", 1, 1, 0)
|
||||
self:SetDefaultColor("ComboPointsBarMax", 0, 1, 0)
|
||||
self:SetDefaultColor("ChargedComboPointBar", 0.3137254901960784, 0.3725490196078432, 1)
|
||||
|
||||
self.bTreatEmptyAsFull = true
|
||||
end
|
||||
@ -52,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
|
||||
|
||||
@ -62,6 +83,7 @@ function ComboPointsBar.prototype:GetDefaultSettings()
|
||||
defaults.alwaysDisplay = false
|
||||
defaults.desiredLerpTime = 0.05
|
||||
defaults.bShowWithNoTarget = true
|
||||
defaults.bShowCharged = true
|
||||
return defaults
|
||||
end
|
||||
|
||||
@ -84,17 +106,7 @@ function ComboPointsBar.prototype:Enable(core)
|
||||
end
|
||||
|
||||
if GetUnitChargedPowerPoints then
|
||||
self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateChargedComboPoints")
|
||||
end
|
||||
|
||||
self:UpdateChargedComboPoints()
|
||||
end
|
||||
|
||||
function ComboPointsBar.prototype:UpdateChargedComboPoints()
|
||||
if GetUnitChargedPowerPoints then
|
||||
local chargedPowerPoints = GetUnitChargedPowerPoints("player")
|
||||
self.chargedPowerPointIndex = chargedPowerPoints and chargedPowerPoints[1]
|
||||
self:UpdateComboPoints()
|
||||
self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateComboPoints")
|
||||
end
|
||||
end
|
||||
|
||||
@ -131,18 +143,46 @@ function ComboPointsBar.prototype:UpdateComboPoints(...)
|
||||
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,7 @@ 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"]}
|
||||
|
||||
IceCustomBar.prototype.auraDuration = -1
|
||||
IceCustomBar.prototype.auraEndTime = -1
|
||||
@ -28,6 +29,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
|
||||
@ -149,8 +160,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
|
||||
@ -329,16 +339,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 +441,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"] = {
|
||||
@ -864,9 +877,16 @@ function IceCustomBar.prototype:Show(bShouldShow, bForceHide)
|
||||
return
|
||||
end
|
||||
|
||||
if self.moduleSettings.displayWhenTargeting and self.target 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
|
||||
IceCustomBar.super.prototype.Show(self, not bShouldShow)
|
||||
elseif self.moduleSettings.displayMode == displayModes.WHEN_TARGETING and self.target then
|
||||
IceCustomBar.super.prototype.Show(self, true)
|
||||
elseif self.moduleSettings.displayWhenEmpty then
|
||||
elseif self.moduleSettings.displayMode == displayModes.ALWAYS then
|
||||
if not self.bIsVisible then
|
||||
IceCustomBar.super.prototype.Show(self, true)
|
||||
end
|
||||
|
@ -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
|
||||
|
123
modules/DruidEnergy.lua
Normal file
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
|
74
modules/EssencePower.lua
Normal file
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
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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()
|
||||
@ -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")
|
||||
@ -1279,6 +1276,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
|
||||
@ -1421,43 +1420,78 @@ function PlayerHealth.prototype:HideBlizz()
|
||||
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()
|
||||
if self.combat then
|
||||
self.pendingBlizzardPartyHide = true
|
||||
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,7 +115,9 @@ end
|
||||
|
||||
function PlayerInfo.prototype:ShowBlizz()
|
||||
BuffFrame:Show()
|
||||
TemporaryEnchantFrame:Show()
|
||||
if TemporaryEnchantFrame then
|
||||
TemporaryEnchantFrame:Show()
|
||||
end
|
||||
|
||||
BuffFrame:GetScript("OnLoad")(BuffFrame)
|
||||
end
|
||||
@ -123,7 +125,9 @@ end
|
||||
|
||||
function PlayerInfo.prototype:HideBlizz()
|
||||
BuffFrame:Hide()
|
||||
TemporaryEnchantFrame:Hide()
|
||||
if TemporaryEnchantFrame then
|
||||
TemporaryEnchantFrame:Hide()
|
||||
end
|
||||
|
||||
BuffFrame:UnregisterAllEvents()
|
||||
end
|
||||
|
@ -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"
|
||||
|
@ -274,7 +274,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()
|
||||
@ -296,13 +296,14 @@ 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)
|
||||
|
@ -3,6 +3,8 @@ 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
|
||||
@ -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()
|
||||
@ -577,6 +584,10 @@ local function hook_playerframe()
|
||||
end
|
||||
|
||||
function Runes.prototype:HideBlizz()
|
||||
if not PlayerFrame_HideVehicleTexture then
|
||||
return
|
||||
end
|
||||
|
||||
RuneFrame:Hide()
|
||||
RuneFrame:UnregisterAllEvents()
|
||||
|
||||
|
@ -103,7 +103,7 @@ end
|
||||
|
||||
-- Load us up
|
||||
local _, unitClass = UnitClass("player")
|
||||
if (unitClass == "PRIEST" and PriestBarFrame) then
|
||||
if (unitClass == "PRIEST" and IceHUD.WowVer >= 50000 and IceHUD.WowVer < 70000) then
|
||||
IceHUD.ShadowOrbs = ShadowOrbs:new()
|
||||
end
|
||||
|
||||
|
@ -277,7 +277,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()
|
||||
@ -312,13 +312,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)
|
||||
|
@ -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
|
||||
|
@ -375,11 +375,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)
|
||||
|
@ -841,6 +841,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
|
||||
|
@ -191,11 +191,12 @@ 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 or not self.lastUpdateTime then
|
||||
self.buffName, self.buffDuration, self.buffRemaining = self:GetMaxbuffDuration(self.unit, self.buffList)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -1,10 +1,53 @@
|
||||
# Changelog
|
||||
|
||||
v1.13.17:
|
||||
v1.14.10:
|
||||
|
||||
- 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.
|
||||
- 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.
|
||||
|
Reference in New Issue
Block a user