Compare commits

...

29 Commits

Author SHA1 Message Date
18d827965c Update changelog 2022-09-18 23:16:04 -05:00
c2183f99a0 Add missing feature flag definition 2022-09-18 23:07:07 -05:00
7ceb70737a Fix combo points display in Classic Era 2022-09-18 22:57:01 -05:00
faa3d326aa Replace WowVer checks in class power counters 2022-09-18 22:43:04 -05:00
9fc90551e2 Fix Charged combo points feature flag 2022-09-18 22:35:19 -05:00
0af47119e3 Continue replacement of WowVer checks 2022-09-18 21:49:53 -05:00
955fa6efdc Continue replacement of WowVer checks 2022-09-18 17:54:35 -05:00
41ae17ba9a Continue replacement of WowVer checks 2022-09-18 17:50:37 -05:00
5bc1f04504 Remove HolyPower reference from most power modules 2022-09-18 15:37:01 -05:00
09e1832fbe Fix more invalid texture layers 2022-09-18 15:36:45 -05:00
7c3fc54d26 Fix invalid texture layer
This is an error in 10.0 and was wrong before that.
2022-09-18 15:36:34 -05:00
8972f7eed5 Fix MaxPower event flag
I'm not sure how this got set the way it was...the event definitely exists in > 8.0...
2022-09-18 15:36:06 -05:00
9e68edbc43 Detect SnD max changing more reliably 2022-09-18 15:34:36 -05:00
a259db6b8a Use UnitPowerMax where available 2022-09-18 15:34:27 -05:00
d10586d477 More culling of WowVer checks 2022-09-18 13:33:51 -05:00
c804ba178b Convert a few more checks into feature flags 2022-09-18 08:30:06 -05:00
f04c5db493 Re-enable dev-only profile export/import
Exporting works pretty well, but importing is rough (mostly because error messaging isn't quite in place, and it's not obvious that you have to close the window to execute the import). I found a generic json serializer, decided to adapt it to WoW, and it seems to work.

But anyway, I saw this code sitting around and figured it wouldn't take too much work to get it in working order. I was mostly right.
2022-09-02 21:44:12 -05:00
1de917223f Use new Classic expansion checks where available 2022-09-02 20:48:10 -05:00
fa064dc866 Update changelogs 2022-09-02 14:35:27 -05:00
ee72cd1f33 Add feature flag for UnitGroupRolesAssigned 2022-09-02 14:31:51 -05:00
777cf01174 Add feature flag for Heal Prediction
And turn it on for Wrath Classic, because apparently it works there.
2022-09-02 14:27:33 -05:00
97e81018c7 Update for Wrath Classic (non-BCC pre-patch)
Apparently in full-blown Wrath classic, post-BCC-pre-patch, there's a new WOW_PROJECT constant that needs to be used.
2022-09-02 14:26:54 -05:00
b65909c570 Wrath updates for Paladin GCD, Rogue SnD 2022-08-30 22:25:16 -05:00
b33a82622f Update changelogs 2022-08-30 22:03:46 -05:00
96a8fb2c3d Bump TOC for retail 2022-08-30 22:01:00 -05:00
6c623d6965 Initial Wrath-Classic compatibility
Briefly fought a training dummy with a Death Knight and a Shaman. I'm sure stuff like Slice-and-dice will need attention for talents moving around and such.
2022-08-30 21:59:58 -05:00
d31872512e Add support for blocked submenu options
Some menus, such as when targeting other players, use mixins which are themselves menus. We have to dive down one more layer to resolve those. The official UI source does this submenu thing (as opposed to recursion) so this should exactly mimic how the base game now works.
2022-06-06 09:02:43 -05:00
d424afdab1 Rework blocked menu options for 9.2.5
Since 9.2.5 completely re-worked UnitPopupMenus, IceHUD's "Set Focus" right-click menu option overrides were broken. This restores the override so that it can still suppress the tainted functionality.

