Repository navigation
WIKI
Welcome to the comprehensive technical documentation and operator handbook for L-Dungeons. This guide provides an in-depth reference for configuration options, architectural designs, server clustering, and administrative workflows.
- Overview & Core Architecture
- Installation & Requirements
- Runic Portal Network
- Ancient Dungeons & Gameplay Mechanics
- Proxy & Multi-Server Architecture
- Zero-Lag Asynchronous Logging System
- Custom 3D Models & Plugin Hooks
- Anonymous Metrics (bStats)
- Commands & Permissions Reference
- Configuration Guide (
config.yml) - Frequently Asked Questions & Troubleshooting
L-Dungeons is engineered for high-performance production Minecraft networks, targeting Paper, Purpur, and Folia (1.21.x+).
-
Regional Threading Abstraction: L-Dungeons does not rely on legacy Bukkit schedulers. It utilizes a unified
SchedulerManagerabstraction that detects Folia at runtime and delegates tasks toRegionScheduler,GlobalRegionScheduler, orAsyncScheduler. -
Asynchronous Teleportation: All portal transits and dungeon entries invoke
player.teleportAsync(). Chunk loading never blocks the server main thread. -
Dual-Language Parity: Native support for English (
en) and Turkish (tr). All user-facing strings are formatted using Adventure MiniMessage with RGB color gradients and click/hover events.
- Java: Java 21 LTS or newer.
- Server Platform: Paper, Purpur, or Folia 1.21.x+.
-
Database:
- SQLite: Recommended for single-server (Standalone) environments (automatically generated).
- MySQL / MariaDB: Recommended for multi-server proxy networks (requires HikariCP pooling).
- Download
L-Dungeons-1.0.0-SNAPSHOT.jarand place it into your server'splugins/directory. - Start and stop the server once to generate default configuration files and language templates.
- Open
plugins/L-Dungeons/config.ymlto specify your operational server mode (STANDALONEorSURVIVAL). - Restart your server.
Runic Portals are resonant physical gateways that link two locations across identical or separate worlds.
flowchart LR
A["Runic Portal (Tag: 'MiningOutpost')"] <--->|Bidirectional Resonance| B["Runic Portal (Tag: 'MiningOutpost')"]
- When a portal structure is placed, the owner designates a Tag (default:
default). - When exactly two portals in the network share an identical tag, an energetic resonance is established, triggering purple/cyan vortex particles and ambient audio.
- If three or more portals share the same tag, the network flags a
CONFLICTstate and locks all linked gates to prevent teleport loops.
To maintain healthy survival economies and prevent players from instantly teleporting raw mined wealth directly into base vaults:
-
Restricted Materials:
RAW_IRON,RAW_COPPER,RAW_GOLD,ANCIENT_DEBRIS,IRON_INGOT,GOLD_INGOT,COPPER_INGOT,NETHERITE_INGOT,NETHERITE_SCRAP. - When an explorer attempts to cross a portal while carrying restricted materials, passage is rejected: the player is pushed back with velocity, and a warning title appears on screen.
-
Bypass Permission: Players or VIPs with
ldungeons.bypass.orecan carry ores freely.
- Portal Settings GUI: Right-clicking an owned portal opens a control pane allowing the owner to modify tags via chat prompt or safely dismantle the portal.
-
Portal Directory GUI (
/portal list): A paginated administrative directory displaying portal owners, coordinates, tags, and status (CONNECTED,WAITING,CONFLICT). Offers one-click teleportation, tag inspection, and remote deletion (Shift + Right-Click).
Ancient Dungeons are instanced, procedural challenge chambers where players unlock entrance gates, fight hostile sentinels, mine scrap piles, and collect rewards.
- L-Dungeons constructs procedural dungeons using a grid layout.
- The
ProceduralDungeonBuilderalgorithm ensures rooms are systematically connected by enclosed corridors, guaranteeing no doorway opens into the void. - The default layout generates 16 interconnected chambers (
rooms-count: 16), supporting both procedural layouts and schematic files (generation-mode: AUTO).
- Administrators can place permanent dungeon entrance gates in survival worlds using
/ldungeons dungeon spawn-entrance <tier>. -
Per-Player Dynamic Hologram:
- A player who has not unlocked the gate sees:
[Locked - Requires Tier X Key]. - Right-clicking the gate while holding an Ancient Key of matching tier unlocks the passage and consumes the key.
- The hologram dynamically transforms into
[Unlocked - Right-Click to Enter]solely for that player. Other players continue to see the gate as locked.
- A player who has not unlocked the gate sees:
-
Evil Piles (Spawner Monuments):
- Dark spawner structures that continually summon dungeon sentinels.
- Display a dynamic boss bar reflecting remaining health. Once damaged and destroyed by players, mob spawning terminates.
-
Muddy Scrap Piles:
- Ancient mineral blocks embedded in dungeon corridors.
- Requires pickaxe hits to break down, dropping valuable scrap metal upon total destruction.
-
Anti-Grief Structure Fortification:
- All ancient stone walls and floors inside dungeons are protected against breaking and building (
ldungeons.bypass.buildcan bypass).
- All ancient stone walls and floors inside dungeons are protected against breaking and building (
-
Automated Lifecycle Reset:
- Once all explorers exit the dungeon, an automatic countdown initiates (
reset-timeout-seconds: 300). - After timeout expiry, the dungeon resets: mobs and loot are regenerated, and the overworld entrance gate returns to Locked for all players.
- Once all explorers exit the dungeon, an automatic countdown initiates (
For large networks where dungeon instances must not impact overworld tick rates, L-Dungeons provides native BungeeCord and Velocity clustering.
flowchart TD
subgraph Proxy Network
Proxy[BungeeCord / Velocity]
end
subgraph Survival Node
Surv["Survival Server (SURVIVAL Mode)"]
Gate["Dungeon Entrance Gate"]
end
subgraph Central Database
DB[("MariaDB / MySQL (HikariCP)")]
end
subgraph Dedicated Dungeon Nodes
Node1["Dungeon Node 1 (DUNGEON_NODE)"]
Node2["Dungeon Node 2 (DUNGEON_NODE)"]
end
Surv -->|Generate NBT Ticket & Nonce| DB
Surv -->|Forward Player| Proxy
Proxy -->|Route Player| Node1
Node1 -->|Validate & Consume Single-Use Ticket| DB
Node1 -->|Restore 100% Lossless Inventory & Stats| Node1
| Mode | Purpose |
|---|---|
STANDALONE |
Operates an instanced dungeons_world locally on a single server. No proxy required. |
SURVIVAL |
Hosts survival worlds and entrance gates. Forwards players to dedicated dungeon nodes. |
DUNGEON_NODE |
Dedicated worker server hosting and executing dungeon instances in isolation. |
L-Dungeons delivers built-in cross-server player synchronization without external dependencies:
- When a player steps into an entrance gate on the
SURVIVALserver, the plugin serializes:- 36 Inventory slots
- 4 Armor slots
- Offhand slot
- Ender chest inventory
- Health and maximum health
- Food and saturation levels
- Total experience points and levels
- Active potion effects with durations and amplifiers
- The payload is encoded into Base64 and stored in the central database alongside a single-use cryptographic ticket (
TransferTicket) andsync_nonce. - The player is transferred via proxy plugin messaging. Upon arrival at the target dungeon node, the ticket is verified and consumed, restoring player state with zero item loss or duplication.
A live graphical administration menu displaying the health and load of the proxy cluster:
- Cluster Beacon: Displays active/offline node counts, total cluster player counts, and active dungeon session metrics.
- Node Cards: Individual server items showing server ID, operating mode, online players, active dungeon sessions, live TPS, and heartbeat timestamps.
-
Cache Lifecycle: Node statuses update every 5 minutes (
status-refresh-interval-minutes: 5) to prevent database strain. - Instant Refresh: Administrators can click the Nether Star button to trigger an immediate live database query.
L-Dungeons features an asynchronous file auditing engine engineered to never block the main thread.
flowchart LR
A["Player Action Event"] -->|O(1) Enqueue| B["ConcurrentLinkedQueue (Memory)"]
B -->|Async Background Task (Every 2s)| C["Disk Writer Thread"]
C -->|Batch Write| D["Daily Log (YYYY-MM-DD.log)"]
C -->|Batch Write| E["Player Log (players/Player.log)"]
-
In-Memory Buffering: Player events are pushed into a thread-safe
ConcurrentLinkedQueuein$O(1)$ time. -
Batched Disk Flushing: A background task flushes pending events in batches every 2 seconds (
flush-interval-seconds: 2). -
Shutdown Persistence: On plugin disable (
onDisable), any remaining queue items are synchronously flushed to ensure zero record loss.
Every event is written to two destinations simultaneously:
-
Daily Network Log:
plugins/L-Dungeons/logs/YYYY-MM-DD.log(Chronological record across the entire server). -
Per-Player Log:
plugins/L-Dungeons/logs/players/PlayerName.log(Consolidated player audit trail).
- Portal Events: Portal placement, tag changes, deletions, and planar crossings.
- Security & Restriction Rejections: Raw ore and metal transit blocks with item types and coordinates.
- Dungeon Entrance & Keys: Ancient key consumptions, gate unlocks, and interior door interactions.
- In-Dungeon Actions: Dungeon entries, safe departures, scrap pile mining, evil spawner destructions, and dungeon clears.
- Security Violations: Unauthorized attempts to place or destroy blocks inside dungeons.
- Rewards: Vault chest openings and loot claimed.
- Proxy Network Transfers: Transfer tickets issued and target verification arrivals.
To prevent disk exhaustion, log files older than 15 days are automatically removed during server startup and daily background cycles (retention-days: 15).
Staff members can review a player's history through an interactive in-game menu:
- Displays player skull, total logged events, and active retention policy.
- Thematic icons for each event type (Barrier for restrictions, Iron Door for dungeon entries, Tripwire Hook for key unlocks, etc.).
- Exact timestamps, world coordinates, and detailed event payloads.
- Refresh button to load newly flushed events from disk instantly.
L-Dungeons integrates with leading Spigot and Paper ecosystem plugins:
Assign custom 3D models and textures to portals, keys, and dungeon blocks:
hooks:
itemsadder:
enabled: true
items:
runic-portal: "ldungeons:runic_portal"
swamp-key: "ldungeons:swamp_key"
scrap-iron: "ldungeons:scrap_iron"
surtling-core: "ldungeons:surtling_core"
blocks:
muddy-scrap-pile: "ldungeons:muddy_scrap_pile"
entities:
evil-pile: "ldungeons:evil_pile"Bind custom MythicMobs identifiers to dungeon room spawn points to feature specialized minibosses and guards.
Leverage FAWE for asynchronous pasting of custom .schem dungeon room templates.
L-Dungeons integrates anonymous usage metrics via bStats (Plugin ID: 34880).
-
Server Operating Mode: Distribution of
STANDALONE,SURVIVAL, andDUNGEON_NODEservers. -
Database Engine: Distribution of
SQLITEvsMYSQLconfigurations. -
Language Selection: Active localization (
trvsen). - Folia Adoption: Percentage of servers utilizing Folia's regional threading.
bStats can be enabled or disabled at any time in config.yml:
bstats:
enabled: true # Set to false to disable all metrics collection| Command | Arguments | Description | Default Permission |
|---|---|---|---|
/ldungeons help |
- | Displays command help index | Everyone |
/ldungeons reload |
- | Reloads configuration, languages, and portals | ldungeons.admin |
/ldungeons portal give |
<player> [amount] |
Grants a Runic Portal item | ldungeons.admin |
/ldungeons portal list |
- | Opens the portal directory GUI | ldungeons.admin |
/ldungeons dungeon spawn-entrance |
<tier> |
Places a permanent dungeon entrance gate | ldungeons.admin |
/ldungeons dungeon enter |
[tier] [variant] |
Teleports directly into a dungeon session | ldungeons.admin |
/ldungeons dungeon leave |
- | Safely departs an active dungeon | Everyone |
/ldungeons key give |
<player> [tier] [amount] |
Grants tiered ancient dungeon keys | ldungeons.admin |
/ldungeons proxy |
[status/gui/list] |
Opens the proxy network monitoring dashboard | ldungeons.admin |
/ldungeons logs |
<player> |
Opens the player action audit GUI | ldungeons.admin |
/portal give |
<player> [amount] |
Shortcut to grant a runic portal | ldungeons.portal.admin |
/portal list |
- | Opens personal portal management GUI | ldungeons.portal.use |
-
ldungeons.admin: Complete access to all administrative commands and GUIs (Default: OP). -
ldungeons.portal.use: Ability to place, tune, and travel through runic portals (Default: Everyone). -
ldungeons.portal.admin: Administrative power to modify or delete any player's portal (Default: OP). -
ldungeons.bypass.ore: Bypasses portal ore transit restrictions (Default: OP). -
ldungeons.bypass.build: Bypasses block-breaking and placing restrictions inside dungeons (Default: OP).
Annotated reference of the core configuration file:
# ========================================================
# L-DUNGEONS CONFIGURATION
# ========================================================
# Language selection: "tr" (Turkish) or "en" (English)
language: "en"
# Database settings (SQLite or MySQL/MariaDB with HikariCP)
database:
type: "SQLITE" # "SQLITE" for single servers, "MYSQL" for proxy networks
file: "data.db"
pool-size: 10
mysql:
host: "127.0.0.1"
port: 3306
database: "ldungeons"
username: "root"
password: ""
use-ssl: false
# Proxy and Multi-Server Network Settings (BungeeCord / Velocity)
proxy:
enabled: false
server-mode: "STANDALONE" # STANDALONE, SURVIVAL, or DUNGEON_NODE
server-id: "survival-1"
dungeon-servers:
- "dungeon-1"
fallback-server: "survival-1"
data-sync:
provider: "NATIVE" # Zero-dependency lossless NBT sync
sync-main-inventory: true
sync-armor: true
sync-offhand: true
sync-enderchest: true
sync-experience: true
sync-health: true
sync-food: true
sync-potion-effects: true
status-refresh-interval-minutes: 5
heartbeat-interval-seconds: 30
# Asynchronous Zero-Lag Player Action Logging
logging:
enabled: true
retention-days: 15
flush-interval-seconds: 2
log-portal: true
log-dungeon: true
log-reward: true
log-proxy: true
log-restrictions: true
# Runic Portal Settings
portal:
particle-effects: true
ambient-sound: true
cooldown-seconds: 3
push-back-force: 0.7
metal-restriction:
enabled: true
blocked-materials:
- RAW_IRON
- RAW_COPPER
- RAW_GOLD
- ANCIENT_DEBRIS
- IRON_INGOT
- GOLD_INGOT
- COPPER_INGOT
- NETHERITE_INGOT
- NETHERITE_SCRAP
# Dungeon World Settings
dungeons:
world-name: "dungeons_world"
grid-offset: 5000
reset-timeout-seconds: 300
generation-mode: "AUTO" # PROCEDURAL, SCHEMATIC, or AUTO
rooms-count: 16
# bStats Anonymous Metrics (Service ID: 34880)
bstats:
enabled: true-
Cause: You are running in
SURVIVALproxy mode without a connected BungeeCord or Velocity proxy routing the player. -
Solution: For single-server testing, set
proxy.enabled: falseandproxy.server-mode: "STANDALONE"inconfig.yml, then execute/ldungeons reload. The dungeon instance will generate locally.
-
Cause: Your inventory contains blocked raw ores (
RAW_IRON,RAW_GOLD, etc.) or ingots. -
Solution: Deposit raw ores into a chest before traversing, or grant yourself the
ldungeons.bypass.orepermission.
- Cause: You need an Ancient Key matching the gate's tier.
-
Solution: Use
/ldungeons key give <player> 1to obtain a Tier 1 Ancient Key, then right-click the gate. Once unlocked, the hologram will dynamically update to "Unlocked" for your player.
-
Solution: No. L-Dungeons is designed with Folia architecture in mind. All scheduling operations run through specialized Folia region schedulers, and world teleportations are performed asynchronously via
player.teleportAsync().