Compare commits

...

11 Commits

Author SHA1 Message Date
6a985bc67a Add Evoker, empowered casting support 2022-11-11 11:29:15 -06:00
3a5e58bf34 Add Spell ID support for aura tracking (#31) 2022-11-06 08:34:01 -06:00
b467af21c0 Fix CC and Invuln not showing immediately
This is the same fix as was applied to RollTheBones in commit 46883e355b but I failed to audit the rest of the mod for places where this was possible. This one was reported over on the Curse addon page comments.
2022-10-31 23:36:38 -05:00
acc400de6e Fix error on Classic with Hide Party
I neglected to test the new party-hide implementation on pre-10.0. It was not fully implemented. This implementation is from Pitbull4 and is more complicated than I need, but certainly does the job and allows for some future usage if needed.

Fixes wowace ticket #330
2022-10-30 23:21:31 -05:00
cac0deeb3c Update license with current year 2022-10-28 22:48:37 -05:00
e951d40b12 Don't package file just meant to help packager 2022-10-28 22:48:31 -05:00
46883e355b Fix RollTheBones not showing immediately when cast
I guess UNIT_AURA now provides a third argument that it wasn't before. So instead of relying on a third argument, just override the event name to something we control and key off that for avoiding updates.
2022-10-28 22:44:38 -05:00
004df582ef Update changelog 2022-10-27 20:34:19 -05:00
b8cf6e90b0 Fix error on 10.0
I guess this frame is gone. I don't remember why this was necessary.
2022-10-27 20:32:47 -05:00
d0c06c7b55 Add sponsor file 2022-10-27 09:09:50 -05:00
8858459b10 Disable Runes Hide Blizzard option
This is no longer functional in 10.0 and I can't find an easy replacement, so I'm removing the functionality for 10.0+ for now. The entire player frame can still be hidden, which also hides the runes, so I don't feel like this is super critical to have.

Fixes #26
2022-10-27 08:56:53 -05:00
22 changed files with 397 additions and 53 deletions

View File

@ -37,6 +37,9 @@ externals:
libs/AceLocale-3.0: libs/AceLocale-3.0:
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceLocale-3.0 url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceLocale-3.0
tag: latest tag: latest
libs/AceHook-3.0:
url: svn://svn.wowace.com/wow/ace3/mainline/trunk/AceHook-3.0
tag: latest
libs/LibRangeCheck-2.0: libs/LibRangeCheck-2.0:
url: https://github.com/WeakAuras/LibRangeCheck-2.0/ url: https://github.com/WeakAuras/LibRangeCheck-2.0/
libs/LibSharedMedia-3.0: libs/LibSharedMedia-3.0:
@ -65,6 +68,8 @@ tools-used:
ignore: ignore:
- readme.md - readme.md
- FUNDING.yml
- this_version.md
manual-changelog: this_version.md manual-changelog: this_version.md

3
FUNDING.yml Normal file
View File

@ -0,0 +1,3 @@
github: parnic
ko_fi: parnic
custom: "https://www.paypal.me/parnic"

View File

@ -3,7 +3,7 @@ IceCastBar = IceCore_CreateClass(IceBarElement)
local IceHUD = _G.IceHUD 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.action = nil
IceCastBar.prototype.actionStartTime = nil IceCastBar.prototype.actionStartTime = nil
@ -49,6 +49,13 @@ function IceCastBar.prototype:init(name)
self:SetDefaultColor("CastChanneling", 242, 242, 10) self:SetDefaultColor("CastChanneling", 242, 242, 10)
self:SetDefaultColor("CastSuccess", 242, 242, 70) self:SetDefaultColor("CastSuccess", 242, 242, 70)
self:SetDefaultColor("CastFail", 1, 0, 0) 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.unit = "player"
self.delay = 0 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_UPDATE", "SpellCastChannelUpdate") -- unit, spell, rank
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", "SpellCastChannelStop") -- 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 end
self:Show(false) self:Show(false)
end end
@ -311,7 +324,13 @@ function IceCastBar.prototype:PositionIcons()
self.barFrame.icon:SetHeight(AuraIconHeight * self.moduleSettings.auraIconScale) self.barFrame.icon:SetHeight(AuraIconHeight * self.moduleSettings.auraIconScale)
end 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 -- OnUpdate handler
function IceCastBar.prototype:MyOnUpdate() function IceCastBar.prototype:MyOnUpdate()
@ -322,17 +341,15 @@ function IceCastBar.prototype:MyOnUpdate()
return return
end end
local time = GetTime()
self:Update() self:Update()
self:SetTextAlpha() self:SetTextAlpha()
-- handle casting and channeling -- handle casting and channeling
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
local remainingTime = self.actionStartTime + self.actionDuration - time local remainingTime = self:GetRemainingCastTime()
local scale = 1 - (self.actionDuration ~= 0 and remainingTime / self.actionDuration or 0) 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 scale = self.actionDuration ~= 0 and remainingTime / self.actionDuration or 0
end end
@ -343,14 +360,22 @@ function IceCastBar.prototype:MyOnUpdate()
end end
local timeString = self.moduleSettings.showCastTime and string.format("%.1fs ", remainingTime) or "" 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 return
end end
-- stop bar if casting or channeling is done (in theory this should not be needed) -- 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() self:StopBar()
return return
end end
@ -361,7 +386,7 @@ function IceCastBar.prototype:MyOnUpdate()
self.action == IceCastBar.Actions.Success or self.action == IceCastBar.Actions.Success or
self.action == IceCastBar.Actions.Failure) self.action == IceCastBar.Actions.Failure)
then then
local scale = time - self.actionStartTime local scale = GetTime() - self.actionStartTime
if (scale > 1) then if (scale > 1) then
self:StopBar() self:StopBar()
@ -381,12 +406,60 @@ function IceCastBar.prototype:MyOnUpdate()
self:StopBar() self:StopBar()
end end
function IceCastBar.prototype:GetCurrentCastingColor() function IceCastBar.prototype:GetStageDuration(stage)
local updateColor = "CastCasting" if not GetUnitEmpowerMinHoldTime then
if self.action == IceCastBar.Actions.Channel then return 0
updateColor = "CastChanneling"
end 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 end
function IceCastBar.prototype:FlashBar(color, alpha, text, textColor) function IceCastBar.prototype:FlashBar(color, alpha, text, textColor)
@ -406,7 +479,7 @@ end
function IceCastBar.prototype:StartBar(action, message) function IceCastBar.prototype:StartBar(action, message)
local spell, rank, displayName, icon, startTime, endTime, isTradeSkill local spell, rank, displayName, icon, startTime, endTime, isTradeSkill, numStages
if IceHUD.SpellFunctionsReturnRank then if IceHUD.SpellFunctionsReturnRank then
spell, rank, displayName, icon, startTime, endTime, isTradeSkill = UnitCastingInfo(self.unit) spell, rank, displayName, icon, startTime, endTime, isTradeSkill = UnitCastingInfo(self.unit)
else else
@ -416,7 +489,24 @@ function IceCastBar.prototype:StartBar(action, message)
if IceHUD.SpellFunctionsReturnRank then if IceHUD.SpellFunctionsReturnRank then
spell, rank, displayName, icon, startTime, endTime = UnitChannelInfo(self.unit) spell, rank, displayName, icon, startTime, endTime = UnitChannelInfo(self.unit)
else else
spell, displayName, icon, startTime, endTime = UnitChannelInfo(self.unit) spell, displayName, icon, startTime, endTime, isTradeSkill, _, _, _, numStages = UnitChannelInfo(self.unit)
end
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
end end
@ -465,6 +555,7 @@ function IceCastBar.prototype:StopBar()
self.actionDuration = nil self.actionDuration = nil
self:SetBottomText1() self:SetBottomText1()
self:SetBottomText2()
self:SetScale(0) self:SetScale(0)
self:Show(false) self:Show(false)
end end
@ -514,7 +605,8 @@ function IceCastBar.prototype:SpellCastStop(event, unit, castGuid, spellId)
if (self.action ~= IceCastBar.Actions.Success and if (self.action ~= IceCastBar.Actions.Success and
self.action ~= IceCastBar.Actions.Failure and self.action ~= IceCastBar.Actions.Failure and
self.action ~= IceCastBar.Actions.Channel) self.action ~= IceCastBar.Actions.Channel and
self.action ~= IceCastBar.Actions.ReverseChannel)
then then
self:StopBar() self:StopBar()
self.current = nil self.current = nil
@ -532,7 +624,7 @@ function IceCastBar.prototype:SpellCastFailed(event, unit, castGuid, spellId)
end end
-- channeled spells will call ChannelStop, not cast failed -- 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 return
end end
@ -582,7 +674,7 @@ function IceCastBar.prototype:SpellCastSucceeded(event, unit, castGuid, spellId)
--IceHUD:Debug("SpellCastSucceeded", unit, castGuid, spellId) --IceHUD:Debug("SpellCastSucceeded", unit, castGuid, spellId)
-- never show on channeled (why on earth does this event even fire when channeling starts?) -- 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 return
end end

