From a064b3f1990c87ad09a55e14e441be8460b90ac0 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Sat, 16 Aug 2025 19:14:53 +0000 Subject: [PATCH] Dateien nach "src/main/java/de/viper/commandsigns" hochladen --- .../commandsigns/CommandSignsPlugin.java | 356 ++++++++++++++++++ .../de/viper/commandsigns/UpdateChecker.java | 34 ++ 2 files changed, 390 insertions(+) create mode 100644 src/main/java/de/viper/commandsigns/CommandSignsPlugin.java create mode 100644 src/main/java/de/viper/commandsigns/UpdateChecker.java diff --git a/src/main/java/de/viper/commandsigns/CommandSignsPlugin.java b/src/main/java/de/viper/commandsigns/CommandSignsPlugin.java new file mode 100644 index 0000000..13df7da --- /dev/null +++ b/src/main/java/de/viper/commandsigns/CommandSignsPlugin.java @@ -0,0 +1,356 @@ +package de.viper.commandsigns; + +import org.bstats.bukkit.Metrics; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.block.Sign; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.*; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class CommandSignsPlugin extends JavaPlugin implements Listener, CommandExecutor, TabCompleter { + + private File configFile; + private YamlConfiguration config; + + private final Map> playerClipboard = new HashMap<>(); + private Metrics metrics; + + // 🔹 UpdateChecker Variablen + private boolean updateAvailable = false; + private String latestVersion = ""; + + @Override + public void onEnable() { + // Config setup + configFile = new File(getDataFolder(), "signs.yml"); + if (!configFile.exists()) { + try { + getDataFolder().mkdirs(); + configFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + config = YamlConfiguration.loadConfiguration(configFile); + + // Commands + Events registrieren + getCommand("cmdsign").setExecutor(this); + getCommand("cmdsign").setTabCompleter(this); + Bukkit.getPluginManager().registerEvents(this, this); + + // bStats + int pluginId = 26933; // <- deine eigene Plugin-ID einsetzen! + metrics = new Metrics(this, pluginId); + + // 🔹 UpdateChecker starten + checkForUpdates(); + + getLogger().info("CommandSignsPlugin geladen!"); + } + + @Override + public void onDisable() { + try { + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + // 🔹 UpdateChecker Funktion + private void checkForUpdates() { + int resourceId = 128039; // deine Spigot Plugin ID + Bukkit.getScheduler().runTaskAsynchronously(this, () -> { + try (InputStream is = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + resourceId).openStream(); + Scanner scann = new Scanner(is)) { + if (scann.hasNext()) { + latestVersion = scann.next(); + String current = this.getDescription().getVersion(); + if (!current.equalsIgnoreCase(latestVersion)) { + updateAvailable = true; + getLogger().warning("Es gibt ein Update! Deine Version: " + current + " | Neueste: " + latestVersion); + } else { + getLogger().info("Du hast die aktuelle Version: " + current); + } + } + } catch (IOException e) { + getLogger().warning("Konnte nicht nach Updates prüfen: " + e.getMessage()); + } + }); + } + + private void saveConfigSafe() { + try { + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private String buildPermissionFromCommand(String command) { + if (command == null || command.isEmpty()) return "commandsigns.use.default"; + String clean = command.toLowerCase().replaceAll("[^a-z0-9]", ""); + if (clean.isEmpty()) clean = "default"; + return "commandsigns.use." + clean; + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + if (!(sender instanceof Player)) { + sender.sendMessage("Nur Spieler können diesen Befehl ausführen."); + return true; + } + Player player = (Player) sender; + + if (args.length == 0) { + player.sendMessage(ChatColor.RED + "Nutze /cmdsign help für die Befehlsübersicht"); + return true; + } + + String sub = args[0].toLowerCase(); + + switch (sub) { + case "help": + player.sendMessage(ChatColor.GOLD + "=== CommandSigns Hilfe ==="); + player.sendMessage(ChatColor.YELLOW + "/cmdsign create [anzeigetext] - Clipboard zu Schild hinzufügen (Admin +commandsigns.create)"); + player.sendMessage(ChatColor.YELLOW + "/cmdsign add - Command zum Clipboard hinzufügen"); + player.sendMessage(ChatColor.YELLOW + "/cmdsign clear - Clipboard löschen"); + player.sendMessage(ChatColor.YELLOW + "/cmdsign delete - CommandSign löschen (Admin)"); + player.sendMessage(ChatColor.YELLOW + "/cmdsign list - Liste aller CommandSigns"); + return true; + + case "add": + if (args.length < 2) { + player.sendMessage(ChatColor.RED + "Nutze: /cmdsign add "); + return true; + } + String commandToAdd = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); + playerClipboard.computeIfAbsent(player.getUniqueId(), k -> new ArrayList<>()).add(commandToAdd); + player.sendMessage(ChatColor.GREEN + "Command zum Clipboard hinzugefügt: " + ChatColor.RESET + commandToAdd); + return true; + + case "clear": + playerClipboard.remove(player.getUniqueId()); + player.sendMessage(ChatColor.GREEN + "Clipboard geleert."); + return true; + + case "create": + if (!player.hasPermission("commandsigns.create")) { + player.sendMessage(ChatColor.RED + "Du hast keine Erlaubnis, ein CommandSign zu erstellen."); + return true; + } + List clipboard = playerClipboard.get(player.getUniqueId()); + if (clipboard == null || clipboard.isEmpty()) { + player.sendMessage(ChatColor.RED + "Dein Clipboard ist leer! Nutze /cmdsign add ."); + return true; + } + Block targetBlock = player.getTargetBlockExact(5); + if (targetBlock == null || !(targetBlock.getState() instanceof Sign)) { + player.sendMessage(ChatColor.RED + "Du musst ein Schild ansehen (max. 5 Blöcke)."); + return true; + } + + String id = UUID.randomUUID().toString(); + String loc = locToString(targetBlock.getLocation()); + + config.set("signs." + id + ".location", loc); + config.set("signs." + id + ".commands", clipboard); + + String firstCmd = clipboard.get(0); + String perm = buildPermissionFromCommand(firstCmd); + config.set("signs." + id + ".permission", perm); + saveConfigSafe(); + + // Anzeige: Entweder Text-Argument oder Command + String displayText; + if (args.length > 1) { + displayText = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); + } else { + displayText = firstCmd; // Fallback = 1. Befehl + } + if (displayText.length() > 15) displayText = displayText.substring(0, 15); + + Sign sign = (Sign) targetBlock.getState(); + sign.setLine(0, ChatColor.GOLD + "[CommandSign]"); + sign.setLine(1, ChatColor.GREEN + displayText); + sign.setLine(2, ""); + sign.setLine(3, ""); + sign.update(); + + playerClipboard.remove(player.getUniqueId()); + player.sendMessage(ChatColor.GREEN + "CommandSign erstellt mit ID: " + id); + player.sendMessage(ChatColor.GRAY + "Permission: " + perm); + return true; + + case "list": + Set signIDs = config.getConfigurationSection("signs") == null ? Collections.emptySet() + : config.getConfigurationSection("signs").getKeys(false); + if (signIDs.isEmpty()) { + player.sendMessage(ChatColor.YELLOW + "Keine CommandSigns gefunden."); + return true; + } + player.sendMessage(ChatColor.GOLD + "CommandSigns:"); + for (String signID : signIDs) { + player.sendMessage(ChatColor.GREEN + signID); + } + return true; + + case "delete": + if (!player.hasPermission("commandsigns.delete")) { + player.sendMessage(ChatColor.RED + "Du hast keine Erlaubnis, CommandSigns zu löschen."); + return true; + } + if (args.length < 2) { + player.sendMessage(ChatColor.RED + "Nutze: /cmdsign delete "); + return true; + } + String deleteID = args[1]; + if (config.get("signs." + deleteID) != null) { + config.set("signs." + deleteID, null); + saveConfigSafe(); + player.sendMessage(ChatColor.GREEN + "CommandSign " + deleteID + " gelöscht."); + } else { + player.sendMessage(ChatColor.RED + "Kein CommandSign mit dieser ID gefunden."); + } + return true; + + default: + player.sendMessage(ChatColor.RED + "Unbekannter Subcommand. Nutze /cmdsign help"); + return true; + } + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + if (args.length == 1) { + return Arrays.asList("help", "add", "clear", "create", "list", "delete").stream() + .filter(s -> s.startsWith(args[0].toLowerCase())) + .collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; + if (!(event.getClickedBlock().getState() instanceof Sign)) return; + + String loc = locToString(event.getClickedBlock().getLocation()); + Set signIDs = config.getConfigurationSection("signs") == null ? Collections.emptySet() + : config.getConfigurationSection("signs").getKeys(false); + + for (String signID : signIDs) { + String signLoc = config.getString("signs." + signID + ".location"); + if (loc.equals(signLoc)) { + String permission = config.getString("signs." + signID + ".permission", "commandsigns.use.default"); + Player player = event.getPlayer(); + if (!player.hasPermission(permission)) { + player.sendMessage(ChatColor.RED + "Du hast keine Berechtigung, dieses CommandSign zu benutzen."); + event.setCancelled(true); + return; + } + event.setCancelled(true); + + List commands = config.getStringList("signs." + signID + ".commands"); + for (String cmd : commands) { + String commandText = cmd.replace("{player}", player.getName()); + Bukkit.dispatchCommand(player, commandText); + } + player.sendMessage(ChatColor.GREEN + "CommandSign ausgeführt."); + return; + } + } + } + + @EventHandler + public void onBlockBreak(BlockBreakEvent event) { + if (!(event.getBlock().getState() instanceof Sign)) return; + Player player = event.getPlayer(); + String loc = locToString(event.getBlock().getLocation()); + Set signIDs = config.getConfigurationSection("signs") == null ? Collections.emptySet() + : config.getConfigurationSection("signs").getKeys(false); + + for (String signID : signIDs) { + String signLoc = config.getString("signs." + signID + ".location"); + if (loc.equals(signLoc)) { + if (!player.isSneaking()) { + player.sendMessage(ChatColor.RED + "Du musst zum Abbau dieses CommandSigns schleichen (Sneaken)."); + event.setCancelled(true); + return; + } + String permission = config.getString("signs." + signID + ".permission", "commandsigns.use.default") + .replace("use", "break"); + if (!player.hasPermission(permission)) { + player.sendMessage(ChatColor.RED + "Du hast keine Berechtigung, dieses CommandSign abzubauen."); + event.setCancelled(true); + return; + } + config.set("signs." + signID, null); + saveConfigSafe(); + player.sendMessage(ChatColor.GREEN + "CommandSign mit ID " + signID + " wurde entfernt."); + return; + } + } + } + + @EventHandler + public void onSignChange(SignChangeEvent event) { + Player player = event.getPlayer(); + Block block = event.getBlock(); + String loc = locToString(block.getLocation()); + + // Spieler darf Schildtext ändern, nur Zeile 0 bleibt reserviert + if (config.getConfigurationSection("signs") != null) { + Set signIDs = config.getConfigurationSection("signs").getKeys(false); + for (String signID : signIDs) { + String signLoc = config.getString("signs." + signID + ".location"); + if (loc.equals(signLoc)) { + if (!event.getLine(0).equalsIgnoreCase(ChatColor.GOLD + "[CommandSign]")) { + event.setLine(0, ChatColor.GOLD + "[CommandSign]"); + } + return; + } + } + } + } + + // 🔹 Admins bei Join über Update informieren + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + if (updateAvailable) { + Player player = event.getPlayer(); + if (player.hasPermission("commandsigns.admin")) { + player.sendMessage(ChatColor.GOLD + "[CommandSigns] " + ChatColor.YELLOW + + "Es gibt ein Update! Deine Version: " + + getDescription().getVersion() + " | Neueste: " + latestVersion); + player.sendMessage(ChatColor.GRAY + "Download: https://www.spigotmc.org/resources/128039/"); + } + } + } + + private String locToString(Location loc) { + return loc.getWorld().getName() + ";" + loc.getBlockX() + ";" + loc.getBlockY() + ";" + loc.getBlockZ(); + } +} diff --git a/src/main/java/de/viper/commandsigns/UpdateChecker.java b/src/main/java/de/viper/commandsigns/UpdateChecker.java new file mode 100644 index 0000000..067452d --- /dev/null +++ b/src/main/java/de/viper/commandsigns/UpdateChecker.java @@ -0,0 +1,34 @@ +package de.viper.commandsigns; + +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Scanner; +import java.util.function.Consumer; + +public class UpdateChecker { + + private final JavaPlugin plugin; + private final int resourceId; + + public UpdateChecker(JavaPlugin plugin, int resourceId) { + this.plugin = plugin; + this.resourceId = resourceId; + } + + public void getVersion(final Consumer consumer) { + Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> { + try (InputStream is = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.resourceId).openStream(); + Scanner scann = new Scanner(is)) { + if (scann.hasNext()) { + consumer.accept(scann.next()); + } + } catch (IOException e) { + plugin.getLogger().info("§cUnable to check for updates: " + e.getMessage()); + } + }); + } +}