Compare commits

...

43 Commits

Author SHA1 Message Date
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
701fb1373f Fix Runes disappearing for DK on Wrath
MaxPower events fire, but I guess only Legion+ actually returns rune counts from this function. On Wrath it always returns 0, so the CheckMaxNumRunes logic was hiding all runes.
2022-09-20 14:27:31 -05:00
20d26d8f5e Update changelog for release 2022-09-19 10:21:41 -05:00
5a41d9a7f4 Fix ShadowOrbs causing priests to freeze/hang on login
I would still like to find a way to feature-flag this instead of WowVer-flag it, but it's not super important for now.
2022-09-19 10:21:02 -05:00
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
42 changed files with 936 additions and 279 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,20 +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@v2
with:
args: -g wrath -w 0

View File

@ -43,9 +43,9 @@ externals:
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:

View File

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

View File

@ -307,7 +307,7 @@ function IceCore.prototype:Enable(userToggle)
return
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:Hide()
elseif C_Map then

View File

@ -7,8 +7,6 @@ local SML = LibStub("LibSharedMedia-3.0")
local ACR = LibStub("AceConfigRegistry-3.0")
local ConfigDialog = LibStub("AceConfigDialog-3.0")
local icon = LibStub("LibDBIcon-1.0", true)
local AceGUI = LibStub("AceGUI-3.0")
local AceSerializer = LibStub("AceSerializer-3.0", 1)
local pendingModuleLoads = {}
local bReadyToRegisterModules = false
@ -18,25 +16,49 @@ IceHUD.debugging = false
IceHUD.WowVer = select(4, GetBuildInfo())
IceHUD.WowMain = not WOW_PROJECT_ID or WOW_PROJECT_ID == WOW_PROJECT_MAINLINE
IceHUD.WowClassic = WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_CLASSIC
IceHUD.WowClassicBC = WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_BURNING_CRUSADE_CLASSIC
if GetClassicExpansionLevel then
IceHUD.WowClassic = GetClassicExpansionLevel() == 0
IceHUD.WowClassicBC = GetClassicExpansionLevel() == 1
IceHUD.WowClassicWrath = GetClassicExpansionLevel() == 2
else
IceHUD.WowClassic = WOW_PROJECT_ID and WOW_PROJECT_ID == WOW_PROJECT_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
IceHUD.SpellFunctionsReturnRank = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsPlayerPetChanged = IceHUD.WowVer < 80000 and not IceHUD.WowClassic and not IceHUD.WowClassicBC
IceHUD.EventExistsPetBarChanged = IceHUD.WowVer < 80000 and not IceHUD.WowClassic and not IceHUD.WowClassicBC
IceHUD.EventExistsPlayerPetChanged = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsPetBarChanged = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsPlayerComboPoints = IceHUD.WowMain and IceHUD.WowVer < 30000
IceHUD.EventExistsUnitComboPoints = IceHUD.WowMain and IceHUD.WowVer < 70000
IceHUD.EventExistsUnitMaxPower = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsGroupRosterUpdate = IceHUD.WowVer >= 50000 or IceHUD.WowClassic or IceHUD.WowClassicBC
IceHUD.EventExistsUnitMaxPower = IceHUD.WowMain and IceHUD.WowVer >= 40000
IceHUD.EventExistsGroupRosterUpdate = IceHUD.WowVer >= 50000 or not IceHUD.WowMain
IceHUD.EventExistsUnitDynamicFlags = IceHUD.WowMain and IceHUD.WowVer < 80000
IceHUD.EventExistsUnitHealthFrequent = not IceHUD.WowMain or (IceHUD.WowVer >= 40000 and IceHUD.WowVer < 90000)
IceHUD.PerPowerEventsExist = IceHUD.WowMain and IceHUD.WowVer < 40000
IceHUD.PerTargetComboPoints = IceHUD.WowVer < 60000
IceHUD.CanTrackOtherUnitBuffs = not IceHUD.WowClassic
IceHUD.CanTrackGCD = not IceHUD.WowClassic
IceHUD.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.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"
@ -44,6 +66,8 @@ IceHUD.validBarList = { "Bar", "HiBar", "RoundBar", "ColorBar", "RivetBar", "Riv
"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_UnitFrame_DropDown = CreateFrame("Frame", "IceHUD_UnitFrame_DropDown", UIParent, "UIDropDownMenuTemplate")
--@debug@
IceHUD.optionsLoaded = true
--@end-debug@
@ -68,6 +92,43 @@ end
IceHUD.deepcopy = deepcopy
function IceHUD:removeDefaults(db, defaults, blocker)
-- remove all metatables from the db, so we don't accidentally create new sub-tables through them
setmetatable(db, nil)
-- loop through the defaults and remove their content
for k,v in pairs(defaults) do
if type(v) == "table" and type(db[k]) == "table" then
-- if a blocker was set, dive into it, to allow multi-level defaults
self:removeDefaults(db[k], v, blocker and blocker[k])
if next(db[k]) == nil then
db[k] = nil
end
else
-- check if the current value matches the default, and that its not blocked by another defaults table
if db[k] == defaults[k] and (not blocker or blocker[k] == nil) then
db[k] = nil
end
end
end
end
function IceHUD:populateDefaults(db, defaults, blocker)
-- remove all metatables from the db, so we don't accidentally create new sub-tables through them
setmetatable(db, nil)
-- loop through the defaults and add their content
for k,v in pairs(defaults) do
if type(v) == "table" and type(db[k]) == "table" then
-- if a blocker was set, dive into it, to allow multi-level defaults
self:populateDefaults(db[k], v, blocker and blocker[k])
else
-- check if the current value matches the default, and that its not blocked by another defaults table
if db[k] == nil then
db[k] = defaults[k]
end
end
end
end
IceHUD.Location = "Interface\\AddOns\\IceHUD"
StaticPopupDialogs["ICEHUD_CUSTOM_BAR_CREATED"] =
@ -343,7 +404,7 @@ end
-- blizzard interface options
local blizOptionsPanel = CreateFrame("FRAME", "IceHUDConfigPanel", UIParent)
blizOptionsPanel.name = "IceHUD"
blizOptionsPanel.button = CreateFrame("BUTTON", "IceHUDOpenConfigButton", blizOptionsPanel, (IceHUD.WowVer >= 50000 or IceHUD.WowClassic or IceHUD.WowClassicBC) and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
blizOptionsPanel.button = CreateFrame("BUTTON", "IceHUDOpenConfigButton", blizOptionsPanel, IceHUD.UsesUIPanelButtonTemplate and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
blizOptionsPanel.button:SetText("Open IceHUD configuration")
blizOptionsPanel.button:SetWidth(240)
blizOptionsPanel.button:SetHeight(30)
@ -657,14 +718,14 @@ function IceHUD:GetIsInLFGGroup()
end
local mode, submode
if IceHUD.WowVer >= 50000 then
if LE_LFG_CATEGORY_LFD then
mode, submode = GetLFGMode(LE_LFG_CATEGORY_LFD)
else
mode, submode = GetLFGMode()
end
local IsInLFGGroup = CheckLFGMode(mode)
if IceHUD.WowVer < 50000 then
if not LE_LFG_CATEGORY_LFD then
return IsInLFGGroup
end
@ -684,14 +745,17 @@ function IceHUD:GetIsInLFGGroup()
return IsInLFGGroup
end
local BLACKLISTED_UNIT_MENU_OPTIONS = {}
if UnitPopupButtons then
local BLACKLISTED_UNIT_MENU_OPTIONS = {
BLACKLISTED_UNIT_MENU_OPTIONS = {
SET_FOCUS = "ICEHUD_SET_FOCUS",
CLEAR_FOCUS = "ICEHUD_CLEAR_FOCUS",
PET_DISMISS = "ICEHUD_PET_DISMISS",
LOCK_FOCUS_FRAME = true,
UNLOCK_FOCUS_FRAME = true,
}
if select(2, UnitClass("player")) ~= "WARLOCK" then
BLACKLISTED_UNIT_MENU_OPTIONS[PET_DISMISS] = "ICEHUD_PET_DISMISS"
end
UnitPopupButtons["ICEHUD_SET_FOCUS"] = {
text = L["Type %s to set focus"]:format(SLASH_FOCUS1),
@ -710,108 +774,192 @@ if UnitPopupButtons then
tooltipText = L["Blizzard currently does not provide a proper way to right-click dismiss a pet with custom unit frames."],
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
local munged_unit_menus = {}
local function munge_unit_menu(menu)
local result = munged_unit_menus[menu]
if result then
return result
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 function munge_unit_menu(menu)
local result = munged_unit_menus[menu]
if result then
return result
end
if not UnitPopupMenus then
munged_unit_menus[menu] = menu
return menu
end
local data = UnitPopupMenus[menu]
if not data then
munged_unit_menus[menu] = menu
return menu
end
local found = false
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
if not UnitPopupMenus then
munged_unit_menus[menu] = menu
return menu
end
local data = UnitPopupMenus[menu]
if not data then
munged_unit_menus[menu] = menu
return menu
end
local found = false
local _, v
else
for _, v in ipairs(data) do
if BLACKLISTED_UNIT_MENU_OPTIONS[v] then
found = true
break
end
end
end
if not found then
-- nothing to remove or add, we're all fine here.
munged_unit_menus[menu] = menu
return menu
if not found then
-- nothing to remove or add, we're all fine here.
munged_unit_menus[menu] = menu
return menu
end
local new_data = {}
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
local new_data = {}
new_data = data
function new_data:GetMenuButtons()
return new_buttons_list
end
else
for _, v in ipairs(data) do
local blacklisted = BLACKLISTED_UNIT_MENU_OPTIONS[v]
if v == "PET_DISMISS" and select(2, UnitClass("player")) == "WARLOCK" then
blacklisted = false
end
if not blacklisted then
new_data[#new_data+1] = v
elseif blacklisted ~= true then
new_data[#new_data+1] = blacklisted
end
end
local new_menu_name = "ICEHUD_" .. menu
UnitPopupMenus[new_menu_name] = new_data
munged_unit_menus[menu] = new_menu_name
return new_menu_name
end
IceHUD.MungeUnitMenu = munge_unit_menu
local new_menu_name = "ICEHUD_" .. menu
local function figure_unit_menu(unit)
if unit == "focus" then
return "FOCUS"
end
if UnitIsUnit(unit, "player") then
return "SELF"
end
if UnitIsUnit(unit, "vehicle") then
-- NOTE: vehicle check must come before pet check for accuracy's sake because
-- a vehicle may also be considered your pet
return "VEHICLE"
end
if UnitIsUnit(unit, "pet") then
return "PET"
end
if not UnitIsPlayer(unit) then
return "TARGET"
end
local id = UnitInRaid(unit)
if id then
return "RAID_PLAYER", id
end
if UnitInParty(unit) then
return "PARTY"
end
return "PLAYER"
end
IceHUD_UnitFrame_DropDown = CreateFrame("Frame", "IceHUD_UnitFrame_DropDown", UIParent, "UIDropDownMenuTemplate")
UnitPopupFrames[#UnitPopupFrames+1] = "IceHUD_UnitFrame_DropDown"
IceHUD.DropdownUnit = nil
UIDropDownMenu_Initialize(IceHUD_UnitFrame_DropDown, function()
if not IceHUD.DropdownUnit then
return
end
local menu, id = figure_unit_menu(IceHUD.DropdownUnit)
if menu then
menu = IceHUD.MungeUnitMenu(menu)
UnitPopup_ShowMenu(IceHUD_UnitFrame_DropDown, menu, IceHUD.DropdownUnit, nil, id)
end
end, "MENU", nil)
UnitPopupMenus[new_menu_name] = new_data
munged_unit_menus[menu] = new_menu_name
return new_menu_name
end
IceHUD.MungeUnitMenu = munge_unit_menu
local function figure_unit_menu(unit)
if unit == "focus" then
return "FOCUS"
end
if UnitIsUnit(unit, "player") then
return "SELF"
end
if UnitIsUnit(unit, "vehicle") then
-- NOTE: vehicle check must come before pet check for accuracy's sake because
-- a vehicle may also be considered your pet
return "VEHICLE"
end
if UnitIsUnit(unit, "pet") then
return "PET"
end
if not UnitIsPlayer(unit) then
return "TARGET"
end
local id = UnitInRaid(unit)
if id then
return "RAID_PLAYER", id
end
if UnitInParty(unit) then
return "PARTY"
end
return "PLAYER"
end
if UnitPopupFrames then
UnitPopupFrames[#UnitPopupFrames+1] = "IceHUD_UnitFrame_DropDown"
end
IceHUD.DropdownUnit = nil
UIDropDownMenu_Initialize(IceHUD_UnitFrame_DropDown, function()
if not IceHUD.DropdownUnit then
return
end
local menu, id = figure_unit_menu(IceHUD.DropdownUnit)
if menu then
menu = IceHUD.MungeUnitMenu(menu)
UnitPopup_ShowMenu(IceHUD_UnitFrame_DropDown, menu, IceHUD.DropdownUnit, nil, id)
end
end, "MENU", nil)

View File

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

View File

@ -1,7 +1,8 @@
## Interface: 90205
## Interface-Retail: 90205
## Interface: 100000
## Interface-Retail: 100000
## Interface-Classic: 11403
## Interface-BCC: 20504
## Interface-Wrath: 30400
## Title: IceHUD |cff7fff7f-Options-|r
## Author: Parnic
## Version: @project-version@
@ -10,4 +11,7 @@
## Dependencies: IceHUD
## LoadOnDemand: 1
Json.lua
JsonDecode.lua
JsonEncode.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 L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
local icon = LibStub("LibDBIcon-1.0", true)
local AceGUI = LibStub("AceGUI-3.0")
local AceSerializer = LibStub("AceSerializer-3.0", 1)
local lastCustomModule = "Bar"
IceHUD_Options = {}
@ -421,7 +423,7 @@ The Classic game client doesn't provide this information to addons because it wa
IceHUD.IceCore.IceHUDFrame:Show()
end
end,
hidden = IceHUD.WowVer < 80000,
hidden = not IceHUD.HasShellGame,
order = 36,
},
}
@ -757,6 +759,9 @@ function IceHUD_Options:OnLoad()
self:GenerateModuleOptions(true)
self.options.args.colors.args = IceHUD.IceCore:GetColorOptions()
self.options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(IceHUD.db)
--@debug@
IceHUD_Options:SetupProfileImportButtons()
--@end-debug@
-- Add dual-spec support
if IceHUD.db ~= nil and LibDualSpec then
@ -787,14 +792,14 @@ function IceHUD_Options:SetupProfileImportButtons()
editbox:SetLabel("Profile")
editbox:SetFullWidth(true)
editbox:SetFullHeight(true)
local profileTable = deepcopy(IceHUD.db.profile)
local profileTable = IceHUD.deepcopy(IceHUD.db.profile)
IceHUD:removeDefaults(profileTable, IceHUD.IceCore.defaults.profile)
editbox:SetText(IceHUD:Serialize(profileTable))
editbox:SetText(IceHUD.json.encode(profileTable))
editbox:DisableButton(true)
frame:AddChild(editbox)
end,
hidden =
-- hello, snooper! this feature doesn't actually work yet, so enabling it won't help you much :)
-- hello, snooper! exporting works well enough, but importing is very rough, so enable this at your own peril
--[===[@non-debug@
true
--@end-non-debug@]===]
@ -803,7 +808,7 @@ function IceHUD_Options:SetupProfileImportButtons()
--@end-debug@
,
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@
true
--@end-non-debug@]===]
@ -824,11 +829,14 @@ function IceHUD_Options:SetupProfileImportButtons()
frame:SetStatusText("Exported profile details")
frame:SetLayout("Flow")
frame:SetCallback("OnClose", function(widget)
local success, newTable = IceHUD:Deserialize(widget.children[1]:GetText())
if success then
local newTable, err = IceHUD.json.decode(widget.children[1]:GetText())
if err ~= nil then
print("failed to import profile: "..err)
else
print("importing profile")
IceHUD:PreProfileChanged()
IceHUD:populateDefaults(newTable, IceHUD.IceCore.defaults.profile)
IceHUD.db.profile = deepcopy(newTable)
IceHUD.db.profile = IceHUD.deepcopy(newTable)
IceHUD:PostProfileChanged()
end
AceGUI:Release(widget)
@ -841,7 +849,7 @@ function IceHUD_Options:SetupProfileImportButtons()
frame:AddChild(editbox)
end,
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@
true
--@end-non-debug@]===]
@ -850,7 +858,7 @@ function IceHUD_Options:SetupProfileImportButtons()
--@end-debug@
,
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@
true
--@end-non-debug@]===]
@ -862,7 +870,3 @@ function IceHUD_Options:SetupProfileImportButtons()
}
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,48 @@
# Changelog
v1.13.17.3:
- Packaged latest LibDogTag-Unit to work around crash in Wrath Classic client.
v1.13.17.2:
- Fixed Runes disappearing for Death Knights on Wrath Classic when using the dual spec feature.
v1.13.17.1:
- Fixed Priests hanging on login on the retail client.
v1.13.17:
- Internal maintainability updates. There are so many versions of the game now, updates need to be as easy and safe as possible.
- Improved reliability of Slice-n-Dice predicted length when changing talents.
- Improved various modules's ability to respond to the player's maximum power type changing (going from 5 max combo points to 6, for example).
- Fixed invalid texture layers specified on a variety of textures (10.0 fix).
- Removed HolyPowerNumeric text from the configuration options of several modules that it didn't belong with.
- Fixed combo points in Classic Era clients.
v1.13.16:
- Enabled Incoming Heal Prediction on Wrath-Classic.
- Added detection for the full Wrath Classic build (not just the pre-patch).
v1.13.15:
- Updated TOC for Retail (9.2.7).
- Added Wrath-Classic compatibility.
v1.13.14.3:
- Restored right-click menus on Info and Health bars when targeting other players.
v1.13.14.2:
- Restored right-click menus on Info and Health bars.
v1.13.14.1:
- Restored guard around array that doesn't exist on Classic clients.
v1.13.14:
- Fixed target health updating infrequently on Classic.

