Scoreboard API â
La Scoreboard API permite mostrar informaciĂłn en el panel lateral derecho de la pantalla del jugador (el scoreboard de Minecraft Bedrock). Soporta tres modos: estĂĄtico, gestionado por jugador (ScoreboardManager) y auto-actualizable (Live Scoreboard).
Scoreboard estĂĄtico â
El modo mĂĄs simple. CreĂĄs un scoreboard, le ponĂ©s lĂneas y lo enviĂĄs a un jugador.
var sb = scoreboard.create("§6§lMi Servidor");
// Forma recomendada â setLines reemplaza todo el contenido de una vez
sb.setLines([
"§7Jugadores: 5",
"§7Mapa: Lobby",
"",
"§fplay.miservidor.com"
]);
player.sendScoreboard(sb);
player.removeScoreboard();También podés construirlo condicionalmente con push:
var sb = scoreboard.create("§6§lMi Servidor");
var lines = [
"§7Jugadores: " + server.getPlayerCount(),
"§7Modo: " + player.getGameMode()
];
if (player.getGameMode() === "creative") {
lines.push("§bModo creativo activo");
}
lines.push("");
lines.push("§fplay.miservidor.com");
sb.setLines(lines);
player.sendScoreboard(sb);WARNING
Modificar un scoreboard después de enviarlo no actualiza lo que ve el jugador automåticamente. Hay que volver a llamar player.sendScoreboard(sb) o usar el Live Scoreboard.
MĂ©todos del scoreboard â
| Método | Retorna | Descripción |
|---|---|---|
scoreboard.create(titulo) | Scoreboard | Crea un nuevo scoreboard con el tĂtulo dado |
sb.setLines(array) | â | Reemplaza todo el contenido con el array dado. La forma recomendada para contenido dinĂĄmico |
sb.setLine(index, texto) | boolean | Setea el texto en la lĂnea index (0â14). Rellena con lĂneas vacĂas si el Ăndice supera las actuales |
sb.addLine(texto) | boolean | Agrega una lĂnea al final. Retorna false si se superan las 15 lĂneas |
sb.removeLine(index) | boolean | Elimina la lĂnea en el Ăndice dado |
sb.getLines() | string[] | Retorna todas las lĂneas actuales como array |
sb.getLineCount() | number | Cantidad de lĂneas actuales |
sb.getTitle() | string | TĂtulo del scoreboard |
sb.setDescending() | â | Invierte el orden visual de las lĂneas |
sb.isDescending() | boolean | Si estĂĄ en orden descendente |
sb.removePadding() | â | Elimina el padding automĂĄtico de espacios en cada lĂnea |
sb.sendTo(player) | â | Atajo: envĂa este scoreboard al jugador dado |
MĂ©todos en el jugador â
| Método | Descripción |
|---|---|
player.sendScoreboard(sb) | EnvĂa el scoreboard al jugador |
player.removeScoreboard() | Quita el scoreboard de la pantalla del jugador |
ScoreboardManager â
El ScoreboardManager gestiona quĂ© scoreboard tiene asignado cada jugador. Es ideal cuando tenĂ©s mĂșltiples jugadores con distintos scoreboards o querĂ©s saber en cualquier momento quĂ© estĂĄ viendo cada uno.
Cada plugin tiene su propio manager aislado â scoreboard.getManager() siempre retorna el mismo manager para ese plugin.
var mgr = scoreboard.getManager();
events.on("PlayerJoin", function(event) {
var player = event.getPlayer();
var sb = scoreboard.create("§6Mi Servidor");
sb.setLine(0, "§7Bienvenido, §f" + player.getName());
sb.setLine(1, "§7Jugadores: §f" + server.getPlayerCount());
mgr.set(player, sb);
});
events.on("PlayerQuit", function(event) {
mgr.remove(event.getPlayer());
});MĂ©todos del ScoreboardManager â
| Método | Retorna | Descripción |
|---|---|---|
scoreboard.getManager() | ScoreboardManager | Retorna el manager del plugin |
mgr.set(player, sb) | boolean | Asigna el scoreboard al jugador y lo envĂa inmediatamente |
mgr.remove(player) | â | Quita el scoreboard asignado al jugador y lo elimina de su pantalla |
mgr.get(player) | Scoreboard | null | Retorna el scoreboardWrapper activo del jugador, o null si no tiene |
mgr.hasScoreboard(player) | boolean | true si el jugador tiene un scoreboard asignado |
mgr.getAssignedCount() | number | Cantidad de jugadores con scoreboard asignado |
mgr.clearAll() | â | Quita el registro de todos los jugadores del manager |
Live Scoreboard â
El Live Scoreboard se auto-actualiza automĂĄticamente en un intervalo definido. En cada tick, el callback recibe un scoreboard limpio para que el plugin llene las lĂneas, y luego lo reenvĂa a todos los jugadores asignados.
var live = scoreboard.createLive("§aMi Servidor", function(sb, player) {
var lines = [
"§7Jugador: §f" + player.getName(),
"§7Vida: §c" + Math.floor(player.getHealth()) + "§7/§c" + Math.floor(player.getMaxHealth()),
"§7Coords: §b" + Math.floor(player.getX()) + " §7/ §b" + Math.floor(player.getY()) + " §7/ §b" + Math.floor(player.getZ()),
""
];
var gm = player.getGameMode();
if (gm === "creative") {
lines.push("§bModo: §3Creativo");
lines.push("§7Vuelo: " + (player.isFlying() ? "§aActivo" : "§cInactivo"));
} else if (gm === "survival") {
lines.push("§aModo: §2Supervivencia");
lines.push("§7Exp: §a" + player.getExperienceLevel() + " §7niveles");
} else {
lines.push("§7Modo: §f" + gm);
}
lines.push("");
lines.push("§7play.miservidor.com");
sb.setLines(lines);
}, 2000); // actualiza cada 2 segundos
events.on("PlayerJoin", function(event) {
live.addPlayer(event.getPlayer());
});
events.on("PlayerQuit", function(event) {
live.removePlayer(event.getPlayer());
});
function onDisable() {
live.stop(); // detener el ticker al cerrar el plugin
}TIP
El intervalo mĂnimo es 50ms. Para HUDs con coordenadas fluidas se recomienda 100ms. Para scoreboards de lobby estĂĄticos, 1000â5000ms es suficiente.
WARNING
El callback del live recibe (sb, playerData) â el scoreboard y un objeto con getters precalculados (getName, getHealth, getX, getGameMode, etc.). Se llama una vez por cada jugador registrado en el live. No usar server.getPlayers() desde dentro del callback â causarĂĄ un deadlock de transacciĂłn y un panic en el servidor.
MĂ©todos del Live Scoreboard â
| Método | Retorna | Descripción |
|---|---|---|
scoreboard.createLive(titulo, fn, intervalMs) | LiveScoreboard | Crea y arranca un live scoreboard |
live.addPlayer(player) | boolean | Agrega el jugador â empezarĂĄ a recibir updates automĂĄticos |
live.removePlayer(player) | boolean | Saca al jugador del live y le quita el scoreboard |
live.hasPlayer(player) | boolean | true si el jugador estĂĄ recibiendo updates |
live.getPlayerCount() | number | Cantidad de jugadores en el live |
live.clearPlayers() | â | Saca a todos los jugadores sin detener el live |
live.stop() | â | Detiene el auto-update y quita el scoreboard a todos los jugadores |
Ejemplo completo â
Plugin de lobby con scoreboard en tiempo real para todos los jugadores:
config.setDefaults({
"titulo": "§6§lMi Servidor",
"intervalo": 2000
});
var live;
function onEnable() {
var titulo = config.getString("titulo", "§6§lMi Servidor");
var intervalo = config.getInt("intervalo", 2000);
live = scoreboard.createLive(titulo, function(sb) {
var hora = new Date().toLocaleTimeString();
sb.setLine(0, "§7Jugadores: §f" + server.getPlayerCount() + "§7/§f" + server.getMaxPlayers());
sb.setLine(1, "§7Hora: §f" + hora);
sb.setLine(2, "");
sb.setLine(3, "§7play.miservidor.com");
}, intervalo);
// Agregar jugadores que ya estén conectados
var players = server.getPlayers();
for (var i = 0; i < players.length; i++) {
live.addPlayer(players[i]);
}
events.on("PlayerJoin", function(event) {
live.addPlayer(event.getPlayer());
});
events.on("PlayerQuit", function(event) {
live.removePlayer(event.getPlayer());
});
}
function onDisable() {
if (live) live.stop();
config.save();
}
module = { onEnable: onEnable, onDisable: onDisable };