From d1b864c4ec58054918de4dffb896e17bfd725400 Mon Sep 17 00:00:00 2001 From: Adrien Date: Tue, 14 Apr 2026 16:35:05 +0200 Subject: [PATCH] fix(D-01/A): double item consumption + unchecked cast in TyingInteractionHelper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QA-001: add instanceof V2TyingPlayerTask guard before cast to prevent ClassCastException when a V1 TyingPlayerTask was still active QA-002: remove stack.shrink(1) after tying completion — V2TyingPlayerTask .onComplete() already consumes the held item via heldStack.shrink(1) --- .../com/tiedup/remake/v2/bondage/TyingInteractionHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/tiedup/remake/v2/bondage/TyingInteractionHelper.java b/src/main/java/com/tiedup/remake/v2/bondage/TyingInteractionHelper.java index 02e9939..99350de 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/TyingInteractionHelper.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/TyingInteractionHelper.java @@ -85,9 +85,11 @@ public final class TyingInteractionHelper { TyingTask currentTask = playerState.getCurrentTyingTask(); if (currentTask == null + || !(currentTask instanceof V2TyingPlayerTask) || !currentTask.isSameTarget(target) || currentTask.isOutdated() || !ItemStack.matches(currentTask.getBind(), stack)) { + // Start new task (also handles case where existing task is V1 TyingPlayerTask) playerState.setCurrentTyingTask(newTask); newTask.start(); } else { @@ -97,7 +99,7 @@ public final class TyingInteractionHelper { newTask.update(); if (newTask.isStopped()) { - stack.shrink(1); + // Item already consumed by V2TyingPlayerTask.onComplete() — don't shrink again playerState.setCurrentTyingTask(null); TiedUpMod.LOGGER.info("[TyingInteraction] {} tied {}", player.getName().getString(), target.getName().getString()); }