A Bukkit/Spigot plugin that opens mirrored double doors together, with low-latency syncing and optional compatibility handling for common server stacks.
- Same-tick partner door sync (no scheduled 1-tick delay)
- Strict mirrored pair matching for doors:
- same door type
- same facing direction
- opposite hinge
- side-by-side only
- Optional recursive opening support for non-door openables (fence gates/trapdoors)
- Per-player toggle:
/doubledoors toggle - LuckPerms-friendly permission nodes
- GriefPrevention compatibility check for linked-door claim access
- Duplicate interaction debounce (helps packet duplication patterns seen with some Bedrock/Geyser flows)
- Translation support via JSON language files (built-in + custom)
- Supports Minecraft Java Edition
1.21.xand26.1.x.
- Plugin declares soft-depends on
Geyser-Spigotandfloodgate. - A short duplicate-interaction debounce window is used to avoid rapid duplicate toggles on the same block.
- Works through standard Bukkit permissions, so LuckPerms applies automatically.
- Use
doubledoors.useto allow/deny linked opening behavior.
- Plugin declares a soft-depend on
GriefPrevention. - When present, linked-door interaction is checked against claim build permission before toggling the partner door.
- Folia is supported with region-aware scheduling for delayed block updates and shared-state access.
DoubleDoors includes an optional Velocity proxy plugin for Geyser/Floodgate environments with multiple backend servers.
- Shared SQL heartbeat/presence tracking across multiple proxies
- Automatic detection of Geyser/Floodgate clients
- Support for SQLite and MySQL databases
- Connection pooling via HikariCP for efficient SQL resource usage
- Download the proxy JAR from the releases page (
doubledoors-proxy-<version>.jar) - Place it in your Velocity
plugins/directory - Restart the proxy
- A
plugins/DoubleDoors/proxy-config.propertiesfile will be generated
Edit plugins/DoubleDoors/proxy-config.properties:
# Enable SQL heartbeat reporting (requires Geyser/Floodgate on this proxy)
sql.enabled=false
# JDBC URL for the shared database
# SQLite example: jdbc:sqlite:plugins/DoubleDoors/doubledoors.db
# MySQL example: jdbc:mysql://localhost:3306/doubledoors
sql.jdbcUrl=jdbc:sqlite:plugins/DoubleDoors/doubledoors.db
# SQL authentication (leave blank for SQLite)
sql.username=
sql.password=
# Unique proxy identifier (for multi-proxy setups)
sql.proxyId=velocity-main
# Heartbeat interval in seconds (minimum 5 seconds)
sql.heartbeatSeconds=30For a setup with multiple Velocity proxies reporting to a shared MySQL database:
Proxy 1:
sql.enabled=true
sql.jdbcUrl=jdbc:mysql://db.example.com:3306/doubledoors
sql.username=dd_user
sql.password=dd_pass
sql.proxyId=velocity-us
sql.heartbeatSeconds=30Proxy 2:
sql.enabled=true
sql.jdbcUrl=jdbc:mysql://db.example.com:3306/doubledoors
sql.username=dd_user
sql.password=dd_pass
sql.proxyId=velocity-eu
sql.heartbeatSeconds=30/doubledoors reload- reload config/doubledoors toggle- toggle behavior for yourself/doubledoors knock-volume <0-1>- set personal knock sound volume/doubledoors server-toggle- toggle behavior server-wide
doubledoors.use(default:true)doubledoors.knock.volume(default:true)doubledoors.toggle(default:true)doubledoors.reload(default:op)doubledoors.server-toggle(default:op)
src/main/resources/config.yml
enableRecursiveOpening(default:true)recursiveOpeningMaxBlocksDistance(default:10)enableDoors(default:true)enableFenceGates(default:true)enableTrapdoors(default:true)enableVillagerLinkedDoors(default:true)serverWideEnabled(default:true)language(default:en_US)
- Built-in update checks are controlled by
updateChecker.enabledinconfig.yml. - If a standalone
PluginUpdaterplugin is installed, DoubleDoors automatically disables its own built-in checks to avoid duplicate notifications. - Startup logs explicitly state whether update checks are:
- enabled via DoubleDoors built-in updater,
- disabled by config,
- or delegated to standalone
PluginUpdater.
- When delegating to standalone
PluginUpdater, configure that plugin to include DoubleDoors update notifications.
Troubleshooting:
- If you do not receive update notifications, first check startup logs to see which updater path is active.
- If built-in checks are active, verify
updateChecker.enabledand related notify/schedule settings. - If checks are delegated, verify standalone
PluginUpdaterconfiguration and permissions for who should receive update notices.
Language files:
- Built-in fallback file:
src/main/resources/lang/en_US.json - Runtime custom language folder:
plugins/DoubleDoors/lang/ - Set active language with
language: <code>inconfig.yml(example:language: de_DE) - Custom files are JSON objects of key/value strings and override built-in messages when present.
Requirements:
- Java 25+
- Maven
Build command:
mvn -DskipTests packageOutput jar is generated under target/.
Licensed under the GNU General Public License v3.0.
See LICENSE.