Compare commits

...

12 Commits

Author SHA1 Message Date
9500bdf393 Fix error on BCC
Fixes #21
2022-06-01 16:26:12 -05:00
6325ed1ade Fix changelogs
This is why Unreleased is used instead...
2022-06-01 08:31:05 -05:00
a4c44a5809 Update TOC 2022-06-01 08:30:21 -05:00
82db70969a Remove UnitPopupButtons usage
I need to find a way to reintroduce this, but Blizzard's new method of building these frames doesn't look like it's going to be particularly easy. This stops error popups on 9.2.5
2022-06-01 08:29:39 -05:00
47931922bd Fix target health updating infrequently on Classic 2022-05-02 12:22:07 -05:00
af74c9e3fe Update changelog 2022-03-28 10:30:30 -05:00
611f37a1f3 Add reported missing nil check
Fixes #20 (github)
2022-03-25 21:30:54 -05:00
5d8b83e5ef Update changelog 2022-03-24 11:54:20 -05:00
53fdb48b05 Fix reported TBC issue of target health updates
For some reason, on TBC classic target health is not updating frequently. I waded through the official TBC source code, and it looks like if predictedHealth is enabled (which it is by default), then the default UI uses an OnUpdate handler to update the target's health bar. So now I'm doing the same.
2022-03-24 11:51:58 -05:00
b64294ca11 Minor optimization for ZM puzzle detection
COMBAT_LOG_EVENT_UNFILTERED is a spam-fest, so let's only subscribe to it when we absolutely have to. This could arguably by done entirely in UNIT_AURA, but since we don't know for sure that a given UNIT_AURA event was the removal of a buff, there is a potential problem with trying to detect exactly when the puzzle session was finished. This code can potentially mis-detect puzzle starting, or hide the addon again when it's already hidden, but there shouldn't be an issue in practice. If this turns out to be problematic, I will roll back to the previous method.
2022-03-23 23:07:20 -05:00
0785265feb Convenience method for looking for any buff from a list 2022-03-23 23:04:00 -05:00
4007f1258b Fix whitespace 2022-03-23 11:40:12 -05:00
8 changed files with 209 additions and 150 deletions

View File

@ -303,9 +303,23 @@ function IceCore.prototype:Enable(userToggle)
end
elseif (event == "UNIT_AURA") then
local unit = ...
if IceHUD.IceCore.settings.bHideDuringShellGame and unit == "player" and IceHUD:HasDebuffs("player", {271571})[1] and UnitInVehicle("player") then
if unit ~= "player" then
return
end
if IceHUD.IceCore.settings.bHideDuringShellGame and IceHUD:HasAnyDebuff("player", {271571}) and UnitInVehicle("player") then
self:RegisterEvent("UNIT_EXITED_VEHICLE")
self:Hide()
elseif C_Map then
local bestMapID = C_Map.GetBestMapForUnit("player")
if bestMapID ~= ZM_MAP_ID then
return
end
if IceHUD:HasAnyBuff("player", IceCore.zmPuzzleIds) then
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
self:Hide()
end
end
elseif (event == "UNIT_EXITED_VEHICLE") then
self:UnregisterEvent("UNIT_EXITED_VEHICLE")
@ -314,33 +328,23 @@ function IceCore.prototype:Enable(userToggle)
if C_Map then
local bestMapID = C_Map.GetBestMapForUnit("player")
if bestMapID == ZM_MAP_ID then
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
local puzzleStatus = IceHUD:HasBuffs("player", IceCore.zmPuzzleIds)
for i=1, #puzzleStatus do
if puzzleStatus[i] then
self:Hide()
end
if IceHUD:HasAnyBuff("player", IceCore.zmPuzzleIds) then
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
self:Hide()
end
else
self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
end
end
elseif (event == "COMBAT_LOG_EVENT_UNFILTERED") then
local _,subevent,_,_,_,_,_,_,destName,_,_,spellId = CombatLogGetCurrentEventInfo()
if subevent == "SPELL_AURA_APPLIED" then
if destName == UnitName("player") then
if IceCore.zmPuzzleMap[spellId] then
self:Hide()
end
end
elseif subevent == "SPELL_AURA_REMOVED" then
if destName == UnitName("player") then
if IceCore.zmPuzzleMap[spellId] then
self:Show()
end
end
end
if subevent == "SPELL_AURA_REMOVED" then
if destName == UnitName("player") then
if IceCore.zmPuzzleMap[spellId] then
self:Show()
self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
end
end
end
end
end)

