/fui keeps edit mode, reset and list. The thirty diagnostic and tuning
functions behind the other subcommands (bar, bags, character, tabs, close,
model, minimap, mouse, map, questlog, chat, chatlines, tabard...) go with
them, with Panes.Report, the bags read-back and the 205 texts they alone used.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
GearManagerDialog fait partie des UIChildWindows : CloseChildWindows le
masquait dès qu'un panneau s'ouvrait à côté de la feuille (grimoire,
quêtes...), et la page des ensembles perdait Équiper et Enregistrer. Il est
réaffiché tant que la page est à l'écran, hors combat seulement (son
OnShow écrit un attribut de CharacterFrame, protégé).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KxRZNHkq453dyUMcWsyUf1
Listes de réputation, compétences et statistiques : une ligne qui ne tenait
plus était cachée, mais la boucle continuait, et une ligne plus courte plus
loin (un en-tête après une entrée) prenait sa place, hors d'ordre. Rien
n'est plus placé après la première ligne qui ne tient pas.
Statistiques : la page possédait les douze lignes et les réaffichait toutes
après chaque mise à jour, y compris la sixième que le client cache pour la
catégorie Distance (les chasseurs par défaut), avec le contenu de la
catégorie d'avant. Elle possède désormais leur parent, CharacterAttributesFrame.
Ensembles : le panneau était créé visible, et GearManagerDialog_Update
(ensemble porté depuis une barre, /equipset) pouvait le construire avant
la première ouverture de sa page, par-dessus les statistiques. Il naît
caché, et sa page le connaît même ouverte en combat.
L'ordre d'affichage et le dernier ensemble porté étaient au compte, alors
que les ensembles sont à un personnage : ouvrir la page sur un autre
personnage élaguait l'ordre du premier. Ils sont rangés par personnage, et
le premier usage reprend les anciennes valeurs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KxRZNHkq453dyUMcWsyUf1
Ensembles d'équipement : le crochet qui abandonne une modification sur
Annuler ou Échap visait la globale GearManagerDialogPopup_OnHide, que le
XML lie directement (function=) : il ne se déclenchait jamais. La session
restée ouverte faisait de la sauvegarde suivante une modification : l'ancien
ensemble était rééquipé, enregistré sous le nom tapé, puis supprimé. Le
script du cadre est désormais greffé (comme Taxi.lua).
Réputation : la description et les trois cases venaient de la liste du
client, qui ne les remplit que pour ses 15 lignes visibles ; cachée et
jamais défilée, elle laissait à partir de la 16e faction celles de la
précédente, et un clic agissait sur la nouvelle à contresens (en guerre,
barre suivie). Elles sont lues sur la faction elle-même.
Combat : PetPaperDollFrame, et donc CharacterFrame, sont protégés par les
boutons de compagnon sécurisés. Les masquer, les déplacer ou retailler la
feuille depuis l'addon en combat était bloqué : à chaque rafraîchissement
du familier (PET_BAR_UPDATE...), à chaque ouverture de la feuille, à chaque
onglet. Ces appels attendent la fin du combat ; Panes n'appelle plus Show
ou Hide sans changement, que le client refuse aussi.
Performance : les événements d'unité de la feuille (inventaire, portrait,
modèle) ne relancent plus toute la mise en page pour les autres unités ni
feuille fermée ; l'onglet du familier ne réagit plus qu'à son familier ;
l'onglet des statistiques relit l'arbre au plus deux fois par seconde.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KxRZNHkq453dyUMcWsyUf1
Traduction
- Identifiants en anglais dans tout le module : addon, ecrans d'accueil,
outils Python, banc d'essai et patcheur C#.
- Fichiers au nom francais renommes (Gabarits.lua -> Templates.lua,
Textes_*.lua -> Texts_*.lua, deployer.py -> deploy.py,
tools/patcheur -> tools/patcher, etc.).
- Commandes /fui et options de deploy.py en anglais (--check, --server,
--remove-dbc).
- Cles des variables sauvegardees et de data/dbc/statistics.json
traduites, sans reprise des anciennes cles.
- API de la micro-barre : ForeverUI.AddMicroButton(def) avec les champs
name, atlasSet, after, tooltip, onClick, ready, et
ForeverUI.UpdateMicro(name, isOpen).
- Commentaires reecrits en anglais, courts, sans dates ni historique ;
les fonctions au nom peu parlant et leurs parametres sont expliques.
Code mort
- Exports, fonctions et variables jamais lus retires.
- Retires a la demande des modules : ForeverUI.PvPJauge, les exports
FondEntete / TuilerEntete / Polices de TradeSkill, l'art legacy-up-c60,
honorfill(half)blue et inv_misc_book_09, leurs entrees d'atlas et les
parties d'outils correspondantes.
Verifications : liaisons des noms comparees avant et apres, banc vert,
chemins de textures inchanges, generateurs reproduisant les fichiers,
patcheur identique octet pour octet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- socle : Textes.lua (ForeverUI.L) et ForeverUIGlueTextes.lua (G.L) ; les
textes dans Textes_enUS / Textes_frFR (325 cles en jeu) et
ForeverUIGlueTextes_enUS / _frFR (41 cles aux ecrans d'accueil) ; une cle
absente prend l'anglais, une langue sans fichier lit l'anglais ; ajouter
une langue = un fichier de plus
- les textes que le client 3.3.5 connait se lisent dans ses globales
(GlobalStrings, GlueStrings en glue) ; les textes de secours sont retires
- tous les fichiers repris : libelles, infobulles, mode edition, messages et
aide de /fui, erreurs internes ; .toc : Notes + Notes-frFR
- selection des personnages : race et classe traduites ramenees a leur jeton
par les tables de langue (GetAvailableRaces / GetAvailableClasses font
planter le client hors de la creation)
- tools/cartes_instances.py : noms des instances dans toutes les langues de
la LibBabble-Zone de WDM (portails de la carte sur tout client)
- banc : toute cle employee existe en anglais et en francais, memes cles dans
les deux, bascule frFR / deDE essayee ; chaines 3.3.5 ajoutees au faux client
- README : etat des sections mis a jour, langues, glue, deploiement --glue
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Chat : cadre, barre et bouton de retour, colonne, bouton d'amis de camelot ;
au repos fond, onglets, colonne et saisie s'effacent, allumage au survol
- Barres d'ameliorations et d'affaiblissements (Buffs.lua) : grille, bordures
par type, clignotement, repli, regroupement, enchantements d'arme
- Souillure : StaticPopupDialogs n'est plus reaffectee (BindEnchant bloque) ;
menus deroulants, suivi des objectifs, choix d'icone, ajout de canal et
carte du monde n'ecrivent plus les globales du client ; menus d'unite :
lignes protegees servies par des boutons securises hors combat, grisees en
combat ; seule MAP_QUEST_DIFFICULTY reste, par decision
- Gestionnaire d'ensembles : plus d'appel GetEquipmentSetIconInfo(nil)
- Banc : garde des globales ecrites (bytecode Lua 5.1), faux client durci
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Elle se decidait a cinq : l'habillage, les deux onglets du volet, le repli
et la fonction des statistiques. Et l'habillage reposait TOUTE la geometrie
a chaque evenement. D'ou deux fautes que rien ne pouvait prevenir -- le
panneau du gestionnaire survivait a un changement d'onglet lateral, parce
qu'il appartient a NOTRE volet et non au PaperDollFrame du client ; les
barres de reputation traversaient ce volet, ReputationFrame gardant la
taille de la fenetre d'origine sans que personne ne le borne.
Panes.lua pose le modele de camelot : des HOTES, des GROUPES -- ce qu'un
onglet ouvre, un ecran entier -- et des PAGES, deux contenus qui se
partagent une surface. Un contenu se batit UNE fois, a sa premiere
ouverture, et ne fait ensuite que paraitre.
Les cadres du client ne sont pas reparentes : cela reinitialiserait niveau
et strate, et des reglages deja valides avec. Un contenu declare la liste
de ceux qu'il possede.
CharacterFrame_ShowSubFrame est le commutateur : le nom de l'ecran sert de
nom de groupe. La largeur de la fenetre devient une consequence -- l'hote
droit a-t-il quelque chose a montrer -- et le bouton de repli disparait la
ou il n'y a rien a replier.
Aucune mesure ne bouge : le banc le verifie sur vingt allers-retours, et
tous les essais de geometrie deja valides passent inchanges. /fui perso
rapporte desormais l'etat des hotes en tete.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le temoin /fui sets a donne la cause : pour UN ensemble publie par le
client, l'ordre retenu en tenait sept -- "aab" quatre fois, plus trois noms
effaces. Un nom que le client ne publie pas a cet instant est saute par la
premiere boucle, et la seconde le rajoute des qu'il reparait ; quelques
renommages suffisaient a empiler les copies.
Chaque copie prenant un rang, l'ensemble se posait quatre fois. Et la
boucle d'affichage testait "index <= total" avec index = le RANG au lieu de
l'indice du client : la carte finissait au rang 4 pour un total de 1, donc
masquee -- liste vide apres un renommage.
Trois corrections : un nom n'est place qu'une fois ; remplacerDansOrdre
retire les copies du nom qu'il pose ; l'ordre se nettoie des noms effaces,
mais seulement quand le client publie au moins un ensemble. Le vrai indice
se lit dans ordre[position].
Le banc rejoue l'ordre corrompu rapporte par le temoin, et verifie qu'a
zero ensemble publie l'ordre reste intact.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Renommer un ensemble laissait la liste vide jusqu'a l'operation suivante.
Le rattrapage d'une image manquait encore la publication du client : les
ensembles vivent cote serveur, et aucun moment n'est sur -- ni le retour de
SaveEquipmentSet, ni l'instant de EQUIPMENT_SETS_CHANGED, ni l'image d'apres.
Le panneau compare donc toutes les 0,2 s ce que le client rend au contenu
affiche, et repose les cartes des que cela differe. Liste inchangee, rien
n'est repose. Le controle ne tourne que panneau ouvert.
Le banc rejoue desormais le pire cas -- evenement avant publication,
rattrapage dans le vide, plus rien d'annonce ensuite -- et verifie qu'un
seul battement repare, sans pose inutile quand la liste ne bouge pas.
Ajoute /fui sets : temoin des trois etats qui decident de l'affichage.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Deux fautes, qui se cumulaient.
GetNumEquipmentSets et GetEquipmentSetInfo ne rendent pas le nouvel etat
dans la foulee d'un enregistrement, ni meme a l'instant ou
EQUIPMENT_SETS_CHANGED arrive : la liste se reposait sur l'etat d'avant.
Elle se repose desormais a l'image suivante, comme la hauteur des sacs.
Et l'ordre retenu s'elaguait pendant l'affichage : quand le client ne
rend momentanement aucun ensemble, la table se vidait pour de bon et les
noms y revenaient un par un. Un nom inconnu est maintenant saute.
Le banc rendait ses listes tout de suite et ne pouvait pas le voir : il
repond desormais sur un etat publie, qui ne rattrape le vrai qu'a
l'evenement. La sequence signalee est un test.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
SaveEquipmentSet et DeleteEquipmentSet rendent la main avant que
GetNumEquipmentSets ait change : reposer les cartes dans la foulee
montrait l'etat d'avant, et un ensemble renomme n'apparaissait qu'a la
prochaine secousse de la liste.
On s'abonne soi-meme a l'evenement, le client ne l'ecoutant que fenetre
ouverte alors que notre panneau peut etre sur l'autre onglet. Le contenu
des cartes venant de lui, son GearManagerDialog_Update est refait aussi.
L'ordre retenu est elague des ensembles effaces.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Deux causes d'echec silencieux de l'enregistrement. L'indice d'icone peut
manquer : la fenetre retient l'icone preselectionnee dans selectedTexture
et ne la convertit en selectedIcon que pour les icones de la page
visible. Et MAX_EQUIPMENT_SETS_PER_PLAYER : creer avant d'effacer demande
une place de plus, qui n'existe pas au plafond.
Sans indice valide on abandonne ; au plafond l'ancien part d'abord, ce
qui est sans risque puisque son equipement est porte a cet instant ; et
l'effacement suit toujours une verification par
GetEquipmentSetInfoByName.
Le banc couvre les deux cas, et clot le remplacement asynchrone par son
evenement.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GearManagerDialogPopup_OnHide remet popup.name a nil : je le lisais apres
popup:Hide(), d'ou SaveEquipmentSet(nil, ...) et son Usage. Le nom et
l'icone sont desormais lus avant, et un drapeau dit au greffon du OnHide
que la fermeture vient de nous, pour qu'il n'abandonne pas l'edition.
Trois manques du banc l'avaient laisse passer : son Hide ne declenchait
pas OnHide, son SaveEquipmentSet acceptait un nom vide, et son
GearManagerDialogSaveSet_OnClick ne montrait pas la fenetre. Les trois
sont corriges, et le banc echoue bien sur l'ancien code.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ce client n'a pas de ModifyEquipmentSet : SaveEquipmentSet enregistre
l'equipement PORTE. Le chemin retenu equipe donc l'ancien ensemble --
l'equipement porte devient sa liste -- l'enregistre sous le nouveau nom
et la nouvelle icone, efface l'ancien et remet le nouveau a sa place.
C'est asynchrone : EQUIPMENT_SWAP_FINISHED annonce la fin, avec un
abandon au bout de dix secondes. Si l'ensemble est deja porte, on
enchaine directement.
Le Okay de la fenetre est REPRIS et non greffe : un greffon passerait
apres le client, qui aurait deja enregistre l'equipement porte sous ce
nom.
L'ordre d'affichage est tenu dans ForeverUIDB, 3.3.5 n'ayant aucun moyen
de replacer un ensemble dans sa liste.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sur le releve de GearSetButtonTemplate : croix 14 x 14 a BOTTOMRIGHT
(-21, 2) sur UI-GroupLoot-Pass-Up, engrenage 16 x 16 a RIGHT sur son
LEFT sur GEAR_64GREY, alpha 0,5 au repos et 1 au survol, texture decalee
de (1, -1) a l'appui. Les deux textures existent deja dans 3.3.5.
Le survol se suit a chaque image et non par OnEnter : ce sont des cadres
fils de la carte, y entrer declencherait son OnLeave. camelot fait de
meme dans PaperDollEquipmentManagerPane_OnUpdate.
La croix appelle CONFIRM_DELETE_EQUIPMENT_SET, la fenetre de validation
du client. L'engrenage choisit l'ensemble puis rouvre la fenetre de
creation : le client la remplit de son nom et de son icone, et son Okay
ecrase au lieu de creer.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Deux defauts distincts.
GetEquipmentSetLocations rend une table indexee par emplacement, et
EquipmentManager_UnpackLocation rend joueur, banque, sacs, SLOT. Je ne
lisais que les deux premiers drapeaux : une piece portee dans un AUTRE
emplacement passait pour bonne, d'ou des coches sur des ensembles sans
rapport. Le slot rendu doit valoir la cle.
Et si deux ensembles decrivent le meme equipement, la geometrie ne peut
pas les departager. 3.3.5 n'a aucune notion d'ensemble actif : le dernier
equipe est retenu par un greffon sur UseEquipmentSet, garde dans
ForeverUIDB, et la coche va a celui-la tant qu'il est encore porte.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
camelot ancre sa coche a RIGHT (-23) du bouton, qui chez lui s'arrete 25
px avant le bord de la carte. Ici le bouton couvre toute la carte, si
bien que le meme -23 la ramenait trop vers la gauche : elle passe a -12
du bord droit.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La liste glisse de 4 vers la droite, la carte descend a 40 de haut (fond
45, le debord de 5 de la source garde) et son fond passe a 174 de large.
Cette largeur est calculee, pas ecrite : l'ecart separateur -> icone
egale l'ecart carte -> bord de la fenetre, 8 de chaque cote.
Le choix et le survol etaient sur le meme calque, ou seul l'ordre de
creation departage. Le survol reste en BORDER, le choix monte en
ARTWORK.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GearManagerDialog est declaree toplevel dans le FrameXML et son OnShow
finit par GearManagerDialog:Raise() : a chaque ouverture elle repasse au
sommet de sa strate, apres tout niveau pose une fois pour toutes. D'ou un
bouton qui ne recevait rien malgre un niveau superieur.
SetToplevel(false), puisqu'elle n'est plus une fenetre, et le niveau du
bouton recalcule depuis le sien a chaque passage.
Le banc reproduit desormais Raise et toplevel.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GearManagerDialog est etalee sur tout le panneau, elle prend la souris et
elle est posee un cran plus haut : un bouton fils du panneau passait
dessous et ne recevait plus rien. Ceux du client -- Equip, Save -- sont
ses enfants a elle, donc epargnes.
Meme famille de defaut que le modele 3D sur les emplacements
d'equipement.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La recette du bouton tertiaire et ses mesures passent dans
ForeverUI.SkinTertiaryButton (AtlasUtil), employee par les selecteurs de
statistiques et par ce bouton. Son option auto fait suivre l'etat presse
au bouton de la souris ; sans elle l'appelant commande, ce que font les
selecteurs dont l'etat tient tant que leur liste est ouverte.
L'intitule est ecrit en dur : PAPERDOLL_NEWEQUIPMENTSET n'existe pas ici
et ce client ne porte aucune chaine equivalente.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Les boutons du panneau sont ses cadres fils, pas ceux de la fenetre du
client : masquer GearManagerDialog ne les emportait pas, et le bouton
restait visible sous les statistiques. Le panneau entier se montre et se
cache avec l'onglet.
Son intitule venait de NEW_COMPACT_UNIT_FRAME_PROFILE, absente de ce
client -- d'ou "New Profile", une chaine d'un tout autre panneau.
PAPERDOLL_NEWEQUIPMENTSET, que camelot ecrit, n'existe pas ici non plus :
NEW est la plus proche, et elle va avec Equip et Save.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UIPanelDialogTemplate nomme son bouton $parentClose --
GearManagerDialogClose -- et non $parentCloseButton : le masquer sous le
mauvais nom ne faisait rien. C'est refait a chaque passage, le client
remontrant ses morceaux quand il rouvre sa fenetre.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Les deux bords bougent ensemble -- gauche de -1 a -3, droit de -4 a -2 --
sinon la bordure s'elargirait au lieu de glisser.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
common-insideframe fait 107 x 107 et porte un motif dans chaque angle :
tendue sur les 233 x 379 du panneau, elle est multipliee par deux en
largeur et trois et demi en hauteur, et tout se brouille.
Neuf tranches, coin de 20 -- mesure sur l'art : le filet occupe 2..12 et
94..104, le motif d'angle s'arrete a 19. Les marges de camelot (TOPLEFT
1,1 et BOTTOMRIGHT -4,2) converties en -1, 1, -4, -2.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sur le releve de PaperDollFrame.EquipmentManagerPane et de
GearSetButtonTemplate : panneau sous la bande de pierre, bordure
common-insideframe, cartes de 169 x 44 en colonne avec leur fond
OutfitCard, leur icone cerclee, leur intitule et la coche des ensembles
portes, puis Equip, Save et New Set au bas.
Rien n'est recree : GearManagerDialog passe dans le volet, son art de
fenetre est efface, ses cartes se reposent et se rhabillent. Le client
garde la liste, la selection et les infobulles.
Ecarts documentes : New Set passe par le Save du client, Delete est
garde (3.3.5 n'a pas le menu de carte de camelot), la coche se calcule
depuis GetEquipmentSetLocations, et la liste defile a la molette faute
de MinimalScrollBar.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>