Teammates
Outlines through walls in your team color, names with distance, and an arrow at the screen edge when they're behind you. Set them per round - or for a time window.
VeloBridge.teammates(p, team, "#4ade80", 600)
One jar. Teammate outlines through walls, waypoints, native toasts and countdowns, camera effects, Discord presence, mod hints and proxy-free transfers - for every player using Velo. Everyone else never notices it's there.
The island shrinks in 30 seconds.
Outlines through walls in your team color, names with distance, and an arrow at the screen edge when they're behind you. Set them per round - or for a time window.
VeloBridge.teammates(p, team, "#4ade80", 600)
Markers in the world with a pulsing ring, label and live distance - objectives, beds, the flag. Same id moves it, a timer removes it.
VeloBridge.waypoint(p, "flag", loc, "Flag", "#f4b82e", 0)
Toasts, a big countdown that pops each second, labelled progress bars. Crisp at every GUI scale, no resource pack - and always tagged "From your server".
VeloBridge.countdown(p, "Game starts", 10)
Screen shake for explosions and boss stomps (the view moves, never the aim), colored vignettes and full-screen tints for events.
VeloBridge.shake(p, 0.6, 800)
Your server writes the status friends see on Discord: "In BedWars · Team Red · 2/8". Placeholders in the config, or per player from code.
VeloBridge.presence(p, "In BedWars", "Team Red")
Tell players which mods you don't allow - Wurst, Meteor, Glazed, X-Ray, Baritone and more come as ready lists. Checked on the player's PC, shown as a friendly heads-up. Never enforced, so false positives can't hurt anyone.
forbid-presets: [cheat-clients, often-banned]
Switch specific Velo modules off on your server - Freelook in a hide-and-seek mode, the minimap in UHC. Enforced while they play there, back on when they leave. Players see which modules you turned off.
disabled-modules: [freelook]
Velo tells your server which of its modules are on, live. Instead of banning a whole client, your anti-cheat can react to exactly the module that matters.
@EventHandler VeloModulesChangeEvent
Move players between servers with the 1.20.5+ transfer packet - no proxy. Ask the client its ping to each server and send it to the closest one. Velo warms the target up first, so the switch is faster.
VeloBridge.pings(p, servers).thenAccept(...)
Velo downloads your pack in the background before the prompt even shows, straight into Minecraft's own cache - the pack screen finishes immediately.
precache-packs: [{ id, url, sha1 }]
Velo's floating notes on your server: switch them off, block areas like spawn, or cap how many each player may place.
notes: { max-per-player: 20 }
Anonymous numbers (Velo players online, versions) put your server on the Velo partner radar - the way to get featured in the launcher. No names, opt-out with one line.
stats: true
Put VeloBridge-1.0.0.jar into your plugins/ folder and restart. On a network, install it on every backend server.
Open plugins/VeloBridge/config.yml, set your name and color - that's what players see on everything you send.
server: name: "SkyWars.gg" color: "#5aa9ff"
Run /velobridge reload, then try /velobridge countdown * 5 Test. Every Velo player sees it - nobody else is touched.
Loading…
Add depend: [VeloBridge] (or softdepend) to your plugin.yml and compile against the jar. Every call is safe for players without Velo and safe from any thread - Folia included.
// A round starts: countdown, then a toast and a red pulse. if (VeloBridge.isVelo(player)) { VeloBridge.countdown(player, "Round 2", 5); VeloBridge.progress(player, "capture", "Island capture", 0.4); VeloBridge.toast(player, "Round 2", "The island shrinks in 30 seconds", 6); VeloBridge.vignette(player, "#ff3b3b", 0.5, 1500); VeloBridge.shake(player, 0.4, 600); }
// Show each player their team - outline through walls, names, edge arrows. for (Team team : game.teams()) { for (Player p : team.players()) { VeloBridge.teammates(p, team.players(), team.hexColor(), 0); } } // The objective, for everyone: Bukkit.getOnlinePlayers().forEach(p -> VeloBridge.waypoint(p, "core", coreLocation, "Enemy core", "#e0262e", 0));
// Send the player to the lobby they reach fastest - no proxy. List<String> lobbies = List.of("eu.lobby.gg", "us.lobby.gg", "asia.lobby.gg"); VeloBridge.pings(player, lobbies).thenAccept(ms -> { String best = ms.entrySet().stream() .filter(e -> e.getValue() >= 0) .min(Map.Entry.comparingByValue()) .map(Map.Entry::getKey).orElse(lobbies.get(0)); VeloBridge.transfer(player, best, 25565); });
// React to exactly the Velo module that matters in your mode. @EventHandler public void onModules(VeloModulesChangeEvent e) { if (inHideAndSeek(e.getPlayer()) && e.getActive().contains("freelook")) { VeloBridge.disableModules(e.getPlayer(), List.of("freelook"), "Not in hide & seek"); } } @EventHandler public void onVelo(VeloPlayerJoinEvent e) { getLogger().info(e.getPlayer().getName() + " uses Velo " + e.getVelo().veloVersion()); }
// build.gradle(.kts) - put the jar into libs/ dependencies { compileOnly(files("libs/VeloBridge-1.0.0.jar")) } # plugin.yml softdepend: [VeloBridge]
VeloBridgeMinestom, Velocity, your own server - it's one plugin channel, velo:bridge, with one UTF-8 JSON object per message. Every message has a "t" (type); unknown types and fields are ignored on both sides, so you can always add more.
hello | protocol, Velo version, Minecraft version, active module ids. Sent once on join. |
modules | The active module ids, whenever they change. |
ping_result | nonce, results { "host": ms } (-1 = unreachable). |
welcome | name, color - shown on everything you send. |
toast | title, text, seconds |
countdown | label, seconds |
progress / progress_remove | id, label, value 0-1 |
shake | intensity 0-1, millis |
vignette / tint | color, strength 0-1, millis · effects_clear |
teammates | list [ { uuid, name } ], color, seconds |
waypoint / waypoint_remove | id, x, y, z, label, color, seconds · waypoints_clear |
presence | details, state |
mod_rules | forbid / recommend [ { match: id|modrinth|name, value, label } ], message |
lock_modules | modules [ ids ], reason |
ping | nonce, servers [ "host:port" ] |
precache | packs [ { id (pack UUID), url, sha1 } ] |
preconnect | hosts [ "host:port" ] |
notes | enabled, maxPerPlayer, blocked [ { world, x1, z1, x2, z2 } ] |
// Server → client, raw bytes on velo:bridge (no length prefix) { "t": "toast", "title": "Round 2", "text": "The island shrinks in 30 seconds", "seconds": 6 }
Use these ids in disabled-modules, disableModules(...) and the modules players report.
No. The plugin only ever talks to players who said hello on the Velo channel. Everyone else gets no packets, no messages, nothing.
No - on purpose. Mod hints are checked on the player's own PC and shown as a heads-up; nothing is reported back or enforced, so a wrong match can never cost anyone their account. The only enforced thing is switching off Velo's own modules you listed.
Everything you send carries a "FROM YOUR SERVER" tag in your color, and Velo's own UI never uses it. Players can also hide your mod hints for good.
stats: true?Your server name, software, Minecraft version, players online, how many use Velo and which Velo versions. No player names, UUIDs or IPs of players. Set stats: false and nothing is sent.
Yes. It uses Folia's region and entity schedulers (which Paper and Purpur have too) and falls back to Bukkit's on Spigot. On a network, install it on every backend - transfers work between any servers, with or without a proxy.
Servers on Minecraft 1.20.5 and newer (Java 21+). Players on any Velo version with Bridge support.
Install Bridge, keep stats on, and reach out - partner servers get featured in the Velo launcher.