5 classes ajoutées dans rig/patch/ :
- TiedUpCapabilities.java
Holder du Capability<EntityPatch> CAPABILITY_ENTITY (CapabilityToken
auto-register) + helpers getEntityPatch / getPlayerPatch /
getPlayerPatchAsOptional. Simplifié de EF (pas de ITEM/PROJECTILE/SKILL
caps, combat only).
- EntityPatchProvider.java
ICapabilityProvider + Map<EntityType, Function<Entity, Supplier<EntityPatch<?>>>>.
registerEntityPatches() pour commonSetup (EntityType.PLAYER seul Phase 2),
registerEntityPatchesClient() pour clientSetup (dispatch LocalPlayerPatch vs
ClientPlayerPatch<RemotePlayer> vs ServerPlayerPatch). CUSTOM_CAPABILITIES
pour extensions futures. Pas de GlobalMobPatch combat fallback.
IMPORTANT : n'enregistre PAS EntityType.VILLAGER (MCA conflict V3-REW-10).
- TiedUpCapabilityEvents.java
@Mod.EventBusSubscriber sur AttachCapabilitiesEvent<Entity>. Check oldPatch
pour éviter double-attach, construit provider, appelle onConstructed eager
(D-01 pattern EF), addCapability. Priority NORMAL (order d'attachement
ne matière pas, c'est les runtime cross-cap reads qui importent et ceux-là
sont déjà lazy dans onConstructed).
3 stubs PlayerPatch subclasses (placeholders Phase 2.4) :
- ServerPlayerPatch : overrideRender=false, getArmature=null stub, updateMotion no-op
- ClientPlayerPatch<T extends AbstractClientPlayer> : overrideRender=true, @OnlyIn CLIENT
- LocalPlayerPatch extends ClientPlayerPatch<LocalPlayer> : vide pour l'instant
Ces stubs satisfont le compile de EntityPatchProvider.registerEntityPatchesClient().
Le getArmature() null est non-bloquant Phase 2.3 mais devra être fixé Phase 2.4
pour le vrai rendering (lien avec TiedUpRigRegistry.BIPED à créer Phase 2.7).
Compile BUILD SUCCESSFUL + 11 tests bridge GREEN maintenus.
Résout les 3 items remontés par la review globale pré-Phase 2 :
SMELL-001 — TiedUpRigConstants.ANIMATOR_PROVIDER
Le ternaire retournait ServerAnimator::getAnimator dans les 2 branches
alors que ClientAnimator est maintenant forké (présent dans rig/anim/client/).
Switch vers ClientAnimator::getAnimator côté client (pattern lazy method-ref
préserve la non-chargement sur serveur dédié).
DOC-001 — AnimationManager:211
Commentaire ambigu "SkillManager.reloadAllSkillsAnimations() strippé"
clarifié : préciser que l'appel upstream EF venait de yesman.epicfight.skill.*
et que le combat system est hors scope TiedUp.
TEST-001 — GltfToSkinnedMeshTest coverage gaps
Tests précédents utilisaient [1,0,0,0] → drop trivial, renorm no-op.
Ajoute 3 tests :
- convertDropsLowestWeightAndRenormalizes : poids [0.5, 0.3, 0.15, 0.05]
force le drop du plus faible (0.05) + renorm des 3 restants.
- convertHandlesZeroWeightVertex : weights tous-zéro → fallback Root w=1.
- convertFallsBackToRootForUnknownJointName : joint GLB inconnu ("TentacleJoint42")
→ log WARN + fallback Root id=0 sans crash.
11 tests bridge GREEN (5 alias + 6 convert). Compile BUILD SUCCESSFUL.
Cross-check de l'audit Phase 0 contre les sources EF (4 agents) a remonté :
D-08 RÉFUTÉ partiellement :
- EF LivingEntityPatch.getTarget() = getLastHurtMob() — identique à notre stub.
- MAIS MobPatch.getTarget() override avec Mob.getTarget() manquait chez nous.
- Fix : override ajouté, ref commentée à EF MobPatch.java:171-174.
- Sans ça, MoveCoordFunctions.MOB_ATTACK_TARGET_LOOK aurait la mauvaise
sémantique (dernier mob qui m'a frappé vs cible AI courante) → NPC ne
tourne pas vers sa cible pendant attack anim.
D-07 VALIDÉ :
- correctRootJoint zero-out X/Z de la Root en espace monde pour éviter
sliding visuel pendant LinkAnimation vers ActionAnimation.
- Safe Phase 1 (idle/walk = StaticAnimation, pas ActionAnimation).
- Critical Phase 2+ dès qu'une vraie ActionAnimation bondage est jouée.
- Fix : dev assertion LOGGER.warn en IS_DEV_ENV pointant vers
PHASE0_DEGRADATIONS.md D-07. Empêche découverte tardive.
Autres findings post-vérification (traçés en doc gitignorée) :
D-01 getAnimator()=null : fix Phase 2 (pas Phase 1) — field protected EF-style
D-02 sync() stripped : FAUX-POSITIF partiel — BEGINNING_LOCATION non affecté
(IndependentVariableKey non-synced), seul DESTINATION en MP dédié
D-03 InstantiateInvoker throws : swallowed par try/catch, silent no-op
D-04 Patch suppression : doc EXTRACTION.md §3.12/§10 corrigée (Option A)
D-05 reloadAllSkillsAnimations : était déjà dans SkillManager (commentaire OK)
D-06 playAnimationAt : ARCHITECTURE.md §5.5.1 pseudocode (signature fantôme)
→ notes ajoutées pointant vers D-06
D-09 AnimationBegin/EndEvent : listeners EF uniquement skill system interne,
ON_BEGIN/END_EVENTS data-driven continuent de fonctionner
D-10 AT 127 lignes : ~50% utile (GUI TiedUp existant), ne pas fix maintenant
IK stack (S-05 pas dans les docs) : section R12 ajoutée à ARCHITECTURE.md §11.
Compile BUILD SUCCESSFUL maintenu (0 errors).