Sku v43.9 - notes de version

Aperçu

Nouveautés

Changements

Corrections

Menu des quêtes : « Itinéraire » trouve les créatures avec un trait d'union dans leur nom

Simple : Dans le menu des quêtes (Début de quête, Cible de quête, Livraison), une créature propose « Itinéraire », « Fermer l'itinéraire » et « Point de passage ». « Itinéraire » disait « liste vide » dès que le nom de la créature contenait un trait d'union, une parenthèse ou un caractère semblable, même quand la créature est bien reliée au réseau de chemins. Sur un client allemand, cela touchait 249 créatures, dont les trois espèces de singes du cratère d'Un'Goro. « Fermer l'itinéraire » et « Point de passage » n'étaient pas concernés.

Technique : SkuQuest/Options.lua, CreateRtWpSubmenu, branche « Itinéraire » : string.find(i, wpName) sans l'argument plain lisait le nom du point de passage comme un motif Lua. Là, « - » est un quantificateur (« o- » = un nombre quelconque de o), le nom ne se trouvait donc jamais lui-même. Désormais string.find(i, wpName, 1, true) aux deux endroits. Les données d'itinéraire du cratère étaient correctes (vérifié : liens, indices d'apparition et raccordement au réseau).

Fermer l'itinéraire : les dix points de passage reliés les plus proches sont vraiment trouvés

Simple : La plupart des créatures ne sont pas elles-mêmes reliées au réseau de chemins. Pour « Fermer l'itinéraire », Sku cherche donc jusqu'à dix points de passage reliés dans un rayon de 500 mètres autour de la cible et prend le meilleur qui soit accessible. Cette recherche en renvoyait souvent moins de dix. Le point le plus proche en faisait pourtant toujours partie, et le réseau de chemins est connexe presque partout. Cela n'a très probablement jamais touché personne ; la correction n'est là que pour l'exactitude. Le défaut n'aurait pu se voir que si le point le plus proche se trouve sur un morceau détaché du réseau : alors « liste vide » ou un petit détour.

Technique : SkuNav:GetNearestWpsWithLinksToWp (SkuNav/Core.lua). L'insertion triée n'avait pas de cas d'ajout en fin de liste : un candidat plus éloigné que toutes les entrées était écarté alors que la liste avait encore de la place, et le premier résultat de pairs() fixait ainsi le plafond. La coupe au-delà de N entrées retirait déjà toujours la plus éloignée et reste en place. Vérifié hors jeu contre « les N plus proches » (20000 cas aléatoires) : ancien 9059 trop courts, nouveau tous corrects. Les cinq appelants parcourent toute la liste et prennent la meilleure entrée accessible ; davantage de candidats ne peut donc donner que des itinéraires aussi bons ou meilleurs.

Auras : les auras de base ont la liste de sorties complète

Simple : Sous « Nouvelle aura », « Auras de base », chaque modèle avait une entrée « Son » où l'on pouvait choisir exactement un son, rien d'autre. Cette entrée s'appelle désormais « Sortie », suivie du nombre de sorties activées, et ouvre la même liste qu'une aura personnalisée : tous les sons et toutes les sorties de données, par exemple le nom du sort ou l'unité cible. Chaque entrée est un interrupteur, Entrée l'active ou le désactive, et plusieurs peuvent être actives à la fois. Ce que le modèle imposait jusqu'ici (son son, plus le nom du sort et l'unité cible pour « Votre amélioration sur un membre du groupe a expiré ») est déjà activé à l'ouverture et peut maintenant aussi être désactivé.

