Scoreboard-Konfiguration (YAML-Format / PlaceholderAPI)
scoreboard:
title: "&c&lGRIEFERGAMES &7» &6r/place"
lines:
- "&7&m------------------------"
- "&e⏱ &lCooldown:"
- " &7» &a%rplace_cooldown%"
- ""
- "&e⚡ &lBooster-Zeit:"
- " &7» %rplace_booster_status%"
- ""
- "&e📈 &lFortschritt:"
- " &7» &e%rplace_map_progress%%"
- ""
- "&e🧱 &lDeine Blöcke:"
- " &7» &a%rplace_player_blocks%"
- ""
- "&e🏆 &lPlatzierung:"
- " &7» &d#%rplace_player_rank%"
- "&7&m------------------------"
- "&7play.&6griefergames&7.net"
Java
package net.griefergames.rplace;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scoreboard.*;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class RPlacePlugin extends JavaPlugin implements Listener {
private final Map<UUID, Long> cooldowns = new HashMap<>();
private final Map<UUID, Integer> blocksPlaced = new HashMap<>();
// Cooldown in Millisekunden (Standard: 30000 ms = 30 Sek., Booster: 15000 ms = 15 Sek.)
private long currentCooldownMs = 30000;
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
// Task: Aktualisiert den Cooldown-Timer im Scoreboard jede Sekunde
Bukkit.getScheduler().runTaskTimer(this, () -> {
for (Player player : Bukkit.getOnlinePlayers()) {
if (player.getWorld().getName().equalsIgnoreCase("rplace")) {
updateScoreboard(player);
}
}
}, 0L, 20L);
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
Player player = event.getPlayer();
// Nur in der Event-Welt "rplace" ausführen
if (!player.getWorld().getName().equalsIgnoreCase("rplace")) {
return;
}
UUID uuid = player.getUniqueId();
long currentTime = System.currentTimeMillis();
// Cooldown-Prüfung
if (cooldowns.containsKey(uuid)) {
long timeLeft = (cooldowns.get(uuid) - currentTime) / 1000;
if (timeLeft > 0) {
event.setCancelled(true);
player.sendMessage(ChatColor.RED + "Du musst noch " + timeLeft + " Sekunden warten!");
return;
}
}
// Cooldown setzen & Blockzähler erhöhen
cooldowns.put(uuid, currentTime + currentCooldownMs);
int currentCount = blocksPlaced.getOrDefault(uuid, 0) + 1;
blocksPlaced.put(uuid, currentCount);
player.sendMessage(ChatColor.GREEN + "+1 Block platziert! (Gesamt: " + currentCount + ")");
updateScoreboard(player);
}
@EventHandler
public void onJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
if (player.getWorld().getName().equalsIgnoreCase("rplace")) {
updateScoreboard(player);
}
}
public void updateScoreboard(Player player) {
ScoreboardManager manager = Bukkit.getScoreboardManager();
if (manager == null) return;
Scoreboard board = manager.getNewScoreboard();
Objective objective = board.registerNewObjective("rplace", "dummy");
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
objective.setDisplayName(ChatColor.RED + "" + ChatColor.BOLD + "GRIEFERGAMES " + ChatColor.GRAY + "» " + ChatColor.GOLD + "r/place");
UUID uuid = player.getUniqueId();
long currentTime = System.currentTimeMillis();
long cooldownRemaining = 0;
if (cooldowns.containsKey(uuid)) {
cooldownRemaining = Math.max(0, (cooldowns.get(uuid) - currentTime) / 1000);
}
String cooldownText = (cooldownRemaining > 0)
? ChatColor.RED + "" + cooldownRemaining + " Sek."
: ChatColor.GREEN + "LOS!";
int totalBlocks = blocksPlaced.getOrDefault(uuid, 0);
// Zeilen zusammenbauen
addLine(objective, ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "------------------------", 9);
addLine(objective, ChatColor.YELLOW + "⏱ " + ChatColor.BOLD + "Cooldown:", 8);
addLine(objective, ChatColor.GRAY + "» " + cooldownText, 7);
addLine(objective, ChatColor.RESET + " ", 6);
addLine(objective, ChatColor.YELLOW + "🧱 " + ChatColor.BOLD + "Deine Blöcke:", 5);
addLine(objective, ChatColor.GRAY + "» " + ChatColor.GREEN + totalBlocks, 4);
addLine(objective, ChatColor.RESET + " ", 3);
addLine(objective, ChatColor.YELLOW + "⚡ " + ChatColor.BOLD + "Booster-Zeit:", 2);
addLine(objective, ChatColor.GRAY + "» " + (currentCooldownMs == 15000 ? ChatColor.AQUA + "AKTIV" : ChatColor.RED + "INAKTIV"), 1);
addLine(objective, ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "-----------------------", 0);
player.setScoreboard(board);
}
private void addLine(Objective objective, String text, int score) {
Score line = objective.getScore(text);
line.setScore(score);
}
}
auf Spigotmc gibt es eins das wehr aber für Version
Tested Major MC Versions:
- 1.21
https://www.spigotmc.org/resources/mcplace-the-r-place-experience-in-minecraft.124625