Additionally, it turns out that having Clique installed replaces this entire thing somehow and makes Set Focus et al function (with IceHUD's ClickCastFrames registration). I don't know what that magic is about, but none of this munging happens and the tainted paths work fine. Interesting.

Fixes wowace ticket #319
2022-06-05 23:30:09 -05:00
9500bdf393 Fix error on BCC
Fixes #21
2022-06-01 16:26:12 -05:00
41 changed files with 814 additions and 232 deletions

View File

@ -48,3 +48,8 @@ jobs:
uses: BigWigsMods/packager@master uses: BigWigsMods/packager@master
with: with:
args: -g bcc -w 0 args: -g bcc -w 0
- name: Package and release for Wrath
uses: BigWigsMods/packager@master
with:
args: -g wrath -w 0

View File

@ -146,7 +146,7 @@ function IceCastBar.prototype:GetOptions()
end, end,
order = 39.998 order = 39.998
} }
if IceHUD.WowVer < 80000 then if IceHUD.SpellFunctionsReturnRank then
opts["showSpellRank"] = opts["showSpellRank"] =
{ {
type = 'toggle', type = 'toggle',
@ -470,7 +470,7 @@ function IceCastBar.prototype:StopBar()
end end
function IceCastBar.prototype:GetShortRank(rank) function IceCastBar.prototype:GetShortRank(rank)
if IceHUD.WowVer < 80000 and rank then if IceHUD.SpellFunctionsReturnRank and rank then
local _, _, sRank = string.find(rank, "(%d+)") local _, _, sRank = string.find(rank, "(%d+)")
if (sRank) then if (sRank) then
return " (" .. sRank .. ")" return " (" .. sRank .. ")"

View File

@ -307,7 +307,7 @@ function IceCore.prototype:Enable(userToggle)
return return
end end
if IceHUD.IceCore.settings.bHideDuringShellGame and IceHUD:HasAnyDebuff("player", {271571}) and UnitInVehicle("player") then if IceHUD.IceCore.settings.bHideDuringShellGame and IceHUD:HasAnyDebuff("player", {IceHUD.ShellGameSpellID}) and UnitInVehicle("player") then
self:RegisterEvent("UNIT_EXITED_VEHICLE") self:RegisterEvent("UNIT_EXITED_VEHICLE")
self:Hide() self:Hide()
elseif C_Map then elseif C_Map then

View File

@ -7,8 +7,6 @@ local SML = LibStub("LibSharedMedia-3.0")
local ACR = LibStub("AceConfigRegistry-3.0") local ACR = LibStub("AceConfigRegistry-3.0")
local ConfigDialog = LibStub("AceConfigDialog-3.0") local ConfigDialog = LibStub("AceConfigDialog-3.0")
local icon = LibStub("LibDBIcon-1.0", true) local icon = LibStub("LibDBIcon-1.0", true)
local AceGUI = LibStub("AceGUI-3.0")
local AceSerializer = LibStub("AceSerializer-3.0", 1)
local pendingModuleLoads = {} local pendingModuleLoads = {}
local bReadyToRegisterModules = false local bReadyToRegisterModules = false
@ -18,25 +16,49 @@ IceHUD.debugging = false
IceHUD.WowVer = select(4, GetBuildInfo()) IceHUD.WowVer = select(4, GetBuildInfo())
IceHUD.WowMain = not WOW_PROJECT_ID or WOW_PROJECT_ID == WOW_PROJECT_MAINLINE IceHUD.WowMain = not WOW_PROJECT_ID or WOW_PROJECT_ID == WOW_PROJECT_MAINLINE
if GetClassicExpansionLevel then
IceHUD.WowClassic = GetClassicExpansionLevel() == 0
IceHUD.WowClassicBC = GetClassicExpansionLevel() == 1
IceHUD.WowClassicWrath = GetClassicExpansionLevel() == 2
else
IceHUD.WowClassic = WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_CLASSIC IceHUD.WowClassic = WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_CLASSIC
IceHUD.WowClassicBC = WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_BURNING_CRUSADE_CLASSIC IceHUD.WowClassicBC = false
IceHUD.WowClassicWrath = false
if WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_BURNING_CRUSADE_CLASSIC then
if not LE_EXPANSION_LEVEL_CURRENT or LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_BURNING_CRUSADE then
IceHUD.WowClassicBC = true
elseif LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_WRATH_OF_THE_LICH_KING then
IceHUD.WowClassicWrath = true
end
elseif WOW_PROJECT_WRATH_CLASSIC and WOW_PROJECT_ID == WOW_PROJECT_WRATH_CLASSIC then
IceHUD.WowClassicWrath = true
end
end
-- compatibility/feature flags -- compatibility/feature flags
IceHUD.SpellFunctionsReturnRank = IceHUD.WowMain and IceHUD.WowVer < 80000 IceHUD.SpellFunctionsReturnRank = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsPlayerPetChanged = IceHUD.WowVer < 80000 and not IceHUD.WowClassic and not IceHUD.WowClassicBC IceHUD.EventExistsPlayerPetChanged = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsPetBarChanged = IceHUD.WowVer < 80000 and not IceHUD.WowClassic and not IceHUD.WowClassicBC IceHUD.EventExistsPetBarChanged = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsPlayerComboPoints = IceHUD.WowMain and IceHUD.WowVer < 30000 IceHUD.EventExistsPlayerComboPoints = IceHUD.WowMain and IceHUD.WowVer < 30000
IceHUD.EventExistsUnitComboPoints = IceHUD.WowMain and IceHUD.WowVer < 70000 IceHUD.EventExistsUnitComboPoints = IceHUD.WowMain and IceHUD.WowVer < 70000
IceHUD.EventExistsUnitMaxPower = IceHUD.WowMain and IceHUD.WowVer < 80000 IceHUD.EventExistsUnitMaxPower = IceHUD.WowMain and IceHUD.WowVer >= 40000
IceHUD.EventExistsGroupRosterUpdate = IceHUD.WowVer >= 50000 or IceHUD.WowClassic or IceHUD.WowClassicBC IceHUD.EventExistsGroupRosterUpdate = IceHUD.WowVer >= 50000 or not IceHUD.WowMain
IceHUD.EventExistsUnitDynamicFlags = IceHUD.WowMain and IceHUD.WowVer < 80000 IceHUD.EventExistsUnitDynamicFlags = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsUnitHealthFrequent = not IceHUD.WowMain or (IceHUD.WowVer >= 40000 and IceHUD.WowVer < 90000)
IceHUD.PerPowerEventsExist = IceHUD.WowMain and IceHUD.WowVer < 40000 IceHUD.PerPowerEventsExist = IceHUD.WowMain and IceHUD.WowVer < 40000
IceHUD.PerTargetComboPoints = IceHUD.WowVer < 60000 IceHUD.PerTargetComboPoints = IceHUD.WowVer < 60000
IceHUD.CanTrackOtherUnitBuffs = not IceHUD.WowClassic IceHUD.CanTrackOtherUnitBuffs = not IceHUD.WowClassic
IceHUD.CanTrackGCD = not IceHUD.WowClassic IceHUD.CanTrackGCD = not IceHUD.WowClassic
IceHUD.GetSpellInfoReturnsFunnel = IceHUD.WowMain and IceHUD.WowVer < 60000 IceHUD.GetSpellInfoReturnsFunnel = IceHUD.WowMain and IceHUD.WowVer < 60000
IceHUD.CanHookDestroyTotem = IceHUD.WowClassic or IceHUD.WowClassicBC IceHUD.CanHookDestroyTotem = IceHUD.WowClassic or IceHUD.WowClassicBC or IceHUD.WowClassicWrath
IceHUD.ShouldUpdateTargetHealthEveryTick = (IceHUD.WowClassic or IceHUD.WowClassicBC) and GetCVarBool("predictedHealth") IceHUD.ShouldUpdateTargetHealthEveryTick = (IceHUD.WowClassic or IceHUD.WowClassicBC) and GetCVarBool("predictedHealth")
IceHUD.UsesUIPanelButtonTemplate = IceHUD.WowVer >= 50000 or not IceHUD.WowMain
IceHUD.EventExistsSpellcastInterruptible = IceHUD.WowVer >= 30200 and not IceHUD.WowClassicWrath
IceHUD.DeathKnightUnholyFrostRunesSwapped = IceHUD.WowVer < 70300 and not IceHUD.WowClassicWrath
IceHUD.SupportsHealPrediction = IceHUD.WowVer >= 40000 or IceHUD.WowClassicWrath
IceHUD.UnitGroupRolesReturnsRoleString = IceHUD.WowVer >= 40000 or IceHUD.WowClassicWrath
IceHUD.ShellGameSpellID = 271571
IceHUD.HasShellGame = GetSpellInfo(IceHUD.ShellGameSpellID)
IceHUD.UnitPowerEvent = "UNIT_POWER_UPDATE" IceHUD.UnitPowerEvent = "UNIT_POWER_UPDATE"
@ -44,6 +66,8 @@ IceHUD.validBarList = { "Bar", "HiBar", "RoundBar", "ColorBar", "RivetBar", "Riv
"BloodGlaives", "ArcHUD", "FangRune", "DHUD", "CleanCurvesOut", "CleanTank", "PillTank", "GemTank" } "BloodGlaives", "ArcHUD", "FangRune", "DHUD", "CleanCurvesOut", "CleanTank", "PillTank", "GemTank" }
IceHUD.validCustomModules = {Bar="Buff/Debuff watcher", Counter="Buff/Debuff stack counter", CD="Cooldown bar", Health="Health bar", Mana="Mana bar", CounterBar="Stack count bar"} IceHUD.validCustomModules = {Bar="Buff/Debuff watcher", Counter="Buff/Debuff stack counter", CD="Cooldown bar", Health="Health bar", Mana="Mana bar", CounterBar="Stack count bar"}
IceHUD_UnitFrame_DropDown = CreateFrame("Frame", "IceHUD_UnitFrame_DropDown", UIParent, "UIDropDownMenuTemplate")
--@debug@ --@debug@
IceHUD.optionsLoaded = true IceHUD.optionsLoaded = true
--@end-debug@ --@end-debug@
@ -68,6 +92,43 @@ end
IceHUD.deepcopy = deepcopy IceHUD.deepcopy = deepcopy
function IceHUD:removeDefaults(db, defaults, blocker)
-- remove all metatables from the db, so we don't accidentally create new sub-tables through them
setmetatable(db, nil)
-- loop through the defaults and remove their content
for k,v in pairs(defaults) do
if type(v) == "table" and type(db[k]) == "table" then
-- if a blocker was set, dive into it, to allow multi-level defaults
self:removeDefaults(db[k], v, blocker and blocker[k])
if next(db[k]) == nil then
db[k] = nil
end
else
-- check if the current value matches the default, and that its not blocked by another defaults table
if db[k] == defaults[k] and (not blocker or blocker[k] == nil) then
db[k] = nil
end
end
end
end
function IceHUD:populateDefaults(db, defaults, blocker)
-- remove all metatables from the db, so we don't accidentally create new sub-tables through them
setmetatable(db, nil)
-- loop through the defaults and add their content
for k,v in pairs(defaults) do
if type(v) == "table" and type(db[k]) == "table" then
-- if a blocker was set, dive into it, to allow multi-level defaults
self:populateDefaults(db[k], v, blocker and blocker[k])
else
-- check if the current value matches the default, and that its not blocked by another defaults table
if db[k] == nil then
db[k] = defaults[k]
end
end
end
end
IceHUD.Location = "Interface\\AddOns\\IceHUD" IceHUD.Location = "Interface\\AddOns\\IceHUD"
StaticPopupDialogs["ICEHUD_CUSTOM_BAR_CREATED"] = StaticPopupDialogs["ICEHUD_CUSTOM_BAR_CREATED"] =
@ -343,7 +404,7 @@ end
-- blizzard interface options -- blizzard interface options
local blizOptionsPanel = CreateFrame("FRAME", "IceHUDConfigPanel", UIParent) local blizOptionsPanel = CreateFrame("FRAME", "IceHUDConfigPanel", UIParent)
blizOptionsPanel.name = "IceHUD" blizOptionsPanel.name = "IceHUD"
blizOptionsPanel.button = CreateFrame("BUTTON", "IceHUDOpenConfigButton", blizOptionsPanel, (IceHUD.WowVer >= 50000 or IceHUD.WowClassic or IceHUD.WowClassicBC) and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2") blizOptionsPanel.button = CreateFrame("BUTTON", "IceHUDOpenConfigButton", blizOptionsPanel, IceHUD.UsesUIPanelButtonTemplate and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
blizOptionsPanel.button:SetText("Open IceHUD configuration") blizOptionsPanel.button:SetText("Open IceHUD configuration")
blizOptionsPanel.button:SetWidth(240) blizOptionsPanel.button:SetWidth(240)
blizOptionsPanel.button:SetHeight(30) blizOptionsPanel.button:SetHeight(30)
@ -657,14 +718,14 @@ function IceHUD:GetIsInLFGGroup()
end end
local mode, submode local mode, submode
if IceHUD.WowVer >= 50000 then if LE_LFG_CATEGORY_LFD then
mode, submode = GetLFGMode(LE_LFG_CATEGORY_LFD) mode, submode = GetLFGMode(LE_LFG_CATEGORY_LFD)
else else
mode, submode = GetLFGMode() mode, submode = GetLFGMode()
end end
local IsInLFGGroup = CheckLFGMode(mode) local IsInLFGGroup = CheckLFGMode(mode)
if IceHUD.WowVer < 50000 then if not LE_LFG_CATEGORY_LFD then
return IsInLFGGroup return IsInLFGGroup
end end
@ -684,14 +745,17 @@ function IceHUD:GetIsInLFGGroup()
return IsInLFGGroup return IsInLFGGroup
end end
local BLACKLISTED_UNIT_MENU_OPTIONS = {}
if UnitPopupButtons then if UnitPopupButtons then
local BLACKLISTED_UNIT_MENU_OPTIONS = { BLACKLISTED_UNIT_MENU_OPTIONS = {
SET_FOCUS = "ICEHUD_SET_FOCUS", SET_FOCUS = "ICEHUD_SET_FOCUS",
CLEAR_FOCUS = "ICEHUD_CLEAR_FOCUS", CLEAR_FOCUS = "ICEHUD_CLEAR_FOCUS",
PET_DISMISS = "ICEHUD_PET_DISMISS",
LOCK_FOCUS_FRAME = true, LOCK_FOCUS_FRAME = true,
UNLOCK_FOCUS_FRAME = true, UNLOCK_FOCUS_FRAME = true,
} }
if select(2, UnitClass("player")) ~= "WARLOCK" then
BLACKLISTED_UNIT_MENU_OPTIONS[PET_DISMISS] = "ICEHUD_PET_DISMISS"
end
UnitPopupButtons["ICEHUD_SET_FOCUS"] = { UnitPopupButtons["ICEHUD_SET_FOCUS"] = {
text = L["Type %s to set focus"]:format(SLASH_FOCUS1), text = L["Type %s to set focus"]:format(SLASH_FOCUS1),
@ -710,6 +774,40 @@ if UnitPopupButtons then
tooltipText = L["Blizzard currently does not provide a proper way to right-click dismiss a pet with custom unit frames."], tooltipText = L["Blizzard currently does not provide a proper way to right-click dismiss a pet with custom unit frames."],
dist = 0, dist = 0,
} }
elseif UnitPopupSetFocusButtonMixin then
IceHUDUnitPopupSetFocusButtonMixin = CreateFromMixins(UnitPopupButtonBaseMixin)
function IceHUDUnitPopupSetFocusButtonMixin:GetText()
return L["Type %s to set focus"]:format(SLASH_FOCUS1)
end
function IceHUDUnitPopupSetFocusButtonMixin:OnClick()
end
IceHUDUnitPopupClearFocusButtonMixin = CreateFromMixins(UnitPopupButtonBaseMixin)
function IceHUDUnitPopupClearFocusButtonMixin:GetText()
return L["Type %s to clear focus"]:format(SLASH_CLEARFOCUS1)
end
function IceHUDUnitPopupClearFocusButtonMixin:OnClick()
end
IceHUDUnitPopupPetDismissButtonMixin = CreateFromMixins(UnitPopupButtonBaseMixin)
function IceHUDUnitPopupPetDismissButtonMixin:GetText()
return L["Use your Dismiss Pet spell to dismiss a pet"]
end
function IceHUDUnitPopupPetDismissButtonMixin:CanShow()
return UnitPopupPetDismissButtonMixin:CanShow()
end
function IceHUDUnitPopupPetDismissButtonMixin:OnClick()
end
BLACKLISTED_UNIT_MENU_OPTIONS[SET_FOCUS] = IceHUDUnitPopupSetFocusButtonMixin
BLACKLISTED_UNIT_MENU_OPTIONS[CLEAR_FOCUS] = IceHUDUnitPopupClearFocusButtonMixin
BLACKLISTED_UNIT_MENU_OPTIONS[LOCK_FOCUS_FRAME] = true
BLACKLISTED_UNIT_MENU_OPTIONS[UNLOCK_FOCUS_FRAME] = true
if select(2, UnitClass("player")) ~= "WARLOCK" then
BLACKLISTED_UNIT_MENU_OPTIONS[PET_DISMISS] = IceHUDUnitPopupPetDismissButtonMixin
end
end
local munged_unit_menus = {} local munged_unit_menus = {}
local function munge_unit_menu(menu) local function munge_unit_menu(menu)
@ -730,13 +828,36 @@ if UnitPopupButtons then
end end
local found = false local found = false
local _, v if data.GetMenuButtons then
local btns = data.GetMenuButtons()
for i=1, #btns do
if btns[i].IsMenu() then
local subbtns = btns[i].GetMenuButtons()
for j=1, #subbtns do
if BLACKLISTED_UNIT_MENU_OPTIONS[subbtns[j]:GetText()] then
found = true
break
end
end
else
if BLACKLISTED_UNIT_MENU_OPTIONS[btns[i]:GetText()] then
found = true
break
end
end
if found then
break
end
end
else
for _, v in ipairs(data) do for _, v in ipairs(data) do
if BLACKLISTED_UNIT_MENU_OPTIONS[v] then if BLACKLISTED_UNIT_MENU_OPTIONS[v] then
found = true found = true
break break
end end
end end
end
if not found then if not found then
-- nothing to remove or add, we're all fine here. -- nothing to remove or add, we're all fine here.
@ -745,17 +866,44 @@ if UnitPopupButtons then
end end
local new_data = {} local new_data = {}
if data.GetMenuButtons then
local new_buttons_list = {}
local btns = data.GetMenuButtons()
for i=1, #btns do
if btns[i].IsMenu() then
local subbtns = btns[i].GetMenuButtons()
for j=1, #subbtns do
local blacklisted = BLACKLISTED_UNIT_MENU_OPTIONS[subbtns[j]:GetText()]
if not blacklisted then
new_buttons_list[#new_buttons_list+1] = subbtns[j]
elseif blacklisted ~= true then
new_buttons_list[#new_buttons_list+1] = blacklisted
end
end
else
local blacklisted = BLACKLISTED_UNIT_MENU_OPTIONS[btns[i]:GetText()]
if not blacklisted then
new_buttons_list[#new_buttons_list+1] = btns[i]
elseif blacklisted ~= true then
new_buttons_list[#new_buttons_list+1] = blacklisted
end
end
end
new_data = data
function new_data:GetMenuButtons()
return new_buttons_list
end
else
for _, v in ipairs(data) do for _, v in ipairs(data) do
local blacklisted = BLACKLISTED_UNIT_MENU_OPTIONS[v] local blacklisted = BLACKLISTED_UNIT_MENU_OPTIONS[v]
if v == "PET_DISMISS" and select(2, UnitClass("player")) == "WARLOCK" then
blacklisted = false
end
if not blacklisted then if not blacklisted then
new_data[#new_data+1] = v new_data[#new_data+1] = v
elseif blacklisted ~= true then elseif blacklisted ~= true then
new_data[#new_data+1] = blacklisted new_data[#new_data+1] = blacklisted
end end
end end
end
local new_menu_name = "ICEHUD_" .. menu local new_menu_name = "ICEHUD_" .. menu
UnitPopupMenus[new_menu_name] = new_data UnitPopupMenus[new_menu_name] = new_data
@ -799,8 +947,9 @@ if UnitPopupButtons then
return "PLAYER" return "PLAYER"
end end
IceHUD_UnitFrame_DropDown = CreateFrame("Frame", "IceHUD_UnitFrame_DropDown", UIParent, "UIDropDownMenuTemplate") if UnitPopupFrames then
UnitPopupFrames[#UnitPopupFrames+1] = "IceHUD_UnitFrame_DropDown" UnitPopupFrames[#UnitPopupFrames+1] = "IceHUD_UnitFrame_DropDown"
end
IceHUD.DropdownUnit = nil IceHUD.DropdownUnit = nil
UIDropDownMenu_Initialize(IceHUD_UnitFrame_DropDown, function() UIDropDownMenu_Initialize(IceHUD_UnitFrame_DropDown, function()
@ -814,4 +963,3 @@ if UnitPopupButtons then
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)
end

View File

@ -1,7 +1,8 @@
## Interface: 90205 ## Interface: 90207
## Interface-Retail: 90205 ## Interface-Retail: 90207
## Interface-Classic: 11403 ## Interface-Classic: 11403
## Interface-BCC: 20504 ## Interface-BCC: 20504
## Interface-Wrath: 30400
## Author: Parnic, originally created by Iceroth ## Author: Parnic, originally created by Iceroth
## Name: IceHUD ## Name: IceHUD
## Title: IceHUD |cff7fff7f-Ace3-|r ## Title: IceHUD |cff7fff7f-Ace3-|r
@ -99,5 +100,8 @@ modules\ArcaneCharges.lua
modules\RollTheBones.lua modules\RollTheBones.lua
#@do-not-package@ #@do-not-package@
IceHUD_Options\Json.lua
IceHUD_Options\JsonDecode.lua
IceHUD_Options\JsonEncode.lua
IceHUD_Options\Options.lua IceHUD_Options\Options.lua
#@end-do-not-package@ #@end-do-not-package@

View File

@ -1,7 +1,8 @@
## Interface: 90205 ## Interface: 90207
## Interface-Retail: 90205 ## Interface-Retail: 90207
## Interface-Classic: 11403 ## Interface-Classic: 11403
## Interface-BCC: 20504 ## Interface-BCC: 20504
## Interface-Wrath: 30400
## Title: IceHUD |cff7fff7f-Options-|r ## Title: IceHUD |cff7fff7f-Options-|r
## Author: Parnic ## Author: Parnic
## Version: @project-version@ ## Version: @project-version@
@ -10,4 +11,7 @@
## Dependencies: IceHUD ## Dependencies: IceHUD
## LoadOnDemand: 1 ## LoadOnDemand: 1
Json.lua
JsonDecode.lua
JsonEncode.lua
Options.lua Options.lua

1
IceHUD_Options/Json.lua Normal file
View File

@ -0,0 +1 @@
IceHUD.json = {}

View File

@ -0,0 +1,241 @@
local parse
local function create_set(...)
local res = {}
for i = 1, select("#", ...) do
res[select(i, ...)] = true
end
return res
end
local space_chars = create_set(" ", "\t", "\r", "\n")
local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",")
local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u")
local literals = create_set("true", "false", "null")
local literal_map = {
["true"] = true,
["false"] = false,
["null"] = nil,
}
local function next_char(str, idx, set, negate)
for i = idx, #str do
if set[str:sub(i, i)] ~= negate then
return i
end
end
return #str + 1
end
local function decode_error(str, idx, msg)
local line_count = 1
local col_count = 1
for i = 1, idx - 1 do
col_count = col_count + 1
if str:sub(i, i) == "\n" then
line_count = line_count + 1
col_count = 1
end
end
return string.format("%s at line %d col %d", msg, line_count, col_count)
end
local function codepoint_to_utf8(n)
-- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa
local f = math.floor
if n <= 0x7f then
return string.char(n)
elseif n <= 0x7ff then
return string.char(f(n / 64) + 192, n % 64 + 128)
elseif n <= 0xffff then
return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128)
elseif n <= 0x10ffff then
return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128,
f(n % 4096 / 64) + 128, n % 64 + 128)
end
return "", string.format("invalid unicode codepoint '%x'", n)
end
local function parse_unicode_escape(s)
local n1 = tonumber(s:sub(1, 4), 16)
local n2 = tonumber(s:sub(7, 10), 16)
-- Surrogate pair?
if n2 then
return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000)
else
return codepoint_to_utf8(n1)
end
end
local function parse_string(str, i)
local res = ""
local j = i + 1
local k = j
while j <= #str do
local x = str:byte(j)
if x < 32 then
return str, j, decode_error(str, j, "control character in string")
elseif x == 92 then -- `\`: Escape
res = res .. str:sub(k, j - 1)
j = j + 1
local c = str:sub(j, j)
if c == "u" then
local hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1)
or str:match("^%x%x%x%x", j + 1)
or false
if hex == false then
return str, j-1, decode_error(str, j - 1, "invalid unicode escape in string")
end
res = res .. parse_unicode_escape(hex)
j = j + #hex
else
if not escape_chars[c] then
return str, j-1, decode_error(str, j - 1, "invalid escape char '" .. c .. "' in string")
end
res = res .. escape_char_map_inv[c]
end
k = j + 1
elseif x == 34 then -- `"`: End of string
res = res .. str:sub(k, j - 1)
return res, j + 1
end
j = j + 1
end
return str, i, decode_error(str, i, "expected closing quote for string")
end
local function parse_number(str, i)
local x = next_char(str, i, delim_chars)
local s = str:sub(i, x - 1)
local n = tonumber(s)
if not n then
return -1, -1, decode_error(str, i, "invalid number '" .. s .. "'")
end
return n, x
end
local function parse_literal(str, i)
local x = next_char(str, i, delim_chars)
local word = str:sub(i, x - 1)
if not literals[word] then
return false, -1, decode_error(str, i, "invalid literal '" .. word .. "'")
end
return literal_map[word], x
end
local function parse_array(str, i)
local res = {}
local n = 1
i = i + 1
while 1 do
local x
i = next_char(str, i, space_chars, true)
-- Empty / end of array?
if str:sub(i, i) == "]" then
i = i + 1
break
end
-- Read token
x, i = parse(str, i)
res[n] = x
n = n + 1
-- Next token
i = next_char(str, i, space_chars, true)
local chr = str:sub(i, i)
i = i + 1
if chr == "]" then break end
if chr ~= "," then return nil, -1, decode_error(str, i, "expected ']' or ','") end
end
return res, i
end
local function parse_object(str, i)
local res = {}
i = i + 1
while 1 do
local key, val
i = next_char(str, i, space_chars, true)
-- Empty / end of object?
if str:sub(i, i) == "}" then
i = i + 1
break
end
-- Read key
if str:sub(i, i) ~= '"' then
return nil, -1, decode_error(str, i, "expected string for key")
end
key, i = parse(str, i)
-- Read ':' delimiter
i = next_char(str, i, space_chars, true)
if str:sub(i, i) ~= ":" then
return nil, -1, decode_error(str, i, "expected ':' after key")
end
i = next_char(str, i + 1, space_chars, true)
-- Read value
val, i = parse(str, i)
-- Set
res[key] = val
-- Next token
i = next_char(str, i, space_chars, true)
local chr = str:sub(i, i)
i = i + 1
if chr == "}" then break end
if chr ~= "," then return nil, -1, decode_error(str, i, "expected '}' or ','") end
end
return res, i
end
local char_func_map = {
['"'] = parse_string,
["0"] = parse_number,
["1"] = parse_number,
["2"] = parse_number,
["3"] = parse_number,
["4"] = parse_number,
["5"] = parse_number,
["6"] = parse_number,
["7"] = parse_number,
["8"] = parse_number,
["9"] = parse_number,
["-"] = parse_number,
["t"] = parse_literal,
["f"] = parse_literal,
["n"] = parse_literal,
["["] = parse_array,
["{"] = parse_object,
}
parse = function(str, idx)
local chr = str:sub(idx, idx)
local f = char_func_map[chr]
if f then
return f(str, idx)
end
return false, -1, decode_error(str, idx, "unexpected character '" .. chr .. "'")
end
function IceHUD.json.decode(str)
if type(str) ~= "string" then
return nil, "expected argument of type string, got " .. type(str)
end
local res, idx, err = parse(str, next_char(str, 1, space_chars, true))
if err ~= nil then
return nil, err
end
idx = next_char(str, idx, space_chars, true)
if idx <= #str then
return nil, decode_error(str, idx, "trailing garbage")
end
return res, nil
end

View File

@ -0,0 +1,100 @@
local encode
local escape_char_map = {
["\\"] = "\\",
["\""] = "\"",
["\b"] = "b",
["\f"] = "f",
["\n"] = "n",
["\r"] = "r",
["\t"] = "t",
}
local escape_char_map_inv = { ["/"] = "/" }
for k, v in pairs(escape_char_map) do
escape_char_map_inv[v] = k
end
local function escape_char(c)
return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte()))
end
local function encode_nil(val)
return "null"
end
local function encode_table(val, stack)
local res = {}
stack = stack or {}
-- Circular reference?
if stack[val] then error("circular reference") end
stack[val] = true
if rawget(val, 1) ~= nil or next(val) == nil then
-- Treat as array -- check keys are valid and it is not sparse
local n = 0
for k in pairs(val) do
if type(k) ~= "number" then
error("invalid table: mixed or invalid key types")
end
n = n + 1
end
if n ~= #val then
error("invalid table: sparse array")
end
-- Encode
for i, v in ipairs(val) do
table.insert(res, encode(v, stack))
end
stack[val] = nil
return "[" .. table.concat(res, ",") .. "]"
else
-- Treat as an object
for k, v in pairs(val) do
if type(k) ~= "string" then
error("invalid table: mixed or invalid key types")
end
table.insert(res, encode(k, stack) .. ":" .. encode(v, stack))
end
stack[val] = nil
return "{" .. table.concat(res, ",") .. "}"
end
end
local function encode_string(val)
return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"'
end
local function encode_number(val)
-- Check for NaN, -inf and inf
if val ~= val or val <= -math.huge or val >= math.huge then
error("unexpected number value '" .. tostring(val) .. "'")
end
return string.format("%.14g", val)
end
local type_func_map = {
["nil"] = encode_nil,
["table"] = encode_table,
["string"] = encode_string,
["number"] = encode_number,
["boolean"] = tostring,
}
encode = function(val, stack)
local t = type(val)
local f = type_func_map[t]
if f then
return f(val, stack)
end
error("unexpected type '" .. t .. "'")
end
function IceHUD.json.encode(val)
return (encode(val))
end

View File

@ -1,6 +1,8 @@
local LibDualSpec = LibStub('LibDualSpec-1.0', true) local LibDualSpec = LibStub('LibDualSpec-1.0', true)
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false) local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
local icon = LibStub("LibDBIcon-1.0", true) local icon = LibStub("LibDBIcon-1.0", true)
local AceGUI = LibStub("AceGUI-3.0")
local AceSerializer = LibStub("AceSerializer-3.0", 1)
local lastCustomModule = "Bar" local lastCustomModule = "Bar"
IceHUD_Options = {} IceHUD_Options = {}
@ -421,7 +423,7 @@ The Classic game client doesn't provide this information to addons because it wa
IceHUD.IceCore.IceHUDFrame:Show() IceHUD.IceCore.IceHUDFrame:Show()
end end
end, end,
hidden = IceHUD.WowVer < 80000, hidden = not IceHUD.HasShellGame,
order = 36, order = 36,
}, },
} }
@ -757,6 +759,9 @@ function IceHUD_Options:OnLoad()
self:GenerateModuleOptions(true) self:GenerateModuleOptions(true)
self.options.args.colors.args = IceHUD.IceCore:GetColorOptions() self.options.args.colors.args = IceHUD.IceCore:GetColorOptions()
self.options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(IceHUD.db) self.options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(IceHUD.db)
--@debug@
IceHUD_Options:SetupProfileImportButtons()
--@end-debug@
-- Add dual-spec support -- Add dual-spec support
if IceHUD.db ~= nil and LibDualSpec then if IceHUD.db ~= nil and LibDualSpec then
@ -787,14 +792,14 @@ function IceHUD_Options:SetupProfileImportButtons()
editbox:SetLabel("Profile") editbox:SetLabel("Profile")
editbox:SetFullWidth(true) editbox:SetFullWidth(true)
editbox:SetFullHeight(true) editbox:SetFullHeight(true)
local profileTable = deepcopy(IceHUD.db.profile) local profileTable = IceHUD.deepcopy(IceHUD.db.profile)
IceHUD:removeDefaults(profileTable, IceHUD.IceCore.defaults.profile) IceHUD:removeDefaults(profileTable, IceHUD.IceCore.defaults.profile)
editbox:SetText(IceHUD:Serialize(profileTable)) editbox:SetText(IceHUD.json.encode(profileTable))
editbox:DisableButton(true) editbox:DisableButton(true)
frame:AddChild(editbox) frame:AddChild(editbox)
end, end,
hidden = hidden =
-- hello, snooper! this feature doesn't actually work yet, so enabling it won't help you much :) -- hello, snooper! exporting works well enough, but importing is very rough, so enable this at your own peril
--[===[@non-debug@ --[===[@non-debug@
true true
--@end-non-debug@]===] --@end-non-debug@]===]
@ -803,7 +808,7 @@ function IceHUD_Options:SetupProfileImportButtons()
--@end-debug@ --@end-debug@
, ,
disabled = disabled =
-- hello, snooper! this feature doesn't actually work yet, so enabling it won't help you much :) -- hello, snooper! exporting works well enough, but importing is very rough, so enable this at your own peril
--[===[@non-debug@ --[===[@non-debug@
true true
--@end-non-debug@]===] --@end-non-debug@]===]
@ -824,11 +829,14 @@ function IceHUD_Options:SetupProfileImportButtons()
frame:SetStatusText("Exported profile details") frame:SetStatusText("Exported profile details")
frame:SetLayout("Flow") frame:SetLayout("Flow")
frame:SetCallback("OnClose", function(widget) frame:SetCallback("OnClose", function(widget)
local success, newTable = IceHUD:Deserialize(widget.children[1]:GetText()) local newTable, err = IceHUD.json.decode(widget.children[1]:GetText())
if success then if err ~= nil then
print("failed to import profile: "..err)
else
print("importing profile")
IceHUD:PreProfileChanged() IceHUD:PreProfileChanged()
IceHUD:populateDefaults(newTable, IceHUD.IceCore.defaults.profile) IceHUD:populateDefaults(newTable, IceHUD.IceCore.defaults.profile)
IceHUD.db.profile = deepcopy(newTable) IceHUD.db.profile = IceHUD.deepcopy(newTable)
IceHUD:PostProfileChanged() IceHUD:PostProfileChanged()
end end
AceGUI:Release(widget) AceGUI:Release(widget)
@ -841,7 +849,7 @@ function IceHUD_Options:SetupProfileImportButtons()
frame:AddChild(editbox) frame:AddChild(editbox)
end, end,
hidden = hidden =
-- hello, snooper! this feature doesn't actually work yet, so enabling it won't help you much :) -- hello, snooper! this feature is really rough, so enable it at your own peril
--[===[@non-debug@ --[===[@non-debug@
true true
--@end-non-debug@]===] --@end-non-debug@]===]
@ -850,7 +858,7 @@ function IceHUD_Options:SetupProfileImportButtons()
--@end-debug@ --@end-debug@
, ,
disabled = disabled =
-- hello, snooper! this feature doesn't actually work yet, so enabling it won't help you much :) -- hello, snooper! this feature is really rough, so enable it at your own peril
--[===[@non-debug@ --[===[@non-debug@
true true
--@end-non-debug@]===] --@end-non-debug@]===]
@ -862,7 +870,3 @@ function IceHUD_Options:SetupProfileImportButtons()
} }
end end
end end
--@debug@
IceHUD_Options:SetupProfileImportButtons()
--@end-debug@

