fix(P1+P2): swarm review — UX fixes + V1 dead code cleanup

P1 — UX visible:
- Add 4 missing translations (leather_mittens, ball_gag_3d, taser, debug_wand)
- Fix earplugs resistance bucket: "blindfold" → "earplug"
- Split mixin config: core (require=1) + compat MCA (require=0)
- Bump PROTOCOL_VERSION from "1" to "2"
- Add debug_wand item model (no texture — debug only)
- Fix 3 display_name inconsistencies (chain, vine_seed, shock_collar_auto)

P2 — Dead code cleanup:
- Delete IHas3DModelConfig + Model3DConfig (zero imports)
- Remove MovementStyleResolver.resolveV1Fallback() + V1Fallback record + V1 constants
- Remove AnimationTickHandler V1 fallback block + buildAnimationId()
- Document PlayerEquipment.equipInRegion() bypass as intentional (force-equip paths)
This commit is contained in:
NotEvil
2026-04-16 10:58:44 +02:00
parent d75b74f9f9
commit 371a138b71
16 changed files with 58 additions and 264 deletions

View File

@@ -424,7 +424,14 @@ public class PlayerEquipment {
/**
* Low-level equip: writes to V2 capability, calls IBondageItem lifecycle hooks, syncs.
* Uses setInRegion directly because V1 items do not implement IV2BondageItem.
*
* <p>INTENTIONALLY bypasses V2EquipmentManager.tryEquip() because:
* <ul>
* <li>V1 items (IBondageItem) do not implement IV2BondageItem, so tryEquip() rejects them</li>
* <li>All callers (commands, NPC AI, NBT restore) are force-equip paths that should not
* be subject to V2 conflict resolution (SMELL-003 reviewed — bypass is by design)</li>
* </ul>
* <p>Basic safety (isRegionOccupied, canEquip) is still checked here.</p>
*/
private void equipInRegion(BodyRegionV2 region, ItemStack stack) {
Player player = host.getPlayer();