Add personal cooldown announcer

This commit is contained in:
2024-03-05 21:27:24 +01:00
parent 9e5c8e8a9e
commit 198099af0d
4 changed files with 305 additions and 1 deletions

214
.vscode/settings.json vendored
View File

@@ -1,3 +1,215 @@
{ {
"Lua.diagnostics.globals": ["aura_env"] "Lua.diagnostics.globals": [
"aura_env",
"StaticPopup1Button1",
"SelectGossipOption",
"UnitDebuff",
"PLAYER",
"UnitBuff",
"ChatConfigChatSettingsLeftCheckBox1Check",
"ChatConfigChatSettingsLeftCheckBox2Check",
"ChatConfigChatSettingsLeftCheckBox3Check",
"ChatConfigChatSettingsLeftCheckBox4Check",
"ChatConfigChatSettingsLeftCheckBox5Check",
"ChatConfigChatSettingsLeftCheckBox6Check",
"ChatConfigChatSettingsLeftCheckBox7Check",
"ChatConfigChatSettingsLeftCheckBox8Check",
"ChatConfigChatSettingsLeftCheckBox9Check",
"ChatConfigChatSettingsLeftCheckBox10Check",
"ChatConfigChatSettingsLeftCheckBox11Check",
"ChatConfigChatSettingsLeftCheckBox12Check",
"ChatConfigChatSettingsLeftCheckBox13Check",
"ChatConfigChatSettingsLeftCheckBox14Check",
"ChatConfigChatSettingsLeftCheckBox15Check",
"ChatConfigChatSettingsLeftCheckBox16Check",
"StaticPopupDialogs",
"StaticPopup_Show",
"CommunitiesFrame",
"COMMUNITIES_FRAME_DISPLAY_MODES",
"CommunitiesFrameInset",
"ActionButton_HideOverlayGlow",
"ActionButton_ShowOverlayGlow",
"message",
"InspectUnit",
"GetItemStats",
"FriendsFrameCloseButton",
"DISPLAY",
"HP",
"NAME",
"ANIMATION",
"SHOW",
"SlashCmdList",
"ChatFrame_AddMessageEventFilter",
"ChatFrame_GetMessageEventFilters",
"ChatFrame_RemoveMessageEventFilter",
"CR_VERSATILITY_DAMAGE_DONE",
"CHAT_MSG_WHISPER",
"CHAT_MSG_TEXT_EMOTE",
"HIDE",
"UnitAura",
"CR_VERSATILITY_DAMAGE_TAKEN",
"COLOR",
"CHAT_MSG_LOOT",
"CHAT_MSG_SYSTEM",
"CHAT_MSG_SKILL",
"AuctionHouseFrame",
"CompactRaidFrameContainer",
"ChatFrame1",
"UIDropDownMenu_Initialize",
"UIDropDownMenu_AddButton",
"ToggleDropDownMenu",
"WorldMapFrame",
"RegisterUnitWatch",
"UnitFrame_OnEnter",
"BOOKTYPE_SPELL",
"DEFAULT_CHAT_FRAME",
"GameTooltipTextLeft1",
"CHAT_MSG_PARTY",
"CHAT_MSG_PARTY_LEADER",
"LFG_LIST_CONVERT_TO_RAID_WARNING",
"INVITE",
"CANCEL",
"UIDropDownMenu_SetText",
"HybridScrollFrame_CreateButtons",
"HybridScrollFrame_Update",
"SearchBoxTemplate_OnTextChanged",
"NORMAL_FONT_COLOR",
"GRAY_FONT_COLOR",
"StaticPopupSpecial_Show",
"StaticPopupSpecial_Hide",
"UIDropDownMenu_JustifyText",
"UIDropDownMenu_SetAnchor",
"NUM_LE_LFG_CATEGORYS",
"LFG_LIST_ENTER_NAME",
"nop",
"FILTER",
"LFGListApplicationDialog",
"LFG_LIST_APP_UNEMPOWERED",
"HIGHLIGHT_FONT_COLOR",
"WHISPER",
"LFG_LIST_MUST_SIGN_UP_TO_WHISPER",
"PVEFrame_ShowFrame",
"LFG_LIST_SELECT_A_CATEGORY",
"LFG_LIST_NOT_LEADER",
"LFG_LIST_MORE",
"LFG_LIST_MUST_HAVE_NAME",
"UIDropDownMenu_DisableDropDown",
"UIDropDownMenu_EnableDropDown",
"HybridScrollFrame_GetOffset",
"ERR_RESTRICTED_ACCOUNT_LFG_LIST_TRIAL",
"MAX_RAID_MEMBERS",
"LFG_LIST_PROVING_GROUND_TITLE",
"LFG_LIST_APP_CURRENTLY_APPLYING",
"LFG_LIST_MAX_MEMBERS",
"LFG_LIST_MUST_CHOOSE_SPEC",
"LFG_LIST_OFFLINE_MEMBER",
"LFG_LIST_SELECT_A_SEARCH_RESULT",
"BATTLENET_FONT_COLOR",
"EasyMenu",
"LFG_LIST_MUST_SELECT_ROLE",
"LFG_LIST_INVITED_TO_GROUP",
"GMError",
"LFG_LIST_ILVL_ABOVE_YOURS",
"LFG_LIST_HONOR_LEVEL_ABOVE_YOURS",
"LFG_LIST_LEGACY",
"LFG_LIST_CATEGORY_FORMAT",
"WHISPER_LEADER",
"LFG_LIST_REPORT_GROUP_FOR",
"LFG_LIST_REPORT_FOR",
"IGNORE_PLAYER",
"UIDropDownMenu_CreateInfo",
"PVEFrame_ToggleFrame",
"CANNOT_DO_THIS_WITH_LFGLIST_APP",
"CANNOT_DO_THIS_WHILE_LFGLIST_LISTED",
"NO_LFG_LIST_AVAILABLE",
"LFG_LIST_LOADING",
"LFG_LIST_RECOMMENDED_ILVL",
"LFG_LIST_ITEM_LEVEL_INSTR_SHORT",
"DONE_EDITING",
"LIST_GROUP",
"LFG_LIST_ITEM_LEVEL_CURRENT",
"GameFontHighlightSmall",
"GameFontDisableSmall",
"LE_PARTY_CATEGORY_HOME",
"LFG_LIST_INVITE_GROUP",
"LFG_LIST_APP_INVITED",
"LFG_LIST_APP_CANCELLED",
"LFG_LIST_APP_DECLINED",
"LFG_LIST_APP_TIMED_OUT",
"LFG_LIST_APP_INVITE_ACCEPTED",
"LFG_LIST_APP_INVITE_DECLINED",
"LFG_LIST_PROVING_TANK_GOLD",
"LFG_LIST_PROVING_TANK_SILVER",
"LFG_LIST_PROVING_TANK_BRONZE",
"LFG_LIST_PROVING_HEALER_GOLD",
"LFG_LIST_PROVING_HEALER_SILVER",
"LFG_LIST_PROVING_HEALER_BRONZE",
"LFG_LIST_PROVING_DAMAGER_GOLD",
"LFG_LIST_PROVING_DAMAGER_SILVER",
"LFG_LIST_PROVING_DAMAGER_BRONZE",
"SearchBoxTemplateClearButton_OnClick",
"LFG_LIST_ROLE_CHECK",
"LFG_LIST_PENDING",
"LFGListFrameDropDown",
"LE_LFG_LIST_DISPLAY_TYPE_CLASS_ENUMERATE",
"LFG_LIST_TOOLTIP_FRIENDS_IN_GROUP",
"LFG_LIST_BOSSES_DEFEATED",
"LFG_LIST_ENTRY_DELISTED",
"FRIENDS_BNET_NAME_COLOR_CODE",
"FRIENDS_WOW_NAME_COLOR_CODE",
"LFG_LIST_JOINED_GROUP_NOTICE",
"LFG_LIST_OFFLINE_MEMBER_NOTICE",
"GameFontRed",
"LFG_LIST_OFFLINE_MEMBER_NOTICE_GONE",
"GameFontGreen",
"LE_LFG_LIST_DISPLAY_TYPE_ROLE_COUNT",
"LE_LFG_LIST_DISPLAY_TYPE_ROLE_ENUMERATE",
"LE_LFG_LIST_DISPLAY_TYPE_PLAYER_COUNT",
"LE_LFG_LIST_DISPLAY_TYPE_HIDE_ALL",
"UIDropDownMenu_SetWidth",
"GetLFGMode",
"CANNOT_DO_THIS_WHILE_PVE_QUEUING",
"CANNOT_DO_THIS_IN_BATTLEGROUND",
"GREEN_FONT_COLOR",
"LFG_LIST_NO_RESULTS_FOUND",
"MAX_PARTY_MEMBERS",
"LFG_LIST_AND_MORE",
"RED_FONT_COLOR",
"PLAYER_LIST_DELIMITER",
"FONT_COLOR_CODE_CLOSE",
"RGBTableToColorCode",
"ChatFrame_SendTell",
"CANNOT_DO_THIS_WHILE_PVP_QUEUING",
"ChatTypeInfo",
"LFG_LIST_TOO_MANY_FOR_ACTIVITY",
"LFG_LIST_GROUP_TOO_FULL",
"LFG_LIST_INVITED_APP_FILLS_GROUP",
"UNIT_TYPE_LEVEL_TEMPLATE",
"LFG_LIST_HONOR_LEVEL_CURRENT_PVP",
"LFG_LIST_COMMENT_FORMAT",
"LFG_LIST_SEARCH_FAILED",
"LFG_LIST_HIT_MAX_APPLICATIONS",
"LFG_LIST_TOOLTIP_ILVL",
"LFG_LIST_TOOLTIP_HONOR_LEVEL",
"LFG_LIST_TOOLTIP_VOICE_CHAT",
"LFG_LIST_TOOLTIP_LEADER",
"LFG_LIST_TOOLTIP_AGE",
"LFG_LIST_TOOLTIP_MEMBERS_SIMPLE",
"LFG_LIST_TOOLTIP_MEMBERS",
"CANNOT_DO_THIS_IN_LFG_PARTY",
"CANNOT_DO_THIS_IN_PVE_QUEUE",
"LFG_LIST_TOOLTIP_CLASS_ROLE",
"LFG_LIST_BAD_NAME",
"LFG_LIST_BAD_DESCRIPTION",
"LFG_LIST_BAD_VOICE_CHAT_COMMENT",
"LFG_LIST_BAD_LEADER_NAME",
"LFG_LIST_APP_DECLINED_MESSAGE",
"LFG_LIST_APP_TIMED_OUT_MESSAGE",
"LE_FRAME_TUTORIAL_LFG_LIST",
"LFGListFrame",
"WeakAuras",
"enabled",
"C_Container"
],
"Lua.diagnostics.disable": ["duplicate-doc-field"]
} }