View File

@ -0,0 +1,37 @@
local function table_print(tt, indent, done)
done = done or {}
indent = indent or 0
if type(tt) == "table" then
local sb = {}
for key, value in pairs(tt) do
table.insert(sb, string.rep(" ", indent)) -- indent it
if type(value) == "table" and not done[value] then
done[value] = true
table.insert(sb, key .. " = {\n");
table.insert(sb, table_print(value, indent + 2, done))
table.insert(sb, string.rep(" ", indent)) -- indent it
table.insert(sb, "}\n");
elseif "number" == type(key) then
table.insert(sb, string.format("\"%s\"\n", tostring(value)))
else
table.insert(sb, string.format(
"%s = \"%s\"\n", tostring(key), tostring(value)))
end
end
return table.concat(sb)
else
return tt .. "\n"
end
end
local function to_string(tbl)
if "nil" == type(tbl) then
return tostring(nil)
elseif "table" == type(tbl) then
return table_print(tbl)
elseif "string" == type(tbl) then
return tbl
else
return tostring(tbl)
end
end

View File

@ -1,5 +1,36 @@
# Changelog # Changelog
v1.13.17:
- Internal maintainability updates. There are so many versions of the game now, updates need to be as easy and safe as possible.
- Improved reliability of Slice-n-Dice predicted length when changing talents.
- Improved various modules's ability to respond to the player's maximum power type changing (going from 5 max combo points to 6, for example).
- Fixed invalid texture layers specified on a variety of textures (10.0 fix).
- Removed HolyPowerNumeric text from the configuration options of several modules that it didn't belong with.
- Fixed combo points in Classic Era clients.
v1.13.16:
- Enabled Incoming Heal Prediction on Wrath-Classic.
- Added detection for the full Wrath Classic build (not just the pre-patch).
v1.13.15:
- Updated TOC for Retail (9.2.7).
- Added Wrath-Classic compatibility.
v1.13.14.3:
- Restored right-click menus on Info and Health bars when targeting other players.
v1.13.14.2:
- Restored right-click menus on Info and Health bars.
v1.13.14.1:
- Restored guard around array that doesn't exist on Classic clients.
v1.13.14: v1.13.14:
- Fixed target health updating infrequently on Classic. - Fixed target health updating infrequently on Classic.

