Enemy combat status: in-combat/passive on target (Off / Beep / Announce)
Simple: New item under Accessibility, Misc: "Enemy combat status". "Beep" (default) is the previous behavior - a tone before the enemy name when the enemy is fighting you or your group. "Announce" keeps the tone and also says "in combat" or "passive" before the name. "Off" disables tone and status announcement. The cycle key is unchanged.
Technical: In SkuMob\Core.lua (PLAYER_TARGET_CHANGED) the existing InCombatSound now only plays when the mode is not "off"; in "announce" mode "in combat" is prepended to the name like the existing "passive". New DB value
profile.SkuMob.enemyCombatStatusMode (off/beep/announce, default beep -> existing characters unchanged). Menu in SkuZOptions\Core.lua, locale "im kampf" in deDE/enUS. Pure announcement code, no taint.
Stability: crash in the friendly health/heal monitor fixed
Simple: The "fatality" error that could occur when switching to yourself or a pet during combat (with the "factor in incoming heals" option enabled) is fixed. Health announcements keep working normally.
Technical: In SkuCore\aq.lua, UNIT_HEALTH read UnitGetIncomingHeals(unit, "player") without a nil guard; with no incoming player heal (the normal case) the subtraction "number minus nil" threw a Lua error. Added "or 0" in four places.
Stability: rare menu error (Core.lua:4021) fixed
Simple: A rare error tone when navigating in certain menu states (e.g. an open chat line via Ctrl+Enter, then arrow) is gone.
Technical: In SkuOptions:VocalizeMultipartString a debug breadcrumb loop "while tTable.parent.name do" had no nil guard; at a root node without parent -> "attempt to index field 'parent'". Guard added. Debug path only, no behavior change.
Follow warning: no false "follow ended" when re-pressing follow
Simple: When you press the follow key again while following (to check it), WoW briefly stops and immediately re-establishes the follow. Previously this falsely said "follow ended". Now it stays with the normal bling in that case; "follow ended" only fires on a REAL break.
Technical: The AUTOFOLLOW_END announcement is delayed by 0.4 s and suppressed if an AUTOFOLLOW_BEGIN arrives in between (re-follow). Generation counter against stale timers. In SkuCore\visualAids.lua.
Fix: "click sound at beacons" menu was sometimes empty (Navigation, Options)
Simple: The click-sound choice (beep/click) was sometimes empty and not changeable (the on/off toggle still worked). Cause was a load-order race: the click sounds come from the add-on SkuBeaconSoundsets and are only registered on entering the world - but Sku sometimes built the list earlier (empty). Now the list is reliably rebuilt shortly after loading.
Technical: Additive deferred rebuild in SkuNav\Options.lua (NOT in the protected SkuNav\Core.lua): on PLAYER_ENTERING_WORLD + C_Timer.After it rebuilds SkuNav.ClickClackSoundsets from BeaconLib:GetClickClackSoundSets() and re-points clickClackSoundset.values. pcall-guarded, no-op if SkuBeaconSoundsets is missing. IMPORTANT: if SkuBeaconSoundsets is disabled/missing the list stays empty (beacon sounds also missing) - a common cause of user "audio problems".
Mouse: alternative control ("walk to target") cleanly toggleable + switch in the menu
Simple: Accessibility menu, under Other, now has the switch "Walk to target on interact". Sighted players can turn off the auto-walk-on-click control; it no longer disturbs the normal mouse.
Technical: The WorldFrame mouse handler is no longer overwritten via SetScript but installed additively via HookScript EXACTLY ONCE (guard flag, not in the 100ms path) and does nothing while interactMove is off. The switch reuses the existing options node, exposed in Accessibility, Other.
Nameplates tied to the camera
Simple: Friendly nameplates are only forced as long as the camera SkuStandard is active. When the camera menu is released you can change or disable the nameplates yourself.
Technical: The nameplateShowFriends=1 enforcement in the OnUpdate loop now only applies when cameraOptions.skuStandard ~= false (plain read with full and-chain, combat gate preserved).
New: black reading bar (accessibility, for low-vision players)
Simple: A black bar at the top or bottom of the screen shows ONLY the current menu item (not the whole path) being spoken, in large high-contrast text. Only visible while the menu is open. Default OFF. In the new menu item Accessibility, Visual aids, you can toggle it and set font size (up to very large; larger also gets bolder), position (top/bottom) and opacity. Long lines run off to the right - this is intended. Fix: with very large font the bar now grows DOWNWARD (text was cut off at the top); it is no longer clipped at the top screen edge.
Technical: New non-secure FontString frame on UIParent (EnableMouse(false), no taint), fed by SkuOptions.currentMenuPosition.name (current line only), event-driven (no OnUpdate, not in the 100ms loop), text set AFTER speech. Font via SetFont with THICKOUTLINE from medium size up (boldness). FontString now anchored TOPLEFT (JustifyV TOP), bar height px+40%+12, so large text grows downward instead of clipping at the top. Logic isolated in SkuCore\visualAids.lua; values per profile under db.profile.SkuCore.visualAids.lineBar. New "Visual aids" item.
New: nameplate colors (accessibility, for low-vision players)
Simple: In Accessibility, Visual aids, Nameplate colors you can color nameplates by reaction (enemy, neutral, friend), choose each color yourself, plus mode (only target or all nameplates), size and opacity. Default OFF. A warning explains that the colors are display only.
Technical: Own function in SkuCore\visualAids.lua, own opt-in flag (not testMode), event-driven (NAME_PLATE_UNIT_ADDED/REMOVED, PLAYER_TARGET_CHANGED), no C_Timer fan-out, not in the 100ms loop, no TOOLTIP strata. Full nil guards (UnitReaction, 4-level frame check). In the OFF state the events are unregistered.
New: mouse finder (accessibility, for low-vision players)
Simple: In Accessibility, Visual aids, Mouse finder, enable it. You now bind the key DIRECTLY in the Mouse finder menu (third item "find mouse", go right, Rebind) - just like in the Sku key bindings, no separate search needed. The plain text hint was removed. On key press a high-contrast marker briefly lights up around the mouse (pulse ring or compass strokes, selectable). Default OFF.
Technical: Well-formed key entry SKU_KEY_MOUSEFINDER (no blank entry, hence no login crash), the handler shows a non-interactive overlay (EnableMouse(false)) centered on GetCursorPosition, about a quarter of the screen, auto-hidden via C_Timer.After. No secure button, no taint. The key-binding entry inside the Mouse finder menu is fully encapsulated in SkuCore\visualAids.lua (own capture helper, writes to the same SkuKeyBinds DB as the main menu); SkuCore\Options.lua is left untouched.
New: announce number of enemies (accessibility, Other)
Simple: Accessibility, Other now has "Announce number of enemies" with three settings: "elite enemies only", "all enemies" and "off". One choice sets the right combination, so you do not have to find the two separate switches in the hostile monitor.
Technical: Convenience selector that couples two existing values (in
db.char.SkuCore.aq[talentSet].combat.hostile): relativeNumberUnitsInCombat.value and ignoreNonElite. Mapping: elite only -> ignoreNonElite=true, value=3 (enemies attacking you/party); all enemies -> ignoreNonElite=false, value=3; off -> ignoreNonElite=true, value=1 (off). Fix: "all enemies" and "elite only" now ALSO enable the combat monitor master (db.char.SkuCore.aq[talentSet].combat.enabled= true) - previously, on a character whose master was off, "all enemies" produced no announcement. "off" deliberately leaves the master untouched (only the two single options are set), so other combat monitoring is not affected.
New: warning when follow breaks (accessibility, Other)
Simple: Accessibility, Other now has "Warning when follow breaks" (on/off, default off). When you follow someone (autofollow) and the follow ends - whether the target moves too far, stops, or you move - you hear "Follow ended". No distance tracking or picking a person is required.
Technical: Lean listener on the public events AUTOFOLLOW_BEGIN/END in
SkuCore\visualAids.lua; announcement only if a follow had begun and the switch (db.profile.SkuCore.followBreakWarn) is on. No taint, no distance tracking, no OnUpdate. Note: warning when SOMEONE ELSE stops following YOU is not possible (no event for it).
New: key "next enemy in combat" (Sku key bindings)
Simple: The Sku key bindings (Core menu) have the new action "next enemy in combat". Bind it to a key and you cycle through nearby enemies on key press - even in the middle of combat. Sku announces the new target as usual. Default: no key set.
Technical: SECURE implementation via a SecureActionButton (macro /targetenemy) to which the chosen key is bound with SetOverrideBindingClick. This makes the in- combat target switch allowed (no ADDON_ACTION_BLOCKED, no taint).
SKU_KEY_NEXTCOMBATENEMY -> SkuCore:UpdateNextCombatEnemyBinding (in SkuCore\visualAids.lua); the binding is deferred during combat and reapplied via PLAYER_REGEN_ENABLED. Note: /targetenemy cycles nearby attackable enemies, not exactly filtered to those fighting you - an exactly filtered variant would be a larger, later addition.
New: create aura sets and share them in the group (stage 1+2)
Simple: The Auras menu now has "Sets (share)". You can create a named set from your current auras (same name exists -> a number is appended), list and delete sets. A set can be "share with group": your group sees "<you> shares aura set <name>" and at the end "sharing complete". Anyone with Sku in the group receives it under "received sets" and can accept it there (with duplicate-name check) or discard it. Note: in this stage only between the same client language; the language translator comes later.
Technical: Isolated in NEW file SkuAuras\sharing.lua, pcall-guarded, does NOT change the existing aura system (auras stay name-based). Sets: db.char.SkuAuras.Sets (snapshot). Transport via AceComm-3.0 (embedded into SkuAuras, prefix SkuAuraSetV1, automatic chunking) plus AceSerializer (SkuOptions:Serialize/ Deserialize). Receive into db.char.SkuAuras.PendingSets; accept imports with duplicate check and calls UpdateAttributesListWithCurrentAuras. Visible group announce via SendChatMessage, data hidden via addon message. No taint. Later: stage 3 (account-wide library), stage 4 (language translator via
SkuDB.SpellDataTBC). Details in the plan in the Heute folder.
Default value: continuous volume of health monitors is now 100
Simple: On a NEW installation the volume for the continuous output of the health monitors (player, party, raid, pet) is now 100 instead of 50 - matching the event volume (which was already 100). Existing profiles stay unchanged.
Technical: Default continouslyVolume in SkuCore\aq.lua changed from 50 to 100 (4 places: player/party/raid/pet health). Only applies while the value is still nil (fresh setup).
Soft targeting: "hard target over soft target" now works + no more combat error
Simple: The setting "hard target counts before soft target" had NO effect before - a spell went to the soft target despite having a hard target. Fixed: with a hard target, the hard target now counts. Also the "ADDON_ACTION_BLOCKED" error that appeared after login on the first friendly target in combat is gone.
Technical: In UpdateSoftTargetingSettings (SkuZOptions/Core.lua) BOTH branches used to set SoftTargetMatchLocked = 0 (bug) -> now 1 when matchLocked>0. Also the SoftTarget CVars are protected in combat: the function now skips all SetCVar calls in combat (InCombatLockdown guard) and re-applies once after combat (PLAYER_REGEN_ENABLED). No loss of function (CVars are frozen in combat anyway), no more ADDON_ACTION_BLOCKED.
Version number raised to 41.05.