View File

@ -284,6 +284,8 @@ function IceCore.prototype:Enable(userToggle)
self.IceHUDFrame:RegisterEvent("ZONE_CHANGED") self.IceHUDFrame:RegisterEvent("ZONE_CHANGED")
end end
self.IceHUDFrame:RegisterEvent("UNIT_AURA") 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, ...) self.IceHUDFrame:SetScript("OnEvent", function(self, event, ...)
if (event == "PET_BATTLE_OPENING_START") then if (event == "PET_BATTLE_OPENING_START") then
if IceHUD.IceCore.settings.bHideDuringPetBattles then if IceHUD.IceCore.settings.bHideDuringPetBattles then

View File

@ -1,5 +1,5 @@
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false) 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 local IceHUD = IceHUD
@ -36,6 +36,7 @@ else
end end
-- compatibility/feature flags -- compatibility/feature flags
IceHUD.GetPlayerAuraBySpellID = _G["C_UnitAuras"] and C_UnitAuras.GetPlayerAuraBySpellID
IceHUD.SpellFunctionsReturnRank = IceHUD.WowMain and IceHUD.WowVer < 80000 IceHUD.SpellFunctionsReturnRank = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsPlayerPetChanged = IceHUD.WowMain and IceHUD.WowVer < 80000 IceHUD.EventExistsPlayerPetChanged = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsPetBarChanged = 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 return 0
end 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 i = 1
local name, _, texture, applications local name, _, texture, applications
if IceHUD.SpellFunctionsReturnRank then if IceHUD.SpellFunctionsReturnRank then
@ -963,3 +974,53 @@ UIDropDownMenu_Initialize(IceHUD_UnitFrame_DropDown, function()
UnitPopup_ShowMenu(IceHUD_UnitFrame_DropDown, menu, IceHUD.DropdownUnit, nil, id) UnitPopup_ShowMenu(IceHUD_UnitFrame_DropDown, menu, IceHUD.DropdownUnit, nil, id)
end end
end, "MENU", nil) 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

