
RedLightGreenLight by Vineurodev
Red Light / Green Light for Paper. A server-wide mode that needs no setup, plus full arenas with lobbies, start and finish lines, play regions and spectator bounds. Build them by clicking blocks. Leaderboards, rewards, config that checks itself. No deps.
Compatibility
Minecraft: Java Edition
Platforms
Tags
Creators
Details
Vineurodev RLGL
Red Light, Green Light — two ways to play, and not a single dependency.
Freeze the entire server with one command, or build proper race arenas with a lobby, a start line, a finish line and bounds players cannot leave. Select them by clicking two blocks. Let a wizard tell you what is still missing.
No database. No Citizens. No WorldGuard. No economy plugin. Everything is YAML you can read, and the plugin argues with you when you get it wrong instead of quietly falling back to a default.
⚠️ Requires Java 25
Paper 26.2 ships Java 25 class files, so this is a hard floor, not a preference — a Java 21 server cannot load it. Check your runtime before you download.
| Server | Paper 26.2+ |
| Java | 25+ |
| Optional | PlaceholderAPI 2.11.6+ |
🟥 Two ways to play
Global mode needs no setup at all. One command enrols every online player, wherever they are standing. Survive to the timer without dying and you win.
/rlgl start global 2m
Arena mode is the full race. Players queue in a lobby, spawn together when the countdown ends, and run for a finish line. A start line stops anyone creeping forward early. A play region teleports anyone who wanders out back inside. Spectator bounds hold the eliminated where you want them.
Two life modes per arena: CONTINUOUS lets the dead respawn and try again,
ONE_LIFE puts them straight into spectator for the rest of the round.
🏗️ Build an arena by clicking blocks
No coordinates to type. Four tools, one per thing you need to define:
/rlgl regionstick myarena
Right-click two blocks, left-click to confirm, and the tool removes itself. Wrong corner? Right-click again before confirming — nothing is written until you do. The arena name lives inside the item, so two tools for two arenas never collide, and block interaction is cancelled while you hold one.
Then let the wizard drive:
/rlgl wizard myarena
A live checklist of every requirement, ticked or crossed, each with a clickable command for the next step. It refreshes itself as you finish steps. Leave it open and work down the list.
/rlgl arena enable refuses an unfinished arena, so players can never join a
course they are unable to complete.
🎯 The rules that make it a game
Two details that are easy to leave out, and change how it plays:
- A reaction window. The light turning red does not kill you for momentum you had already committed to. Configurable, default 1.25 s.
- A green-light idle penalty. Standing still while the light is green costs
health. Without it, the optimal strategy is to never move at all, and the round
is dull. Set the damage to
0and the check stops running entirely.
Light durations are randomised between a floor and a ceiling you set. Get the range backwards and it is repaired with a warning rather than aborting the light cycle mid-round.
🧱 Config that checks itself
Every value is validated when the file is read. Anything unusable is repaired to a known default and named in the console, so a typo is visible on the first restart instead of six weeks later:
[VincergyRLGL] 2 problem(s) found in config.yml:
[VincergyRLGL] - 'arena.default-life-mode' has invalid value 'ONELIFE', using CONTINUOUS instead
[VincergyRLGL] - 'global.max-light-delay-seconds' value '1' is out of range, clamped to 2
Keys you leave out use their defaults, so trimming the file is safe. Values are read once into a snapshot rather than looked up during play — nothing does a string-keyed map lookup on the movement path.
A mid-match /rlgl reload cannot change the rules of a round already running.
🛡️ It will not eat your arenas
Two things this plugin refuses to do:
- Overwrite a coordinate it could not read. If an arena's world is not loaded
when the server starts — routine with world managers that load worlds after
plugins — the stored coordinates are left untouched on disk and load once the
world exists.
/rlgl statuslists which arenas are waiting. Saving never writes nothing over something. - Delete on one command.
/rlgl arena delete myarenadeletes nothing. It shows what would be lost, warns you if players are standing in it, and arms a confirmation valid for 30 seconds. The confirmation is bound to that exact arena name and to you, and is single use — so a stale "yes" can never land on a different arena than the one you were shown.
Arena names are validated before they reach storage, because a name becomes a YAML key: a dot would otherwise nest one arena inside another and quietly corrupt the file.
📊 Statistics and leaderboards
Arena wins, flawless wins, global survivals and deaths, per player.
Statistics are batched and flushed periodically instead of writing the whole file on every kill, and always saved on shutdown. Main-thread file I/O in the middle of a match is not a feature.
With PlaceholderAPI:
%rlgl_arena_wins% %rlgl_current_arena%
%rlgl_arena_flawless_wins% %rlgl_light%
%rlgl_deaths% %rlgl_remaining_time%
%rlgl_top_arena_wins_name_1% %rlgl_top_arena_wins_value_1%
Leaderboards exclude players who never scored, so they are not padded with zeroes, and ties break on name so the order does not shuffle between requests.
🎁 Rewards without an economy dependency
Console commands, run on a win:
arena:
finish:
enabled: true
commands:
- 'give %player% diamond 3'
- 'eco give %player% 500'
Commands are the escape hatch that keeps the plugin dependency-free —
eco give %player% 500 works with whatever economy you already run. Separate
bundles for finishing, for finishing without dying, and for surviving a global
round. Every one ships disabled, so a fresh install pays out nothing until you
say so.
🧩 Modular
Four modules you switch on or off: setup-tools, stats, rewards,
placeholders. A disabled module registers nothing at all — no idle listener left
attached. Turn setup-tools off once your arenas are built and its interact
handler stops running on every block click. Turn rewards off while you are
testing so test runs do not hand out prizes.
/rlgl modules tells you what is actually running.
⚙️ Built for Paper 26.2
Adventure components and boss bars throughout, attribute-based health, registry
material lookups, PluginMeta instead of the deprecated description file. Bukkit
API only — no NMS, no reflection, nothing version-locked.
No deprecated API anywhere, and the build finishes with zero compiler warnings
under -Xlint:all. Nothing is suppressed to get there.
Ships with 119 JUnit tests over the parts that actually branch: the
120 / 90s / 2m30s duration grammar including overflow and malformed input,
arena-name validation including the YAML-path and traversal cases, inclusive block
containment, one-directional finish-line crossing on diagonals and around segment
ends, leaderboard ordering and tie-breaking, light-delay bounds with a seeded
random source, and the delete confirmation's token matching, scoping and expiry —
tested against an injected clock, not a sleep.
No server-mocking framework, deliberately: logic worth testing lives in classes that never touch Bukkit.
📋 Commands and permissions
16 subcommands under /rlgl, including 15 arena operations, every one with its own
permission node, usage line and tab completion. /rlgl help is generated from the
command registry and lists only what the sender can actually run, so nobody is
shown a command they cannot use.
23 permission nodes, each with a description, grouped under rlgl.admin and
rlgl.user. Every subcommand checks its own node, so granting a parent is never
required — hand out rlgl.arena.list on its own if that is all you want.
🌍 Text
Every string a player sees is in messages.yml — 124 keys, each with its
placeholders documented in a comment beside it. Nothing is hardcoded in Java, so
you can reword or translate the whole plugin without touching code.
The plugin ships in English. There is one message file, not a per-language loader: copy it aside, translate the values, and reload. If you need several languages switchable at runtime, this is not that plugin yet.
Good to know
Two honest limitations, so you find them here rather than after buying:
- One arena runs at a time. Starting a different arena stops the current one. Fine for events; not a lobby server with six simultaneous games.
- Module changes need a restart.
/rlgl reloadcovers every other setting in all five YAML files, but enabling a module has to register listeners and commands, so it happens at startup.
Full documentation ships with the plugin: a commands reference, a permissions reference, a key-by-key configuration reference, five feature guides, an FAQ and a troubleshooting guide.

