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