arcadia-pets-1.21.1-1.3.0
Curse Maven Snippet
What's new
Fixed
- The mixin config was never loaded, which had disabled Follow mode entirely —
neoforge.mods.tomldeclared it asmixinConfigs="arcadia_pets.mixins.json"inside the[[mods]]table. That is the old Forge key: NeoForge 1.21 reads a top-level[[mixins]]array and ignores the legacy one without emitting any warning. SinceapplyModesstrips every vanilla goal from a summoned pet,PetLiteAiMixinis the Follow implementation — with the config unloaded, nothing moved the pet and it stood still forever. The per-tick optimisation that ships with it (~150 µs down to ~7 µs per pet) had never been active either. Declared correctly now; same defect fixed in Arcadia Lib, whereCreativeTabLagFixMixinwas equally dead. - Companion pets were sometimes rendered far too large — the scale multiplied a per-species factor by an Endurance term and then capped on the pet's largest dimension, so wide, flat species were never limited on height: a turtle could grow until it was 1.8 blocks across. The table was also calibrated for a median 3★ Endurance, leaving a 5★ pet 36% oversized. Scale is now solved for a target height (0.55 blocks, +0.05 per Endurance star) with width as a separate ceiling, so every Follow pet is knee-high whatever its species.
- "Own every staff member pet" counted duplicates and had a frozen target — progress went up by one for every staff pet obtained, so seventeen copies of the same one completed it, while its hardcoded target of 17 silently became unreachable as soon as a staff member was added. It now counts distinct staff species and derives its target from the live roster.
- Leaving a world leaked it — three client-side caches each had a clear() written for the disconnect, one of them documented as such, and nothing ever called any of them: the mod had no client disconnect hook. Each holds entities built against the level being discarded, so every world or server join in a session kept the previous one alive. Opening the compendium once was enough to pin a level, and on a populated server the pocket-pet renderer held one entity per nearby player on top.
- Fusion destroyed the inputs before it knew there was a reward — the five slots were cleared and only then was the fusion bag requested. The bag builder returns an empty stack for any tier it has no bag for, and adding an empty stack to an inventory quietly succeeds, so on that path five pets vanished and nothing came back. The tier guard earlier in the method rules it out today, but that puts the safety of an irreversible operation in two places that have to agree. The reward is now built first and an empty one aborts the fusion untouched.
- Unsummoning a pet while riding it left the ride session behind — the entity was discarded without telling the mount system, and the only thing that clears a session is the mount's own tick, which a discarded entity never runs again. The session then outlived the pet: the check that lets the mount hook skip every non-ridden entity never went back to sleep, so it kept running in full for every ticking entity, and the stale entity id sat waiting to be recycled, at which point an unrelated mob was treated as an abandoned ride and had its gravity and step height forced.
- An expired duel challenge leaked its stake into the next one — the expiry path dropped the challenge but kept the wager, and a new challenge only wrote a stake when it carried one, so the old amount survived on the target. Challenge someone with a stake, let it lapse, then challenge them again with none, and the second duel charged both players the first one's stake for a match they had agreed was free. The expiry path now clears the stake and a new challenge always overwrites it.
- A lapsed challenge blocked its target permanently — the guard tested the pending-challenge map directly, which ignores the time limit, and nothing sweeps these maps on a timer. A challenge nobody answered kept its target from being challenged again until some unrelated call happened to prune it.
- A duel could pay out a pot nobody had funded — with no economy backend, taking the stakes reported success and left the wager in place, so the session was recorded as escrowed without a coin being taken. Settlement only checks that the economy is available at settlement time, so a backend that reconnected during the duel paid the winner from nothing. Without an economy the duel now simply runs unbetted.
- Mob names ignored the client language everywhere they were shown — the display name was built by prettifying the entity id, so the compendium, tooltips, duel screens and the pedestal all read in English whatever language the player used, and a French client saw "Cave Spider" rather than "Araignée cavernicole". Custom pets fared worse still: the name set in the lang files was bypassed entirely, so Izzy showed up as "Izzy Creeper". Names now resolve through the entity's own translation, and only when one exists, since an untranslated key would otherwise surface as a raw
entity.namespace.pathstring. Staff pets keep their handle, and an id from a mod that is no longer installed still falls back to the prettified form. - A malformed id in the pet pools took down the whole compendium — the id was read with
ResourceLocation.parse, which throws, from inside the render loop; one typo in the config cost the entire screen instead of the single card. The same call resolved pocket-pet types straight off the network. Both now usetryParseand take the fallback each already had. - The debug pet command could never spawn a staff pet — its argument was declared
word(), whose charset excludes:, so no namespaced id could reach the handler even though the handler explicitly supported one. Now aResourceLocationargument, with entity-id tab completion. - Pet names showed zero stars — the item read its stats out of a nested
Statscompound that nothing has ever written, while the flat per-stat bytes it should have summed sat beside it untouched. Every getter returned its default, so the star row was computed from zeros and drawn empty whatever the pet had actually rolled. - A flying pet span on the spot above its owner — the follow logic steered towards a point directly overhead, and
MoveControlderives its yaw from the horizontal delta. Standing still, that delta is floating-point noise, so the pet turned to face a direction that changed every tick. Vanilla's guard against exactly this compares the 3D distance, which the hover offset keeps well above the threshold. Flyers now hold position horizontally and only correct altitude once they are close enough.
Added
Mounting is earned, not granted — riding used to depend only on the species and a star floor, so a pet either could or could not carry you the moment you pulled it and nothing about it ever progressed. Each pet now has a bond, a 0-100 track earned by keeping it out with you: distance covered together, mobs killed at its side, and time simply summoned. Riding opens at 25 and flight at 75, both configurable, along with how fast bond accrues. A pocketed pet earns nothing and a teleport is never counted as distance. Arcane pets are born at the cap and are rideable straight out of the crate, as before. Pets saved before this change read as unbonded, except Arcane ones, which keep what they already had. Bond shows on the item tooltip and as a bar in the pet panel, notched at each threshold so it reads as what is left to earn rather than only how full it is.
Rideable pets — right-click your own pet in Follow mode to ride it. Species are classed as ground, aquatic or flying, speed scales with Agility, and flying mounts draw on a stamina pool that scales with Endurance and refills on the ground. Everything is tunable under
[mounts]in the config and switchable live with/arcadia_pets mounts.Four staff pets — Royal_F_ (Chronicle), HealeurAs2 (Mending Aura), Darkdiamons (Dark Prism) and Loldragman45 (Dragon Breath), each with a signature skill and a duel definition.
The Ender Dragon can now be a Follow pet — pinned to
noAiso vanilla skips its phase and attack logic, flown by hand, shrunk by a render-time mixin since its renderer ignores the SCALE attribute, and with its eight multipart hitboxes kept on the body.Config switch for passive owner bonuses —
passive_player_bonusesunder[stats]controls whether an equipped pet grants its owner attribute bonuses (this is what adds a heart with a high-Endurance pet). Defaults to the existing behaviour.The starter Pet Collection Book can be turned off — new
starter_book_enabledtoggle in a[gameplay]section of the server config, for servers whose starter kit already hands out first-join items; the book stays craftable and obtainable normally. The once-per-player flag also survives death now: it was stored in a part of the player data that a respawn wipes, so anyone who had died was handed another book on their next login — which is how players ended up hoarding them. Existing flags are migrated, so nobody receives a duplicate from the update itself.Arcane rarity, above Mythic — a tier for hand-made pets that are custom entities rather than vanilla mobs. It is drawn separately, before the ordinary rarity roll, so its odds cannot drift when another tier is re-tuned, and only crates at or above the configured tier can roll it. 1% from the Legendary crate by default, both values configurable under
[stats]. The tier is appended last in the enum because pets serialise their rarity by ordinal, so inserting it anywhere else would silently re-label every pet already saved.Four Arcane pets: Zyrra, Vaelryn, Nyssara and Magmara — Zyrra is a creeper and a ground mount; Vaelryn a dragon, Nyssara a manta ray of the End and Magmara a lava whale, all three flying mounts. Zyrra's Static Charge builds a charge from incoming hits and discharges it as a shockwave that damages and throws back nearby hostiles while never touching a block; Vaelryn's Wyrm Bond cuts fall damage and keeps the rider buoyant. All four have duel definitions.
Idle flourishes — standing still on the ground, each Arcane pet plays a short move of its own: Zyrra spins as its head swells, Vaelryn stretches, Nyssara rolls through a barrel turn and Magmara bellows. The cycle is offset by the entity id, so several of them together never move in step.
"Inseparable" achievement — for taking a single pet all the way to full bond, worth 3000 coins. It is the goal the bond track needed: the two mount thresholds sit at 25 and 75, so nothing rewarded finishing the last quarter.
"One in a Hundred" achievement — awarded for owning an Arcane pet, and worth 15000 coins, placing it above the Mythic reward.
Guide coverage for everything new — a Mounts entry walking through how to ride, the three mount classes, the stamina formula and the config levers; a Staff pets entry, since the Mythic tier and the longest collection goal in the mod had no page at all; an Arcane pets entry covering the separate roll, the crate gating, the maximum stat floor and what each of the two pets does; a Spirit Points entry, since the whole duel economy existed only in code comments and a player could not see what anything cost or that unspent points carry over; an Achievements entry, since fifty-six of them pay coins and none were documented; and the rarities entry corrected from six tiers to seven.
Changed
- Routine pet status no longer fills the chat — players reported being spammed while a pet was equipped. Nothing was firing in a loop: every warning is guarded on a threshold crossing and fires once. The problem was volume, since mounting alone posted two lines and feeding, hunger, pocket switches and flight warnings all landed in the same place as conversation. Transient status now goes to the action bar, where each message replaces the last instead of pushing chat up. Deaths, milestones, duels, drops and anything with a consequence stay in chat, including the two flight warnings: the stamina gauge rewrites the action bar every half second while airborne, so a warning posted there would vanish before it was read. Set
verbose_chatunder[mounts]to put everything back. - Warden, Breeze, Shulker, Dolphin and Elder Guardian can be set to Follow — they were blacklisted for costing server time, which was a symptom of the mixin never loading: they were running their full vanilla brains. Everything they do hangs off
serverAiStep, which the lite AI cancels outright, so they now cost about as much as a chicken. Only the Wither stays out, because it drives its attacks fromaiStep()itself. - Kill drops no longer scan the pet pools — deciding whether a killed mob has a pet walked five pool lists entry by entry, so the common case of a mob in no pool paid a comparison against every entry of all five. It is now a single lookup against an index rebuilt whenever the config loads or reloads, so an edited pool is still picked up without a restart. Modest on the shipped pools, which hold 27 mobs, and worth more on a server that has filled them out.
- The AI hot path no longer allocates — the mixin rejected non-pets by reading a flag out of
getPersistentData(), which lazily allocates aCompoundTagon any entity lacking one. Running for every mob, every tick, that minted a tag per non-pet mob purely to answer "no". It now rejects on an id lookup. - A pet type that fails to resolve is no longer resolved again on every frame — the client entity cache kept its results in a map, and a map cannot hold a null value, so a type that resolved to nothing was never recorded and the whole lookup ran again on the next frame, for every card showing it. The pools are config-driven, so an id that no longer resolves is expected rather than exceptional, and the item renderer falls back to a pig without saying so, which kept the cost invisible. Failures are remembered now, but only permanent ones: a level that has not finished loading stays retryable.
- The HUD no longer re-measures the pet name on every frame — trimming the name to the portrait width walked it one character at a time, allocating a string and measuring the font at each step, for a result that only changes when the pet is renamed. It is memoised on the name and the GUI scale.
- The Warden and Sniffer behaviour sweeps check that a pet exists first — each built a stream pipeline to look for species nobody may own, the Sniffer one twice a second for the lifetime of the server.
Correctifs
- La configuration de mixins n'était jamais chargée, ce qui désactivait tout le mode Follow —
neoforge.mods.tomlla déclarait viamixinConfigs="arcadia_pets.mixins.json"à l'intérieur du bloc[[mods]]. C'est la clé de l'ancien Forge : NeoForge 1.21 lit un tableau[[mixins]]de premier niveau et ignore l'ancienne sans le moindre avertissement. CommeapplyModesretire tous les goals vanilla d'un familier invoqué,PetLiteAiMixinest l'implémentation du Follow — sans la configuration, plus rien ne déplaçait le familier et il restait immobile. L'optimisation de tick qui l'accompagne (~150 µs ramenés à ~7 µs par familier) n'avait jamais été active non plus. Déclarée correctement désormais ; même défaut corrigé dans Arcadia Lib, oùCreativeTabLagFixMixinétait tout aussi inactif. - Les familiers apparaissaient parfois beaucoup trop grands — l'échelle multipliait un facteur par espèce par un terme d'Endurance, puis plafonnait sur la plus grande dimension : les espèces larges et plates n'étaient donc jamais limitées en hauteur, et une tortue pouvait grossir jusqu'à 1,8 bloc de large. La table était en outre calibrée pour une Endurance médiane de 3★, laissant un familier 5★ 36 % trop grand. L'échelle vise maintenant une hauteur cible (0,55 bloc, +0,05 par étoile d'Endurance), la largeur devenant un plafond distinct.
- Le succès « posséder tous les familiers du staff » comptait les doublons et avait une cible figée — la progression montait de un à chaque familier staff obtenu, donc dix-sept exemplaires du même le validaient, tandis que sa cible codée en dur à 17 devenait silencieusement inatteignable dès l'ajout d'un membre. Il compte désormais les espèces staff distinctes et tire sa cible de l'effectif réel.
- Quitter un monde le laissait fuir — trois caches côté client disposaient chacun d'un
clear()écrit pour la déconnexion, dont un explicitement documenté comme tel, et aucun n'était jamais appelé : le mod n'avait aucun hook de déconnexion client. Chacun retient des entités construites contre le niveau que l'on quitte, si bien que chaque monde ou serveur rejoint dans une même session maintenait le précédent en vie. Ouvrir le compendium une seule fois suffisait à épingler un niveau, et sur un serveur peuplé le rendu des familiers de poche en retenait une par joueur proche en plus. - La fusion détruisait les familiers avant de savoir s'il y avait une récompense — les cinq emplacements étaient vidés, et seulement ensuite le sac de fusion était demandé. Le constructeur de sac renvoie une pile vide pour tout palier qu'il ne couvre pas, et ajouter une pile vide à un inventaire réussit silencieusement : sur ce chemin, cinq familiers disparaissaient sans contrepartie. La garde de palier placée plus haut l'écarte aujourd'hui, mais elle fait reposer la sûreté d'une opération irréversible sur deux endroits qui doivent rester d'accord. La récompense est désormais construite en premier, et une récompense vide annule la fusion sans rien toucher.
- Déséquiper un familier pendant qu'on le chevauchait laissait la session de monte derrière — l'entité était détruite sans prévenir le système de montures, et la seule chose qui efface une session est le tick de la monture, qu'une entité détruite n'exécutera plus jamais. La session survivait donc au familier : le test qui permet au hook de montures d'ignorer toutes les entités non chevauchées ne se réactivait plus, il tournait donc intégralement pour chaque entité qui tique, et l'identifiant d'entité périmé attendait d'être recyclé, moment où un mob sans rapport était pris pour une monte abandonnée et se voyait imposer gravité et hauteur de pas.
- Un défi expiré transmettait sa mise au suivant — le chemin d'expiration supprimait le défi mais conservait la mise, et un nouveau défi n'écrivait une mise que s'il en portait une : l'ancien montant survivait donc sur la cible. Défier quelqu'un avec une mise, laisser expirer, puis le redéfier sans mise, et le second duel prélevait aux deux joueurs la mise du premier pour un affrontement convenu gratuit. L'expiration efface désormais la mise, et un nouveau défi l'écrase systématiquement.
- Un défi périmé bloquait sa cible indéfiniment — la garde interrogeait directement la table des défis en attente, qui ignore le délai, et rien ne balaie ces tables périodiquement. Un défi resté sans réponse empêchait donc sa cible d'être redéfiée jusqu'à ce qu'un appel sans rapport le purge par hasard.
- Un duel pouvait verser un gain que personne n'avait financé — sans service économique, la prise des mises annonçait un succès en laissant la mise en place : la session était enregistrée comme provisionnée sans qu'une pièce ait été prélevée. Le règlement ne vérifie la disponibilité de l'économie qu'au moment du règlement, si bien qu'un service revenu en cours de duel payait le vainqueur à partir de rien. Sans économie, le duel se déroule désormais simplement sans mise.
- Les noms de mobs ignoraient la langue du client partout où ils apparaissaient — le nom affiché était fabriqué en embellissant l'identifiant de l'entité : le compendium, les infobulles, les écrans de duel et le piédestal s'affichaient donc en anglais quelle que soit la langue, et un client français lisait « Cave Spider » au lieu d'« Araignée cavernicole ». Les familiers personnalisés étaient encore plus mal lotis, le nom défini dans les fichiers de langue étant purement ignoré : Izzy apparaissait en « Izzy Creeper ». Les noms passent désormais par la traduction propre à l'entité, et seulement si elle existe, faute de quoi une clé non traduite ressortirait telle quelle sous la forme
entity.namespace.path. Les familiers staff conservent leur pseudo, et un identifiant venant d'un mod désinstallé retombe toujours sur la forme embellie. - Un identifiant malformé dans les pools faisait tomber tout le compendium — il était lu avec
ResourceLocation.parse, qui lève une exception, depuis la boucle de rendu : une faute de frappe dans la config coûtait l'écran entier au lieu de la seule carte concernée. Le même appel résolvait aussi les types de familiers de poche reçus par le réseau. Les deux passent àtryParseet empruntent le repli dont ils disposaient déjà. - La commande de debug ne pouvait pas faire apparaître un familier staff — son argument était déclaré en
word(), dont le jeu de caractères exclut:, donc aucun identifiant avec namespace ne pouvait atteindre le gestionnaire, alors même que celui-ci le gérait explicitement. C'est désormais un argumentResourceLocation, avec autocomplétion des identifiants d'entité. - Les noms de familiers affichaient zéro étoile — l'objet lisait ses statistiques dans un compound
Statsimbriqué que rien n'a jamais écrit, alors que les octets à plat qu'il aurait dû additionner se trouvaient juste à côté, intacts. Chaque accesseur renvoyait donc sa valeur par défaut, et la ligne d'étoiles était calculée à partir de zéros, quelles que soient les statistiques réellement tirées. - Un familier volant tournait sur lui-même au-dessus de son propriétaire — la logique de suivi visait un point à la verticale, et
MoveControldéduit son lacet du déplacement horizontal. À l'arrêt, ce déplacement n'est que du bruit de virgule flottante : le familier s'orientait donc vers une direction qui changeait à chaque tick. La garde prévue par vanilla contre exactement cela compare la distance en 3D, que le décalage de survol maintient bien au-dessus du seuil. Les volants tiennent désormais leur position à l'horizontale et ne corrigent l'altitude qu'une fois assez proches.
Ajouts
La monte se mérite, elle n'est plus donnée — chevaucher ne dépendait que de l'espèce et d'un seuil d'étoiles : un familier pouvait ou non te porter dès sa sortie, et rien n'évoluait ensuite. Chaque familier possède désormais un Lien, une jauge de 0 à 100 qui se gagne en le gardant sorti avec toi : distance parcourue ensemble, mobs tués à ses côtés, et temps simplement passé dehors. La monte s'ouvre à 25 et le vol à 75, les deux étant configurables, tout comme la vitesse de gain. Un familier en poche ne gagne rien et une téléportation n'est jamais comptée comme de la distance. Les familiers Arcane naissent au maximum et restent chevauchables dès la caisse, comme avant. Les familiers sauvegardés avant ce changement sont lus comme non liés, à l'exception des Arcane, qui conservent ce qu'ils avaient. Le Lien apparaît sur l'infobulle de l'objet et sous forme de barre dans le panneau du familier, avec une encoche à chaque palier pour montrer ce qu'il reste à gagner plutôt que seulement son remplissage.
Familiers chevauchables — clic droit sur ton familier en mode Follow pour le monter. Les espèces sont classées terrestre, aquatique ou volante, la vitesse dépend de l'Agilité, et les montures volantes puisent dans une réserve d'endurance liée à l'Endurance qui se recharge au sol. Tout est réglable dans
[mounts]et commutable à chaud via/arcadia_pets mounts.Quatre familiers staff — Royal_F_ (Chronique), HealeurAs2 (Aura de Soin), Darkdiamons (Prisme Obscur) et Loldragman45 (Souffle du Dragon), chacun avec sa compétence signature et sa définition de duel.
L'Ender Dragon peut désormais être un familier en Follow — épinglé en
noAipour que vanilla saute sa logique de phases et d'attaque, piloté à la main, réduit par un mixin au rendu puisque son renderer ignore l'attribut SCALE, et ses huit hitbox multi-parties maintenues sur le corps.Interrupteur de config pour les bonus passifs du propriétaire —
passive_player_bonusessous[stats]contrôle si un familier équipé accorde des bonus d'attributs à son propriétaire (c'est ce qui ajoute un cœur avec un familier à forte Endurance). Par défaut sur le comportement existant.Le Livre de Collection de départ peut être désactivé — nouveau réglage
starter_book_enableddans une section[gameplay]de la config serveur, pour les serveurs dont le kit de départ distribue déjà les objets de première connexion ; le livre reste fabricable et obtenable normalement. Le marqueur « une fois par joueur » survit en outre à la mort désormais : il était stocké dans une partie des données du joueur qu'une réapparition efface, si bien qu'un joueur mort une fois recevait un nouveau livre à sa connexion suivante — c'est ainsi que certains ont fini par en accumuler. Les marqueurs existants sont migrés, personne ne reçoit donc de doublon du fait de la mise à jour elle-même.Rareté Arcane, au-dessus de Mythique — un palier pour les familiers faits main, qui sont des entités dédiées et non des mobs vanilla. Il est tiré séparément, avant le tirage de rareté ordinaire, pour que ses chances ne dérivent pas quand un autre palier est retouché, et seules les caisses au niveau configuré ou au-dessus peuvent le sortir. 1 % depuis la caisse Légendaire par défaut, les deux valeurs étant réglables sous
[stats]. Le palier est ajouté en fin d'énumération car la rareté d'un familier est sérialisée par ordinal : l'insérer ailleurs renommerait silencieusement tous les familiers déjà sauvegardés.Quatre familiers Arcane : Zyrra, Vaelryn, Nyssara et Magmara — Zyrra est un creeper et une monture terrestre ; Vaelryn un dragon, Nyssara une raie manta de l'End et Magmara une baleine de lave, toutes trois montures volantes. La Charge Statique de Zyrra accumule les coups reçus puis les décharge en onde de choc qui blesse et projette les hostiles autour, sans jamais toucher un bloc ; le Lien du Wyrm de Vaelryn réduit les dégâts de chute et maintient le cavalier en suspension. Les quatre ont leur définition de duel.
Fioritures au repos — à l'arrêt au sol, chaque familier Arcane joue un court mouvement qui lui est propre : Zyrra tourne sur lui-même en gonflant la tête, Vaelryn s'étire, Nyssara enchaîne un tonneau et Magmara pousse un beuglement. Le cycle est décalé par l'identifiant de l'entité, si bien que plusieurs d'entre eux ne bougent jamais à l'unisson.
Succès « Inséparables » — pour avoir mené un familier jusqu'au Lien maximum, doté de 3000 pièces. C'est l'objectif qui manquait à la jauge de Lien : les deux paliers de monte se situant à 25 et 75, rien ne récompensait le dernier quart.
Succès « Un sur cent » — décerné pour la possession d'un familier Arcane, et doté de 15000 pièces, ce qui le place au-dessus de la récompense Mythique.
Le guide couvre toutes les nouveautés — une entrée Montures détaillant comment monter, les trois classes de monture, la formule d'endurance et les réglages de config ; une entrée Familiers du staff, le palier Mythique et le plus long objectif de collection du mod n'ayant aucune page ; une entrée Familiers Arcane couvrant le tirage séparé, le verrou par caisse, le plancher de statistiques maximal et ce que fait chacun des deux familiers ; une entrée Points d'esprit, toute l'économie des duels n'existant que dans les commentaires du code, sans que le joueur puisse voir ce que coûtent les compétences ni que les points non dépensés sont reportés ; une entrée Succès, cinquante-six d'entre eux versant des pièces sans qu'aucun ne soit documenté ; et l'entrée des raretés corrigée de six paliers à sept.
Modifications
- Le statut courant des familiers n'encombre plus le chat — des joueurs se plaignaient d'être spammés familier équipé. Rien ne partait en boucle : chaque avertissement est gardé par un franchissement de seuil et ne part qu'une fois. Le problème était le volume, monter un familier envoyant à lui seul deux lignes, auxquelles s'ajoutaient les repas, la faim, les passages en poche et les alertes de vol, le tout mêlé aux conversations. Le statut transitoire passe désormais par la barre d'action, où chaque message remplace le précédent au lieu de faire remonter le chat. Les morts, les jalons, les duels, les drops et tout ce qui a une conséquence restent en chat, y compris les deux alertes de vol : la jauge d'endurance réécrit la barre d'action toutes les demi-secondes en vol, une alerte posée là disparaîtrait donc avant d'être lue.
verbose_chatsous[mounts]rétablit l'ancien comportement. - Warden, Breeze, Shulker, Dolphin et Gardien ancestral peuvent passer en Follow — ils étaient sur liste noire pour leur coût serveur, symptôme du mixin jamais chargé : ils tournaient avec leur cerveau vanilla complet. Tout ce qu'ils font passe par
serverAiStep, que l'IA allégée annule intégralement ; ils coûtent donc désormais autant qu'une poule. Seul le Wither reste exclu, car il pilote ses attaques depuisaiStep()lui-même. - Les drops sur kill ne parcourent plus les pools — déterminer si un mob tué possède un familier passait en revue cinq listes entrée par entrée : le cas courant, un mob absent de tous les pools, payait donc une comparaison contre chaque entrée des cinq. C'est désormais une seule recherche dans un index reconstruit à chaque chargement ou rechargement de config, si bien qu'un pool modifié est toujours pris en compte sans redémarrage. Le gain reste modeste sur les pools livrés, qui comptent 27 mobs, et devient intéressant sur un serveur qui les a étoffés.
- Le chemin chaud de l'IA n'alloue plus — le mixin rejetait les non-familiers en lisant un flag dans
getPersistentData(), qui alloue paresseusement unCompoundTagsur toute entité qui n'en a pas. Exécuté pour chaque mob à chaque tick, cela créait un tag par mob non-familier juste pour répondre « non ». Le rejet passe maintenant par une recherche d'identifiant. - Un type de familier qui échoue à se résoudre ne l'est plus à chaque frame — le cache d'entités côté client rangeait ses résultats dans une table, et une table ne peut pas contenir de valeur nulle : un type qui ne résolvait rien n'était donc jamais enregistré, et la recherche complète repartait à la frame suivante, pour chaque carte l'affichant. Les pools étant pilotés par la config, un identifiant qui ne résout plus est un cas attendu, et le rendu d'objet retombe sur un cochon sans le dire, ce qui rendait le coût invisible. Les échecs sont désormais mémorisés, mais seulement les définitifs : un niveau pas encore chargé reste réessayable.
- Le HUD ne remesure plus le nom du familier à chaque frame — la troncature à la largeur du portrait retirait un caractère à la fois, en allouant une chaîne et en mesurant la police à chaque étape, pour un résultat qui ne change qu'au renommage. Il est désormais mémoïsé sur le nom et l'échelle de l'interface.
- Les balayages de comportement du Warden et du Sniffer vérifient d'abord qu'un familier existe — chacun construisait un pipeline de flux pour chercher des espèces que personne ne possède peut-être, celui du Sniffer deux fois par seconde durant toute la vie du serveur.
This mod has no additional files