View File

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

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

View File

@ -101,7 +101,7 @@ function IceClassPowerCounter.prototype:GetOptions()
opts["displayMode"] = {
type = 'select',
name = L["Display mode"],
desc = L["Choose whether you'd like a graphical or numeric representation of the runes.\n\nNOTE: The color of 'Numeric' mode can be controlled by the HolyPowerNumeric color."],
desc = L["Choose whether you'd like a graphical or numeric representation of the runes."],
get = function(info)
return IceHUD:GetSelectValue(info, self.moduleSettings.runeMode)
end,
@ -468,6 +468,9 @@ function IceClassPowerCounter.prototype:DisplayCounter()
self:RegisterEvent(IceHUD.UnitPowerEvent, "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()
@ -497,8 +500,22 @@ function IceClassPowerCounter.prototype:UpdateRunePower(event, arg1, arg2)
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 +584,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 +605,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 +743,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 +787,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

@ -13,13 +13,6 @@ if Enum and Enum.PowerType then
SPELL_POWER_COMBO_POINTS = Enum.PowerType.ComboPoints
end
local GetUnitChargedPowerPoints = GetUnitChargedPowerPoints
if not GetUnitChargedPowerPoints then
GetUnitChargedPowerPoints = function()
return nil
end
end
-- Constructor --
function ComboPoints.prototype:init()
ComboPoints.super.prototype.init(self, "ComboPoints")
@ -28,7 +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
@ -229,25 +222,26 @@ function ComboPoints.prototype:GetOptions()
order = 35
}
if IceHUD.WowVer >= 90000 then
opts["bShowAnimaCharged"] = {
type = 'toggle',
width = 'double',
name = L["Show Anima-charged points"],
desc = L["Whether or not to color an anima-charged combo point a separate color. Set the KyrianAnimaComboPoint color to the color you would like it to be."],
get = function()
return self.moduleSettings.bShowAnimaCharged
end,
set = function(info, v)
self.moduleSettings.bShowAnimaCharged = v
self:UpdateChargedComboPoints()
end,
disabled = function()
return not self.moduleSettings.enabled
end,
order = 36
}
end
opts["bShowCharged"] = {
type = 'toggle',
width = 'double',
name = L["Show Charged points"],
desc = L["Whether or not to color a charged combo point a separate color. Set the ChargedComboPoint color to the color you would like it to be."],
get = function()
return self.moduleSettings.bShowCharged
end,
set = function(info, v)
self.moduleSettings.bShowCharged = v
self:UpdateChargedComboPoints()
end,
disabled = function()
return not self.moduleSettings.enabled
end,
hidden = function()
return not GetUnitChargedPowerPoints
end,
order = 36
}
return opts
end
@ -267,7 +261,7 @@ function ComboPoints.prototype:GetDefaultSettings()
defaults["comboGap"] = 0
defaults["showAnticipation"] = true
defaults["bShowWithNoTarget"] = true
defaults["bShowAnimaCharged"] = true
defaults["bShowCharged"] = true
return defaults
end
@ -291,7 +285,7 @@ function ComboPoints.prototype:Enable(core)
self:RegisterEvent("UNIT_COMBO_POINTS", "UpdateComboPoints")
else
self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateComboPoints")
if IceHUD.WowVer < 80000 then
if IceHUD.EventExistsUnitMaxPower then
self:RegisterEvent("UNIT_MAXPOWER", "UpdateMaxComboPoints")
end
end
@ -307,7 +301,7 @@ function ComboPoints.prototype:Enable(core)
self:RegisterEvent("PLAYER_COMBO_POINTS", "UpdateComboPoints")
end
if IceHUD.WowVer >= 90000 then
if GetUnitChargedPowerPoints then
self:RegisterEvent("UNIT_POWER_POINT_CHARGE", "UpdateChargedComboPoints")
end
@ -330,9 +324,11 @@ function ComboPoints.prototype:UpdateMaxComboPoints(event, unit, powerType)
end
function ComboPoints.prototype:UpdateChargedComboPoints()
self.chargedPowerPoints = GetUnitChargedPowerPoints("player")
self:CreateComboFrame()
self:UpdateComboPoints()
if GetUnitChargedPowerPoints then
self.chargedPowerPoints = GetUnitChargedPowerPoints("player")
self:CreateComboFrame()
self:UpdateComboPoints()
end
end
-- 'Protected' methods --------------------------------------------------------
@ -444,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
@ -493,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
@ -515,7 +511,7 @@ function ComboPoints.prototype:UpdateComboPoints(...)
local points, anticipate, _
if IceHUD.IceCore:IsInConfigMode() then
points = self:GetMaxComboPoints()
elseif IceHUD.WowVer >= 30000 or IceHUD.WowClassic or IceHUD.WowClassicBC then
elseif UnitHasVehicleUI then
-- Parnic: apparently some fights have combo points while the player is in a vehicle?
local isInVehicle = UnitHasVehicleUI and UnitHasVehicleUI("player")
local checkUnit = isInVehicle and "vehicle" or "player"
@ -531,7 +527,7 @@ function ComboPoints.prototype:UpdateComboPoints(...)
anticipate = 0
end
else
points = GetComboPoints("target")
points = GetComboPoints("player", "target")
end
points = points or 0
@ -593,7 +589,7 @@ do
function ComboPoints.prototype:CheckAnticipation(e, unit) -- UNIT_AURA handler
if UnitIsUnit(unit, "player") then
local _, _, _, newAntStacks
if IceHUD.WowVer < 80000 then
if IceHUD.SpellFunctionsReturnRank then
_, _, _, newAntStacks = UnitAura("player", GetSpellInfo(AnticipationSpellId))
else
_, _, newAntStacks = UnitAura("player", GetSpellInfo(AnticipationSpellId))

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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()
@ -68,7 +69,7 @@ function PlayerHealth.prototype:Enable(core)
PlayerHealth.super.prototype.Enable(self, core)
self:RegisterEvent("UNIT_HEALTH", "UpdateEvent")
if IceHUD.WowVer < 90000 then
if IceHUD.EventExistsUnitHealthFrequent then
self:RegisterEvent("UNIT_HEALTH_FREQUENT", "UpdateEvent")
end
self:RegisterEvent("UNIT_MAXHEALTH", "UpdateEvent")
@ -81,11 +82,7 @@ function PlayerHealth.prototype:Enable(core)
self:RegisterEvent("PLAYER_REGEN_DISABLED", "CheckCombat")
self:RegisterEvent("PARTY_LEADER_CHANGED", "CheckLeader")
if IceHUD.EventExistsGroupRosterUpdate then
self:RegisterEvent("GROUP_ROSTER_UPDATE", "CheckLeader")
else
self:RegisterEvent("PARTY_MEMBERS_CHANGED", "CheckLeader")
end
self:RegisterEvent(groupEvent, "CheckLeader")
if GetLFGProposal then
self:RegisterEvent("LFG_PROPOSAL_UPDATE", "CheckPartyRole")
self:RegisterEvent("LFG_PROPOSAL_FAILED", "CheckPartyRole")
@ -105,7 +102,7 @@ function PlayerHealth.prototype:Enable(core)
self:RegisterEvent("UNIT_EXITED_VEHICLE", "ExitingVehicle")
end
if IceHUD.WowVer < 40000 then
if not IceHUD.SupportsHealPrediction then
HealComm = LibStub("LibHealComm-4.0", true)
if HealComm then
HealComm.RegisterCallback(self, "HealComm_HealStarted", function(event, casterGUID, spellID, spellType, endTime, ...) self:HealComm_HealEvent(event, casterGUID, spellID, spellType, endTime, ...) end)
@ -169,7 +166,7 @@ function PlayerHealth.prototype:HealComm_ModifierChanged(event, guid)
end
function PlayerHealth.prototype:IncomingHealPrediction(event, unit)
if IceHUD.WowVer >= 40000 then
if IceHUD.SupportsHealPrediction then
if unit and unit ~= self.unit then
return
end
@ -321,7 +318,7 @@ function PlayerHealth.prototype:GetOptions()
self:Update()
end,
disabled = function()
return not (self.moduleSettings.enabled and (IceHUD.WowVer >= 40000 or HealComm))
return not (self.moduleSettings.enabled and (IceHUD.SupportsHealPrediction or HealComm))
end,
order = 43.6
}
@ -367,7 +364,7 @@ function PlayerHealth.prototype:GetOptions()
self:Update()
end,
disabled = function()
return not (self.moduleSettings.enabled and IceHUD.WowVer >= 70000)
return not (self.moduleSettings.enabled and UnitGetTotalAbsorbs)
end,
order = 43.8
}
@ -942,7 +939,7 @@ function PlayerHealth.prototype:CreateHealBar()
self:UpdateBar(1, "undef")
if not self.moduleSettings.showIncomingHeals or (IceHUD.WowVer < 40000 and not HealComm) then
if not self.moduleSettings.showIncomingHeals or (not IceHUD.SupportsHealPrediction and not HealComm) then
self.healFrame.bar:Hide()
end
end
@ -954,7 +951,7 @@ function PlayerHealth.prototype:CreateAbsorbBar()
self:UpdateBar(1, "undef")
if not self.moduleSettings.showAbsorbs or UnitGetTotalAbsorbs == nil then
if not self.moduleSettings.showAbsorbs or not UnitGetTotalAbsorbs then
self.absorbFrame.bar:Hide()
end
end
@ -1094,7 +1091,7 @@ function PlayerHealth.prototype:CheckPartyRole()
proposalExists, id, typeID, subtypeID, name, texture, role, hasResponded, totalEncounters, completedEncounters, numMembers, isleader = GetLFGProposal()
local p = self.unit
if IceHUD.WowVer < 40000 then
if not IceHUD.UnitGroupRolesReturnsRoleString then
isTank, isHeal, isDPS = UnitGroupRolesAssigned(p)
else
local grpRole = UnitGroupRolesAssigned(p)
@ -1427,37 +1424,34 @@ function PlayerHealth.prototype:HideBlizzardParty()
return
end
-- Both Pitbull 4 and Xperl use these exact code, so we use it too.
for i = 1, MAX_PARTY_MEMBERS do
local party = _G['PartyMemberFrame'..i]
party:UnregisterAllEvents()
party:Hide()
party.Show = function() end
if PartyFrame then
PartyFrame:Hide()
PartyFrame:UnregisterEvent(groupEvent)
else
for i = 1, MAX_PARTY_MEMBERS do
local frame = _G["PartyMemberFrame" .. i]
frame:SetAttribute("statehidden", true)
hook_frames(frame)
end
UIParent:UnregisterEvent(groupEvent)
end
UIParent:UnregisterEvent('RAID_ROSTER_UPDATE')
end
function PlayerHealth.prototype:ShowBlizzardParty()
-- Both Pitbull 4 and Xperl use these exact code, so we use it too.
for i = 1, MAX_PARTY_MEMBERS do
local frame = _G["PartyMemberFrame"..i]
if frame then
frame.Show = nil
frame:GetScript("OnLoad")(frame)
if IceHUD.WowVer >= 50000 then
frame:GetScript("OnEvent")(frame, "GROUP_ROSTER_UPDATE")
else
frame:GetScript("OnEvent")(frame, "PARTY_MEMBERS_CHANGED")
end
PartyMemberFrame_UpdateMember(frame)
if PartyFrame then
PartyFrame:Show()
PartyFrame:Layout()
PartyFrame:RegisterEvent(groupEvent)
else
for i = 1, MAX_PARTY_MEMBERS do
local frame = _G["PartyMemberFrame" .. i]
frame:SetAttribute("statehidden", nil)
unhook_frames(frame)
frame:GetScript("OnEvent")(frame, groupEvent)
end
UIParent:RegisterEvent(groupEvent)
end
UIParent:RegisterEvent("RAID_ROSTER_UPDATE")
end
--function PlayerHealth.prototype:ShowBlizzParty()

