+0

Creación de un Scoreboard y manipulación de Teams de Minecraft Spigot



Vamos a ver como manipular el Scoreboard (texto que se muestra a la derecha de la pantalla), y como gestionar equipos de Minecraft.

Scoreboard

Un Scoreboard es como una pantalla de texto que podemos añadir al servidor, a la derecha del todo de la pantalla. Podemos hacer que el texto sea dinámico, que se mueva, que cambie dependiendo del minijuego, cualquier cosa que se os ocurra.

Ejemplo de Scoreboard en Minecraft

Ejemplo de Scoreboard en Minecraft

Para ello necesitaremos tocar temas complejos de Minecraft, como los scoreboards, los objectives y los teams.

Empezaremos obteniendo el ScoreboardManager con un método estático de la clase Bukkit y llamaremos al método getNewScoreboard para crear un nuevo Scoreboard, que guardaremos en una nueva variable. A continuación, con este scoreboard, llamaremos el método registerNewObjective pasándole un título que le queramos poner (no tiene importancia), le pasamos el Criteria DUMMY, y como último un componente que servirá como título que se muestre arriba del todo, y lo guardaremos una variable objective. A esta variable objective le pondremos el display slot como sidebar.

Para añadir texto dentro, usaremos el método getScore del objetivo que hemos creado, le pondremos el texto que queramos que se muestre en pantalla, y luego con el método setScore le pondremos un número dependiendo del order. Si queremos que el texto se vea de arriba a abajo, tendremos que poner los números decrecientes.

Para terminar, llamaremos al método setScoreboard de cualquier jugador, y le pasaremos el scoreboard que hemos creado anteriormente.

Scoreboard scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();  
Objective objective = scoreboard.registerNewObjective(  
        "board",   
        Criteria.DUMMY,   
        Component.text("Título del scoreboard")  
);  
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
 
objective.getScore("Probando").setScore(3);  
objective.getScore(" ").setScore(2);  
objective.getScore("Web: polv.dev").setScore(1);  
  
player.setScoreboard(scoreboard);

Si entramos dentro del juego, veremos que aparece nuestro scoreboard 😁

Scoreboard dinámico

Si queremos cambiar una línea del scoreboard de manera dinámica, hemos de usar Teams.

Primero de todo registraremos un nuevo equipo en nuestro scoreboard, guardado en una variable, con el método registerNewTeam. A este equipo, le daremos un nombre (no tiene mucha importancia), y le pondremos un ID con addEntry. Luego, para el texto que se mostrará, podemos poner un prefijo y un sufijo. Lo que recomiendo es que la parte dinámica la separes en uno de los dos. Finalmente, lo añadiremos al objective que habíamos guardado anteriormente.

Team team = scoreboard.registerNewTeam("sampleTeam");  
team.addEntry("count");  
team.prefix(Component.text("Contador: "));  
team.suffix(Component.text("0"));  
objective.getScore("count").setScore(4);

Si ahora queremos hacer que el contador suba cada vez que el jugador se agacha, tenemos que guardar en Team (por ejemplo, en un HashMap), y actualizaremos el sufijo con el nuevo número.

private final HashMap<UUID, Integer> counter = new HashMap<>();  
  
@EventHandler  
public void onPlayerJoin(PlayerJoinEvent event) {  
    Player player = event.getPlayer();  
  
    Scoreboard scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();  
  
    Objective objective = scoreboard.registerNewObjective(  
            "board",  
            Criteria.DUMMY,  
            Component.text("Título del scoreboard")  
    );  
    objective.setDisplaySlot(DisplaySlot.SIDEBAR);  
  
    objective.getScore("Probando").setScore(3);  
    objective.getScore(" ").setScore(2);  
    objective.getScore("Web: polv.dev").setScore(1);  
  
    Team team = scoreboard.registerNewTeam("shift");  
    team.addEntry("count");  
    team.prefix(Component.text("Contador: "));  
    team.suffix(Component.text("0"));  
    objective.getScore("count").setScore(4);  
  
    player.setScoreboard(scoreboard);  
      
    counter.put(player.getUniqueId(), 0);  
}  
  
@EventHandler  
public void onPlayerSneak(PlayerToggleSneakEvent event) {  
    Player player = event.getPlayer();  
  
    if (event.isSneaking()) {  
        int count = counter.get(player.getUniqueId())+1;  
        counter.put(player.getUniqueId(), count);  
          
        player.getScoreboard().getTeam("shift").suffix(Component.text(count));  
    }  
}