WeakAuras-Forever-1.2.0.zip
What's new
2026-09-29
Added
.luacheckrc: luacheck checks syntax and global variables only. Every global the addons use is listed, so a new one (a typo, or an API not checked on WoW Forever) is reported..github/workflows/lint.ymlruns it on every push and pull request.
Changed
WeakAuras/Init.lua:Private.IsRestricted(kind, ...)asksC_Secretswhether auras, cooldowns, a spell cooldown, unit stats or unit identity are secret, and returnsnilwhen the client cannot tell.WeakAuras.IsRestricted()is true while aura or cooldown data is secret (in combat withoutC_Secrets). TheRestrictionChangedcallback fires when that state changes.Private.IsDurationObject(value).WeakAuras/BuffTrigger2.lua: aura triggers paused on secret data are rescanned when the restriction ends, instead of at the end of combat only.WeakAuras/GenericTrigger.lua: cooldowns are checked again when the restriction ends.WeakAuras/RegionTypes/RegionPrototype.lua: a timed trigger state can carry adurationObject(a duration object of the 12.x engine). Regions receive it with the trigger's main timer, unless the timer is paused or min or max progress is adjusted.WeakAuras/RegionTypes/Icon.lua: the cooldown swipe draws adurationObjectwithSetCooldownFromDurationObject, so it keeps running when the duration is secret.WeakAuras/RegionTypes/AuraBar.lua: an invisible nativeStatusBarruns adurationObjectwithSetTimerDuration, and the bar foreground mask follows its fill, so the bar keeps running when the duration is secret. In that mode the spark is shown unless it is set to always hidden.WeakAuras/GenericTrigger.lua:WeakAuras.GetSpellCooldownDurationObject(id, showgcd, ignoreSpellKnown, track)returns the duration object ofC_Spell.GetSpellCooldownDuration(orC_Spell.GetSpellChargeDurationfor charges) while the spell cooldown is secret. Spells with a secret cooldown sendSPELL_COOLDOWN_CHANGEDon every check. ASPELL_UPDATE_COOLDOWNwith a secret payload checks every spell once on the next frame, instead of on every event.WeakAuras/RegionTypes/Icon.lua: the swipe of a duration object restarts only when its direction changes.WeakAuras/Init.lua:Private.hasAuraInstanceAPI, true when the aura instance API is available (Retail and the 12.x engine).WeakAuras/BuffTrigger2.luaandWeakAuras.GetAuraInstanceTooltipInfo(WeakAuras/WeakAuras.lua) use it instead ofWeakAuras.IsRetail(), so aura triggers handleUNIT_AURAincrementally byauraInstanceID.WeakAuras/BuffTrigger2.lua: while aura data is secret,UNIT_AURAno longer reads its payload. Once per frame, the auras already matched get adurationObjectfromC_UnitAuras.GetAuraDuration, and the ones that no longer exist are removed. Auras applied during the restriction, stacks and other fields are only read when it ends.WeakAuras/Prototypes.lua: the "Cooldown/Charges/Count" trigger setsstate.durationObject, so its icon swipe and bar keep running in combat. Showing only on cooldown or when ready, and tracking a specific charge, still use the last readable cooldown.WeakAuras/WeakAuras.lua: whenvalueortotalof a trigger state is secret, both are also kept instate.secretValueandstate.secretTotal, which are not scrubbed.WeakAuras/RegionTypes/RegionPrototype.luapasses them to regions with the main progress, unless min or max progress is adjusted.WeakAuras/RegionTypes/AuraBar.luadraws them with an invisible nativeStatusBar(SetMinMaxValues,SetValue), like duration objects, so health and power bars keep moving in combat. An inverted bar still shows the last readable value.WeakAuras/Init.lua,WeakAuras/GenericTrigger.lua,WeakAuras/Prototypes.lua: generated trigger code no longer errors on secret health or power without a threshold: the state store compares secret values without reading them, percent and deficit arenilwhile value or total is secret, and a secret raid marker is ignored. A threshold on a secret value (for example health >= 1000) still errors.WeakAuras/GenericTrigger.lua: without combat log, a trigger that errors keeps its last state instead of being untriggered, as described on 2026-09-28. Before, a trigger with automatic hiding was hidden.WeakAuras/GenericTrigger.lua: without combat log, the options warn about combat log triggers and CLEU events, which never fire, and about thresholds of Health and Power triggers, which cannot be checked on secret values.WeakAuras/BuffTrigger2.lua: an aura update that fails on secret data no longer stops the profiler from counting that aura.WeakAuras/Compatibility.lua:Private.hasSpecializations, true on Classic Era when the client hasC_SpecializationInfo(WoW Forever).WeakAuras/Types.lua,WeakAuras/Prototypes.lua,WeakAuras/WeakAuras.lua: in that case the "Class and Specialization" load option and the "Class and Specialization" trigger are available, and loads are checked again onPLAYER_SPECIALIZATION_CHANGED.WeakAuras/Prototypes.lua: "Ammo" trigger on Classic Era, with the count, name and icon of the ammo in the ammo slot..luacheckrc:INVSLOT_AMMO.WeakAuras/Init.lua:Private.IsRestricted("auraInstance", unit, auraInstanceID).WeakAuras/BuffTrigger2.lua: while aura data is secret, auras applied during the restriction are listed withC_UnitAuras.GetUnitAuraInstanceIDs, and the ones thatC_Secrets.ShouldUnitAuraInstanceBeSecretreports as readable are handled right away. The matched auras also get their stack text fromC_UnitAuras.GetAuraApplicationDisplayCount, kept instate.secretStacks(WeakAuras/WeakAuras.luadoes not scrub it).WeakAuras/SubRegionTypes/SubText.lua: a text that is only%pis drawn by aC_DurationUtilduration text binding when the region has adurationObject, and a text that is only%sshowsstate.secretStacks, so both keep updating in combat. In that mode%puses the client's seconds format instead of the text format options, and%sis empty below 2 stacks..luacheckrc:C_DurationUtil,C_StringUtil, and for the entries belowC_SwingTimer,C_CurveUtil,NUM_BAG_SLOTS.WeakAuras/GenericTrigger.lua: when the restriction ends, unit health and power events are scanned again, so health and power triggers do not keep their last readable values until the next change.WeakAuras/Init.lua:RestrictionChangedalso fires when only the unit stats restriction changes.WeakAuras/Compatibility.lua:Private.hasNativeSwingTimer, true whenC_SwingTimerexists.WeakAuras/GenericTrigger.lua: the swing timer starts onPLAYER_SWINGwith the swing duration of the client, for main hand, off hand and ranged (wand included), and a secret attack speed keeps the last readable one. WithPLAYER_SWING, only a swing paused by a cast restarts when the cast ends.WeakAuras.IsTargetInSwingRange(hand).WeakAuras/Prototypes.lua: the Swing Timer trigger has a Target In Range option, updated byPLAYER_SWING_RANGE_UPDATE.WeakAuras/GenericTrigger.lua: without the globalGetWeaponEnchantInfo, the weapon enchant trigger readsC_Item.GetWeaponEnchantInfofor main hand, off hand and ranged.WeakAuras/GenericTrigger.lua: while cooldowns are secret, the global cooldown comes from the duration object ofC_Spell.GetSpellCooldownDuration(spell 61304, 29515 on Classic), returned byWeakAuras.GetGCDInfoas a sixth value.WeakAuras/Prototypes.lua: the Global Cooldown trigger stores it asdurationObject.WeakAuras/SubRegionTypes/Border.lua: Color by Dispel Type option. The border takes the dispel type color of the aura, fromC_UnitAuras.GetAuraDispelTypeColor(secret colors included), else from the readable debuff class, else the border color, also used for auras without dispel type. A border color set by a condition wins.WeakAurasOptions/SubRegionOptions/Border.lua: its toggle.WeakAuras/Prototypes.lua: the Ammo trigger filters by ammo item and gives the total of projectiles in the bags.WeakAuras/Prototypes.lua:Private.GetCooldownManagerSpells()lists the spells of the Cooldown Manager catalog (C_CooldownViewer).WeakAurasOptions/LoadOptions.lua: the Cooldown trigger has a From the Cooldown Manager picker that sets the spell to an exact spell ID of that catalog.WeakAuras/ForeverAurasImport.lua(new, listed inWeakAuras/WeakAuras.toc): auras exported by ForeverAuras (internal version 91 and later, or older ones with ForeverAuras trigger or sub element types) are converted on import, before the version check (WeakAuras/Transmission.lua). Their Cooldown Manager triggers become Cooldown, Aura or Item Cooldown triggers, Blizzard Aura triggers become Aura triggers, dispel type borders become borders colored by dispel type, the Swing Timer weapon and the Ammo item list are mapped, media paths to ForeverAuras point to WeakAuras, and so do API references in custom code. What has no equivalent is listed in the chat.WeakAuras/ForeverTutorial.lua,TUTORIAL.md,README.md: what works in combat now, and a section on importing ForeverAuras auras..pkgmeta:TUTORIAL.mdis not packaged..github/workflows/release.yml: CurseForge and Wago keys, used once the .toc files carry project IDs.WeakAuras/GenericTrigger.lua: an attack speed change rescales the off hand swing by the off hand speed, instead of the main hand one.WeakAuras/Prototypes.lua,WeakAuras/Types.lua: the Swing Timer Target In Range option is a choice between In Range and Out of Range (Private.swing_range_types), so an unknown range (no target) matches neither.WeakAuras/BuffTrigger2.lua: a secret unit name or GUID is replaced by an empty name or the previous GUID instead of being compared.WeakAuras/Libs/LibRangeCheck-3.0,WeakAuras/Libs/LibCustomGlow-1.0,WeakAuras/Libs/Chomp: WoW Forever reports the retail project ID with a Classic interface version. These libraries use their Classic Era spells, items, textures and chat throttle there, and LibRangeCheck keeps its secret GUID handling.WeakAuras/SubRegionTypes/SubText.lua: the client-drawn%ptext follows the Old or Modern Blizzard time format and the Increase Precision Below threshold (one decimal at most).WeakAuras/GenericTrigger.lua: after an attack speed change, the off hand swing keeps an offset like the main hand, so its shown end matches its timer, and both hands count the offset of an earlier change.WeakAuras/Modernize.lua: a Swing Timer Target In Range set with the former yes/no option is converted to In Range or Out of Range.WeakAuras/Types.lua: without the combat log, the Aura trigger no longer offers the Multi-target unit.WeakAuras/BuffTrigger2.lua: its unit tracking skips secret GUIDs.WeakAuras/WeakAuras.lua:/wa cdmshows or hides the Blizzard Cooldown Manager through thecooldownViewerEnabledCVar, outside combat only..luacheckrc:C_CooldownViewer.WeakAuras/Prototypes.lua: new Bag Space (free and used slots of the carried bags, specialty bags on request), Equipment Durability (lowest item, overall, broken items, all slots or one), Role (group role of the player) and Tracking (active minimap tracking, by spell ID, or inverse) triggers.WeakAuras/Types.lua:Private.durability_progress_types..luacheckrc:C_Minimap,GetInventoryItemDurability,INVSLOT_FIRST_EQUIPPED,INVSLOT_LAST_EQUIPPED.WeakAuras/Prototypes.lua,WeakAuras/Types.lua,WeakAuras/WeakAuras.lua: the Instance Type load option (by difficulty ID) is available. The difficulty names come fromGetDifficultyInfo, without the outdated version warning for unknown IDs.WeakAuras/Prototypes.lua,WeakAuras/GenericTrigger.lua: the Conditions trigger has a Secret Restrictions Active option, updated on theRestrictionChangedcallback (WA_RESTRICTION_CHANGED).WeakAuras/Prototypes.lua: the Cooldown trigger has an On Global Cooldown condition, with Show Global Cooldown enabled, for example to hide the cooldown text during the global cooldown.WeakAuras/SubRegionTypes/DispelIcon.lua,WeakAurasOptions/SubRegionOptions/DispelIcon.lua(new, listed in the .toc files): Dispel Type Icon sub element. It shows the dispel type icon of the default UI when the dispel type is readable, and a circle colored by the client (C_UnitAuras.GetAuraDispelTypeColor) when it is secret.WeakAuras/SubRegionTypes/Border.luashares its dispel colors and curve, and no longer reads a secret dispel type.WeakAuras/BuffTrigger2.lua,WeakAurasOptions/BuffTrigger2.lua: the Aura trigger has an Elapsed Time filter, and a From the Cooldown Manager picker that adds the aura spell IDs of a tracked buff (linked spells, tooltip spell and spell, like the default UI).WeakAuras/Prototypes.lua:Private.GetCooldownManagerAuras(),Private.GetCooldownManagerAuraSpellIDs(cooldownID).WeakAuras/ForeverAurasImport.lua: ForeverAuras Role, Tracking, Equipment Durability and Bag Space triggers, dispel type icons, and the elapsed and total time filters of Cooldown Manager buffs are converted too.WeakAuras/BuffTrigger2.lua,WeakAurasOptions/BuffTrigger2.lua,WeakAuras/Types.lua: the Aura trigger has a Native Filter option, with the aura categories of the client (Private.aura_native_filter_types: cast by me, crowd control, important, big and external defensive, dispellable...), each one required or excluded, tested withC_UnitAuras.IsAuraFilteredOutByInstanceID. When it is the only filter, auras applied during the restriction also match: their data stays secret, so the name is empty, and the game draws their icon (state.secretIcon,WeakAuras/RegionTypes/Icon.lua, kept byWeakAuras/WeakAuras.lua), timer and stack text. They are read again when the restriction ends.WeakAuras/ForeverAurasImport.lua: the native filters of Blizzard Aura triggers are converted, and their own auras filter becomes the native one. TimelineParser Stage triggers are listed as not converted, like TimelineParser Timer ones.TUTORIAL.md: sections 2 and 3 rewritten from the in-game tests (tested, limited, not tested, not working), notes on the boss timeline, custom code and the ForeverAuras Native Filter.WeakAuras/ForeverTutorial.lua: the tutorial window becomes the full guide, generated fromTUTORIAL.md(all sections, code examples, and import buttons for the DoT timer, the nameplate DoT timer and the pre-pull checklist). The window is larger, and hides when an import button is clicked so the import dialog is visible.WeakAurasOptions/OptionsFrames/OptionsFrame.lua: a "Guide: learn WeakAuras" button in the title bar of the/wawindow opens the guide, with a tooltip that describes it.WeakAuras/WeakAuras.lua: the/wahelp line and the first login popup point to the guide.
Fixed
WeakAuras/Prototypes.lua: the Role trigger checks secret roles withPrivate.ExecEnv.IsSecret, available to the generated trigger code. The Npc ID of the unit triggers (Unit Characteristics, Health, Power, Threat Situation, Cast) isnilwhen the unit GUID is secret, instead of failing the trigger: an Npc ID filter then hides the aura. The Health trigger listens toUNIT_HEALTH, since the engine has noUNIT_HEALTH_FREQUENT(its health bar did not move in combat). The percent and deficit of the Health, Power, Faction Reputation and Experience triggers (Private.ExecEnv.PercentOrSecret,Private.ExecEnv.DeficitOrSecret) stay secret when their value is, so thatWeakAuras/WeakAuras.luakeeps their last readable value, and a "Health < 50%" condition keeps its last state in combat instead of turning false. The Equipment Durability percentages are rounded down to whole numbers, so "below N" thresholds are unchanged.WeakAuras/SubRegionTypes/SubText.lua: while a progress value is secret, a text made only of%p,%tand plain text (for example%p / %t) is drawn from the secret value and total, unformatted, without raid marks or line breaks.
This mod has no additional files

