Installation
For Server Owners
- BungeeCord Proxy: Put into your folderBungeePlaceholderBridge-Bungee-1.0.0.jarplugins/
- Each Spigot Backend Server:
- Put into your folderBungeePlaceholderBridge-Bukkit-1.0.0.jarplugins/
- Ensure PlaceholderAPI is also installed
- Restart all servers
For Developers (Using the API)
Add the API dependency to your BungeeCord plugin:
Maven:
<repositories>
<repository>
<id>jitpack.io</id>
<url>
https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.github.13502544286</groupId>
<artifactId>BungeePlaceholderBridge</artifactId>
<version>v2.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
Gradle:
dependencies {
compileOnly 'com.github.13502544286.BungeePlaceholderBridge:BungeePlaceholderBridge:2.0.0'
}
API Usage Example
import com.mcplugin.bpb.api.PlaceholderBridge;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class MyPlugin extends Plugin {
public void onPlayerJoin(ProxiedPlayer player) {
PlaceholderBridge bridge = PlaceholderBridge.getInstance();
// Format a string with placeholders
bridge.format("Welcome %player_name%! Your rank is %vault_rank%.", player)
.thenAccept(formatted -> {
player.sendMessage(new TextComponent(formatted));
});
// Format by UUID (async-safe)
bridge.format("Hello %player_name%!", player.getUniqueId())
.thenAccept(formatted -> {
// Do something with the formatted text
});
// Check if text has placeholders before formatting
if (PlaceholderBridge.hasPlaceholders(message)) {
bridge.format(message, player).thenAccept(formatted -> {
// Use formatted message
});
}
}
}
Important: The method returns a . Never call on it from the main thread - this will deadlock the proxy!format()CompletableFuture<String>.join()
Commands
/bpb (BungeeCord only)
Command
Description
Permission
/bpb status Show plugin status (pending requests, cache size) bpb.admin
/bpb cache Show cache information bpb.admin
/bpb cache clear Clear the placeholder cache bpb.admin
/bpb test <text> Test placeholder resolution bpb.admin
/bpb help Show help message bpb.admin
Configuration
Currently, the plugin works out of the box with sensible defaults:
- Cache expiry: 30 seconds (placeholder results are cached per-player to reduce network traffic)
- Request timeout: 5 seconds (requests that don't receive a response in time will return the original text)
These settings may be made configurable in future versions.
Features
- Async by design - Uses to never block the proxy threadCompletableFuture
- Smart caching - Results are cached per-player to minimize Plugin Messaging channel traffic
- Timeout handling - Requests that time out gracefully return the original unformatted text
- Zero-config - Works immediately after installation, no configuration files needed
- Lightweight - Minimal overhead, only processes messages that actually contain placeholders
- PlaceholderAPI compatible - Works with all PlaceholderAPI expansions installed on backend servers
Protocol Details
The plugin uses two Plugin Messaging channels:
Channel
Direction
Purpose
bpb:request Bungee -> Spigot Send placeholder resolution requests
bpb:response Spigot -> Bungee Return resolved placeholder results
Request packet format:
[int] protocol version (1)
[long] request ID MSB
[long] request ID LSB
[long] player UUID MSB
[long] player UUID LSB
[String] text with placeholders
Response packet format:
[int] protocol version (1)
[long] request ID MSB
[long] request ID LSB
[String] resolved text