View File

@ -99,6 +99,7 @@ modules\Stagger.lua
modules\PlayerAltMana.lua modules\PlayerAltMana.lua
modules\ArcaneCharges.lua modules\ArcaneCharges.lua
modules\RollTheBones.lua modules\RollTheBones.lua
modules\EssencePower.lua
#@do-not-package@ #@do-not-package@
IceHUD_Options\Json.lua IceHUD_Options\Json.lua

View File

@ -52,7 +52,13 @@ function IceStackCounter_GetOptions(frame, opts)
opts["auraName"] = { opts["auraName"] = {
type = 'input', type = 'input',
name = L["Aura to track"], 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() get = function()
return frame.moduleSettings.auraName return frame.moduleSettings.auraName
end, end,

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2021 parnic Copyright (c) 2021-2022 parnic
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,5 +1,24 @@
# Changelog # Changelog
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: v1.13.17.3:
- Packaged latest LibDogTag-Unit to work around crash in Wrath Classic client. - Packaged latest LibDogTag-Unit to work around crash in Wrath Classic client.

View File

@ -11,6 +11,7 @@
<Include file="libs\AceConsole-3.0\AceConsole-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\AceAddon-3.0\AceAddon-3.0.xml"/>
<Include file="libs\AceLocale-3.0\AceLocale-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-3.0\lib.xml"/>
<Include file="libs\LibDogTag-Unit-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-2.0\LibRangeCheck-2.0.lua"/>

View File

@ -39,6 +39,9 @@ function CastBar.prototype:GetDefaultSettings()
settings["rangeColor"] = true settings["rangeColor"] = true
settings["bAllowExpand"] = false settings["bAllowExpand"] = false
settings["respectLagTolerance"] = true settings["respectLagTolerance"] = true
settings["lockUpperTextAlpha"] = true
settings["lockLowerTextAlpha"] = true
settings["empowerStageTextDisplay"] = "TOPLINE"
return settings return settings
end end
@ -236,6 +239,7 @@ function CastBar.prototype:GetOptions()
end, end,
set = function(info, v) set = function(info, v)
self.moduleSettings.lockUpperTextAlpha = v self.moduleSettings.lockUpperTextAlpha = v
self.moduleSettings.lockLowerTextAlpha = v
self:Redraw() self:Redraw()
end, end,
order = 13 order = 13
@ -308,7 +312,26 @@ function CastBar.prototype:GetOptions()
disabled = function() disabled = function()
return not self.moduleSettings.enabled return not self.moduleSettings.enabled
end, 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,
},
} }
} }

