Paper1.21.11Resmi#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.

MinborAIminborai 1 0 0 0
Kaynak kod (ZIP)
Tüm hakları saklıdırSunucuda kullanDeğiştirTicari· Atıf gerekli
src/main/java/com/minborai/skortablosu/SkorTablosu.java
1package com.minborai.skortablosu;
2
3import 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;
22
23import 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;
30
31public final class SkorTablosu extends JavaPlugin implements Listener {
32
33 private static final MiniMessage MM = MiniMessage.miniMessage();
34 private static final DateTimeFormatter CLOCK = DateTimeFormatter.ofPattern("HH:mm");
35 private static final int MAX_LINES = 15;
36
37 private final Set<UUID> hidden = new HashSet<>();
38
39 @Override
40 public void onEnable() {
41 saveDefaultConfig();
42 getServer().getPluginManager().registerEvents(this, this);
43 long period = Math.max(10L, getConfig().getLong("update-ticks", 20));
44 getServer().getScheduler().runTaskTimer(this, () -> Bukkit.getOnlinePlayers().forEach(this::update), 20L, period);
45 }
46
47 @EventHandler
48 public void onJoin(PlayerJoinEvent event) {
49 if (!hidden.contains(event.getPlayer().getUniqueId())) show(event.getPlayer());
50 }
51
52 @EventHandler
53 public void onQuit(PlayerQuitEvent event) {
54 // Oyuncuya özel tablo bellekte kalmasın
55 event.getPlayer().setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
56 }
57
58 private void show(Player player) {
59 Scoreboard board = Bukkit.getScoreboardManager().getNewScoreboard();
60 Objective obj = board.registerNewObjective("mb_sidebar", Criteria.DUMMY, MM.deserialize(getConfig().getString("title", "<bold>MinborAI</bold>")));
61 obj.setDisplaySlot(DisplaySlot.SIDEBAR);
62 // Sağdaki kırmızı sayılar gizlenir (1.20.3+)
63 obj.numberFormat(NumberFormat.blank());
64 player.setScoreboard(board);
65 update(player);
66 }
67
68 private void update(Player player) {
69 Objective obj = player.getScoreboard().getObjective("mb_sidebar");
70 if (obj == null) return;
71 TagResolver tags = TagResolver.resolver(
72 Placeholder.unparsed("player", player.getName()),
73 Placeholder.unparsed("online", String.valueOf(Bukkit.getOnlinePlayers().size())),
74 Placeholder.unparsed("max", String.valueOf(Bukkit.getMaxPlayers())),
75 Placeholder.unparsed("ping", String.valueOf(player.getPing())),
76 Placeholder.unparsed("kills", String.valueOf(player.getStatistic(Statistic.PLAYER_KILLS))),
77 Placeholder.unparsed("deaths", String.valueOf(player.getStatistic(Statistic.DEATHS))),
78 Placeholder.unparsed("world", player.getWorld().getName()),
79 Placeholder.unparsed("level", String.valueOf(player.getLevel())),
80 Placeholder.unparsed("time", LocalTime.now(ZoneId.of(getConfig().getString("timezone", "Europe/Istanbul"))).format(CLOCK)));
81 List<String> lines = getConfig().getStringList("lines");
82 int count = Math.min(lines.size(), MAX_LINES);
83 for (int i = 0; i < count; i++) {
84 Score score = obj.getScore("line" + i);
85 score.setScore(count - i);
86 score.customName(MM.deserialize(lines.get(i), tags));
87 }
88 Scoreboard board = player.getScoreboard();
89 for (int i = count; i < MAX_LINES; i++) board.resetScores("line" + i);
90 }
91
92 @Override
93 public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
94 if (command.getName().equals("sidebarreload")) {
95 reloadConfig();
96 Bukkit.getOnlinePlayers().stream().filter(p -> !hidden.contains(p.getUniqueId())).forEach(this::show);
97 sender.sendMessage(MM.deserialize("<green>Skor tablosu ayarları yeniden yüklendi."));
98 return true;
99 }
100 if (!(sender instanceof Player player)) return true;
101 if (hidden.remove(player.getUniqueId())) {
102 show(player);
103 player.sendMessage(MM.deserialize(getConfig().getString("messages.shown", "<green>Skor tablosu açıldı.")));
104 } else {
105 hidden.add(player.getUniqueId());
106 player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
107 player.sendMessage(MM.deserialize(getConfig().getString("messages.hidden", "<gray>Skor tablosu gizlendi.")));
108 }
109 return true;
110 }
111}
112