MC-ELMA Rope is a Fabric mod for Minecraft 1.21.10 that turns the vanilla lead into a server-authoritative player rope system. It is built for multiplayer survival servers that want controllable tying, rescue, escape, anchor, and smooth pulling mechanics without replacing vanilla leash behavior.
The mod can run on a dedicated server as the authority for gameplay and physics. Installing it on the client is optional and enables the lightweight rope visual renderer.
- Bind another player with a vanilla lead after a timed 3 second action.
- Pull the tied player with smooth velocity-based rope physics instead of teleport correction.
- Keep rope physics one-way: the tied player cannot pull the controller.
- Tie a carried player to configured anchor blocks such as fences, walls, chains, iron bars, lightning rods, end rods, and bells.
- Release anchored ropes automatically when their anchor block is broken.
- Release ropes manually with timed actions and return a lead when appropriate.
- Allow configurable third-party rescue actions for unbound players.
- Give tied players a difficult, low-chance self-escape attempt.
- Let a rope slip free at a configurable low chance when the holder takes damage, with optional damage type allow/deny filters.
- Render active ropes on clients that also install the mod, with smoothed endpoint interpolation, configurable sag, and a vanilla-like braided rope look by default.
- Keep optional rope visual sync cheap by avoiding active-link processing while no ropes exist and reusing per-world snapshots during sync.
- Protect selected players and optionally disable binding near spawn.
- Optionally persist rope state across restart and restore it when endpoint players rejoin.
- Return a lead to the controller when a held player-player target disconnects, while keeping anchored targets tied through reconnect and orderly server restart when configured.
- Apply configurable reconnect penalties to discourage disconnect abuse.
- Log rope lifecycle events for moderation when enabled.
- Keep all core state server-side and tick only active rope links.
- Ship Fabric GameTest smoke coverage for config reload, manager, disconnect penalty, lifecycle, performance, persistence, physics, and timed action invariants.
- Minecraft 1.21.10
- Fabric Loader 0.18.4 or newer
- Fabric API 0.138.4+1.21.10 or newer
- Java 21
Install the jar on the server to enable gameplay and physics. Install the same jar on clients when rope visuals are desired.
The first server launch creates:
config/mc_elma_rope.json
Use a lead on another player and keep the interaction conditions valid until the action completes. Survival and adventure players consume one lead when the rope is created. Creative players can create ropes without item consumption.
The controller can release the rope with an empty main hand after the configured release duration. If the rope was created by consuming a lead, manual release refunds one lead to the releasing player.
When enabled, another unbound player can rescue the tied player with a slower timed release. The tied player cannot release other players' ropes and cannot bind another player while tied.
A tied player can attempt a self-escape with an empty main hand. By default the attempt needs 45 seconds of progress inside a 60 second attempt window and succeeds at 1 in 300. The cooldown starts when the attempt starts. Completed failures are stored on the rope; after 60 completed failures, the next completed attempt succeeds. Canceled attempts do not increase this counter.
The attempt pauses while the holder is within 12 blocks and cancels on excess
movement, damage, or an item entering the main hand. A taut player-player rope
blocks the attempt. A taut anchored rope remains escapable but progresses at
x0.15 speed by default.
Automatic cleanup from death, spectator mode, dimension mismatch, anchor break, or admin clear does not refund leads. Disconnect cleanup can optionally return one lead to the controller when a held player-player target disconnects from a lead-created rope.
When an anchored target disconnects, the rope is saved as an offline anchored rope by default. If the player rejoins in the anchor world and the anchor block is still valid, they are tied back to the same anchor. This does not refund a lead, and the normal reconnect penalty still applies.
If disconnect cleanup happens before Fabric's connection callback, the active anchor rope is still moved to offline state. If a portal or multiworld login temporarily places the player in another dimension, the record is retained and retried once per second instead of being discarded.
During an orderly server shutdown, active anchored ropes are also captured into the same offline anchor state. This keeps anchored players tied after the server starts again without enabling restart persistence for ordinary player-player ropes.
By default, a tied target who disconnects is marked for a reconnect penalty. When they return, they receive 2 minutes of Mining Fatigue I and Slowness I. Server owners can disable this, change effect levels, change duration, or disable persistence of pending penalties.
Admin commands are intended for testing, moderation, and emergency cleanup.
/mcelmarope anchor <player> <x> <y> <z> <length>
/mcelmarope bind <playerA> <playerB> <length>
/mcelmarope clear <player|all>
/mcelmarope clearall
/mcelmarope status <player>
/mcelmarope inspect <player>
/mcelmarope list
/mcelmarope config
/mcelmarope physics show <player|anchor|all>
/mcelmarope physics preset <player|anchor> <soft|balanced|strict>
/mcelmarope physics set <player|anchor> <stiffness|pull_speed|emergency_stretch|emergency_pull_speed|swing_damping> <value>
/mcelmarope physics apply <player|anchor|all>
/mcelmarope physics save <player|anchor|all>
/mcelmarope physics rollback <player|anchor|all>
/mcelmarope reload
preset and set only stage values. apply makes staged values live without
reconnecting ropes. save persists the currently applied profile atomically
and creates config/mc_elma_rope.json.bak. rollback restores the last saved
profile. /mcelmarope reload discards unsaved changes.
Important defaults:
maxRopeLength:48.0defaultPlayerRopeLength:12.0anchorRopeLength:12.0bindDurationTicks:60controllerReleaseDurationTicks:60thirdPartyReleaseDurationTicks:240enableThirdPartyRelease:trueenableSelfEscape:trueselfEscapeDurationTicks:900selfEscapeCooldownTicks:1200selfEscapeSuccessDenominator:300selfEscapeAttemptWindowTicks:1200selfEscapeGuaranteedAfterFailures:60selfEscapeGuardProgressMultiplier:0.0playerSelfEscapeTautProgressMultiplier:0.0anchorSelfEscapeTautProgressMultiplier:0.15enableHolderDamageDrop:trueholderDamageDropDenominator:100holderDamageDropAllowedDamageTypeIds:[]holderDamageDropDeniedDamageTypeIds:[]playerPhysics: independent player-player physics profileanchorPhysics: independent player-anchor physics profilecommandPermissionLevel:2maxActiveLinks:256maxHeldDurationTicks:0(0means disabled)spawnProtectionRadius:0.0protectedPlayerNames:[]protectedPlayerIds:[]logRopeEvents:truepersistRopes:falsepersistAnchoredRopesOnDisconnect:truerefundLeadToControllerOnTargetDisconnect:trueenableDisconnectPenalty:truepersistDisconnectPenalties:truedisconnectPenaltyOnlyLeadCreatedRopes:truedisconnectPenaltyDurationTicks:2400disconnectPenaltyMiningFatigueLevel:1disconnectPenaltySlownessLevel:1disconnectPenaltyShowParticles:truedisconnectPenaltyShowIcon:trueenableActionFeedbackEffects:trueenableActionFeedbackSounds:trueropeVisualEnabled:trueropeVisualSegments:20ropeVisualSag:0.045ropeVisualStyle:vanilla_like(vanilla_like,layered_lines)ropeVisualWidthPreset:balanced
Anchor entries support block ids and block tags:
[
"#minecraft:fences",
"#minecraft:fence_gates",
"#minecraft:walls",
"minecraft:iron_chain",
"minecraft:chain",
"minecraft:iron_bars",
"minecraft:lightning_rod",
"minecraft:end_rod",
"minecraft:bell"
]Use /mcelmarope reload after editing the config.
Each physics profile uses this structure:
{
"preset": "balanced",
"stiffness": 0.35,
"pullSpeed": 0.45,
"emergencyStretchMultiplier": 2.5,
"emergencyPullSpeed": 0.8,
"swingDamping": 0.985
}Safe hot-edit ranges are: stiffness 0.0-1.0, pull_speed 0.0-1.5,
emergency_stretch 1.0-5.0, emergency_pull_speed 0.0-2.0, and
swing_damping 0.90-1.0. Editing one field changes that profile to custom.
When persistRopes is enabled, rope state is saved into the world folder as
mc_elma_rope_state.json. Player-player ropes restore only after the required
players are online again. Normal held player-player disconnect cleanup during
gameplay still removes active ropes.
When persistDisconnectPenalties is enabled, pending reconnect penalties are
saved into the world folder as mc_elma_rope_disconnect_penalties.json.
When persistAnchoredRopesOnDisconnect is enabled, anchored disconnect state is
saved into the world folder as mc_elma_rope_anchored_offline.json. This file
also stores active anchored ropes during an orderly server shutdown.
Runtime state files and saved physics config use atomic replacement and keep a
.bak recovery file. Do not edit .tmp files; they are incomplete writes and
are cleaned on the next successful save.
MC-ELMA Rope does not override the vanilla leash system and does not depend on Create, Create Aeronautics, Sable, NeoForge, or any client optimization mod.
The MVP uses no mixins and no custom rope entity. It is designed to avoid conflicts with optimization-heavy Fabric modpacks. Server gameplay works without the optional client renderer.
- Rope state persistence is opt-in and disabled by default.
- The visual renderer is procedural and intentionally lightweight; it imitates vanilla leash visuals without making players vanilla leashable entities.
- GameTest coverage is currently smoke-level; full multiplayer gameplay validation still belongs in the MC-ELMA test server protocol.
See TESTING_PROTOCOL.md for the dedicated server and gameplay validation checklist.
JDK 21 is required. Use the included Gradle wrapper:
./gradlew buildSuccessful builds verify the release jar metadata and copy the remapped mod jar into the workspace release folder:
fabric-mod-dev/release/mc_elma_rope-0.9.0-rc.1.jar
All Rights Reserved. This repository is public/source-visible for transparency and official distribution preparation, but it is not open-source licensed.