Double Doors Server

A Bukkit/Spigot plugin that opens mirrored double doors together, with low-latency syncing and optional compatibility handling for common server stacks.

357

Quick challenge

How far can you run before the mobs catch you?

Double Doors Server

Double Doors Server

A Bukkit/Spigot plugin that opens mirrored double doors together, with low-latency syncing and optional compatibility handling for common server stacks.

Features

- 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)

Compatibility

- Supports Minecraft Java Edition `26.1`.

Geyser / Floodgate

- Plugin declares soft-depends on `Geyser-Spigot` and `floodgate`. - A short duplicate-interaction debounce window is used to avoid rapid duplicate toggles on the same block.

LuckPerms

- Works through standard Bukkit permissions, so LuckPerms applies automatically. - Use `doubledoors.use` to allow/deny linked opening behavior.

GriefPrevention

- Plugin declares a soft-depend on `GriefPrevention`. - When present, linked-door interaction is checked against claim build permission before toggling the partner door.

Proxy Setup (Multi-Server)

DoubleDoors includes an optional Velocity proxy plugin for Geyser/Floodgate environments with multiple backend servers.

Proxy Features

- 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

Proxy Installation

1. Download the proxy JAR from the releases page (`doubledoors-proxy-<version>.jar`) 2. Place it in your Velocity `plugins/` directory 3. Restart the proxy 4. A `plugins/DoubleDoors/proxy-config.properties` file will be generated

Proxy Configuration

Edit `plugins/DoubleDoors/proxy-config.properties`:

```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=30 ```

Multi-Proxy Example

For a setup with multiple Velocity proxies reporting to a shared MySQL database:

Proxy 1: ```properties 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=30 ```

Proxy 2: ```properties 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 ```

Commands

- `/doubledoors reload` - reload config - `/doubledoors toggle` - toggle behavior for yourself - `/doubledoors server-toggle` - toggle behavior server-wide

Permissions

- `doubledoors.use` (default: `true`) - `doubledoors.toggle` (default: `true`) - `doubledoors.reload` (default: `op`) - `doubledoors.server-toggle` (default: `op`)

Config

`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`)

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>` in `config.yml` (example: `language: de_DE`) - Custom files are JSON objects of key/value strings and override built-in messages when present.

Build

Requirements:

- Java 25 - Maven

Build command:

```bash mvn -DskipTests package ```

Output jar is generated under `target/`.

License

Licensed under the GNU General Public License v3.0. See `LICENSE`.

ADS