Compare commits

..

21 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
86e40187a2 Update Party hide feature for 10.0 compatibility 2022-10-25 22:42:46 -05:00
62bcc17ed6 Increase TOC to 10.0 2022-10-25 21:43:46 -05:00
52c9b51e8d Temp fix for error in 10.0
I need to find the new way to disable party frames, but this gets the addon loaded for now.
2022-10-25 21:43:13 -05:00
aa03a0b332 Add support for max power changing
Evokers can spec into an additional Essence, so we need to handle the power counter increasing/decreasing. This was a fundamental change to the class power counter, so I'm sure something else broke somewhere. A casual glance at other classes/specs seems fine, though...
2022-10-25 21:43:05 -05:00
3017b5dd18 Rename Anima Charged to Charged
Charged combo points are still a thing, but they're no longer called "Anima-charged" or relate to Kyrian.
2022-10-25 21:42:32 -05:00
1f54f7d41d Use new player castbar frame name 2022-10-25 21:42:13 -05:00
5b73d3b35f Update to correct LibDogTag url 2022-10-04 22:36:41 -05:00
decb0017f3 Update changelog 2022-10-04 22:33:35 -05:00
a32b75bf44 Update to latest packager example 2022-09-22 11:01:21 -05:00
6c506579be Add Wago packaging support 2022-09-22 10:46:11 -05:00
26 changed files with 499 additions and 107 deletions

View File

@ -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

View File

@ -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
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
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,7 +386,7 @@ 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()
@ -381,12 +406,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)
@ -406,7 +479,7 @@ end
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
spell, rank, displayName, icon, startTime, endTime, isTradeSkill = UnitCastingInfo(self.unit)
else
@ -416,7 +489,24 @@ 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
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
@ -465,6 +555,7 @@ function IceCastBar.prototype:StopBar()
self.actionDuration = nil
self:SetBottomText1()
self:SetBottomText2()
self:SetScale(0)
self:Show(false)
end
@ -514,7 +605,8 @@ 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
@ -532,7 +624,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
@ -582,7 +674,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

View File

@ -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

View File

@ -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

View File

@ -1,5 +1,5 @@
## Interface: 90207
## Interface-Retail: 90207
## Interface: 100000
## Interface-Retail: 100000
## 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,7 @@ modules\Stagger.lua
modules\PlayerAltMana.lua
modules\ArcaneCharges.lua
modules\RollTheBones.lua
modules\EssencePower.lua
#@do-not-package@
IceHUD_Options\Json.lua

View File

@ -1,5 +1,5 @@
## Interface: 90207
## Interface-Retail: 90207
## Interface: 100000
## Interface-Retail: 100000
## Interface-Classic: 11403
## Interface-BCC: 20504
## Interface-Wrath: 30400

View File

@ -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,

View File

@ -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

View File

@ -1,5 +1,28 @@
# 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:
- 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.

View File

@ -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"/>

View File

@ -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,
},
}
}

View File

@ -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

View File

@ -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

View File

@ -142,7 +142,9 @@ function ComboPointsBar.prototype:UpdateComboPoints(...)
end
self:SetBottomText1(points or "0")
self:SetBottomText2(self.chargedPowerPointIndex)
if self.chargedPowerPointIndex then
self:SetBottomText2(self.chargedPowerPointIndex)
end
end
function ComboPointsBar.prototype:Update()

View File

@ -329,16 +329,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

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

@ -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")
@ -1421,43 +1418,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()

View File

@ -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

View File

@ -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)

View File

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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -1,18 +1,20 @@
# Changelog
v1.13.17.2:
v1.14.3:
- Fixed Runes disappearing for Death Knights on Wrath Classic when using the dual spec feature.
- Add Spell ID support for aura tracking.
- Add Evoker support.
- Add Empowered Casting (hold-to-cast levels) support.
v1.13.17.1:
v1.14.2:
- Fixed Priests hanging on login on the retail client.
- Fix CC and Invuln modules not showing immediately when they should.
v1.13.17:
v1.14.1:
- 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 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.