Paper1.21.11Official#scoreboard#arayüz#sunucu
Skor Tablosu
Kişiye özel yan skor tablosu: çevrimiçi, ping, öldürme/ölüm, dünya, saat. Satırlar config'den (MiniMessage), /sidebar ile aç/kapat.
Tüm hakları saklıdırUse on serverModifyCommercial· Attribution
src/main/java/com/minborai/skortablosu/SkorTablosu.java
1package com.minborai.skortablosu;23import io.papermc.paper.scoreboard.numbers.NumberFormat;4import net.kyori.adventure.text.minimessage.MiniMessage;5import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;6import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;7import org.bukkit.Bukkit;8import org.bukkit.Statistic;9import org.bukkit.command.Command;10import org.bukkit.command.CommandSender;11import org.bukkit.entity.Player;12import org.bukkit.event.EventHandler;13import org.bukkit.event.Listener;14import org.bukkit.event.player.PlayerJoinEvent;15import org.bukkit.event.player.PlayerQuitEvent;16import org.bukkit.plugin.java.JavaPlugin;17import org.bukkit.scoreboard.Criteria;18import org.bukkit.scoreboard.DisplaySlot;19import org.bukkit.scoreboard.Objective;20import org.bukkit.scoreboard.Score;21import org.bukkit.scoreboard.Scoreboard;2223import java.time.LocalTime;24import java.time.ZoneId;25import java.time.format.DateTimeFormatter;26import java.util.HashSet;27import java.util.List;28import java.util.Set;29import java.util.UUID;3031public final class SkorTablosu extends JavaPlugin implements Listener {3233private static final MiniMessage MM = MiniMessage.miniMessage();34private static final DateTimeFormatter CLOCK = DateTimeFormatter.ofPattern("HH:mm");35private static final int MAX_LINES = 15;3637private final Set<UUID> hidden = new HashSet<>();3839@Override40public void onEnable() {41saveDefaultConfig();42getServer().getPluginManager().registerEvents(this, this);43long period = Math.max(10L, getConfig().getLong("update-ticks", 20));44getServer().getScheduler().runTaskTimer(this, () -> Bukkit.getOnlinePlayers().forEach(this::update), 20L, period);45}4647@EventHandler48public void onJoin(PlayerJoinEvent event) {49if (!hidden.contains(event.getPlayer().getUniqueId())) show(event.getPlayer());50}5152@EventHandler53public void onQuit(PlayerQuitEvent event) {54// Oyuncuya özel tablo bellekte kalmasın55event.getPlayer().setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());56}5758private void show(Player player) {59Scoreboard board = Bukkit.getScoreboardManager().getNewScoreboard();60Objective obj = board.registerNewObjective("mb_sidebar", Criteria.DUMMY, MM.deserialize(getConfig().getString("title", "<bold>MinborAI</bold>")));61obj.setDisplaySlot(DisplaySlot.SIDEBAR);62// Sağdaki kırmızı sayılar gizlenir (1.20.3+)63obj.numberFormat(NumberFormat.blank());64player.setScoreboard(board);65update(player);66}6768private void update(Player player) {69Objective obj = player.getScoreboard().getObjective("mb_sidebar");70if (obj == null) return;71TagResolver tags = TagResolver.resolver(72Placeholder.unparsed("player", player.getName()),73Placeholder.unparsed("online", String.valueOf(Bukkit.getOnlinePlayers().size())),74Placeholder.unparsed("max", String.valueOf(Bukkit.getMaxPlayers())),75Placeholder.unparsed("ping", String.valueOf(player.getPing())),76Placeholder.unparsed("kills", String.valueOf(player.getStatistic(Statistic.PLAYER_KILLS))),77Placeholder.unparsed("deaths", String.valueOf(player.getStatistic(Statistic.DEATHS))),78Placeholder.unparsed("world", player.getWorld().getName()),79Placeholder.unparsed("level", String.valueOf(player.getLevel())),80Placeholder.unparsed("time", LocalTime.now(ZoneId.of(getConfig().getString("timezone", "Europe/Istanbul"))).format(CLOCK)));81List<String> lines = getConfig().getStringList("lines");82int count = Math.min(lines.size(), MAX_LINES);83for (int i = 0; i < count; i++) {84Score score = obj.getScore("line" + i);85score.setScore(count - i);86score.customName(MM.deserialize(lines.get(i), tags));87}88Scoreboard board = player.getScoreboard();89for (int i = count; i < MAX_LINES; i++) board.resetScores("line" + i);90}9192@Override93public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {94if (command.getName().equals("sidebarreload")) {95reloadConfig();96Bukkit.getOnlinePlayers().stream().filter(p -> !hidden.contains(p.getUniqueId())).forEach(this::show);97sender.sendMessage(MM.deserialize("<green>Skor tablosu ayarları yeniden yüklendi."));98return true;99}100if (!(sender instanceof Player player)) return true;101if (hidden.remove(player.getUniqueId())) {102show(player);103player.sendMessage(MM.deserialize(getConfig().getString("messages.shown", "<green>Skor tablosu açıldı.")));104} else {105hidden.add(player.getUniqueId());106player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());107player.sendMessage(MM.deserialize(getConfig().getString("messages.hidden", "<gray>Skor tablosu gizlendi.")));108}109return true;110}111}112