diff --git a/src/main/java/com/tiedup/remake/state/struggle/StruggleBinds.java b/src/main/java/com/tiedup/remake/state/struggle/StruggleBinds.java index f32c357..e1bddf6 100644 --- a/src/main/java/com/tiedup/remake/state/struggle/StruggleBinds.java +++ b/src/main/java/com/tiedup/remake/state/struggle/StruggleBinds.java @@ -4,12 +4,18 @@ import com.tiedup.remake.core.SettingsAccessor; import com.tiedup.remake.core.SystemMessageManager; import com.tiedup.remake.core.SystemMessageManager.MessageCategory; import com.tiedup.remake.core.TiedUpMod; +import com.tiedup.remake.items.base.IHasResistance; import com.tiedup.remake.items.base.ILockable; import com.tiedup.remake.items.base.ItemBind; import com.tiedup.remake.state.IPlayerLeashAccess; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.BindModeHelper; +import com.tiedup.remake.v2.bondage.CollarHelper; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; +import com.tiedup.remake.v2.bondage.component.ComponentType; +import com.tiedup.remake.v2.bondage.component.ResistanceComponent; +import com.tiedup.remake.v2.bondage.datadriven.DataDrivenBondageItem; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -75,16 +81,17 @@ public class StruggleBinds extends StruggleState { player, BodyRegionV2.ARMS ); - if ( - bindStack.isEmpty() || - !(bindStack.getItem() instanceof ItemBind bind) - ) { + if (bindStack.isEmpty() || !BindModeHelper.isBindItem(bindStack)) { return false; } // The locked check has been moved to struggle() where decrease is reduced - return bind.canBeStruggledOut(bindStack); + // Check canBeStruggledOut — works for both V1 and V2 via IHasResistance + if (bindStack.getItem() instanceof IHasResistance resistance) { + return resistance.canBeStruggledOut(bindStack); + } + return true; } /** @@ -103,14 +110,13 @@ public class StruggleBinds extends StruggleState { player, BodyRegionV2.ARMS ); - if ( - bindStack.isEmpty() || - !(bindStack.getItem() instanceof ItemBind bind) - ) { - return false; - } + if (bindStack.isEmpty()) return false; - return bind.isLocked(bindStack); + // Works for both V1 (ItemBind) and V2 (DataDrivenBondageItem) via ILockable + if (bindStack.getItem() instanceof ILockable lockable) { + return lockable.isLocked(bindStack); + } + return false; } /** @@ -148,14 +154,18 @@ public class StruggleBinds extends StruggleState { BodyRegionV2.NECK ); - if ( - !collar.isEmpty() && - collar.getItem() instanceof - com.tiedup.remake.items.ItemShockCollar shockCollar - ) { - return shockCollar.notifyStruggle(player, collar); + if (!collar.isEmpty() && CollarHelper.canShock(collar)) { + // V1 shock collar + if (collar.getItem() instanceof com.tiedup.remake.items.ItemShockCollar shockCollar) { + return shockCollar.notifyStruggle(player, collar); + } + // V2 shock collar — notify via IHasResistance if available + if (collar.getItem() instanceof IHasResistance resistance) { + resistance.notifyStruggle(player); + } + return true; } - return true; // No collar, proceed normally + return true; // No shock collar, proceed normally } /** @@ -317,18 +327,23 @@ public class StruggleBinds extends StruggleState { target, BodyRegionV2.ARMS ); - if ( - bindStack.isEmpty() || - !(bindStack.getItem() instanceof ItemBind bind) - ) { + if (bindStack.isEmpty() || !BindModeHelper.isBindItem(bindStack)) { return; } - // Get base resistance from config (BUG-003 fix: was using ModGameRules which - // only knew 4 types and returned hardcoded 100 for the other 10) - int baseResistance = SettingsAccessor.getBindResistance( - bind.getItemName() + // Get base resistance: V2 reads from ResistanceComponent directly, + // V1 reads from SettingsAccessor via item name (BUG-003 fix) + int baseResistance; + ResistanceComponent comp = DataDrivenBondageItem.getComponent( + bindStack, ComponentType.RESISTANCE, ResistanceComponent.class ); + if (comp != null) { + baseResistance = comp.getBaseResistance(); + } else if (bindStack.getItem() instanceof ItemBind bind) { + baseResistance = SettingsAccessor.getBindResistance(bind.getItemName()); + } else { + baseResistance = 100; + } // Set current resistance to base (full restore) setResistanceState(state, baseResistance); diff --git a/src/main/java/com/tiedup/remake/state/struggle/StruggleCollar.java b/src/main/java/com/tiedup/remake/state/struggle/StruggleCollar.java index ec46cad..3432141 100644 --- a/src/main/java/com/tiedup/remake/state/struggle/StruggleCollar.java +++ b/src/main/java/com/tiedup/remake/state/struggle/StruggleCollar.java @@ -2,9 +2,12 @@ package com.tiedup.remake.state.struggle; import com.tiedup.remake.core.SystemMessageManager.MessageCategory; import com.tiedup.remake.core.TiedUpMod; +import com.tiedup.remake.items.base.IHasResistance; +import com.tiedup.remake.items.base.ILockable; import com.tiedup.remake.items.base.ItemCollar; import com.tiedup.remake.state.PlayerBindState; import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.CollarHelper; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -44,19 +47,14 @@ public class StruggleCollar extends StruggleState { @Override protected int getResistanceState(PlayerBindState state) { Player player = state.getPlayer(); - ItemStack collar = V2EquipmentHelper.getInRegion( - player, - BodyRegionV2.NECK - ); + ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); - if ( - collar.isEmpty() || - !(collar.getItem() instanceof ItemCollar collarItem) - ) { - return 0; + if (collar.isEmpty() || !CollarHelper.isCollar(collar)) return 0; + + if (collar.getItem() instanceof IHasResistance resistance) { + return resistance.getCurrentResistance(collar, player); } - - return collarItem.getCurrentResistance(collar, player); + return 0; } /** @@ -68,19 +66,13 @@ public class StruggleCollar extends StruggleState { @Override protected void setResistanceState(PlayerBindState state, int resistance) { Player player = state.getPlayer(); - ItemStack collar = V2EquipmentHelper.getInRegion( - player, - BodyRegionV2.NECK - ); + ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); - if ( - collar.isEmpty() || - !(collar.getItem() instanceof ItemCollar collarItem) - ) { - return; + if (collar.isEmpty() || !CollarHelper.isCollar(collar)) return; + + if (collar.getItem() instanceof IHasResistance resistanceItem) { + resistanceItem.setCurrentResistance(collar, resistance); } - - collarItem.setCurrentResistance(collar, resistance); } /** @@ -104,31 +96,29 @@ public class StruggleCollar extends StruggleState { return false; } - ItemStack collar = V2EquipmentHelper.getInRegion( - player, - BodyRegionV2.NECK - ); + ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); - if ( - collar.isEmpty() || - !(collar.getItem() instanceof ItemCollar collarItem) - ) { + if (collar.isEmpty() || !CollarHelper.isCollar(collar)) { TiedUpMod.LOGGER.debug("[StruggleCollar] No collar equipped"); return false; } - // Check if locked - if (!collarItem.isLocked(collar)) { - TiedUpMod.LOGGER.debug("[StruggleCollar] Collar is not locked"); + // Check if locked (works for V1 and V2 via ILockable) + if (collar.getItem() instanceof ILockable lockable) { + if (!lockable.isLocked(collar)) { + TiedUpMod.LOGGER.debug("[StruggleCollar] Collar is not locked"); + return false; + } + } else { return false; } - // Check if struggle is enabled - if (!collarItem.canBeStruggledOut(collar)) { - TiedUpMod.LOGGER.debug( - "[StruggleCollar] Collar struggle is disabled" - ); - return false; + // Check if struggle is enabled (works for V1 and V2 via IHasResistance) + if (collar.getItem() instanceof IHasResistance resistance) { + if (!resistance.canBeStruggledOut(collar)) { + TiedUpMod.LOGGER.debug("[StruggleCollar] Collar struggle is disabled"); + return false; + } } return true; @@ -141,17 +131,17 @@ public class StruggleCollar extends StruggleState { @Override protected boolean onAttempt(PlayerBindState state) { Player player = state.getPlayer(); - ItemStack collar = V2EquipmentHelper.getInRegion( - player, - BodyRegionV2.NECK - ); + ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); - if ( - !collar.isEmpty() && - collar.getItem() instanceof - com.tiedup.remake.items.ItemShockCollar shockCollar - ) { - return shockCollar.notifyStruggle(player, collar); + if (!collar.isEmpty() && CollarHelper.canShock(collar)) { + // V1 shock collar + if (collar.getItem() instanceof com.tiedup.remake.items.ItemShockCollar shockCollar) { + return shockCollar.notifyStruggle(player, collar); + } + // V2 shock collar — notify via IHasResistance + if (collar.getItem() instanceof IHasResistance resistance) { + resistance.notifyStruggle(player); + } } return true; } @@ -167,31 +157,19 @@ public class StruggleCollar extends StruggleState { @Override protected void successAction(PlayerBindState state) { Player player = state.getPlayer(); - ItemStack collar = V2EquipmentHelper.getInRegion( - player, - BodyRegionV2.NECK - ); + ItemStack collar = V2EquipmentHelper.getInRegion(player, BodyRegionV2.NECK); - if ( - collar.isEmpty() || - !(collar.getItem() instanceof ItemCollar collarItem) - ) { - TiedUpMod.LOGGER.warn( - "[StruggleCollar] successAction called but no collar equipped" - ); + if (collar.isEmpty() || !CollarHelper.isCollar(collar)) { + TiedUpMod.LOGGER.warn("[StruggleCollar] successAction called but no collar equipped"); return; } - // Unlock the collar - collarItem.setLocked(collar, false); + // Unlock the collar (works for V1 and V2 via ILockable) + if (collar.getItem() instanceof ILockable lockable) { + lockable.setLocked(collar, false); + } - TiedUpMod.LOGGER.info( - "[StruggleCollar] {} unlocked their collar!", - player.getName().getString() - ); - - // Note: Collar is NOT removed, just unlocked - // Player can now manually remove it + TiedUpMod.LOGGER.info("[StruggleCollar] {} unlocked their collar!", player.getName().getString()); } @Override @@ -230,30 +208,27 @@ public class StruggleCollar extends StruggleState { return; } - ItemStack collar = V2EquipmentHelper.getInRegion( - target, - BodyRegionV2.NECK - ); + ItemStack collar = V2EquipmentHelper.getInRegion(target, BodyRegionV2.NECK); - if ( - collar.isEmpty() || - !(collar.getItem() instanceof ItemCollar collarItem) - ) { + if (collar.isEmpty() || !CollarHelper.isCollar(collar)) { TiedUpMod.LOGGER.debug("[StruggleCollar] No collar to tighten"); return; } - // Check if collar is locked - if (!collarItem.isLocked(collar)) { - TiedUpMod.LOGGER.debug( - "[StruggleCollar] Collar must be locked to tighten" - ); + // Check if collar is locked (V1 and V2 via ILockable) + if (collar.getItem() instanceof ILockable lockable) { + if (!lockable.isLocked(collar)) { + TiedUpMod.LOGGER.debug("[StruggleCollar] Collar must be locked to tighten"); + return; + } + } else { return; } - // Get base resistance from GameRules - int baseResistance = collarItem.getBaseResistance(target); - int currentResistance = collarItem.getCurrentResistance(collar, target); + // Get resistance (V1 and V2 via IHasResistance) + if (!(collar.getItem() instanceof IHasResistance resistanceItem)) return; + int baseResistance = resistanceItem.getBaseResistance(target); + int currentResistance = resistanceItem.getCurrentResistance(collar, target); // Only tighten if current resistance is lower than base if (currentResistance >= baseResistance) { @@ -264,7 +239,7 @@ public class StruggleCollar extends StruggleState { } // Restore to base resistance - collarItem.setCurrentResistance(collar, baseResistance); + resistanceItem.setCurrentResistance(collar, baseResistance); TiedUpMod.LOGGER.info( "[StruggleCollar] {} tightened {}'s collar (resistance {} -> {})",