View File

@ -61,6 +61,6 @@ end
-- Load us up -- Load us up
local _, unitClass = UnitClass("player") local _, unitClass = UnitClass("player")
if (unitClass == "MAGE" and IceHUD.WowVer >= 70000) then if (unitClass == "MAGE" and MageArcaneChargesFrame) then
IceHUD.ArcaneCharges = ArcaneCharges:new() IceHUD.ArcaneCharges = ArcaneCharges:new()
end end

View File

@ -101,7 +101,7 @@ function IceClassPowerCounter.prototype:GetOptions()
opts["displayMode"] = { opts["displayMode"] = {
type = 'select', type = 'select',
name = L["Display mode"], name = L["Display mode"],
desc = L["Choose whether you'd like a graphical or numeric representation of the runes.\n\nNOTE: The color of 'Numeric' mode can be controlled by the HolyPowerNumeric color."], desc = L["Choose whether you'd like a graphical or numeric representation of the runes."],
get = function(info) get = function(info)
return IceHUD:GetSelectValue(info, self.moduleSettings.runeMode) return IceHUD:GetSelectValue(info, self.moduleSettings.runeMode)
end, end,

View File

@ -13,13 +13,6 @@ if Enum and Enum.PowerType then
SPELL_POWER_COMBO_POINTS = Enum.PowerType.ComboPoints SPELL_POWER_COMBO_POINTS = Enum.PowerType.ComboPoints
end end
local GetUnitChargedPowerPoints = GetUnitChargedPowerPoints
if not GetUnitChargedPowerPoints then
GetUnitChargedPowerPoints = function()
return nil
end
end
-- Constructor -- -- Constructor --
function ComboPoints.prototype:init() function ComboPoints.prototype:init()
ComboPoints.super.prototype.init(self, "ComboPoints") ComboPoints.super.prototype.init(self, "ComboPoints")
@ -229,7 +222,6 @@ function ComboPoints.prototype:GetOptions()
order = 35 order = 35
} }
if IceHUD.WowVer >= 90000 then
opts["bShowAnimaCharged"] = { opts["bShowAnimaCharged"] = {
type = 'toggle', type = 'toggle',
width = 'double', width = 'double',
@ -245,9 +237,11 @@ function ComboPoints.prototype:GetOptions()
disabled = function() disabled = function()
return not self.moduleSettings.enabled return not self.moduleSettings.enabled
end, end,
hidden = function()
return not GetUnitChargedPowerPoints
end,
order = 36 order = 36
} }
end
return opts return opts
end end
@ -291,7 +285,7 @@ function ComboPoints.prototype:Enable(core)
self:RegisterEvent("UNIT_COMBO_POINTS", "UpdateComboPoints") self:RegisterEvent("UNIT_COMBO_POINTS", "UpdateComboPoints")
else else
self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateComboPoints") self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateComboPoints")
if IceHUD.WowVer < 80000 then if IceHUD.EventExistsUnitMaxPower then
self:RegisterEvent("UNIT_MAXPOWER", "UpdateMaxComboPoints") self:RegisterEvent("UNIT_MAXPOWER", "UpdateMaxComboPoints")
end end
end end
@ -307,7 +301,7 @@ function ComboPoints.prototype:Enable(core)
self:RegisterEvent("PLAYER_COMBO_POINTS", "UpdateComboPoints") self:RegisterEvent("PLAYER_COMBO_POINTS", "UpdateComboPoints")
end end
if IceHUD.WowVer >= 90000 then if GetUnitChargedPowerPoints then
self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateChargedComboPoints") self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateChargedComboPoints")
end end
@ -330,10 +324,12 @@ function ComboPoints.prototype:UpdateMaxComboPoints(event, unit, powerType)
end end
function ComboPoints.prototype:UpdateChargedComboPoints() function ComboPoints.prototype:UpdateChargedComboPoints()
if GetUnitChargedPowerPoints then
self.chargedPowerPoints = GetUnitChargedPowerPoints("player") self.chargedPowerPoints = GetUnitChargedPowerPoints("player")
self:CreateComboFrame() self:CreateComboFrame()
self:UpdateComboPoints() self:UpdateComboPoints()
end end
end
-- 'Protected' methods -------------------------------------------------------- -- 'Protected' methods --------------------------------------------------------
@ -515,7 +511,7 @@ function ComboPoints.prototype:UpdateComboPoints(...)
local points, anticipate, _ local points, anticipate, _
if IceHUD.IceCore:IsInConfigMode() then if IceHUD.IceCore:IsInConfigMode() then
points = self:GetMaxComboPoints() points = self:GetMaxComboPoints()
elseif IceHUD.WowVer >= 30000 or IceHUD.WowClassic or IceHUD.WowClassicBC then elseif UnitHasVehicleUI then
-- Parnic: apparently some fights have combo points while the player is in a vehicle? -- Parnic: apparently some fights have combo points while the player is in a vehicle?
local isInVehicle = UnitHasVehicleUI and UnitHasVehicleUI("player") local isInVehicle = UnitHasVehicleUI and UnitHasVehicleUI("player")
local checkUnit = isInVehicle and "vehicle" or "player" local checkUnit = isInVehicle and "vehicle" or "player"
@ -531,7 +527,7 @@ function ComboPoints.prototype:UpdateComboPoints(...)
anticipate = 0 anticipate = 0
end end
else else
points = GetComboPoints("target") points = GetComboPoints("player", "target")
end end
points = points or 0 points = points or 0
@ -593,7 +589,7 @@ do
function ComboPoints.prototype:CheckAnticipation(e, unit) -- UNIT_AURA handler function ComboPoints.prototype:CheckAnticipation(e, unit) -- UNIT_AURA handler
if UnitIsUnit(unit, "player") then if UnitIsUnit(unit, "player") then
local _, _, _, newAntStacks local _, _, _, newAntStacks
if IceHUD.WowVer < 80000 then if IceHUD.SpellFunctionsReturnRank then
_, _, _, newAntStacks = UnitAura("player", GetSpellInfo(AnticipationSpellId)) _, _, _, newAntStacks = UnitAura("player", GetSpellInfo(AnticipationSpellId))
else else
_, _, newAntStacks = UnitAura("player", GetSpellInfo(AnticipationSpellId)) _, _, newAntStacks = UnitAura("player", GetSpellInfo(AnticipationSpellId))