View File

@@ -0,0 +1,7 @@
-- CYKA_EVENT_TICKER
function(e)
for _, spell in ipairs(aura_env.spells) do
---@cast spell Spell
spell:Update()
end
end

View File

@@ -0,0 +1,12 @@
-- PLAYER_ENTERING_WORLD GUILD_ROSTER_UPDATE
function(e)
if aura_env.debug then print(string.format("Current ticker: %s", tostring(aura_env.ticker))) end
if aura_env.ticker == nil then
if aura_env.debug then print("Creating ticker") end
local aura_env = aura_env
aura_env.ticker = C_Timer.NewTicker(0.5, function()
if aura_env.debug then print("Ticker calling CYKA_EVENT_TICKER") end
WeakAuras.ScanEvents("CYKA_EVENT_TICKER")
end)
end
end

View File

@@ -0,0 +1,73 @@
aura_env.debug = false
aura_env.ticker = nil
---@class Spell
---@field name string
---@field id number
---@field isOnCooldown boolean
---@field announced boolean
---@field remaining number
Spell = {
---@param id number
---@param name string
---@return Spell
new = function(id, name)
local self = setmetatable({}, {
__index = Spell
})
self.id = id
self.name = name
self.isOnCooldown = false
self.announced = false
self.remaining = 0
return self
end,
---@param self Spell
Update = function(self)
local start, duration = GetSpellCooldown(self.id)
local isOnCooldown = start > 0 and duration > 3
local remaining = start + duration - GetTime()
if not isOnCooldown and self.isOnCooldown then
self:playComplete()
self.announced = false
end
if not self.announced and isOnCooldown and remaining < 10 then
self:playSoon()
self.announced = true
end
self.isOnCooldown = isOnCooldown
self.remaining = remaining
end,
---@param self Spell
playComplete = function(self)
local soundFile = string.format("Interface\\Sounds\\cooldown\\%s.ogg", self.name)
if aura_env.debug then print(string.format("%s is off cooldown, playing sound file at %s", self.name, soundFile)) end
local success = PlaySoundFile(soundFile, "Master")
if not success then
print(string.format("Failed to play sound for %s", self.name))
end
end,
---@param self Spell
playSoon = function(self)
local soundFile = string.format("Interface\\Sounds\\cooldown\\%sSoon.ogg", self.name)
if aura_env.debug then print(string.format("%s is almost off cooldown, playing sound file at %s", self.name, soundFile)) end
local success = PlaySoundFile(soundFile, "Master")
if not success then
print(string.format("Failed to play sound for %s", self.name))
end
end
}
aura_env.spells = {
Spell.new(107574, "Avatar"),
Spell.new(1719, "BattleCry"),
Spell.new(205545, "OdynsFury"),
Spell.new(26297, "Berserking"),
Spell.new(12292, "Bloodbath"),
Spell.new(23881, "Bloodthirst")
}