diff --git a/src/main/java/de/nexuslobby/modules/ItemsModule.java b/src/main/java/de/nexuslobby/modules/ItemsModule.java new file mode 100644 index 0000000..87e4d2e --- /dev/null +++ b/src/main/java/de/nexuslobby/modules/ItemsModule.java @@ -0,0 +1,30 @@ +package de.nexuslobby.modules; + +import de.nexuslobby.api.Module; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.event.Listener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ItemStack; + +public class ItemsModule implements Module, Listener { + + @Override + public String getName() { + return "Items"; + } + + @Override + public void onEnable() { + Bukkit.getPluginManager().registerEvents(this, Bukkit.getPluginManager().getPlugin("NexusLobby")); + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + event.getPlayer().getInventory().addItem(new ItemStack(Material.COMPASS)); + } + + @Override + public void onDisable() {} +} diff --git a/src/main/java/de/nexuslobby/modules/ProtectionModule.java b/src/main/java/de/nexuslobby/modules/ProtectionModule.java new file mode 100644 index 0000000..42d4ef9 --- /dev/null +++ b/src/main/java/de/nexuslobby/modules/ProtectionModule.java @@ -0,0 +1,94 @@ +package de.nexuslobby.modules; + +import de.nexuslobby.NexusLobby; +import de.nexuslobby.api.Module; +import de.nexuslobby.commands.BuildCommand; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +public class ProtectionModule implements Module, Listener { + + private FileConfiguration getSettings() { + return NexusLobby.getInstance().getLobbySettingsModule().getSettingsConfig(); + } + + @Override + public String getName() { return "Protection"; } + + @Override + public void onEnable() { + Bukkit.getPluginManager().registerEvents(this, NexusLobby.getInstance()); + } + + @Override + public void onDisable() {} + + @EventHandler + public void onBlockBreak(BlockBreakEvent event) { + Player player = event.getPlayer(); + if (BuildCommand.isInBuildMode(player)) return; + + if (!getSettings().getBoolean("allowBlockBreaking", false)) { + event.setCancelled(true); + } + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent event) { + Player player = event.getPlayer(); + if (BuildCommand.isInBuildMode(player)) return; + + if (!getSettings().getBoolean("allowBlockPlacing", false)) { + event.setCancelled(true); + } + } + + @EventHandler + public void onInteract(PlayerInteractEvent event) { + Player player = event.getPlayer(); + if (BuildCommand.isInBuildMode(player)) return; + + if (!getSettings().getBoolean("allowBlockInteracting", true)) { + event.setCancelled(true); + } + } + + @EventHandler + public void onPvp(EntityDamageByEntityEvent event) { + if (event.getDamager() instanceof Player && event.getEntity() instanceof Player) { + if (!getSettings().getBoolean("allowPvp", false)) { + event.setCancelled(true); + } + } + } + + @EventHandler + public void onDrop(PlayerDropItemEvent event) { + if (BuildCommand.isInBuildMode(event.getPlayer())) return; + + if (!getSettings().getBoolean("allowItemDropping", false)) { + event.setCancelled(true); + } + } + + @EventHandler + public void onPickup(EntityPickupItemEvent event) { + if (event.getEntity() instanceof Player) { + Player player = (Player) event.getEntity(); + if (BuildCommand.isInBuildMode(player)) return; + + if (!getSettings().getBoolean("allowItemPickup", false)) { + event.setCancelled(true); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/de/nexuslobby/modules/ScoreboardModule.java b/src/main/java/de/nexuslobby/modules/ScoreboardModule.java new file mode 100644 index 0000000..a1acc7d --- /dev/null +++ b/src/main/java/de/nexuslobby/modules/ScoreboardModule.java @@ -0,0 +1,139 @@ +package de.nexuslobby.modules; + +import de.nexuslobby.NexusLobby; +import de.nexuslobby.api.Module; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scoreboard.*; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public class ScoreboardModule implements Module { + + private final NexusLobby plugin = NexusLobby.getInstance(); + + // Speicher für die aktuellen Spieler-Einstellungen (bis zum Restart/Reload) + private final Set hiddenPlayers = new HashSet<>(); + private final Set adminModePlayers = new HashSet<>(); + + @Override + public String getName() { + return "Scoreboard"; + } + + @Override + public void onEnable() { + FileConfiguration vConfig = plugin.getVisualsConfig(); + if (!vConfig.getBoolean("scoreboard.enabled", true)) return; + + new BukkitRunnable() { + @Override + public void run() { + for (Player player : Bukkit.getOnlinePlayers()) { + updateSidebar(player); + } + } + }.runTaskTimer(plugin, 0L, vConfig.getLong("scoreboard.update_ticks", 20L)); + } + + private void updateSidebar(Player player) { + // 1. Prüfen, ob der Spieler das Scoreboard ausgeblendet hat + if (hiddenPlayers.contains(player.getUniqueId())) { + if (player.getScoreboard() != Bukkit.getScoreboardManager().getMainScoreboard()) { + player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard()); + } + return; + } + + FileConfiguration vConfig = plugin.getVisualsConfig(); + Scoreboard board = player.getScoreboard(); + + if (board == Bukkit.getScoreboardManager().getMainScoreboard()) { + board = Bukkit.getScoreboardManager().getNewScoreboard(); + player.setScoreboard(board); + } + + Objective obj = board.getObjective("lobby"); + if (obj == null) { + obj = board.registerNewObjective("lobby", "dummy", "title"); + obj.setDisplaySlot(DisplaySlot.SIDEBAR); + } + + // 2. Pfad-Logik basierend auf dem Modus (/nexus sb admin/spieler) + String configPath = "scoreboard.default"; + + // Wenn im Admin-Modus UND Rechte vorhanden -> owner Sektion + if (adminModePlayers.contains(player.getUniqueId()) && player.hasPermission("nexuslobby.scoreboard.admin")) { + configPath = "scoreboard.owner"; + } else { + // Standardmäßig default nutzen + configPath = "scoreboard.default"; + } + + String title = vConfig.getString(configPath + ".title", "&6&lNexusLobby"); + obj.setDisplayName(translate(player, title)); + + List lines = vConfig.getStringList(configPath + ".lines"); + + // Scores zurücksetzen um Duplikate zu vermeiden + board.getEntries().forEach(board::resetScores); + + for (int i = 0; i < lines.size(); i++) { + String line = translate(player, lines.get(i)); + + // Verhindert das Verschwinden leerer Zeilen + if (line.isEmpty() || line.trim().isEmpty()) { + line = "" + ChatColor.values()[i] + ChatColor.RESET; + } + + Score score = obj.getScore(line); + score.setScore(lines.size() - i); + } + } + + // --- Methoden für den /nexus sb Befehl --- + + public void setVisibility(Player player, boolean visible) { + if (visible) { + hiddenPlayers.remove(player.getUniqueId()); + player.sendMessage("§7[§6Nexus§7] §aScoreboard eingeschaltet."); + } else { + hiddenPlayers.add(player.getUniqueId()); + player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard()); + player.sendMessage("§7[§6Nexus§7] §cScoreboard ausgeschaltet."); + } + } + + public void setAdminMode(Player player, boolean admin) { + if (admin) { + adminModePlayers.add(player.getUniqueId()); + player.sendMessage("§7[§6Nexus§7] §eModus: §cAdmin-Scoreboard §7(Owner-Sektion)"); + } else { + adminModePlayers.remove(player.getUniqueId()); + player.sendMessage("§7[§6Nexus§7] §eModus: §6Spieler-Scoreboard §7(Default-Sektion)"); + } + // Sofortiges Update erzwingen + updateSidebar(player); + } + + private String translate(Player player, String text) { + String translated = PlaceholderAPI.setPlaceholders(player, text); + return ChatColor.translateAlternateColorCodes('&', translated); + } + + @Override + public void onDisable() { + for (Player player : Bukkit.getOnlinePlayers()) { + player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard()); + } + hiddenPlayers.clear(); + adminModePlayers.clear(); + } +} \ No newline at end of file