From 74e9450a5573774ccb31a7030a23e20cbd9a0e26 Mon Sep 17 00:00:00 2001 From: NotEvil Date: Wed, 15 Apr 2026 03:11:15 +0200 Subject: [PATCH] feat(D-01/E): BuiltInLockComponent for organic items (E2) - New BuiltInLockComponent: blocksUnequip() returns true (permanent lock) - ComponentType: add BUILT_IN_LOCK enum value - 8 organic item JSONs updated (slime, vine, web, tape variants) - DataDrivenBondageItem: add hasBuiltInLock() static helper --- .../component/BuiltInLockComponent.java | 27 +++++++++++++++++++ .../v2/bondage/component/ComponentType.java | 3 ++- .../datadriven/DataDrivenBondageItem.java | 6 +++++ .../assets/tiedup/tiedup_items/duct_tape.json | 3 ++- .../assets/tiedup/tiedup_items/slime.json | 3 ++- .../assets/tiedup/tiedup_items/slime_gag.json | 3 ++- .../assets/tiedup/tiedup_items/tape_gag.json | 3 ++- .../assets/tiedup/tiedup_items/vine_gag.json | 3 ++- .../assets/tiedup/tiedup_items/vine_seed.json | 3 ++- .../assets/tiedup/tiedup_items/web_bind.json | 3 ++- .../assets/tiedup/tiedup_items/web_gag.json | 3 ++- .../data/tiedup/tiedup_items/duct_tape.json | 3 ++- .../data/tiedup/tiedup_items/slime.json | 3 ++- .../data/tiedup/tiedup_items/slime_gag.json | 3 ++- .../data/tiedup/tiedup_items/tape_gag.json | 3 ++- .../data/tiedup/tiedup_items/vine_gag.json | 3 ++- .../data/tiedup/tiedup_items/vine_seed.json | 3 ++- .../data/tiedup/tiedup_items/web_bind.json | 3 ++- .../data/tiedup/tiedup_items/web_gag.json | 3 ++- 19 files changed, 67 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/tiedup/remake/v2/bondage/component/BuiltInLockComponent.java diff --git a/src/main/java/com/tiedup/remake/v2/bondage/component/BuiltInLockComponent.java b/src/main/java/com/tiedup/remake/v2/bondage/component/BuiltInLockComponent.java new file mode 100644 index 0000000..31b1521 --- /dev/null +++ b/src/main/java/com/tiedup/remake/v2/bondage/component/BuiltInLockComponent.java @@ -0,0 +1,27 @@ +package com.tiedup.remake.v2.bondage.component; + +import com.google.gson.JsonObject; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; + +/** + * Component: permanent lock for organic items (slime, vine, web, tape). + * + *

These items cannot have a padlock attached but always require struggle + * to remove — they behave as if permanently locked.

+ * + *

JSON config: {@code "built_in_lock": {}}

+ */ +public class BuiltInLockComponent implements IItemComponent { + + private BuiltInLockComponent() {} + + public static IItemComponent fromJson(JsonObject config) { + return new BuiltInLockComponent(); + } + + @Override + public boolean blocksUnequip(ItemStack stack, LivingEntity entity) { + return true; + } +} diff --git a/src/main/java/com/tiedup/remake/v2/bondage/component/ComponentType.java b/src/main/java/com/tiedup/remake/v2/bondage/component/ComponentType.java index 198159e..b4c616c 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/component/ComponentType.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/component/ComponentType.java @@ -16,7 +16,8 @@ public enum ComponentType { GPS("gps", GpsComponent::fromJson), CHOKING("choking", ChokingComponent::fromJson), ADJUSTABLE("adjustable", AdjustableComponent::fromJson), - OWNERSHIP("ownership", OwnershipComponent::fromJson); + OWNERSHIP("ownership", OwnershipComponent::fromJson), + BUILT_IN_LOCK("built_in_lock", BuiltInLockComponent::fromJson); private final String jsonKey; private final Function factory; diff --git a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java index ef34529..5b1507c 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java @@ -7,6 +7,7 @@ import com.tiedup.remake.v2.bondage.IV2BondageEquipment; import com.tiedup.remake.v2.bondage.TyingInteractionHelper; import com.tiedup.remake.v2.bondage.V2BondageItems; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; +import com.tiedup.remake.v2.bondage.component.BuiltInLockComponent; import com.tiedup.remake.v2.bondage.component.ComponentHolder; import com.tiedup.remake.v2.bondage.component.ComponentType; import com.tiedup.remake.v2.bondage.component.IItemComponent; @@ -436,6 +437,11 @@ public class DataDrivenBondageItem extends AbstractV2BondageItem { ); } + /** Check if the item has a built-in lock (organic items: slime, vine, web, tape). */ + public static boolean hasBuiltInLock(ItemStack stack) { + return getComponent(stack, ComponentType.BUILT_IN_LOCK, BuiltInLockComponent.class) != null; + } + /** * Stack-aware padlock attachment check for data-driven items. * Returns false for organic items (slime, vine, web, tape) that have diff --git a/src/main/resources/assets/tiedup/tiedup_items/duct_tape.json b/src/main/resources/assets/tiedup/tiedup_items/duct_tape.json index 2542047..33f1de4 100644 --- a/src/main/resources/assets/tiedup/tiedup_items/duct_tape.json +++ b/src/main/resources/assets/tiedup/tiedup_items/duct_tape.json @@ -25,6 +25,7 @@ "components": { "resistance": { "id": "tape" - } + }, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/assets/tiedup/tiedup_items/slime.json b/src/main/resources/assets/tiedup/tiedup_items/slime.json index b2f02fa..295c3e0 100644 --- a/src/main/resources/assets/tiedup/tiedup_items/slime.json +++ b/src/main/resources/assets/tiedup/tiedup_items/slime.json @@ -25,6 +25,7 @@ "components": { "resistance": { "id": "slime" - } + }, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/assets/tiedup/tiedup_items/slime_gag.json b/src/main/resources/assets/tiedup/tiedup_items/slime_gag.json index b33a8ae..daa3c31 100644 --- a/src/main/resources/assets/tiedup/tiedup_items/slime_gag.json +++ b/src/main/resources/assets/tiedup/tiedup_items/slime_gag.json @@ -23,6 +23,7 @@ "gagging": { "material": "stuffed" }, - "adjustable": {} + "adjustable": {}, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/assets/tiedup/tiedup_items/tape_gag.json b/src/main/resources/assets/tiedup/tiedup_items/tape_gag.json index b475ad0..0932da9 100644 --- a/src/main/resources/assets/tiedup/tiedup_items/tape_gag.json +++ b/src/main/resources/assets/tiedup/tiedup_items/tape_gag.json @@ -23,6 +23,7 @@ "gagging": { "material": "tape" }, - "adjustable": {} + "adjustable": {}, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/assets/tiedup/tiedup_items/vine_gag.json b/src/main/resources/assets/tiedup/tiedup_items/vine_gag.json index 6076659..2ed6e5d 100644 --- a/src/main/resources/assets/tiedup/tiedup_items/vine_gag.json +++ b/src/main/resources/assets/tiedup/tiedup_items/vine_gag.json @@ -23,6 +23,7 @@ "gagging": { "material": "stuffed" }, - "adjustable": {} + "adjustable": {}, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/assets/tiedup/tiedup_items/vine_seed.json b/src/main/resources/assets/tiedup/tiedup_items/vine_seed.json index e54de28..b99d817 100644 --- a/src/main/resources/assets/tiedup/tiedup_items/vine_seed.json +++ b/src/main/resources/assets/tiedup/tiedup_items/vine_seed.json @@ -25,6 +25,7 @@ "components": { "resistance": { "id": "vine" - } + }, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/assets/tiedup/tiedup_items/web_bind.json b/src/main/resources/assets/tiedup/tiedup_items/web_bind.json index 6e28b72..3885cf6 100644 --- a/src/main/resources/assets/tiedup/tiedup_items/web_bind.json +++ b/src/main/resources/assets/tiedup/tiedup_items/web_bind.json @@ -25,6 +25,7 @@ "components": { "resistance": { "id": "web" - } + }, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/assets/tiedup/tiedup_items/web_gag.json b/src/main/resources/assets/tiedup/tiedup_items/web_gag.json index ef3323a..065bc2e 100644 --- a/src/main/resources/assets/tiedup/tiedup_items/web_gag.json +++ b/src/main/resources/assets/tiedup/tiedup_items/web_gag.json @@ -23,6 +23,7 @@ "gagging": { "material": "stuffed" }, - "adjustable": {} + "adjustable": {}, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/data/tiedup/tiedup_items/duct_tape.json b/src/main/resources/data/tiedup/tiedup_items/duct_tape.json index 2542047..33f1de4 100644 --- a/src/main/resources/data/tiedup/tiedup_items/duct_tape.json +++ b/src/main/resources/data/tiedup/tiedup_items/duct_tape.json @@ -25,6 +25,7 @@ "components": { "resistance": { "id": "tape" - } + }, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/data/tiedup/tiedup_items/slime.json b/src/main/resources/data/tiedup/tiedup_items/slime.json index b2f02fa..295c3e0 100644 --- a/src/main/resources/data/tiedup/tiedup_items/slime.json +++ b/src/main/resources/data/tiedup/tiedup_items/slime.json @@ -25,6 +25,7 @@ "components": { "resistance": { "id": "slime" - } + }, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/data/tiedup/tiedup_items/slime_gag.json b/src/main/resources/data/tiedup/tiedup_items/slime_gag.json index b33a8ae..daa3c31 100644 --- a/src/main/resources/data/tiedup/tiedup_items/slime_gag.json +++ b/src/main/resources/data/tiedup/tiedup_items/slime_gag.json @@ -23,6 +23,7 @@ "gagging": { "material": "stuffed" }, - "adjustable": {} + "adjustable": {}, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/data/tiedup/tiedup_items/tape_gag.json b/src/main/resources/data/tiedup/tiedup_items/tape_gag.json index b475ad0..0932da9 100644 --- a/src/main/resources/data/tiedup/tiedup_items/tape_gag.json +++ b/src/main/resources/data/tiedup/tiedup_items/tape_gag.json @@ -23,6 +23,7 @@ "gagging": { "material": "tape" }, - "adjustable": {} + "adjustable": {}, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/data/tiedup/tiedup_items/vine_gag.json b/src/main/resources/data/tiedup/tiedup_items/vine_gag.json index 6076659..2ed6e5d 100644 --- a/src/main/resources/data/tiedup/tiedup_items/vine_gag.json +++ b/src/main/resources/data/tiedup/tiedup_items/vine_gag.json @@ -23,6 +23,7 @@ "gagging": { "material": "stuffed" }, - "adjustable": {} + "adjustable": {}, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/data/tiedup/tiedup_items/vine_seed.json b/src/main/resources/data/tiedup/tiedup_items/vine_seed.json index e54de28..b99d817 100644 --- a/src/main/resources/data/tiedup/tiedup_items/vine_seed.json +++ b/src/main/resources/data/tiedup/tiedup_items/vine_seed.json @@ -25,6 +25,7 @@ "components": { "resistance": { "id": "vine" - } + }, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/data/tiedup/tiedup_items/web_bind.json b/src/main/resources/data/tiedup/tiedup_items/web_bind.json index 6e28b72..3885cf6 100644 --- a/src/main/resources/data/tiedup/tiedup_items/web_bind.json +++ b/src/main/resources/data/tiedup/tiedup_items/web_bind.json @@ -25,6 +25,7 @@ "components": { "resistance": { "id": "web" - } + }, + "built_in_lock": {} } } \ No newline at end of file diff --git a/src/main/resources/data/tiedup/tiedup_items/web_gag.json b/src/main/resources/data/tiedup/tiedup_items/web_gag.json index ef3323a..065bc2e 100644 --- a/src/main/resources/data/tiedup/tiedup_items/web_gag.json +++ b/src/main/resources/data/tiedup/tiedup_items/web_gag.json @@ -23,6 +23,7 @@ "gagging": { "material": "stuffed" }, - "adjustable": {} + "adjustable": {}, + "built_in_lock": {} } } \ No newline at end of file