View File

@ -6,13 +6,6 @@ if Enum and Enum.PowerType then
SPELL_POWER_COMBO_POINTS = Enum.PowerType.ComboPoints SPELL_POWER_COMBO_POINTS = Enum.PowerType.ComboPoints
end end
local GetUnitChargedPowerPoints = GetUnitChargedPowerPoints
if not GetUnitChargedPowerPoints then
GetUnitChargedPowerPoints = function()
return nil
end
end
function ComboPointsBar.prototype:init() function ComboPointsBar.prototype:init()
ComboPointsBar.super.prototype.init(self, "ComboPointsBar") ComboPointsBar.super.prototype.init(self, "ComboPointsBar")
@ -90,7 +83,7 @@ function ComboPointsBar.prototype:Enable(core)
self:RegisterEvent("PLAYER_COMBO_POINTS", "UpdateComboPoints") self:RegisterEvent("PLAYER_COMBO_POINTS", "UpdateComboPoints")
end end
if IceHUD.WowVer >= 90000 then if GetUnitChargedPowerPoints then
self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateChargedComboPoints") self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateChargedComboPoints")
end end
@ -98,10 +91,12 @@ function ComboPointsBar.prototype:Enable(core)
end end
function ComboPointsBar.prototype:UpdateChargedComboPoints() function ComboPointsBar.prototype:UpdateChargedComboPoints()
if GetUnitChargedPowerPoints then
local chargedPowerPoints = GetUnitChargedPowerPoints("player") local chargedPowerPoints = GetUnitChargedPowerPoints("player")
self.chargedPowerPointIndex = chargedPowerPoints and chargedPowerPoints[1] self.chargedPowerPointIndex = chargedPowerPoints and chargedPowerPoints[1]
self:UpdateComboPoints() self:UpdateComboPoints()
end end
end
function ComboPointsBar.prototype:CreateFrame() function ComboPointsBar.prototype:CreateFrame()
ComboPointsBar.super.prototype.CreateFrame(self) ComboPointsBar.super.prototype.CreateFrame(self)
@ -119,7 +114,7 @@ function ComboPointsBar.prototype:UpdateComboPoints(...)
local points local points
if IceHUD.IceCore:IsInConfigMode() then if IceHUD.IceCore:IsInConfigMode() then
points = UnitPowerMax("player", SPELL_POWER_COMBO_POINTS) points = UnitPowerMax("player", SPELL_POWER_COMBO_POINTS)
elseif IceHUD.WowVer >= 30000 or IceHUD.WowClassic or IceHUD.WowClassicBC then elseif UnitHasVehicleUI then
-- Parnic: apparently some fights have combo points while the player is in a vehicle? -- Parnic: apparently some fights have combo points while the player is in a vehicle?
local isInVehicle = UnitHasVehicleUI and UnitHasVehicleUI("player") local isInVehicle = UnitHasVehicleUI and UnitHasVehicleUI("player")
local checkUnit = isInVehicle and "vehicle" or "player" local checkUnit = isInVehicle and "vehicle" or "player"
@ -129,7 +124,7 @@ function ComboPointsBar.prototype:UpdateComboPoints(...)
points = UnitPower(checkUnit, SPELL_POWER_COMBO_POINTS) points = UnitPower(checkUnit, SPELL_POWER_COMBO_POINTS)
end end
else else
points = GetComboPoints("target") points = GetComboPoints("player", "target")
end end
if (points == 0) then if (points == 0) then

View File

@ -171,7 +171,7 @@ function IceCustomBar.prototype:CreateBar()
IceCustomBar.super.prototype.CreateBar(self) IceCustomBar.super.prototype.CreateBar(self)
if not self.barFrame.icon then if not self.barFrame.icon then
self.barFrame.icon = self.masterFrame:CreateTexture(nil, "LOW") self.barFrame.icon = self.masterFrame:CreateTexture(nil, "BACKGROUND")
-- this cuts off the border around the buff icon -- this cuts off the border around the buff icon
self.barFrame.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) self.barFrame.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.barFrame.icon:SetDrawLayer("OVERLAY") self.barFrame.icon:SetDrawLayer("OVERLAY")