View File

@ -462,10 +462,14 @@ function IceClassPowerCounter.prototype:CheckValidSpec()
end end
end end
function IceClassPowerCounter.prototype:GetPowerEvent()
return IceHUD.UnitPowerEvent
end
function IceClassPowerCounter.prototype:DisplayCounter() function IceClassPowerCounter.prototype:DisplayCounter()
self:UnregisterEvent("PLAYER_LEVEL_UP") self:UnregisterEvent("PLAYER_LEVEL_UP")
self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateRunePower") self:RegisterEvent(self:GetPowerEvent(), "UpdateRunePower")
self:RegisterEvent("UNIT_DISPLAYPOWER", "UpdateRunePower") self:RegisterEvent("UNIT_DISPLAYPOWER", "UpdateRunePower")
self:RegisterEvent("PLAYER_ENTERING_WORLD", "EnteringWorld") self:RegisterEvent("PLAYER_ENTERING_WORLD", "EnteringWorld")
if IceHUD.EventExistsUnitMaxPower then if IceHUD.EventExistsUnitMaxPower then
@ -493,7 +497,7 @@ function IceClassPowerCounter.prototype:EnteringWorld()
end end
function IceClassPowerCounter.prototype:UpdateRunePower(event, arg1, arg2) 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 return
end end

View File