View File

@ -36,6 +36,7 @@ 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.ShouldUpdateTargetHealthEveryTick = (IceHUD.WowClassic or IceHUD.WowClassicBC) and GetCVarBool("predictedHealth")
IceHUD.UnitPowerEvent = "UNIT_POWER_UPDATE"
@ -493,6 +494,30 @@ do
function IceHUD:HasDebuffs(unit, spellIDs, filter)
return IceHUD:HasBuffs(unit, spellIDs, filter and filter.."|HARMFUL" or "HARMFUL")
end
function IceHUD:HasAnyBuff(unit, spellIDs, filter)
local buffs = IceHUD:HasBuffs(unit, spellIDs, filter)
for i=1, #buffs do
if buffs[i] then
return true
end
end
return false
end
function IceHUD:HasAnyDebuff(unit, spellIDs, filter)
local debuffs = IceHUD:HasDebuffs(unit, spellIDs, filter)
for i=1, #debuffs do
if debuffs[i] then
return true
end
end
return false
end
end
function IceHUD:OnDisable()
@ -659,134 +684,136 @@ function IceHUD:GetIsInLFGGroup()
return IsInLFGGroup
end
local 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 UnitPopupButtons then
local 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,
}
UnitPopupButtons["ICEHUD_SET_FOCUS"] = {
text = L["Type %s to set focus"]:format(SLASH_FOCUS1),
tooltipText = L["Blizzard currently does not provide a proper way to right-click focus with custom unit frames."],
dist = 0,
}
UnitPopupButtons["ICEHUD_SET_FOCUS"] = {
text = L["Type %s to set focus"]:format(SLASH_FOCUS1),
tooltipText = L["Blizzard currently does not provide a proper way to right-click focus with custom unit frames."],
dist = 0,
}
UnitPopupButtons["ICEHUD_CLEAR_FOCUS"] = {
text = L["Type %s to clear focus"]:format(SLASH_CLEARFOCUS1),
tooltipText = L["Blizzard currently does not provide a proper way to right-click focus with custom unit frames."],
dist = 0,
}
UnitPopupButtons["ICEHUD_CLEAR_FOCUS"] = {
text = L["Type %s to clear focus"]:format(SLASH_CLEARFOCUS1),
tooltipText = L["Blizzard currently does not provide a proper way to right-click focus with custom unit frames."],
dist = 0,
}
UnitPopupButtons["ICEHUD_PET_DISMISS"] = {
text = L["Use your Dismiss Pet spell to dismiss a pet"],
tooltipText = L["Blizzard currently does not provide a proper way to right-click dismiss a pet with custom unit frames."],
dist = 0,
}
UnitPopupButtons["ICEHUD_PET_DISMISS"] = {
text = L["Use your Dismiss Pet spell to dismiss a pet"],
tooltipText = L["Blizzard currently does not provide a proper way to right-click dismiss a pet with custom unit frames."],
dist = 0,
}
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
local _, v
for _, v in ipairs(data) do
if BLACKLISTED_UNIT_MENU_OPTIONS[v] then
found = true
break
local munged_unit_menus = {}
local function munge_unit_menu(menu)
local result = munged_unit_menus[menu]
if result then
return result
end
end
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 = {}
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
if not UnitPopupMenus then
munged_unit_menus[menu] = menu
return menu
end
if not blacklisted then
new_data[#new_data+1] = v
elseif blacklisted ~= true then
new_data[#new_data+1] = blacklisted
local data = UnitPopupMenus[menu]
if not data then
munged_unit_menus[menu] = menu
return menu
end
local found = false
local _, v
for _, v in ipairs(data) do
if BLACKLISTED_UNIT_MENU_OPTIONS[v] then
found = true
break
end
end
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 = {}
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
local new_menu_name = "ICEHUD_" .. menu
IceHUD.MungeUnitMenu = munge_unit_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 function figure_unit_menu(unit)
if unit == "focus" then
return "FOCUS"
end
local function figure_unit_menu(unit)
if unit == "focus" then
return "FOCUS"
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 UnitIsUnit(unit, "player") then
return "SELF"
IceHUD_UnitFrame_DropDown = CreateFrame("Frame", "IceHUD_UnitFrame_DropDown", UIParent, "UIDropDownMenuTemplate")
if UnitPopupFrames then
UnitPopupFrames[#UnitPopupFrames+1] = "IceHUD_UnitFrame_DropDown"
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
IceHUD.DropdownUnit = nil
UIDropDownMenu_Initialize(IceHUD_UnitFrame_DropDown, function()
if not IceHUD.DropdownUnit then
return
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")
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)
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)
end

View File

@ -1,7 +1,7 @@
## Interface: 90200
## Interface-Retail: 90200
## Interface-Classic: 11402
## Interface-BCC: 20503
## Interface: 90205
## Interface-Retail: 90205
## Interface-Classic: 11403
## Interface-BCC: 20504
## Author: Parnic, originally created by Iceroth
## Name: IceHUD
## Title: IceHUD |cff7fff7f-Ace3-|r

View File

@ -1,7 +1,7 @@
## Interface: 90200
## Interface-Retail: 90200
## Interface-Classic: 11402
## Interface-BCC: 20503
## Interface: 90205
## Interface-Retail: 90205
## Interface-Classic: 11403
## Interface-BCC: 20504
## Title: IceHUD |cff7fff7f-Options-|r
## Author: Parnic
## Version: @project-version@

View File

@ -1,5 +1,21 @@
# Changelog
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.
- Fixed compatibility with WoW 9.2.5.
- Updated TOC for all game flavors.
v1.13.13:
- Slight optimization of Zereth Mortis puzzle detection logic.
- Fixed target health updating infrequently on Classic-BC.
- Fixed reported error in TargetInvuln module.
v1.13.12:
- Hide IceHUD during Zereth Mortis puzzles

View File

@ -642,6 +642,10 @@ function IceTargetHealth.prototype:Enable(core)
self:RegisterEvent("LFG_PROPOSAL_FAILED", "CheckPartyRole")
self:RegisterEvent("LFG_ROLE_UPDATE", "CheckPartyRole")
end
if IceHUD.ShouldUpdateTargetHealthEveryTick and self.unit == "target" then
self.frame:SetScript("OnUpdate", function() self:Update(self.unit) end)
end
end
if (self.moduleSettings.hideBlizz) then
@ -659,6 +663,10 @@ function IceTargetHealth.prototype:Disable(core)
UnregisterUnitWatch(self.frame)
if self.registerEvents and IceHUD.ShouldUpdateTargetHealthEveryTick and self.unit == "target" then
self.frame:SetScript("OnUpdate", nil)
end
if self.moduleSettings.hideBlizz then
self:ShowBlizz()
end

View File

@ -197,7 +197,7 @@ end
function TargetInvuln.prototype:UpdateTargetBuffs(event, unit, isUpdate)
local name, duration, remaining
if not isUpdate then
if not isUpdate or not self.lastUpdateTime then
self.buffName, self.buffDuration, self.buffRemaining = self:GetMaxbuffDuration(self.unit, self.buffList)
else
self.buffRemaining = math.max(0, self.buffRemaining - (GetTime() - self.lastUpdateTime))

View File

@ -1,7 +1,11 @@
# Changelog
v1.13.12:
v1.13.14.1:
- Hide IceHUD during Zereth Mortis puzzles
- Fixed default player and target frames coming back sometimes (github issue #19)
- Updated TOC for 9.2.0 and 1.14.2
- Restored guard around array that doesn't exist on Classic clients.
v1.13.14:
- Fixed target health updating infrequently on Classic.
- Fixed compatibility with WoW 9.2.5.
- Updated TOC for all game flavors.