View File

@ -131,7 +131,7 @@ function IceCustomCDBar.prototype:CreateBar()
IceCustomCDBar.super.prototype.CreateBar(self) IceCustomCDBar.super.prototype.CreateBar(self)
if not self.barFrame.icon then if not self.barFrame.icon then
self.barFrame.icon = self.masterFrame:CreateTexture(nil, "LOW") self.barFrame.icon = self.masterFrame:CreateTexture(nil, "BACKGROUND")
-- this cuts off the border around the buff icon -- this cuts off the border around the buff icon
self.barFrame.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) self.barFrame.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.barFrame.icon:SetDrawLayer("OVERLAY") self.barFrame.icon:SetDrawLayer("OVERLAY")

View File

@ -277,7 +277,7 @@ function IceCustomCounterBar.prototype:CreateFrame()
IceCustomCounterBar.super.prototype.CreateFrame(self) IceCustomCounterBar.super.prototype.CreateFrame(self)
if not self.barFrame.icon then if not self.barFrame.icon then
self.barFrame.icon = self.masterFrame:CreateTexture(nil, "LOW") self.barFrame.icon = self.masterFrame:CreateTexture(nil, "BACKGROUND")
self.barFrame.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) self.barFrame.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.barFrame.icon:SetDrawLayer("OVERLAY") self.barFrame.icon:SetDrawLayer("OVERLAY")
self.barFrame.icon:Hide() self.barFrame.icon:Hide()

View File

@ -119,7 +119,7 @@ function EclipseBar.prototype:UpdateShown()
if form == MOONKIN_FORM or not form then if form == MOONKIN_FORM or not form then
local PrimaryTalentTree = 0 local PrimaryTalentTree = 0
if IceHUD.WowVer >= 50000 then if GetSpecialization then
PrimaryTalentTree = GetSpecialization() PrimaryTalentTree = GetSpecialization()
else else
PrimaryTalentTree = GetPrimaryTalentTree() PrimaryTalentTree = GetPrimaryTalentTree()
@ -190,6 +190,6 @@ function EclipseBar.prototype:MyOnUpdate()
end end
local _, unitClass = UnitClass("player") local _, unitClass = UnitClass("player")
if (unitClass == "DRUID" and IceHUD.WowVer >= 40000 and IceHUD.WowVer < 70000) then if (unitClass == "DRUID" and GetEclipseDirection) then
IceHUD.EclipseBar = EclipseBar:new() IceHUD.EclipseBar = EclipseBar:new()
end end

View File

@ -286,7 +286,7 @@ function GlobalCoolDown.prototype:GetSpellId()
MONK=100780, -- jab MONK=100780, -- jab
} }
if IceHUD.WowClassicBC or IceHUD.WowClassic then if not GetSpellInfo(defaultSpells["PALADIN"]) then
defaultSpells["PALADIN"] = 635 defaultSpells["PALADIN"] = 635
end end

View File

@ -2,6 +2,9 @@ local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
local HarmonyPower = IceCore_CreateClass(IceClassPowerCounter) local HarmonyPower = IceCore_CreateClass(IceClassPowerCounter)
local SPELL_POWER_CHI = SPELL_POWER_CHI local SPELL_POWER_CHI = SPELL_POWER_CHI
if not SPELL_POWER_CHI then
SPELL_POWER_CHI = SPELL_POWER_LIGHT_FORCE
end
if Enum and Enum.PowerType then if Enum and Enum.PowerType then
SPELL_POWER_CHI = Enum.PowerType.Chi SPELL_POWER_CHI = Enum.PowerType.Chi
end end
@ -23,11 +26,7 @@ function HarmonyPower.prototype:init()
} }
self.numRunes = 4 self.numRunes = 4
self.numericColor = "ChiNumeric" self.numericColor = "ChiNumeric"
if IceHUD.WowVer >= 50100 then
self.unitPower = SPELL_POWER_CHI self.unitPower = SPELL_POWER_CHI
else
self.unitPower = SPELL_POWER_LIGHT_FORCE
end
if IceHUD.WowVer >= 70000 then if IceHUD.WowVer >= 70000 then
self.requiredSpec = SPEC_MONK_WINDWALKER self.requiredSpec = SPEC_MONK_WINDWALKER
end end
@ -117,6 +116,6 @@ end
-- Load us up -- Load us up
local _, unitClass = UnitClass("player") local _, unitClass = UnitClass("player")
if (unitClass == "MONK" and IceHUD.WowVer >= 50000) then if unitClass == "MONK" then
IceHUD.HarmonyPower = HarmonyPower:new() IceHUD.HarmonyPower = HarmonyPower:new()
end end

View File

@ -38,7 +38,7 @@ function HolyPower.prototype:init()
self.bTreatEmptyAsFull = true self.bTreatEmptyAsFull = true
self.unit = "player" self.unit = "player"
self.numRunes = 5 self.numRunes = 5
if IceHUD.WowVer >= 50000 then if HOLY_POWER_FULL then
self.numConsideredFull = HOLY_POWER_FULL self.numConsideredFull = HOLY_POWER_FULL
else else
self.numConsideredFull = 3 self.numConsideredFull = 3
@ -134,7 +134,7 @@ end
-- Load us up -- Load us up
local _, unitClass = UnitClass("player") local _, unitClass = UnitClass("player")
if (unitClass == "PALADIN" and IceHUD.WowVer >= 40000) then if (unitClass == "PALADIN" and (PaladinPowerBar or PaladinPowerBarFrame)) then
IceHUD.HolyPower = HolyPower:new() IceHUD.HolyPower = HolyPower:new()
end end

View File

@ -49,7 +49,7 @@ function PetHealth.prototype:Enable(core)
self:RegisterEvent("UNIT_PET", "CheckPet"); self:RegisterEvent("UNIT_PET", "CheckPet");
self:RegisterEvent("UNIT_HEALTH", "UpdateEvent") self:RegisterEvent("UNIT_HEALTH", "UpdateEvent")
if IceHUD.WowVer < 90000 then if IceHUD.EventExistsUnitHealthFrequent then
self:RegisterEvent("UNIT_HEALTH_FREQUENT", "UpdateEvent") self:RegisterEvent("UNIT_HEALTH_FREQUENT", "UpdateEvent")
end end
self:RegisterEvent("UNIT_MAXHEALTH", "UpdateEvent") self:RegisterEvent("UNIT_MAXHEALTH", "UpdateEvent")

View File

@ -29,7 +29,7 @@ function IceHUDPlayerAlternatePower.prototype:Enable(core)
IceHUDPlayerAlternatePower.super.prototype.Enable(self, core) IceHUDPlayerAlternatePower.super.prototype.Enable(self, core)
self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateEvent") self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateEvent")
if IceHUD.WowVer < 80000 then if IceHUD.EventExistsUnitMaxPower then
self:RegisterEvent("UNIT_MAXPOWER", "UpdateEvent") self:RegisterEvent("UNIT_MAXPOWER", "UpdateEvent")
end end
self:RegisterEvent("UNIT_POWER_BAR_SHOW", "PowerBarShow") self:RegisterEvent("UNIT_POWER_BAR_SHOW", "PowerBarShow")

View File

@ -68,7 +68,7 @@ function PlayerHealth.prototype:Enable(core)
PlayerHealth.super.prototype.Enable(self, core) PlayerHealth.super.prototype.Enable(self, core)
self:RegisterEvent("UNIT_HEALTH", "UpdateEvent") self:RegisterEvent("UNIT_HEALTH", "UpdateEvent")
if IceHUD.WowVer < 90000 then if IceHUD.EventExistsUnitHealthFrequent then
self:RegisterEvent("UNIT_HEALTH_FREQUENT", "UpdateEvent") self:RegisterEvent("UNIT_HEALTH_FREQUENT", "UpdateEvent")
end end
self:RegisterEvent("UNIT_MAXHEALTH", "UpdateEvent") self:RegisterEvent("UNIT_MAXHEALTH", "UpdateEvent")
@ -105,7 +105,7 @@ function PlayerHealth.prototype:Enable(core)
self:RegisterEvent("UNIT_EXITED_VEHICLE", "ExitingVehicle") self:RegisterEvent("UNIT_EXITED_VEHICLE", "ExitingVehicle")
end end
if IceHUD.WowVer < 40000 then if not IceHUD.SupportsHealPrediction then
HealComm = LibStub("LibHealComm-4.0", true) HealComm = LibStub("LibHealComm-4.0", true)
if HealComm then if HealComm then
HealComm.RegisterCallback(self, "HealComm_HealStarted", function(event, casterGUID, spellID, spellType, endTime, ...) self:HealComm_HealEvent(event, casterGUID, spellID, spellType, endTime, ...) end) HealComm.RegisterCallback(self, "HealComm_HealStarted", function(event, casterGUID, spellID, spellType, endTime, ...) self:HealComm_HealEvent(event, casterGUID, spellID, spellType, endTime, ...) end)
@ -169,7 +169,7 @@ function PlayerHealth.prototype:HealComm_ModifierChanged(event, guid)
end end
function PlayerHealth.prototype:IncomingHealPrediction(event, unit) function PlayerHealth.prototype:IncomingHealPrediction(event, unit)
if IceHUD.WowVer >= 40000 then if IceHUD.SupportsHealPrediction then
if unit and unit ~= self.unit then if unit and unit ~= self.unit then
return return
end end
@ -321,7 +321,7 @@ function PlayerHealth.prototype:GetOptions()
self:Update() self:Update()
end, end,
disabled = function() disabled = function()
return not (self.moduleSettings.enabled and (IceHUD.WowVer >= 40000 or HealComm)) return not (self.moduleSettings.enabled and (IceHUD.SupportsHealPrediction or HealComm))
end, end,
order = 43.6 order = 43.6
} }
@ -367,7 +367,7 @@ function PlayerHealth.prototype:GetOptions()
self:Update() self:Update()
end, end,
disabled = function() disabled = function()
return not (self.moduleSettings.enabled and IceHUD.WowVer >= 70000) return not (self.moduleSettings.enabled and UnitGetTotalAbsorbs)
end, end,
order = 43.8 order = 43.8
} }
@ -942,7 +942,7 @@ function PlayerHealth.prototype:CreateHealBar()
self:UpdateBar(1, "undef") self:UpdateBar(1, "undef")
if not self.moduleSettings.showIncomingHeals or (IceHUD.WowVer < 40000 and not HealComm) then if not self.moduleSettings.showIncomingHeals or (not IceHUD.SupportsHealPrediction and not HealComm) then
self.healFrame.bar:Hide() self.healFrame.bar:Hide()
end end
end end
@ -954,7 +954,7 @@ function PlayerHealth.prototype:CreateAbsorbBar()
self:UpdateBar(1, "undef") self:UpdateBar(1, "undef")
if not self.moduleSettings.showAbsorbs or UnitGetTotalAbsorbs == nil then if not self.moduleSettings.showAbsorbs or not UnitGetTotalAbsorbs then
self.absorbFrame.bar:Hide() self.absorbFrame.bar:Hide()
end end
end end
@ -1094,7 +1094,7 @@ function PlayerHealth.prototype:CheckPartyRole()
proposalExists, id, typeID, subtypeID, name, texture, role, hasResponded, totalEncounters, completedEncounters, numMembers, isleader = GetLFGProposal() proposalExists, id, typeID, subtypeID, name, texture, role, hasResponded, totalEncounters, completedEncounters, numMembers, isleader = GetLFGProposal()
local p = self.unit local p = self.unit
if IceHUD.WowVer < 40000 then if not IceHUD.UnitGroupRolesReturnsRoleString then
isTank, isHeal, isDPS = UnitGroupRolesAssigned(p) isTank, isHeal, isDPS = UnitGroupRolesAssigned(p)
else else
local grpRole = UnitGroupRolesAssigned(p) local grpRole = UnitGroupRolesAssigned(p)