@ -329,16 +329,18 @@ function IceCustomBar.prototype:GetOptions()
opts["buffToTrack"] = { opts["buffToTrack"] = {
type = 'input', type = 'input',
name = L["Aura to track"], 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() get = function()
return self.moduleSettings.buffToTrack return self.moduleSettings.buffToTrack
end, end,
set = function(info, v) set = function(info, v)
local orig = 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 if v == nil then
v = orig v = orig
end end

74
modules/EssencePower.lua Normal file
View 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

View File

@ -1418,6 +1418,44 @@ function PlayerHealth.prototype:HideBlizz()
PlayerFrame:SetParent(self.PlayerFrameParent) PlayerFrame:SetParent(self.PlayerFrameParent)
end 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() function PlayerHealth.prototype:HideBlizzardParty()
if self.combat then if self.combat then
self.pendingBlizzardPartyHide = true self.pendingBlizzardPartyHide = true

View File

@ -115,7 +115,9 @@ end
function PlayerInfo.prototype:ShowBlizz() function PlayerInfo.prototype:ShowBlizz()
BuffFrame:Show() BuffFrame:Show()
TemporaryEnchantFrame:Show() if TemporaryEnchantFrame then
TemporaryEnchantFrame:Show()
end
BuffFrame:GetScript("OnLoad")(BuffFrame) BuffFrame:GetScript("OnLoad")(BuffFrame)
end end
@ -123,7 +125,9 @@ end
function PlayerInfo.prototype:HideBlizz() function PlayerInfo.prototype:HideBlizz()
BuffFrame:Hide() BuffFrame:Hide()
TemporaryEnchantFrame:Hide() if TemporaryEnchantFrame then
TemporaryEnchantFrame:Hide()
end
BuffFrame:UnregisterAllEvents() BuffFrame:UnregisterAllEvents()
end end

View File

@ -274,7 +274,7 @@ end
function RollTheBones.prototype:MyOnUpdate() function RollTheBones.prototype:MyOnUpdate()
RollTheBones.super.prototype.MyOnUpdate(self) RollTheBones.super.prototype.MyOnUpdate(self)
if self.bUpdateRtb then if self.bUpdateRtb then
self:UpdateRollTheBones(nil, self.unit, true) self:UpdateRollTheBones("internal", self.unit)
end end
if self.target or self.moduleSettings.bShowWithNoTarget then if self.target or self.moduleSettings.bShowWithNoTarget then
self:UpdateDurationBar() self:UpdateDurationBar()
@ -296,13 +296,14 @@ local function ShouldHide()
return not HasSpell(193316) return not HasSpell(193316)
end end
function RollTheBones.prototype:UpdateRollTheBones(event, unit, fromUpdate) function RollTheBones.prototype:UpdateRollTheBones(event, unit)
if unit and unit ~= self.unit then if unit and unit ~= self.unit then
return return
end end
local now = GetTime() local now = GetTime()
local remaining = nil local remaining = nil
local fromUpdate = event == "internal"
if not fromUpdate then if not fromUpdate then
rtbDuration, remaining, rtbCount = self:GetBuffDuration(self.unit, RtBSet) rtbDuration, remaining, rtbCount = self:GetBuffDuration(self.unit, RtBSet)

View File

@ -134,6 +134,9 @@ function Runes.prototype:GetOptions()
disabled = function() disabled = function()
return not self.moduleSettings.enabled return not self.moduleSettings.enabled
end, end,
hidden = function()
return not PlayerFrame_HideVehicleTexture
end,
order = 32 order = 32
} }
@ -581,6 +584,10 @@ local function hook_playerframe()
end end
function Runes.prototype:HideBlizz() function Runes.prototype:HideBlizz()
if not PlayerFrame_HideVehicleTexture then
return
end
RuneFrame:Hide() RuneFrame:Hide()
RuneFrame:UnregisterAllEvents() RuneFrame:UnregisterAllEvents()

View File

