Dateien nach "src/main/java/de/viper/commandsigns" hochladen

This commit is contained in:
2025-08-16 19:14:53 +00:00
parent a850ed3dc2
commit a064b3f199
2 changed files with 390 additions and 0 deletions

View File

@@ -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<UUID, List<String>> 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> - Command zum Clipboard hinzufügen");
player.sendMessage(ChatColor.YELLOW + "/cmdsign clear - Clipboard löschen");
player.sendMessage(ChatColor.YELLOW + "/cmdsign delete <id> - 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 <command>");
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<String> clipboard = playerClipboard.get(player.getUniqueId());
if (clipboard == null || clipboard.isEmpty()) {
player.sendMessage(ChatColor.RED + "Dein Clipboard ist leer! Nutze /cmdsign add <command>.");
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<String> 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 <ID>");
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<String> 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<String> 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<String> 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<String> 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<String> 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();
}
}

View File

@@ -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<String> 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());
}
});
}
}