D1: ThreadLocal alert suppression moved from ItemCollar to CollarHelper.
onCollarRemoved() logic (kidnapper alert) moved to CollarHelper.
D2+D3: Deleted 17 V1 item classes + 4 V1-only interfaces:
ItemBind, ItemGag, ItemBlindfold, ItemCollar, ItemEarplugs, ItemMittens,
ItemColor, ItemClassicCollar, ItemShockCollar, ItemShockCollarAuto,
ItemGpsCollar, ItemChokeCollar, ItemHood, ItemMedicalGag,
IBondageItem, IHasGaggingEffect, IHasBlindingEffect, IAdjustable
D4: KidnapperTheme/KidnapperItemSelector/DispenserBehaviors migrated
from variant enums to string-based DataDrivenItemRegistry IDs.
D5: Deleted 11 variant enums + Generic* factories + ItemBallGag3D:
BindVariant, GagVariant, BlindfoldVariant, EarplugsVariant, MittensVariant,
GenericBind, GenericGag, GenericBlindfold, GenericEarplugs, GenericMittens
D6: ModItems cleaned — all V1 bondage registrations removed.
D7: ModCreativeTabs rewritten — iterates DataDrivenItemRegistry.
D8+D9: All V2 helpers cleaned (V1 fallbacks removed), orphan imports removed.
Zero V1 bondage code references remain (only Javadoc comments).
All bondage items are now data-driven via 47 JSON definitions.
108 lines
6.4 KiB
Markdown
108 lines
6.4 KiB
Markdown
# D-01 Branch C : Consumer Migration (~97 fichiers)
|
|
|
|
> **Prérequis :** Branch A + B mergées.
|
|
> **Branche :** `feature/d01-branch-c-migration`
|
|
> **Objectif :** Remplacer TOUTES les références V1 (`instanceof ItemBind`, `ItemCollar.isOwner()`, `BindVariant.ROPES`, etc.) par les helpers/composants V2. Les classes V1 existent encore mais ne sont plus référencées. À la fin, `grep -r "instanceof ItemBind\|instanceof ItemGag\|instanceof ItemCollar\|instanceof ItemBlindfold\|instanceof ItemEarplugs\|instanceof ItemMittens\|BindVariant\|GagVariant" src/` retourne ZÉRO résultats (hors items/ lui-même).
|
|
|
|
---
|
|
|
|
## Pattern migration
|
|
|
|
| V1 | V2 | Notes |
|
|
|----|-----|-------|
|
|
| `instanceof ItemBind` | `BindModeHelper.isBindItem(stack)` | Ou `instanceof IV2BondageItem` si on a juste besoin de savoir que c'est un bondage item |
|
|
| `ItemBind.hasArmsBound(stack)` | `BindModeHelper.hasArmsBound(stack)` | Mêmes NBT keys |
|
|
| `ItemBind.hasLegsBound(stack)` | `BindModeHelper.hasLegsBound(stack)` | |
|
|
| `ItemBind.getBindModeId(stack)` | `BindModeHelper.getBindModeId(stack)` | |
|
|
| `itemBind.getPoseType()` | `PoseTypeHelper.getPoseType(stack)` | |
|
|
| `BindVariant.ROPES` / `ModItems.getBind(variant)` | `DataDrivenBondageItem.createStack(rl("tiedup:ropes"))` | **LAZY !** Ne pas appeler dans des static initializers |
|
|
| `instanceof ItemCollar` + methods | `CollarHelper.isCollar(stack)` + `CollarHelper.method(stack)` | |
|
|
| `instanceof ItemShockCollar` | `CollarHelper.canShock(stack)` | |
|
|
| `instanceof ItemGpsCollar` | `CollarHelper.hasGPS(stack)` | |
|
|
| `instanceof ItemChokeCollar` | `CollarHelper.isChokeCollar(stack)` | |
|
|
| `instanceof IHasGaggingEffect` | `DataDrivenBondageItem.getComponent(stack, GAGGING, GaggingComponent.class) != null` | Pour V2 items. V1 items gardent l'interface pendant la transition. |
|
|
| `instanceof IHasBlindingEffect` | `DataDrivenBondageItem.getComponent(stack, BLINDING, BlindingComponent.class) != null` | Idem |
|
|
| `instanceof ItemGag` + `getGagMaterial()` | `GaggingComponent comp = getComponent(stack, GAGGING, ...)` + `comp.getMaterial()` | |
|
|
| `PoseType` enum direct | Inchangé — l'enum est conservé | |
|
|
| `IHasResistance` methods | Inchangé — l'interface est conservée | |
|
|
| `ILockable` methods | Inchangé — l'interface est conservée | |
|
|
|
|
---
|
|
|
|
## Ordre de migration (critique d'abord)
|
|
|
|
### Phase 1 : State core (12 fichiers)
|
|
|
|
Ces fichiers sont la fondation — les migrer d'abord assure que le reste fonctionne.
|
|
|
|
| Fichier | Changements |
|
|
|---------|------------|
|
|
| `state/IBondageState.java` | `hasArmsBound()`/`hasLegsBound()` → `BindModeHelper` |
|
|
| `state/PlayerBindState.java` | `instanceof ItemCollar` → `CollarHelper`, `instanceof ItemBind` → `BindModeHelper` |
|
|
| `state/PlayerCaptorManager.java` | `instanceof ItemCollar` → `CollarHelper.isCollar() + CollarHelper.getOwners()` |
|
|
| `state/HumanChairHelper.java` | `PoseType` import OK (conservé) |
|
|
| `state/components/PlayerEquipment.java` | **Garder `equipInRegion()` V1 fallback** (migre en Branch D). Remplacer `instanceof ItemBind/ItemCollar` dans resistance methods. |
|
|
| `state/components/PlayerDataRetrieval.java` | `instanceof ItemCollar` → `CollarHelper.getNickname()` |
|
|
| `state/components/PlayerLifecycle.java` | imports V1 → V2 helpers |
|
|
| `state/components/PlayerShockCollar.java` | `instanceof ItemShockCollar` → `CollarHelper.canShock()` |
|
|
| `state/struggle/StruggleBinds.java` | Déjà migré en Branch A9 — vérifier |
|
|
| `state/struggle/StruggleCollar.java` | Déjà migré en Branch A9 — vérifier |
|
|
| `state/struggle/StruggleAccessory.java` | Vérifier |
|
|
|
|
### Phase 2 : Client animation/render (12 fichiers)
|
|
|
|
| Fichier | Changements |
|
|
|---------|------------|
|
|
| `client/animation/tick/AnimationTickHandler.java` | `instanceof ItemBind` → `PoseTypeHelper.getPoseType()` + `BindModeHelper` |
|
|
| `client/animation/tick/NpcAnimationTickHandler.java` | Idem |
|
|
| `client/animation/render/PlayerArmHideEventHandler.java` | `instanceof ItemBind` → `PoseTypeHelper` |
|
|
| `client/animation/render/DogPoseRenderHandler.java` | Idem |
|
|
| `client/animation/render/PetBedRenderHandler.java` | Idem |
|
|
| `client/animation/util/AnimationIdBuilder.java` | `PoseType` import OK (conservé) |
|
|
| `client/animation/StaticPoseApplier.java` | `PoseType` import OK |
|
|
| `client/model/DamselModel.java` | `PoseType` + `instanceof ItemBind` → helpers |
|
|
| `client/FirstPersonMittensRenderer.java` | `BindVariant.ROPES` → lazy createStack |
|
|
| `mixin/client/MixinPlayerModel.java` | `instanceof ItemBind` → `PoseTypeHelper` |
|
|
| `mixin/client/MixinCamera.java` | Idem |
|
|
| `mixin/client/MixinVillagerEntityBaseModelMCA.java` | Idem |
|
|
|
|
### Phase 3 : Entity AI goals (15 fichiers)
|
|
|
|
Principalement `instanceof ItemBind` → `BindModeHelper`, `ModItems.getBind(variant)` → `createStack(rl)`, `instanceof ItemCollar` → `CollarHelper`.
|
|
|
|
### Phase 4 : Network packets (14 fichiers)
|
|
|
|
`PacketSelfBondage` déjà migré en A11. Reste : `PacketSlaveAction`, `PacketMasterEquip`, `PacketAssignCellToCollar`, `PacketNpcCommand`, etc. → `CollarHelper`.
|
|
|
|
### Phase 5 : Events (8 fichiers)
|
|
|
|
`BondageItemRestrictionHandler`, `RestraintTaskTickHandler`, `PlayerEnslavementHandler`, `ChatEventHandler`, etc.
|
|
|
|
### Phase 6 : Commands (6 fichiers)
|
|
|
|
`BondageSubCommand` (1232 lignes) — le plus gros. `BindVariant` → `createStack()`. `NPCCommand`, `CollarCommand`, `KidnapSetCommand`.
|
|
|
|
### Phase 7 : Entity classes (15 fichiers)
|
|
|
|
`EntityKidnapper`, `KidnapperCaptureEquipment`, `KidnapperTheme`, `KidnapperItemSelector`, `KidnapperCollarConfig`, etc.
|
|
|
|
### Phase 8 : Compat MCA (5 fichiers)
|
|
|
|
`MCAKidnappedAdapter` (907 lignes) — `instanceof IHasGaggingEffect/IHasBlindingEffect` → component checks. `instanceof ItemCollar` → `CollarHelper`.
|
|
|
|
### Phase 9 : Autres (10 fichiers)
|
|
|
|
Dialogue (`GagTalkManager`, `PetRequestManager`), worldgen (`HangingCagePiece`), util (`RestraintApplicator`), blocks (`BondageItemBlockEntity`), dispenser, creative tab.
|
|
|
|
---
|
|
|
|
## Vérification
|
|
|
|
- [ ] `make build` — clean
|
|
- [ ] `grep -r "instanceof ItemBind\b" src/ --include="*.java" | grep -v "items/"` → 0 résultats
|
|
- [ ] `grep -r "instanceof ItemGag\b" src/ --include="*.java" | grep -v "items/"` → 0 résultats
|
|
- [ ] `grep -r "instanceof ItemCollar\b" src/ --include="*.java" | grep -v "items/"` → 0 résultats
|
|
- [ ] `grep -r "BindVariant\b" src/ --include="*.java" | grep -v "items/"` → 0 résultats
|
|
- [ ] `grep -r "GagVariant\b" src/ --include="*.java" | grep -v "items/"` → 0 résultats
|
|
- [ ] `make run` — le mod fonctionne normalement
|