View File

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

View File

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

View File

@ -235,7 +235,7 @@ end
function RollTheBones.prototype:GetBuffDuration(unitName, ids)
local i = 1
local buff, _, type, duration, endTime, spellId
if IceHUD.WowVer < 80000 then
if IceHUD.SpellFunctionsReturnRank then
buff, _, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
else
buff, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
@ -256,7 +256,7 @@ function RollTheBones.prototype:GetBuffDuration(unitName, ids)
i = i + 1;
if IceHUD.WowVer < 80000 then
if IceHUD.SpellFunctionsReturnRank then
buff, _, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
else
buff, _, _, type, duration, endTime, _, _, _, spellId = UnitBuff(unitName, i)
@ -376,14 +376,18 @@ function RollTheBones.prototype:UpdateDurationBar(event, unit)
end
local points = RTBGetComboPoints(self.unit)
-- check for Deeper Stratagem
local _, _, _, DeeperStratagem = GetTalentInfoByID(sixComboPointsTalentID, GetActiveSpecGroup())
if DeeperStratagem then
-- first, set the cached upper limit of RtB duration
CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints + 1)
if UnitPowerMax then
CurrMaxRtBDuration = self:GetMaxBuffTime(UnitPowerMax(self.unit, SPELL_POWER_COMBO_POINTS))
else
CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints)
-- check for Deeper Stratagem
local _, _, _, DeeperStratagem = GetTalentInfoByID(sixComboPointsTalentID, GetActiveSpecGroup())
if DeeperStratagem then
-- first, set the cached upper limit of RtB duration
CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints + 1)
else
CurrMaxRtBDuration = self:GetMaxBuffTime(maxComboPoints)
end
end
if event then