View File

@ -203,7 +203,7 @@ function PlayerMana.prototype:CheckVehicle()
end end
function PlayerMana.prototype:ShouldUseTicker() function PlayerMana.prototype:ShouldUseTicker()
return IceHUD.WowVer < 30000 or (IceHUD.WowVer < 70100 and not GetCVarBool("predictedPower")) return IceHUD.WowVer < 30000 or (IceHUD.WowVer < 70100 and not GetCVarBool("predictedPower") and not IceHUD.WowClassicWrath)
end end
function PlayerMana.prototype:SetupOnUpdate(enable) function PlayerMana.prototype:SetupOnUpdate(enable)
@ -353,13 +353,13 @@ function PlayerMana.prototype:Update(unit, powertype)
color = "PlayerRunicPower" color = "PlayerRunicPower"
elseif (self.manaType == SPELL_POWER_FOCUS) then elseif (self.manaType == SPELL_POWER_FOCUS) then
color = "PlayerFocus" color = "PlayerFocus"
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_INSANITY) then elseif (self.manaType == SPELL_POWER_INSANITY) then
color = "PlayerInsanity" color = "PlayerInsanity"
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_FURY) then elseif (self.manaType == SPELL_POWER_FURY) then
color = "PlayerFury" color = "PlayerFury"
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_MAELSTROM) then elseif (self.manaType == SPELL_POWER_MAELSTROM) then
color = "PlayerMaelstrom" color = "PlayerMaelstrom"
elseif (IceHUD.WowVer >= 70000 and self.manaType == SPELL_POWER_PAIN) then elseif (self.manaType == SPELL_POWER_PAIN) then
color = "PlayerPain" color = "PlayerPain"
end end
end end

View File

@ -79,7 +79,7 @@ end
-- Load for tanks only -- Load for tanks only
local _, unitClass = UnitClass("player") local _, unitClass = UnitClass("player")
if ((unitClass == "DEATHKNIGHT" or unitClass == "DRUID" or unitClass == "PALADIN" or unitClass == "WARRIOR" or unitClass == "MONK") if (unitClass == "DEATHKNIGHT" or unitClass == "DRUID" or unitClass == "PALADIN" or unitClass == "WARRIOR" or unitClass == "MONK")
and IceHUD.WowVer >= 60000 and IceHUD.WowVer < 70000) then and GetSpellInfo(RESOLVE_SPELL_ID) then
IceHUD.Resolve = Resolve:new() IceHUD.Resolve = Resolve:new()
end end

View File

@ -235,7 +235,7 @@ end
function RollTheBones.prototype:GetBuffDuration(unitName, ids) function RollTheBones.prototype:GetBuffDuration(unitName, ids)
local i = 1 local i = 1
local buff, _, type, duration, endTime, spellId local buff, _, type, duration, endTime, spellId
if IceHUD.WowVer < 80000 then if IceHUD.SpellFunctionsReturnRank then
buff, _, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i) buff, _, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
else else
buff, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i) buff, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
@ -256,7 +256,7 @@ function RollTheBones.prototype:GetBuffDuration(unitName, ids)
i = i + 1; i = i + 1;
if IceHUD.WowVer < 80000 then if IceHUD.SpellFunctionsReturnRank then
buff, _, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i) buff, _, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
else else
buff, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i) buff, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
@ -376,6 +376,9 @@ function RollTheBones.prototype:UpdateDurationBar(event, unit)
end end
local points = RTBGetComboPoints(self.unit) local points = RTBGetComboPoints(self.unit)
if UnitPowerMax then
CurrMaxRtBDuration = self:GetMaxBuffTime(UnitPowerMax(self.unit, SPELL_POWER_COMBO_POINTS))
else
-- check for Deeper Stratagem -- check for Deeper Stratagem
local _, _, _, DeeperStratagem = GetTalentInfoByID(sixComboPointsTalentID, GetActiveSpecGroup()) local _, _, _, DeeperStratagem = GetTalentInfoByID(sixComboPointsTalentID, GetActiveSpecGroup())
@ -385,6 +388,7 @@ function RollTheBones.prototype:UpdateDurationBar(event, unit)
else else
CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints) CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints)
end end
end
if event then if event then
self:UpdateRollTheBones() self:UpdateRollTheBones()

View File

@ -9,15 +9,15 @@ if CooldownFrame_Set then
end end
local RUNETYPE_BLOOD = 1; local RUNETYPE_BLOOD = 1;
local RUNETYPE_DEATH = IceHUD.WowVer < 70300 and 2 or 3; local RUNETYPE_DEATH = IceHUD.DeathKnightUnholyFrostRunesSwapped and 2 or 3;
local RUNETYPE_FROST = IceHUD.WowVer < 70300 and 3 or 2; local RUNETYPE_FROST = IceHUD.DeathKnightUnholyFrostRunesSwapped and 3 or 2;
local RUNETYPE_CHROMATIC = 4; local RUNETYPE_CHROMATIC = 4;
local RUNETYPE_LEGION = 5; -- not real, but makes for an easy update local RUNETYPE_LEGION = 5; -- not real, but makes for an easy update
local GetRuneType = GetRuneType local GetRuneType = GetRuneType
if IceHUD.WowVer >= 70000 and IceHUD.WowVer < 70300 then if IceHUD.WowVer >= 70000 and IceHUD.WowVer < 70300 then
GetRuneType = function() return RUNETYPE_LEGION end GetRuneType = function() return RUNETYPE_LEGION end
elseif IceHUD.WowVer >= 70300 then elseif IceHUD.WowVer >= 70300 and GetSpecialization then
GetRuneType = function() return GetSpecialization() end GetRuneType = function() return GetSpecialization() end
end end
@ -503,7 +503,7 @@ function Runes.prototype:CreateRune(i, type, name)
-- create runes -- create runes
if (not self.frame.graphical[i]) then if (not self.frame.graphical[i]) then
self.frame.graphical[i] = CreateFrame("Frame", nil, self.frame) self.frame.graphical[i] = CreateFrame("Frame", nil, self.frame)
self.frame.graphical[i].rune = self.frame.graphical[i]:CreateTexture(nil, "LOW") self.frame.graphical[i].rune = self.frame.graphical[i]:CreateTexture(nil, "BACKGROUND")
self.frame.graphical[i].rune:SetAllPoints(self.frame.graphical[i]) self.frame.graphical[i].rune:SetAllPoints(self.frame.graphical[i])
self.frame.graphical[i].cd = CreateFrame("Cooldown", nil, self.frame.graphical[i], "CooldownFrameTemplate") self.frame.graphical[i].cd = CreateFrame("Cooldown", nil, self.frame.graphical[i], "CooldownFrameTemplate")
self.frame.graphical[i].shine = self.frame.graphical[i]:CreateTexture(nil, "OVERLAY") self.frame.graphical[i].shine = self.frame.graphical[i]:CreateTexture(nil, "OVERLAY")

View File

@ -103,7 +103,7 @@ end
-- Load us up -- Load us up
local _, unitClass = UnitClass("player") local _, unitClass = UnitClass("player")
if (unitClass == "PRIEST" and IceHUD.WowVer >= 50000 and IceHUD.WowVer < 70000) then if (unitClass == "PRIEST" and PriestBarFrame) then
IceHUD.ShadowOrbs = ShadowOrbs:new() IceHUD.ShadowOrbs = ShadowOrbs:new()
end end

View File

@ -276,6 +276,6 @@ end
-- Load us up -- Load us up
local _, unitClass = UnitClass("player") local _, unitClass = UnitClass("player")
if (unitClass == "WARLOCK" and IceHUD.WowVer >= 40000) then if (unitClass == "WARLOCK" and WarlockPowerFrame) then
IceHUD.ShardCounter = ShardCounter:new() IceHUD.ShardCounter = ShardCounter:new()
end end

View File

