diff --git a/src/main/java/viper/ButtonControl.java b/src/main/java/viper/ButtonControl.java index 26bd490..99e8a3f 100644 --- a/src/main/java/viper/ButtonControl.java +++ b/src/main/java/viper/ButtonControl.java @@ -1,136 +1,242 @@ -package viper; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.data.Lightable; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.ShapedRecipe; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.plugin.java.JavaPlugin; - -import java.util.List; - -public class ButtonControl extends JavaPlugin { - private ConfigManager configManager; - private DataManager dataManager; - - @Override - public void onEnable() { - configManager = new ConfigManager(this); - dataManager = new DataManager(this); - - getServer().getPluginManager().registerEvents(new ButtonListener(this, configManager, dataManager), this); - - registerRecipes(); - - // Scheduler zum Prüfen der Tageslichtsensoren alle 10 Sekunden (20 Ticks = 1 Sekunde) - getServer().getScheduler().runTaskTimer(this, this::checkDaylightSensors, 0L, 20L * 10); - } - - private void registerRecipes() { - ItemStack controlButton = new ItemStack(Material.STONE_BUTTON); - ItemMeta buttonMeta = controlButton.getItemMeta(); - buttonMeta.setDisplayName("§6Steuer-Button"); - controlButton.setItemMeta(buttonMeta); - - NamespacedKey buttonKey = new NamespacedKey(this, "control_button"); - ShapedRecipe buttonRecipe = new ShapedRecipe(buttonKey, controlButton); - buttonRecipe.shape("123", "456", "789"); - buttonRecipe.setIngredient('2', Material.STONE_BUTTON); - buttonRecipe.setIngredient('5', Material.STONE_BUTTON); - buttonRecipe.setIngredient('8', Material.STONE_BUTTON); - Bukkit.addRecipe(buttonRecipe); - - ItemStack controlDaylight = new ItemStack(Material.DAYLIGHT_DETECTOR); - ItemMeta daylightMeta = controlDaylight.getItemMeta(); - daylightMeta.setDisplayName("§6Steuer-Tageslichtsensor"); - controlDaylight.setItemMeta(daylightMeta); - - NamespacedKey daylightKey = new NamespacedKey(this, "control_daylight"); - ShapedRecipe daylightRecipe = new ShapedRecipe(daylightKey, controlDaylight); - daylightRecipe.shape("123", "456", "789"); - daylightRecipe.setIngredient('2', Material.DAYLIGHT_DETECTOR); - daylightRecipe.setIngredient('5', Material.DAYLIGHT_DETECTOR); - daylightRecipe.setIngredient('8', Material.DAYLIGHT_DETECTOR); - Bukkit.addRecipe(daylightRecipe); - } - - // Prüft alle platzierten Tageslichtsensoren und schaltet Lampen bei Tag aus und bei Nacht an - public void checkDaylightSensors() { - List allControllers = dataManager.getAllPlacedControllers(); - for (String controllerLoc : allControllers) { - String buttonId = dataManager.getButtonIdForPlacedController(controllerLoc); - if (buttonId == null) continue; - - String[] parts = controllerLoc.split(","); - if (parts.length != 4) continue; - - World world = getServer().getWorld(parts[0]); - if (world == null) continue; - - Location loc = new Location(world, - Integer.parseInt(parts[1]), - Integer.parseInt(parts[2]), - Integer.parseInt(parts[3])); - - Block block = loc.getBlock(); - if (block.getType() != Material.DAYLIGHT_DETECTOR) continue; - - long time = loc.getWorld().getTime(); - boolean isDay = time >= 0 && time < 13000; - - List connectedBlocks = dataManager.getConnectedBlocks(buttonId); - if (connectedBlocks == null) continue; - - for (String targetLocStr : connectedBlocks) { - String[] targetParts = targetLocStr.split(","); - if (targetParts.length != 4) continue; - - World targetWorld = getServer().getWorld(targetParts[0]); - if (targetWorld == null) continue; - - Location targetLoc = new Location(targetWorld, - Integer.parseInt(targetParts[1]), - Integer.parseInt(targetParts[2]), - Integer.parseInt(targetParts[3])); - - Block targetBlock = targetLoc.getBlock(); - - if (targetBlock.getType() == Material.REDSTONE_LAMP) { - Lightable lamp = (Lightable) targetBlock.getBlockData(); - lamp.setLit(!isDay); - targetBlock.setBlockData(lamp); - } - } - } - } - - // Befehlsverarbeitung - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (command.getName().equalsIgnoreCase("bc") && args.length > 0 && args[0].equalsIgnoreCase("info")) { - sender.sendMessage("§6[ButtonControl] §7Informationen zum Plugin:"); - sender.sendMessage("§eVersion: §f" + getDescription().getVersion()); - sender.sendMessage("§eErsteller: §fM_Viper"); - sender.sendMessage("§ePlugin: §fButtonControl"); - sender.sendMessage("§eGetestet für Minecraft: §f1.21.5 - 1.21.8"); - sender.sendMessage("§eWeitere Infos: §fTüren & Lampen mit Buttons oder Tageslichtsensoren steuern"); - return true; - } - return false; - } - - public ConfigManager getConfigManager() { - return configManager; - } - - public DataManager getDataManager() { - return dataManager; - } -} +package viper; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.Lightable; +import org.bukkit.block.data.type.NoteBlock; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.Note; +import org.bukkit.Note.Tone; + +import java.util.List; +import java.util.UUID; + +public class ButtonControl extends JavaPlugin { + private ConfigManager configManager; + private DataManager dataManager; + + @Override + public void onEnable() { + configManager = new ConfigManager(this); + dataManager = new DataManager(this); + + // Initialize config with defaults if not present + updateConfigWithDefaults(); + + getServer().getPluginManager().registerEvents(new ButtonListener(this, configManager, dataManager), this); + + registerRecipes(); + + // Scheduler zum Prüfen der Tageslichtsensoren alle 10 Sekunden (20 Ticks = 1 Sekunde) + getServer().getScheduler().runTaskTimer(this, this::checkDaylightSensors, 0L, 20L * 10); + } + + private void updateConfigWithDefaults() { + // Add default note block sound and double note settings if not present + if (!configManager.getConfig().contains("default-note")) { + configManager.getConfig().set("default-note", "PIANO"); + } + if (!configManager.getConfig().contains("double-note-enabled")) { + configManager.getConfig().set("double-note-enabled", true); + } + if (!configManager.getConfig().contains("double-note-delay-ms")) { + configManager.getConfig().set("double-note-delay-ms", 1000); + } + configManager.saveConfig(); + } + + private void registerRecipes() { + ItemStack controlButton = new ItemStack(Material.STONE_BUTTON); + ItemMeta buttonMeta = controlButton.getItemMeta(); + buttonMeta.setDisplayName("§6Steuer-Button"); + controlButton.setItemMeta(buttonMeta); + + NamespacedKey buttonKey = new NamespacedKey(this, "control_button"); + ShapedRecipe buttonRecipe = new ShapedRecipe(buttonKey, controlButton); + buttonRecipe.shape("123", "456", "789"); + buttonRecipe.setIngredient('2', Material.STONE_BUTTON); + buttonRecipe.setIngredient('5', Material.STONE_BUTTON); + buttonRecipe.setIngredient('8', Material.STONE_BUTTON); + Bukkit.addRecipe(buttonRecipe); + + ItemStack controlDaylight = new ItemStack(Material.DAYLIGHT_DETECTOR); + ItemMeta daylightMeta = controlDaylight.getItemMeta(); + daylightMeta.setDisplayName("§6Steuer-Tageslichtsensor"); + controlDaylight.setItemMeta(daylightMeta); + + NamespacedKey daylightKey = new NamespacedKey(this, "control_daylight"); + ShapedRecipe daylightRecipe = new ShapedRecipe(daylightKey, controlDaylight); + daylightRecipe.shape("123", "456", "789"); + daylightRecipe.setIngredient('2', Material.DAYLIGHT_DETECTOR); + daylightRecipe.setIngredient('5', Material.DAYLIGHT_DETECTOR); + daylightRecipe.setIngredient('8', Material.DAYLIGHT_DETECTOR); + Bukkit.addRecipe(daylightRecipe); + + // Recipe for Control Note Block + ItemStack controlNoteBlock = new ItemStack(Material.NOTE_BLOCK); + ItemMeta noteBlockMeta = controlNoteBlock.getItemMeta(); + noteBlockMeta.setDisplayName("§6Steuer-Notenblock"); + controlNoteBlock.setItemMeta(noteBlockMeta); + + NamespacedKey noteBlockKey = new NamespacedKey(this, "control_noteblock"); + ShapedRecipe noteBlockRecipe = new ShapedRecipe(noteBlockKey, controlNoteBlock); + noteBlockRecipe.shape("123", "456", "789"); + noteBlockRecipe.setIngredient('2', Material.NOTE_BLOCK); + noteBlockRecipe.setIngredient('5', Material.NOTE_BLOCK); + noteBlockRecipe.setIngredient('8', Material.NOTE_BLOCK); + Bukkit.addRecipe(noteBlockRecipe); + } + + public void checkDaylightSensors() { + List allControllers = dataManager.getAllPlacedControllers(); + for (String controllerLoc : allControllers) { + String buttonId = dataManager.getButtonIdForPlacedController(controllerLoc); + if (buttonId == null) continue; + + String[] parts = controllerLoc.split(","); + if (parts.length != 4) continue; + + World world = getServer().getWorld(parts[0]); + if (world == null) continue; + + Location loc = new Location(world, + Integer.parseInt(parts[1]), + Integer.parseInt(parts[2]), + Integer.parseInt(parts[3])); + + Block block = loc.getBlock(); + if (block.getType() != Material.DAYLIGHT_DETECTOR) continue; + + long time = loc.getWorld().getTime(); + boolean isDay = time >= 0 && time < 13000; + + List connectedBlocks = dataManager.getConnectedBlocks(buttonId); + if (connectedBlocks == null) continue; + + for (String targetLocStr : connectedBlocks) { + String[] targetParts = targetLocStr.split(","); + if (targetParts.length != 4) continue; + + World targetWorld = getServer().getWorld(targetParts[0]); + if (targetWorld == null) continue; + + Location targetLoc = new Location(targetWorld, + Integer.parseInt(targetParts[1]), + Integer.parseInt(targetParts[2]), + Integer.parseInt(targetParts[3])); + + Block targetBlock = targetLoc.getBlock(); + + if (targetBlock.getType() == Material.REDSTONE_LAMP) { + Lightable lamp = (Lightable) targetBlock.getBlockData(); + lamp.setLit(!isDay); + targetBlock.setBlockData(lamp); + } + } + } + } + + // Play note block sound for doorbell + public void playDoorbellSound(Location loc, String instrument) { + Block block = loc.getBlock(); + if (block.getType() != Material.NOTE_BLOCK) return; + + NoteBlock noteBlock = (NoteBlock) block.getBlockData(); + try { + // Set instrument based on config or player preference + org.bukkit.Instrument bukkitInstrument = org.bukkit.Instrument.valueOf(instrument.toUpperCase()); + noteBlock.setInstrument(bukkitInstrument); + noteBlock.setNote(new Note(0, Tone.C, false)); // Default to C note + block.setBlockData(noteBlock); + loc.getWorld().playSound(loc, bukkitInstrument.getSound(), 1.0f, 1.0f); + + // Check if double note is enabled + if (configManager.getConfig().getBoolean("double-note-enabled", true)) { + // Schedule the second note after the configured delay in milliseconds + int delayMs = configManager.getConfig().getInt("double-note-delay-ms", 1000); + long delayTicks = (long) (delayMs / 50.0); // Convert milliseconds to ticks (1000 ms = 20 ticks) + getServer().getScheduler().runTaskLater(this, () -> { + if (block.getType() == Material.NOTE_BLOCK) { + loc.getWorld().playSound(loc, bukkitInstrument.getSound(), 1.0f, 1.0f); + } + }, delayTicks); + } + } catch (IllegalArgumentException e) { + getLogger().warning("Ungültiges Instrument: " + instrument); + } + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (command.getName().equalsIgnoreCase("bc")) { + if (args.length == 0) { + sender.sendMessage("§6[ButtonControl] §7Verwende: /bc "); + return true; + } + + if (args[0].equalsIgnoreCase("info")) { + sender.sendMessage("§6[ButtonControl] §7Informationen zum Plugin:"); + sender.sendMessage("§eVersion: §f" + getDescription().getVersion()); + sender.sendMessage("§eErsteller: §fM_Viper"); + sender.sendMessage("§ePlugin: §fButtonControl"); + sender.sendMessage("§eGetestet für Minecraft: §f1.21.5 - 1.21.8"); + sender.sendMessage("§eWeitere Infos: §fTüren, Lampen & Notenblöcke mit Buttons oder Tageslichtsensoren steuern"); + return true; + } + + if (args[0].equalsIgnoreCase("reload")) { + if (!sender.hasPermission("buttoncontrol.reload")) { + sender.sendMessage(configManager.getMessage("keine-berechtigung")); + return true; + } + configManager.reloadConfig(); + updateConfigWithDefaults(); // Ensure new defaults are added without overwriting + dataManager.reloadData(); + sender.sendMessage(configManager.getMessage("konfiguration-reloaded")); + return true; + } + + if (args[0].equalsIgnoreCase("note") && sender instanceof Player) { + Player player = (Player) sender; + if (!player.hasPermission("buttoncontrol.note")) { + player.sendMessage(configManager.getMessage("keine-berechtigung")); + return true; + } + if (args.length < 2) { + sender.sendMessage("§6[ButtonControl] §7Verwende: /bc note "); + sender.sendMessage("§7Verfügbare Instrumente: PIANO, BASS_DRUM, SNARE, STICKS, BASS_GUITAR, FLUTE, BELL, GUITAR, CHIME, XYLOPHONE, etc."); + return true; + } + + String instrument = args[1].toUpperCase(); + try { + org.bukkit.Instrument.valueOf(instrument); + dataManager.setPlayerInstrument(player.getUniqueId(), instrument); + sender.sendMessage(String.format(configManager.getMessage("instrument-gesetzt"), instrument)); + } catch (IllegalArgumentException e) { + sender.sendMessage(configManager.getMessage("ungueltiges-instrument")); + } + return true; + } + } + return false; + } + + public ConfigManager getConfigManager() { + return configManager; + } + + public DataManager getDataManager() { + return dataManager; + } +} \ No newline at end of file