View File

@ -3,21 +3,23 @@ local Runes = IceCore_CreateClass(IceElement)
local IceHUD = _G.IceHUD
local RunesReturnedByMaxPower = IceHUD.WowVer >= 70000
local CooldownFrame_SetTimer = CooldownFrame_SetTimer
if CooldownFrame_Set then
CooldownFrame_SetTimer = CooldownFrame_Set
end
local RUNETYPE_BLOOD = 1;
local RUNETYPE_DEATH = IceHUD.WowVer < 70300 and 2 or 3;
local RUNETYPE_FROST = IceHUD.WowVer < 70300 and 3 or 2;
local RUNETYPE_DEATH = IceHUD.DeathKnightUnholyFrostRunesSwapped and 2 or 3;
local RUNETYPE_FROST = IceHUD.DeathKnightUnholyFrostRunesSwapped and 3 or 2;
local RUNETYPE_CHROMATIC = 4;
local RUNETYPE_LEGION = 5; -- not real, but makes for an easy update
local GetRuneType = GetRuneType
if IceHUD.WowVer >= 70000 and IceHUD.WowVer < 70300 then
GetRuneType = function() return RUNETYPE_LEGION end
elseif IceHUD.WowVer >= 70300 then
elseif IceHUD.WowVer >= 70300 and GetSpecialization then
GetRuneType = function() return GetSpecialization() end
end
@ -132,6 +134,9 @@ function Runes.prototype:GetOptions()
disabled = function()
return not self.moduleSettings.enabled
end,
hidden = function()
return not PlayerFrame_HideVehicleTexture
end,
order = 32
}
@ -265,7 +270,7 @@ end
-- OVERRIDE
function Runes.prototype:Enable(core)
if IceHUD.WowVer >= 70000 then
if RunesReturnedByMaxPower then
self.numRunes = UnitPowerMax("player", SPELL_POWER_RUNES)
end
@ -283,7 +288,9 @@ function Runes.prototype:Enable(core)
self:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED", "UpdateRuneColors")
end
self:RegisterEvent("PLAYER_ENTERING_WORLD", "EnteringWorld")
self:RegisterEvent("UNIT_MAXPOWER", "CheckMaxNumRunes")
if RunesReturnedByMaxPower then
self:RegisterEvent("UNIT_MAXPOWER", "CheckMaxNumRunes")
end
if (self.moduleSettings.hideBlizz) then
self:HideBlizz()
@ -503,7 +510,7 @@ function Runes.prototype:CreateRune(i, type, name)
-- create runes
if (not self.frame.graphical[i]) then
self.frame.graphical[i] = CreateFrame("Frame", nil, self.frame)
self.frame.graphical[i].rune = self.frame.graphical[i]:CreateTexture(nil, "LOW")
self.frame.graphical[i].rune = self.frame.graphical[i]:CreateTexture(nil, "BACKGROUND")
self.frame.graphical[i].rune:SetAllPoints(self.frame.graphical[i])
self.frame.graphical[i].cd = CreateFrame("Cooldown", nil, self.frame.graphical[i], "CooldownFrameTemplate")
self.frame.graphical[i].shine = self.frame.graphical[i]:CreateTexture(nil, "OVERLAY")
@ -577,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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,22 @@
# Changelog
v1.13.14:
v1.13.17.3:
- Fixed target health updating infrequently on Classic.
- Fixed compatibility with WoW 9.2.5.
- Updated TOC for all game flavors.
- Packaged latest LibDogTag-Unit to work around crash in Wrath Classic client.
v1.13.17.2:
- Fixed Runes disappearing for Death Knights on Wrath Classic when using the dual spec feature.
v1.13.17.1:
- Fixed Priests hanging on login on the retail client.
v1.13.17:
- Internal maintainability updates. There are so many versions of the game now, updates need to be as easy and safe as possible.
- Improved reliability of Slice-n-Dice predicted length when changing talents.
- Improved various modules's ability to respond to the player's maximum power type changing (going from 5 max combo points to 6, for example).
- Fixed invalid texture layers specified on a variety of textures (10.0 fix).
- Removed HolyPowerNumeric text from the configuration options of several modules that it didn't belong with.
- Fixed combo points in Classic Era clients.