@ -42,6 +42,10 @@ elseif IceHUD.WowClassicBC then
impSndBonusPerRank = 0.15 impSndBonusPerRank = 0.15
impSndTalentPage = 2 impSndTalentPage = 2
impSndTalentIdx = 4 impSndTalentIdx = 4
elseif IceHUD.WowClassicWrath then
impSndBonusPerRank = 0.25
impSndTalentPage = 2
impSndTalentIdx = 23
end end
local SPELL_POWER_COMBO_POINTS = SPELL_POWER_COMBO_POINTS local SPELL_POWER_COMBO_POINTS = SPELL_POWER_COMBO_POINTS
@ -81,6 +85,10 @@ function SliceAndDice.prototype:Enable(core)
self:CheckMaxComboPoints() self:CheckMaxComboPoints()
end end
if IceHUD.EventExistsUnitMaxPower then
self:RegisterEvent("UNIT_MAXPOWER", "CheckMaxComboPoints")
end
if not self.moduleSettings.alwaysFullAlpha then if not self.moduleSettings.alwaysFullAlpha then
self:Show(false) self:Show(false)
else else
@ -91,9 +99,13 @@ function SliceAndDice.prototype:Enable(core)
end end
function SliceAndDice.prototype:CheckMaxComboPoints() function SliceAndDice.prototype:CheckMaxComboPoints()
if UnitPowerMax then
maxComboPoints = UnitPowerMax(self.unit, SPELL_POWER_COMBO_POINTS)
else
local talentID, name, texture, selected, available, spellID, unknown, row, column, known, grantedByAura = GetTalentInfoByID(sixComboPointsTalentID, GetActiveSpecGroup()) local talentID, name, texture, selected, available, spellID, unknown, row, column, known, grantedByAura = GetTalentInfoByID(sixComboPointsTalentID, GetActiveSpecGroup())
maxComboPoints = selected and 6 or 5 maxComboPoints = selected and 6 or 5
end end
end
function SliceAndDice.prototype:Disable(core) function SliceAndDice.prototype:Disable(core)
SliceAndDice.super.prototype.Disable(self, core) SliceAndDice.super.prototype.Disable(self, core)
@ -290,7 +302,7 @@ local function HasSpell(id)
end end
local function ShouldHide() local function ShouldHide()
if IceHUD.WowVer >= 90000 or IceHUD.WowClassicBC then if IceHUD.WowVer >= 90000 or IceHUD.WowClassicBC or IceHUD.WowClassicWrath then
return false return false
end end
@ -411,13 +423,11 @@ function SliceAndDice.prototype:UpdateDurationBar(event, unit)
end end
function SliceAndDice.prototype:GetMaxBuffTime(numComboPoints) function SliceAndDice.prototype:GetMaxBuffTime(numComboPoints)
local maxduration
if numComboPoints == 0 then if numComboPoints == 0 then
return 0 return 0
end end
maxduration = baseTime + ((numComboPoints - 1) * gapPerComboPoint) local maxduration = baseTime + ((numComboPoints - 1) * gapPerComboPoint)
if self:HasNetherbladeBonus() then if self:HasNetherbladeBonus() then
maxduration = maxduration + netherbladeBonus maxduration = maxduration + netherbladeBonus

View File

@ -185,7 +185,7 @@ function StaggerBar.prototype:GetDebuffInfo()
local staggerLevel = 1 local staggerLevel = 1
for i = 1, IceCore.BuffLimit do for i = 1, IceCore.BuffLimit do
local debuffID = select(IceHUD.WowVer < 80000 and 11 or 10, UnitDebuff(self.unit, i)) local debuffID = select(IceHUD.SpellFunctionsReturnRank and 11 or 10, UnitDebuff(self.unit, i))
if debuffID == LightID or debuffID == ModerateID or debuffID == HeavyID then if debuffID == LightID or debuffID == ModerateID or debuffID == HeavyID then
local spellName = UnitDebuff(self.unit, i) local spellName = UnitDebuff(self.unit, i)
@ -236,7 +236,7 @@ end
function StaggerBar.prototype:GetDebuffDuration(unitName, buffId) function StaggerBar.prototype:GetDebuffDuration(unitName, buffId)
local name, _, duration, endTime local name, _, duration, endTime
if IceHUD.WowVer < 80000 then if IceHUD.SpellFunctionsReturnRank then
name, _, _, _, _, duration, endTime = UnitDebuff(unitName, buffName) name, _, _, _, _, duration, endTime = UnitDebuff(unitName, buffName)
else else
for i = 1, IceCore.BuffLimit do for i = 1, IceCore.BuffLimit do

View File

@ -7,7 +7,7 @@ TargetCC.prototype.debuffRemaining = 0
TargetCC.prototype.debuffDuration = 0 TargetCC.prototype.debuffDuration = 0
local GetNumPartyMembers, GetNumRaidMembers = GetNumPartyMembers, GetNumRaidMembers local GetNumPartyMembers, GetNumRaidMembers = GetNumPartyMembers, GetNumRaidMembers
if IceHUD.WowVer >= 50000 then if GetNumGroupMembers then
GetNumPartyMembers = GetNumGroupMembers GetNumPartyMembers = GetNumGroupMembers
GetNumRaidMembers = GetNumGroupMembers GetNumRaidMembers = GetNumGroupMembers
end end

View File

@ -15,7 +15,7 @@ end
function TargetCast.prototype:Enable(core) function TargetCast.prototype:Enable(core)
TargetCast.super.prototype.Enable(self, core) TargetCast.super.prototype.Enable(self, core)
if IceHUD.WowVer >= 30200 then if IceHUD.EventExistsSpellcastInterruptible then
self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE", "SpellCastInterruptible") self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE", "SpellCastInterruptible")
self:RegisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE", "SpellCastNotInterruptible") self:RegisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE", "SpellCastNotInterruptible")
end end
@ -183,11 +183,11 @@ function TargetCast.prototype:StartBar(action, message)
local spell, notInterruptible local spell, notInterruptible
if UnitCastingInfo then if UnitCastingInfo then
spell = UnitCastingInfo(self.unit) spell = UnitCastingInfo(self.unit)
notInterruptible = select(IceHUD.WowVer < 80000 and 9 or 8, UnitCastingInfo(self.unit)) notInterruptible = select(IceHUD.SpellFunctionsReturnRank and 9 or 8, UnitCastingInfo(self.unit))
end end
if UnitChannelInfo and not spell then if UnitChannelInfo and not spell then
spell = UnitChannelInfo(self.unit) spell = UnitChannelInfo(self.unit)
notInterruptible = select(IceHUD.WowVer < 80000 and 8 or 7, UnitChannelInfo(self.unit)) notInterruptible = select(IceHUD.SpellFunctionsReturnRank and 8 or 7, UnitChannelInfo(self.unit))
if not spell then if not spell then
return return

View File

@ -1108,7 +1108,7 @@ function IceTargetHealth.prototype:CheckPartyRole()
proposalExists, id, typeID, subtypeID, name, texture, role, hasResponded, totalEncounters, completedEncounters, numMembers, isleader = GetLFGProposal() proposalExists, id, typeID, subtypeID, name, texture, role, hasResponded, totalEncounters, completedEncounters, numMembers, isleader = GetLFGProposal()
local p = self.unit local p = self.unit
if IceHUD.WowVer < 40000 then if not IceHUD.UnitGroupRolesReturnsRoleString then
isTank, isHeal, isDPS = UnitGroupRolesAssigned(p) isTank, isHeal, isDPS = UnitGroupRolesAssigned(p)
else else
local grpRole = UnitGroupRolesAssigned(p) local grpRole = UnitGroupRolesAssigned(p)

View File

@ -7,7 +7,7 @@ TargetInvuln.prototype.buffRemaining = 0
TargetInvuln.prototype.buffDuration = 0 TargetInvuln.prototype.buffDuration = 0
local GetNumPartyMembers, GetNumRaidMembers = GetNumPartyMembers, GetNumRaidMembers local GetNumPartyMembers, GetNumRaidMembers = GetNumPartyMembers, GetNumRaidMembers
if IceHUD.WowVer >= 50000 then if GetNumGroupMembers then
GetNumPartyMembers = GetNumGroupMembers GetNumPartyMembers = GetNumGroupMembers
GetNumRaidMembers = GetNumGroupMembers GetNumRaidMembers = GetNumGroupMembers
end end

View File

@ -83,7 +83,7 @@ function IceTargetMana.prototype:Enable(core)
self:RegisterEvent("UNIT_FOCUS", "UpdateEvent") self:RegisterEvent("UNIT_FOCUS", "UpdateEvent")
-- DK rune stuff -- DK rune stuff
if IceHUD.WowVer >= 30000 then if SPELL_POWER_RUNIC_POWER then
self:RegisterEvent("UNIT_RUNIC_POWER", "UpdateEvent") self:RegisterEvent("UNIT_RUNIC_POWER", "UpdateEvent")
self:RegisterEvent("UNIT_MAXRUNIC_POWER", "UpdateEvent") self:RegisterEvent("UNIT_MAXRUNIC_POWER", "UpdateEvent")
end end
@ -135,13 +135,13 @@ function IceTargetMana.prototype:Update(unit)
self.color = "TargetEnergy" self.color = "TargetEnergy"
elseif (manaType == SPELL_POWER_RUNIC_POWER) then elseif (manaType == SPELL_POWER_RUNIC_POWER) then
self.color = "TargetRunicPower" self.color = "TargetRunicPower"
elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_INSANITY) then elseif (manaType == SPELL_POWER_INSANITY) then
self.color = "TargetInsanity" self.color = "TargetInsanity"
elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_FURY) then elseif (manaType == SPELL_POWER_FURY) then
self.color = "TargetFury" self.color = "TargetFury"
elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_MAELSTROM) then elseif (manaType == SPELL_POWER_MAELSTROM) then
self.color = "TargetMaelstrom" self.color = "TargetMaelstrom"
elseif (IceHUD.WowVer >= 70000 and manaType == SPELL_POWER_PAIN) then elseif (manaType == SPELL_POWER_PAIN) then
self.color = "TargetPain" self.color = "TargetPain"
end end

View File

@ -341,7 +341,7 @@ function Totems.prototype:CreateTotem(i, name)
local haveTotem, name, startTime, duration, icon = GetTotemInfo(i) local haveTotem, name, startTime, duration, icon = GetTotemInfo(i)
if (not self.frame.graphical[i]) then if (not self.frame.graphical[i]) then
self.frame.graphical[i] = CreateFrame("Frame", nil, self.frame) self.frame.graphical[i] = CreateFrame("Frame", nil, self.frame)
self.frame.graphical[i].totem = self.frame.graphical[i]:CreateTexture(nil, "LOW") self.frame.graphical[i].totem = self.frame.graphical[i]:CreateTexture(nil, "BACKGROUND")
self.frame.graphical[i].cd = CreateFrame("Cooldown", nil, self.frame.graphical[i], "CooldownFrameTemplate") self.frame.graphical[i].cd = CreateFrame("Cooldown", nil, self.frame.graphical[i], "CooldownFrameTemplate")
self.frame.graphical[i].shine = self.frame.graphical[i]:CreateTexture(nil, "OVERLAY") self.frame.graphical[i].shine = self.frame.graphical[i]:CreateTexture(nil, "OVERLAY")

View File

@ -1,7 +1,10 @@
# Changelog # Changelog
v1.13.14: v1.13.17:
- Fixed target health updating infrequently on Classic. - Internal maintainability updates. There are so many versions of the game now, updates need to be as easy and safe as possible.
- Fixed compatibility with WoW 9.2.5. - Improved reliability of Slice-n-Dice predicted length when changing talents.
- Updated TOC for all game flavors. - 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.