@ -277,7 +277,7 @@ end
function SliceAndDice.prototype:MyOnUpdate() function SliceAndDice.prototype:MyOnUpdate()
SliceAndDice.super.prototype.MyOnUpdate(self) SliceAndDice.super.prototype.MyOnUpdate(self)
if self.bUpdateSnd then if self.bUpdateSnd then
self:UpdateSliceAndDice(nil, self.unit, true) self:UpdateSliceAndDice("internal", self.unit)
end end
if self.target or self.moduleSettings.bShowWithNoTarget then if self.target or self.moduleSettings.bShowWithNoTarget then
self:UpdateDurationBar() self:UpdateDurationBar()
@ -312,13 +312,14 @@ local function ShouldHide()
-- with different durations -- with different durations
end end
function SliceAndDice.prototype:UpdateSliceAndDice(event, unit, fromUpdate) function SliceAndDice.prototype:UpdateSliceAndDice(event, unit)
if unit and unit ~= self.unit then if unit and unit ~= self.unit then
return return
end end
local now = GetTime() local now = GetTime()
local remaining = nil local remaining = nil
local fromUpdate = event == "internal"
if not fromUpdate or IceHUD.WowVer < 30000 then if not fromUpdate or IceHUD.WowVer < 30000 then
sndDuration, remaining = self:GetBuffDuration(self.unit, sndBuffName) sndDuration, remaining = self:GetBuffDuration(self.unit, sndBuffName)

View File

@ -375,11 +375,12 @@ end
function TargetCC.prototype:MyOnUpdate() function TargetCC.prototype:MyOnUpdate()
TargetCC.super.prototype.MyOnUpdate(self) TargetCC.super.prototype.MyOnUpdate(self)
self:UpdateTargetDebuffs(nil, self.unit, true) self:UpdateTargetDebuffs("internal", self.unit)
end end
function TargetCC.prototype:UpdateTargetDebuffs(event, unit, isUpdate) function TargetCC.prototype:UpdateTargetDebuffs(event, unit)
local name, duration, remaining local name, duration, remaining
local isUpdate = event == "internal"
if not isUpdate or not self.lastUpdateTime then if not isUpdate or not self.lastUpdateTime then
self.debuffName, self.debuffDuration, self.debuffRemaining = self:GetMaxDebuffDuration(self.unit, self.debuffList) self.debuffName, self.debuffDuration, self.debuffRemaining = self:GetMaxDebuffDuration(self.unit, self.debuffList)

View File

@ -191,11 +191,12 @@ end
function TargetInvuln.prototype:MyOnUpdate() function TargetInvuln.prototype:MyOnUpdate()
TargetInvuln.super.prototype.MyOnUpdate(self) TargetInvuln.super.prototype.MyOnUpdate(self)
self:UpdateTargetBuffs(nil, self.unit, true) self:UpdateTargetBuffs("internal", self.unit)
end end
function TargetInvuln.prototype:UpdateTargetBuffs(event, unit, isUpdate) function TargetInvuln.prototype:UpdateTargetBuffs(event, unit)
local name, duration, remaining local name, duration, remaining
local isUpdate = event == "internal"
if not isUpdate or not self.lastUpdateTime then if not isUpdate or not self.lastUpdateTime then
self.buffName, self.buffDuration, self.buffRemaining = self:GetMaxbuffDuration(self.unit, self.buffList) self.buffName, self.buffDuration, self.buffRemaining = self:GetMaxbuffDuration(self.unit, self.buffList)

View File

@ -1,22 +1,20 @@
# Changelog # Changelog
v1.13.17.3: v1.14.3:
- Packaged latest LibDogTag-Unit to work around crash in Wrath Classic client. - Add Spell ID support for aura tracking.
- Add Evoker support.
- Add Empowered Casting (hold-to-cast levels) support.
v1.13.17.2: v1.14.2:
- Fixed Runes disappearing for Death Knights on Wrath Classic when using the dual spec feature. - Fix CC and Invuln modules not showing immediately when they should.
v1.13.17.1: v1.14.1:
- Fixed Priests hanging on login on the retail client. - Fix Hide Party feature on pre-10.0 clients.
v1.13.17: v1.14.0:
- Internal maintainability updates. There are so many versions of the game now, updates need to be as easy and safe as possible. - 10.0 compatibility
- Improved reliability of Slice-n-Dice predicted length when changing talents. - Renamed Anima Charged combo points to Charged, and removed specific references to Kyrian.
- 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.