Technique : SkuAuras/Options.lua. tBuildOutputsLevel accepte un contexte optionnel (outputs, ownerLabel, tooltip) ; sans lui, la liste modifie comme avant le brouillon du constructeur d'auras, avec lui la liste du formulaire de base. Le formulaire (tBaseForm) tient une liste outputs au lieu d'une seule valeur sound, préremplie à partir de defaultSound et defaultOutputs (auparavant fixedOutputs, ajoutées d'office à la création). Le résumé et tBaseFormCommit lisent cette liste ; sans aucune sortie active, le message reste « Aucune sortie définie ».

Auras : « Supprimer toutes les auras » demande confirmation

Simple : « Supprimer toutes les auras » dans le menu Auras n'avait pas de niveau en dessous : une touche Entrée ou Flèche droite, et toutes les auras du personnage avaient disparu. Désormais l'entrée mène à « Vraiment supprimer ? », comme la suppression d'une seule aura. Seul Entrée à cet endroit supprime, Flèche gauche annule.

Technique : SkuAuras/Options.lua, MenuBuilder : l'entrée est désormais dynamic et son BuildChildren crée l'unique enfant « Vraiment supprimer ? ». En y entrant, selectTarget pointe sur l'entrée elle-même, Entrée sur l'enfant appelle donc son OnAction. Avant, dynamic = false sans enfants, OnPostSelect passait directement dans la branche OnAction.

Menu : les chemins sont résolus au lieu d'être parcourus

Simple : Chaque fois que Sku place lui-même le menu à un endroit donné (une fenêtre s'ouvre, une touche rapide comme Maj-F10, ou une fenêtre a changé et son menu est reconstruit), il parcourait jusqu'ici le chemin comme si Entrée était pressée à chaque niveau, en annonçant chaque étape. Lors de la reconstruction silencieuse d'une fenêtre de métier ou de maître après une fabrication ou un apprentissage, on entendait donc le nom de la fenêtre (« Métier », « Maître »), et le curseur était remis par numéro de ligne dans une liste qui venait de changer. Désormais le chemin cible est résolu directement, sans annonce des étapes, et le curseur revient sur la même entrée : la même recette (même avec un nouveau nombre), la même compétence, le même bouton. Ce n'est que si cette entrée a disparu que l'endroit où le curseur a atterri est annoncé.

Technique : SkuOptions:ResolveMenuPath et EnsureLevelBuilt (SkuZOptions/Core.lua) remplacent la boucle de SlashFunc qui appelait OnSelect(true) sur chaque segment du chemin. Les niveaux traversés sont seulement construits (dynamic : RebuildNodeChildren, sinon un BuildChildren s'ils sont vides), jamais sélectionnés ; seule la destination reçoit son OnSelect comme avant (préconstruction d'un niveau vide non dynamique, jamais sur isSkuToggle). Les effets de bord du parcours disparaissent avec lui : les nœuds actionOnEnter sur le chemin se déclenchaient, tous les frères avant la correspondance étaient préconstruits. Le paramètre aSilent de SlashFunc est désormais effectif. La restauration dans SkuCore:CheckFrames fait un appel silencieux au lieu de deux parlants et place le curseur directement : skuIdentity, puis nom, puis la ligne à l'ancien index (bornée à la nouvelle longueur). Les entrées de fenêtre portent skuIdentity (copié par SkuIterateGossipList) : recettes « recipe:Nom (rang) », catégories « cat: », compétences du maître « skill: », sinon « frame:<frame> » pour toute entrée seule sur son frame (SkuCore:PrepareWindowEntries à la fin des trois constructeurs). SkuCore:RefreshWindowMenuQuietly (LocalMenu.lua) est la reconstruction silencieuse commune pour TRADE_SKILL_UPDATE/CRAFT_UPDATE et le bouton Apprendre ; elle ne parle que si l'identité (ou le nom sans le nombre) est différente ensuite. Les sacs gardent leur propre chemin (tFindMenuNodeByPath, tBagAnnounceSuppress).

Fenêtres de métier : Entrée sur une recette ou « Créer » annonçait l'entrée deux fois

Simple : Après Entrée sur une recette ou un bouton Créer, l'entrée était dite deux fois. Désormais une fois.

Technique : Le chemin de clic classique dans SkuIterateGossipList appelait après func un CheckFrames parlant puis OnUpdate 0,35 s plus tard, en plus de l'annonce du gestionnaire de touches. La troisième annonce était le plus souvent absorbée par le garde-doublon (1 s), la deuxième arrivait 0,9 s plus tard et ne l'était pas. Les entrées avec quietClick (posé par PrepareWindowEntries pour tout bouton cliquable sans containerFrameName) passent désormais par func plus RefreshWindowMenuQuietly ; les boutons à /click sécurisé gardent l'ancien chemin.

Boîte aux lettres : « Cible » avant « Nouveau courrier »

Simple : À l'ouverture d'une boîte aux lettres, « Cible » était annoncé d'abord, puis seulement « Nouveau courrier ». Désormais seulement « Nouveau courrier ».

Technique : Mail:MAIL_SHOW ouvrait le chemin « Local, Courrier » avant que le MailFrame soit visible, or l'entrée Courrier sous Local n'existe que lorsque son frame est visible. Le chemin ne trouvait rien, et l'ouverture silencieuse annonçait à la place la première entrée racine (« Cible », le menu de cible) ; les sacs ramenaient le menu dans le courrier un instant plus tard via CheckFrames. Le journal de débogage montrait « path walk found nothing ... short,lokal,post » à chaque boîte aux lettres depuis au moins la v43.6 ; cela ne s'est remarqué qu'une fois les annonces intermédiaires disparues. Désormais MAIL_SHOW ouvre une image plus tard (C_Timer.After(0)), seulement avec un MailFrame visible et seulement si le curseur n'est pas déjà dans le courrier.

Raccourcis clavier : seconde touche pour le moniteur, le scan, la rotation et les autres

Simple : Sous « Raccourcis clavier Sku », chaque touche a une première et une seconde assignation. Pour plusieurs touches, la seconde pouvait être définie et était annoncée comme « Touche 2 », mais ne faisait rien. Étaient concernées « Déclencher la sortie continue du moniteur de groupe », distance de la cible, mode panique, scan de la minicarte large et étroit, vérification de portée des membres du groupe, « Tourner vers l'unité » 1 à 6 et 180 degrés, « Continuer le scan », scan 1 à 8 et la notification de ressources. La seconde touche fonctionne désormais partout.

Technique : SkuCore/Core.lua, script OnHide de SkuCoreControlOption1 : les assignations de ce frame étaient armées avec SetOverrideBindingClick pour .key seulement (seule exception SKU_KEY_TAXICANCEL), alors que le dispatcher de clic vérifie les deux champs via SkuKeyBindsMatchKey. Les menus d'assignation dans SkuZOptions/Core.lua armaient key2 depuis toujours, d'où le bon fonctionnement de la seconde touche pour d'autres actions. Un helper local tArm(aConst) lie désormais chaque touche renvoyée par SkuKeyBindsGetKeys ; les vingt lignes individuelles écrites à la main disparaissent.

Moniteur combat : l'annonce de mort nomme la touche du pavé numérique

Simple : Sous Moniteur, Combat, Amical, « Annoncer les morts » annonce un membre du groupe mort. Le numéro qu'elle contient est désormais toujours la touche qui cible ce membre. En groupe, ce sont les touches par défaut de Sku : pavé 1 = soi, 2 à 5 = les quatre autres. Le quatrième membre du groupe devient donc « party 5, dead », et non plus « party 4 ». Le moniteur de santé et l'aperçu ont toujours compté ainsi. En raid, c'est le numéro de ciblage au cadran qui est dit : la touche unique jusqu'à 10 joueurs, la séquence à deux chiffres à partir de 11. Avant, on entendait « party 2 » pour les membres de son propre sous-groupe et « raid 17 » (la place brute du raid) pour tous les autres, deux numérotations dans un même combat, aucune ne correspondant au pavé. Les places de raid 26 à 40 n'étaient pas annoncées du tout. « Compter les morts » est supprimé : en mode « numéro seul », son « 3, dead » ne se distinguait pas de « party 3, dead », et le compteur ne redescendait jamais lors d'une résurrection.

Technique : SkuCore/aqCombat.lua, aqCombat_SKU_UNIT_DIED. Nouveau helper tDeathUnitToken(GUID) renvoyant séparément le jeton parlé et l'id d'unité réel, les vérifications UnitIsDeadOrGhost et familier ont besoin de la place brute. Groupe : jeton de aqCombatGroupGuidToUnitId, chiffre plus 1. Raid : toutes les places MAX_RAID_MEMBERS parcourues par GUID (les 25 de tAllPartyRaidUnits ne suffisaient pas), numéro lu dans la grille du ciblage au cadran (SkuSecureTargetingFrame, unitNameSlotGG-SS, touche = (GG-1)*5+SS ; du code non sécurisé peut lire les attributs d'un cadre sécurisé), sinon tDTRaidRoster de aq.lua, sinon calcul direct (sous-groupe-1)*5+position. Grille et roster ne sont reconstruits qu'hors combat, ils vieillissent donc avec le pavé. partyDeadCount, son compteur, son menu et sa clé de locale supprimés, la valeur enregistrée est effacée à la connexion.

Moniteur combat : « Ignorer les familiers morts du groupe » reste sur Non

Simple : Le réglage pouvait être mis sur « Non » mais revenait sur « Oui » après le rechargement suivant. Corrigé.

Technique : aqCombatOnLogin fixait la valeur avec « x or true » ; un false enregistré est faux en Lua et était remplacé par true à chaque chargement. Désormais seulement si nil.

Moniteur santé : « Ajouter Mort à 0 pour cent » désactivé par défaut

Simple : Le style hauteur de son du moniteur de santé de groupe et de raid ajoute un clip « dead » au son d'un membre à 0 pour cent. C'était activé pour le groupe et le raid et c'est désormais désactivé, y compris pour les personnages existants. Pour le réactiver : Moniteur, Groupe ou Raid, Santé. L'annonce de mort du moniteur de combat (ci-dessus) devient ainsi le seul message de mort actif par lui-même.

Technique : SkuCore/aq.lua, AqOnLogin : valeur par défaut false au lieu de true, bascule unique des personnages existants via addDeadOn0PercentDefaultOff (même schéma que *DefaultOff dans aqCombat).

Ciblage au cadran : uniquement en raid, une touche jusqu'à 10 joueurs

Simple : « Activé » sous Ciblage au cadran est désormais un interrupteur Activé/Désactivé et n'agit qu'en raid. Les choix « Groupe » et « Groupe et raid » disparaissent : en groupe, les touches par défaut de Sku, pavé 1 à 5, atteignent déjà tout le monde, et le mode groupe posait par-dessus une numérotation décalée (0 = soi, 1 à 4 = les autres) et masquait les touches par défaut tant qu'il était actif. Un « Groupe » enregistré devient Désactivé, « Raid » et « Groupe et raid » deviennent Activé. Dans les raids jusqu'à 10 joueurs, une touche par membre est désormais toujours active (pavé 1 à 9, 0 = membre 10, dans l'ordre des sous-groupes), à partir de 11 joueurs la saisie à deux chiffres. L'option « Action à touche unique dans les raids jusqu'à 10 joueurs » disparaît, c'est la règle désormais.

Technique : SkuCore/DialTargeting.lua. enabled est converti une fois à la connexion en Désactivé/Activé, singleKeyinRaid10 effacé. DialTargetingRosterUpdate et DialTargeting_EndableDisable ne vérifient plus que UnitInRaid et enabled == Activé ; la branche groupe (unitNameSlot01-0x = partyx) et la branche « party » morte du snippet sécurisé sont supprimées. Mode raid : tNumCurMembers > 10 signifie deux chiffres, sinon raid10. Trois clés de locale supprimées. Rien de tout cela n'est testé en jeu.

Numéros de groupe : un seul comptage pour tous les moniteurs

Simple : Chaque numéro que Sku dit pour un membre du groupe doit être la touche qui le cible. En groupe, c'est le pavé numérique 1 pour vous et 2 à 5 pour les autres ; en raid, le numéro du ciblage au cadran, une touche 1 à 10 jusqu'à 10 joueurs et deux chiffres à partir de 11. L'annonce de mort compte ainsi depuis cette version. Désormais le moniteur de santé et le moniteur de debuffs en raid, les avertissements de menace, « cible de la cible » et « hors de portée » du moniteur de combat ainsi que les sorties d'aura « unité source » et « unité cible » le font aussi. Les moniteurs de santé et de debuffs du groupe gardent le comptage de groupe en raid, car qui ne surveille que son sous-groupe le cible là avec le pavé 2 à 5.

Le moniteur de santé en raid n'a des fichiers de hauteur que pour les numéros 1 à 25, les membres 26 à 40 restaient donc muets. Ils sont désormais prononcés, le numéro d'abord, puis la santé par dizaines, avec la voix du nouveau réglage « Voix pour les membres au-delà de 25 » (Moniteur, Raid, Santé ; Justin par défaut).

Technique : SkuCore/aq.lua : SkuCore.Monitor.RaidMemberNumbersByName() construit la table nom -> numéro selon la règle du cadran (jusqu'à 10 membres à plat 1-10 dans l'ordre des sous-groupes, à partir de 11 (sous-groupe-1)*5+position) ; tDTRaidRoster et la grille du ciblage au cadran (DialTargeting.lua) en sont remplis, tDTRaidRoster calculait toujours à deux chiffres. SkuCore.Monitor.GroupMemberNumber(unitId) renvoie le numéro de touche des jetons party/raid. La sortie continue des debuffs en raid disait string.sub(unitId, 5)+1. MonitorOutputRaidPercent2 prononce les numéros au-delà de 25 via MonitorOutputPlayerStatus (raid.health2.voice, 1 par défaut) et renvoie la durée à la file ; les entrées de la file portent pour cela la santé absolue. SkuCore/aqCombat.lua : tAllPartyRaidUnits et tUnitsToTestOnGameRaidTargets contenaient raid1-25 en dur ; ils sont désormais regarnis sur place d'après la taille réelle du raid à chaque événement de roster. tSpokenGroupUnit(unitId) applique la correspondance de l'annonce de mort à toutes les annonces amicales. « party5 »/« partypet5 » n'existent pas comme mots dans les voix de combat, SkuCoreAqCombatGetVoiceString les découpe en « party », « pet », « 5 ». SkuAuras/data.lua : tUnitIdToSpokenName dit party N comme N+1 et raid N comme numéro du cadran.

Touches de sous-groupe de raid : sauter dans un groupe de raid d'une seule touche

Simple : Qui ne soigne que son propre groupe en raid a besoin d'un accès rapide à un groupe sans la saisie à deux chiffres du cadran. Alt+pavé 1 à 8 cible le premier membre du sous-groupe de raid 1 à 8 (le membre numéro 1 de ce groupe, le même ordre que le ciblage au cadran et les moniteurs). La cible est annoncée comme toute cible. Si le groupe est vide, Sku dit « Groupe N vide » et rien ne se passe ; hors raid « Pas de raid ». Les huit touches ont leur propre sous-menu « Touches de sous-groupe de raid » dans les raccourcis Sku, la seconde touche fonctionne aussi. La fonction peut être désactivée sous Fonctions.

Comme pour toute touche de ciblage : les changements de groupe pendant un combat sont pris en compte après le combat, d'ici là la touche saute vers l'ancien premier membre.

Technique : Nouveau fichier SkuCore/subgroupTargeting.lua (sous-module SubgroupTargeting, dans la TOC après skuFocus.lua). Huit SecureActionButtons SkuSubgroupTarget1-8 avec type1=macro, macrotext1="/tar <nom>", liés par SetOverrideBindingClick SANS cinquième argument (LeftButton, pour que type1/macrotext1 soit lu) ; les noms viennent de GetRaidRosterInfo (premier nom par sous-groupe dans l'ordre du roster) sur GROUP_ROSTER_UPDATE, GROUP_FORMED/JOINED/LEFT et PLAYER_ENTERING_WORLD hors combat, reporté à PLAYER_REGEN_ENABLED en combat. PreClick (non sécurisé, s'exécute aussi en combat) prononce la ligne vide / pas de raid. Cadre de contrôle SkuCoreSubgroupControl, script OnHide, arme les deux touches de chaque constante via

SkuOptions:SkuKeyBindsGetKeys. Constantes SKU_KEY_SUBGROUPTARGET1-8, défaut ALT-NUMPAD1-8 (SkuZOptions/SkuKeyBinds.lua), groupe « Raid Untergruppen Tasten » dans SkuCore/Options.lua.