A gag
gagging (material) + resistance (id: "gag") + adjustable, plus lockable if it can be
padlocked.
Components live in the components{…} object of an item definition. Each one attaches a
behaviour to the worn item: a lock, struggle resistance, a gag, a collar, and so on.
{ "type": "tiedup:bondage_item", "display_name": "Ball Gag", "model": "tiedup:models/gltf/gags/ball_gag.glb", "regions": ["MOUTH"], "components": { "lockable": {}, "resistance": { "id": "gag" }, "gagging": { "material": "ball" }, "adjustable": {} }}| Component | What it does | Status |
|---|---|---|
lockable | Per-item lock resistance (worn-item lock gate is elsewhere) | ✅ Available |
resistance | Struggle resistance from a config preset | ✅ Available |
gagging | Muffles chat by gag material | ✅ Available |
blinding | No-op marker; blackout comes from the EYES region | ❌ Planned |
shock | Shock collar (manual + auto interval) | ✅ Available |
gps | GPS tracking + safe zone | ✅ Available |
choking | Choke collar (air drain) | ⚠️ Partial |
adjustable | Y-offset adjustment slider | ✅ Available |
ownership | Collar registration + owner tooltips | ✅ Available |
built_in_lock | Permanently locked, no padlock | ✅ Available |
lockableStores a per-item lock resistance — how hard a padlock on this item is to break by struggling. Almost every shipped item declares it as an empty object and inherits the global default.
"lockable": {}"lockable": { "lock_resistance": 300 }lock_resistance (int, default 250, clamped ≥ 0) — added to the struggle cost when a
padlock is attached. Shows up on the advanced (F3+H) tooltip.resistanceSets the base struggle resistance for escaping the item. The normal, shipped way is to point
at a named config preset with id — the actual number is then taken from the server config at
runtime, so server owners can retune it.
"resistance": { "id": "gag" }id resolves through the server config’s bind-resistance table. Built-in preset keys you can
reference:
rope chain armbinder wrap straitjacket latex_sackribbon vine web slime tape gagblindfold collarAn id that doesn’t match a configured key falls back to 100 at runtime (no crash). A few item
names are aliased to a shared preset (e.g. shibari → rope, beam_cuffs → chain,
leather_straps/medical_straps/dogbinder → armbinder) — reference the preset key, not
the item name.
gaggingMuffles the wearer’s chat. The real lever is material, which selects a gag profile
(comprehension + how far the muffled text carries).
"gagging": { "material": "ball" }Valid material values (case-insensitive):
cloth ball tape stuffed panel latexring bite sponge baguetteAn unknown material is logged with a WARN and the item falls back to default muffling
(stuffed is the typical heavy gag; ball is a common medium one). The material also drives the
gag tooltip line.
blindingNominally “marks the item as a blindfold” — but the component does nothing functional. The
blackout is driven entirely by the EYES body region, not by this component. You can write it as
an empty marker, but it changes no behaviour:
"blinding": {}Turns a collar into a shock collar. The working lever is auto_interval — the number of ticks
between automatic shocks (20 ticks = 1 second). 0 (the default) means manual-only, triggered
through a controller.
"shock": {}"shock": { "auto_interval": 200 }auto_interval (int, default 0, clamped ≥ 0) — 0 = manual shock only; any positive value
auto-shocks on that cadence. With auto enabled, the tooltip shows the interval in seconds.A real shock collar pairs shock with ownership so the wearer is registered and
the owner can trigger it:
"components": { "ownership": {}, "lockable": {}, "resistance": { "id": "collar" }, "shock": { "auto_interval": 200 }}Tracks the wearer and defines a safe zone.
"gps": { "safe_zone_radius": 50 }safe_zone_radius (int, default 50, clamped ≥ 0) — radius in blocks. 0 = tracking only,
no safe zone. This value works (it drives the safe-zone / GPS-shock logic) and adds a
tooltip line.chokingTurns a collar into a choke collar that drains air. Present it as an empty marker:
"choking": {}adjustableLets the wearer (or owner) nudge the item’s vertical position with an in-GUI slider — useful for gags and blindfolds that need to sit a little higher or lower per body shape.
"adjustable": {}"adjustable": { "default": 0.5 }default (float) — the starting Y-offset used as the fallback before the player adjusts it.
Clamped into the working slider range.ownershipMarks the item as a collar with an owner. This is a real, non-trivial component (omitted from older guides) used by the five shipped collars. On equip it registers the wearer in the collar registry against the NBT owner list; on removal it fires the owner-alert / unregister flow. It also drives the nickname and owner-count tooltip lines.
"ownership": {}It takes no config — just the empty marker. Combine it with the collar capability components:
"components": { "ownership": {}, "lockable": {}, "resistance": { "id": "collar" }, "gps": { "safe_zone_radius": 50 }}built_in_lockThe “permanently locked, no padlock” mechanic for organic restraints — slime, vine, web, tape. Used by eight shipped items. While worn, the item always blocks unequip (it behaves as if locked), and a padlock cannot be attached to it.
"built_in_lock": {}It takes no config. A built_in_lock item should declare "can_attach_padlock": false to match
its behaviour, and typically omits the lockable component (there is no padlock to resist):
{ "type": "tiedup:bondage_item", "display_name": "Web Bind", "model": "tiedup:models/gltf/binds/web_bind.glb", "regions": ["ARMS"], "can_attach_padlock": false, "components": { "resistance": { "id": "web" }, "built_in_lock": {} }}A gag
gagging (material) + resistance (id: "gag") + adjustable, plus lockable if it can be
padlocked.
A collar
ownership + resistance (id: "collar") + a capability: shock, gps, or choking.
An organic bind
resistance + built_in_lock, with can_attach_padlock: false. No lockable.
A blindfold
regions: ["EYES"] does the blackout; add blinding as a marker, adjustable to fine-tune fit.
For the surrounding item fields (regions, pose_priority, can_attach_padlock, icon,
animations…) see The item JSON.