Skip to content

Instantly share code, notes, and snippets.

@HugoSilvaF
Last active June 9, 2025 12:49
Show Gist options
  • Save HugoSilvaF/e68af1b5f56dc279fe21 to your computer and use it in GitHub Desktop.
Save HugoSilvaF/e68af1b5f56dc279fe21 to your computer and use it in GitHub Desktop.
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
public class ScoreboardScroller {
private final Objective objective;
private final Plugin plugin;
private BukkitRunnable task;
private String originalTitle;
private ChatColor color = ChatColor.WHITE;
private int position = 0;
private long speed = 200L; // Em milissegundos
public ScoreboardScroller(Plugin plugin, Objective objective, String title) {
if (plugin == null) {
throw new IllegalArgumentException("Plugin nao pode ser nulo.");
}
if (objective == null) {
throw new IllegalArgumentException("Objective nao pode ser nulo.");
}
if (!objective.getDisplaySlot().equals(DisplaySlot.SIDEBAR)) {
throw new IllegalArgumentException("Objective deve estar no slot SIDEBAR.");
}
this.plugin = plugin;
this.objective = objective;
this.originalTitle = title;
}
public ScoreboardScroller setColor(ChatColor color) {
this.color = color;
return this;
}
public ScoreboardScroller setSpeed(long speedInMillis) {
this.speed = speedInMillis;
return this;
}
public void start() {
if (task != null) {
// Se ja estiver rodando, nao faz nada.
return;
}
long ticks = speed / 50; // Converte milissegundos para ticks do servidor (1 tick = 50ms)
if (ticks < 1) {
ticks = 1;
}
task = new BukkitRunnable() {
@Override
public void run() {
String animatedTitle = originalTitle + " "; // Adiciona espacos para um efeito de rolagem mais suave
String part1 = animatedTitle.substring(position);
String part2 = animatedTitle.substring(0, position);
String finalTitle = color + part1 + part2;
if (finalTitle.length() > 32) {
finalTitle = finalTitle.substring(0, 32);
}
objective.setDisplayName(finalTitle);
position++;
if (position >= animatedTitle.length()) {
position = 0;
}
}
};
task.runTaskTimer(plugin, 0L, ticks);
}
public void stop() {
if (task != null) {
task.cancel();
task = null;
}
objective.setDisplayName(originalTitle); // Restaura o titulo original
}
}
@HugoSilvaF
Copy link
Author

HugoSilvaF commented Feb 5, 2016

O que é isso?

Esta classe cria um efeito de texto "rolando" (scrolling) no título de uma scoreboard. É um efeito visual para deixar seu servidor com uma aparência mais profissional e dinâmica.

1. Adicionando ao seu Projeto

Primeiramente, copie o código ScoreboardScroller.java acima e adicione-o ao projeto do seu plugin no mesmo pacote do seu código principal, ou em um sub-pacote (ex: meuplugin.utils).

2. Passo a Passo para Usar

Para que a animação funcione, você precisa de uma scoreboard e um objective já criados e exibidos para o jogador. O local mais comum para configurar isso é no método onEnable() da sua classe principal ou em um evento PlayerJoinEvent.

Passo 1: Criar a Scoreboard e o Objective

Antes de usar o ScoreboardScroller, você precisa ter um "objective" no slot SIDEBAR. Se você ainda não tem um, veja como criar:

// Dentro do seu método onEnable() ou de um evento.

// Pega a scoreboard principal do servidor.
// Voce também pode criar uma nova com Bukkit.getScoreboardManager().getNewScoreboard();
Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();

// Verifica se o objective já existe para não dar erro.
Objective objective = scoreboard.getObjective("meu_plugin_obj");
if (objective == null) {
    // Registra um novo objective. "dummy" é o tipo mais comum para isso.
    objective = scoreboard.registerNewObjective("meu_plugin_obj", "dummy");
}

// Define o local de exibição (a barra lateral)
objective.setDisplaySlot(DisplaySlot.SIDEBAR);

Passo 2: Criar e Iniciar a Animação

Agora que você tem o objective, você pode criar uma instância do ScoreboardScroller e iniciar a animação.

// O título que você quer que apareça rolando.
String tituloAnimado = "Seja bem-vindo ao meu Servidor!";

// Cria a instância do Scroller.
// Lembre-se de passar sua classe principal (this), o objective e o título.
ScoreboardScroller scroller = new ScoreboardScroller(this, objective, tituloAnimado);

// Inicia a animação!
scroller.start();

Passo 3: Customização (Opcional)

Você pode customizar a cor e a velocidade da animação usando os métodos disponíveis. A customização deve ser feita antes de chamar o método start().

ScoreboardScroller scroller = new ScoreboardScroller(this, objective, tituloAnimado);

// Define a cor do texto para VERMELHO
scroller.setColor(ChatColor.RED);

// Define a velocidade da animação (200ms = 0.2 segundos por letra)
scroller.setSpeed(200L);

// Agora inicia com as configurações aplicadas
scroller.start();

Passo 4: Parando a Animação

Se você precisar parar a animação (por exemplo, no onDisable() do seu plugin), guarde a instância do scroller em uma variável e chame o método stop().

// Na sua classe principal
private ScoreboardScroller scroller;

// No onEnable()
this.scroller = new ScoreboardScroller(this, objective, "Seu Titulo");
this.scroller.start();

// No onDisable()
if (this.scroller != null) {
    this.scroller.stop();
}

Exemplo Completo (na classe principal do plugin)

Aqui está um exemplo completo de como usar a classe no seu plugin.

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;

public class MeuPlugin extends JavaPlugin {

    private ScoreboardScroller scroller;

    @Override
    public void onEnable() {
        getLogger().info("MeuPlugin foi habilitado!");

        // 1. Configurar a Scoreboard e o Objective
        Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
        Objective objective = scoreboard.getObjective("meu_plugin_obj");
        if (objective == null) {
            objective = scoreboard.registerNewObjective("meu_plugin_obj", "dummy");
        }
        objective.setDisplaySlot(DisplaySlot.SIDEBAR);

        // Adiciona algumas linhas de exemplo na scoreboard
        objective.getScore(Bukkit.getOfflinePlayer(ChatColor.GREEN + "Online:")).setScore(10);
        objective.getScore(Bukkit.getOfflinePlayer(ChatColor.AQUA + "Website:")).setScore(9);
        objective.getScore(Bukkit.getOfflinePlayer("www.meusite.com")).setScore(8);

        // 2. Criar e iniciar o Scroller
        String titulo = "Meu Servidor INCRIVEL!";
        this.scroller = new ScoreboardScroller(this, objective, titulo);
        
        // 3. Customizar (opcional)
        this.scroller.setColor(ChatColor.GOLD);
        this.scroller.setSpeed(250L); // Um pouco mais lento

        // 4. Iniciar!
        this.scroller.start();
    }

    @Override
    public void onDisable() {
        getLogger().info("MeuPlugin foi desabilitado!");
        
        // 5. Parar a animação para não deixar "lixo" para trás
        if (this.scroller != null) {
            this.scroller.stop();
        }
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment