Dateien nach "src/main/java/de/viper/commandsigns" hochladen
This commit is contained in:
356
src/main/java/de/viper/commandsigns/CommandSignsPlugin.java
Normal file
356
src/main/java/de/viper/commandsigns/CommandSignsPlugin.java
Normal 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();
|
||||
}
|
||||
}
|
34
src/main/java/de/viper/commandsigns/UpdateChecker.java
Normal file
34
src/main/java/de/viper/commandsigns/UpdateChecker.java
Normal 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());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user