src/main/java/viper/ButtonListener.java aktualisiert

This commit is contained in:
2025-08-09 09:51:48 +00:00
parent 10c17850d1
commit 82701d2cbe

View File

@@ -1,215 +1,225 @@
package viper; package viper;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.data.type.Door; import org.bukkit.block.data.type.Door;
import org.bukkit.block.data.Lightable; import org.bukkit.block.data.Lightable;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
public class ButtonListener implements Listener { public class ButtonListener implements Listener {
private final ButtonControl plugin; private final ButtonControl plugin;
private final ConfigManager configManager; private final ConfigManager configManager;
private final DataManager dataManager; private final DataManager dataManager;
public ButtonListener(ButtonControl plugin, ConfigManager configManager, DataManager dataManager) { public ButtonListener(ButtonControl plugin, ConfigManager configManager, DataManager dataManager) {
this.plugin = plugin; this.plugin = plugin;
this.configManager = configManager; this.configManager = configManager;
this.dataManager = dataManager; this.dataManager = dataManager;
} }
@EventHandler @EventHandler
public void onPlayerInteract(PlayerInteractEvent event) { public void onPlayerInteract(PlayerInteractEvent event) {
String playerUUID = event.getPlayer().getUniqueId().toString(); String playerUUID = event.getPlayer().getUniqueId().toString();
ItemStack item = event.getItem();
ItemStack item = event.getItem(); Block block = event.getClickedBlock();
Block block = event.getClickedBlock();
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && block != null &&
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && block != null && (block.getType() == Material.STONE_BUTTON || block.getType() == Material.DAYLIGHT_DETECTOR)) {
(block.getType() == Material.STONE_BUTTON || block.getType() == Material.DAYLIGHT_DETECTOR)) {
String blockLocation = block.getWorld().getName() + "," + block.getX() + "," + block.getY() + "," + block.getZ();
String blockLocation = block.getWorld().getName() + "," + block.getX() + "," + block.getY() + "," + block.getZ(); String buttonId = dataManager.getButtonIdForPlacedController(playerUUID, blockLocation);
String buttonId = dataManager.getButtonIdForPlacedController(playerUUID, blockLocation);
if (buttonId != null) {
if (buttonId != null) { event.setCancelled(true);
event.setCancelled(true); List<String> connectedBlocks = dataManager.getConnectedBlocks(playerUUID, buttonId);
List<String> connectedBlocks = dataManager.getConnectedBlocks(playerUUID, buttonId); if (connectedBlocks != null && !connectedBlocks.isEmpty()) {
if (connectedBlocks != null && !connectedBlocks.isEmpty()) { boolean anyDoorOpened = false;
boolean anyDoorClosed = false;
boolean anyDoorOpened = false; boolean anyLampOn = false;
boolean anyDoorClosed = false; boolean anyLampOff = false;
boolean anyLampOn = false; boolean anyNoteBlockPlayed = false;
boolean anyLampOff = false;
for (String loc : connectedBlocks) {
for (String loc : connectedBlocks) { String[] parts = loc.split(",");
String[] parts = loc.split(","); Location location = new Location(plugin.getServer().getWorld(parts[0]),
Location location = new Location(plugin.getServer().getWorld(parts[0]), Integer.parseInt(parts[1]),
Integer.parseInt(parts[1]), Integer.parseInt(parts[2]),
Integer.parseInt(parts[2]), Integer.parseInt(parts[3]));
Integer.parseInt(parts[3])); Block targetBlock = location.getBlock();
Block targetBlock = location.getBlock(); if (isDoor(targetBlock.getType())) {
if (isDoor(targetBlock.getType())) { Door door = (Door) targetBlock.getBlockData();
Door door = (Door) targetBlock.getBlockData(); boolean wasOpen = door.isOpen();
boolean wasOpen = door.isOpen(); door.setOpen(!wasOpen);
door.setOpen(!wasOpen); targetBlock.setBlockData(door);
targetBlock.setBlockData(door); if (!wasOpen) {
anyDoorOpened = true;
if (!wasOpen) { } else {
anyDoorOpened = true; anyDoorClosed = true;
} else { }
anyDoorClosed = true; } else if (targetBlock.getType() == Material.REDSTONE_LAMP) {
} Lightable lamp = (Lightable) targetBlock.getBlockData();
} else if (targetBlock.getType() == Material.REDSTONE_LAMP) { boolean wasLit = lamp.isLit();
Lightable lamp = (Lightable) targetBlock.getBlockData(); lamp.setLit(!wasLit);
boolean wasLit = lamp.isLit(); targetBlock.setBlockData(lamp);
lamp.setLit(!wasLit); if (!wasLit) {
targetBlock.setBlockData(lamp); anyLampOn = true;
} else {
if (!wasLit) { anyLampOff = true;
anyLampOn = true; }
} else { } else if (targetBlock.getType() == Material.NOTE_BLOCK) {
anyLampOff = true; String instrument = dataManager.getPlayerInstrument(event.getPlayer().getUniqueId());
} if (instrument == null) {
} instrument = configManager.getConfig().getString("default-note", "PIANO");
} }
plugin.playDoorbellSound(location, instrument);
if (anyDoorOpened) { anyNoteBlockPlayed = true;
event.getPlayer().sendMessage(configManager.getMessage("doors-open")); }
} }
if (anyDoorClosed) {
event.getPlayer().sendMessage(configManager.getMessage("doors-closed")); if (anyDoorOpened) {
} event.getPlayer().sendMessage(configManager.getMessage("tueren-geoeffnet"));
if (anyLampOn) { }
event.getPlayer().sendMessage(configManager.getMessage("lamps-on")); if (anyDoorClosed) {
} event.getPlayer().sendMessage(configManager.getMessage("tueren-geschlossen"));
if (anyLampOff) { }
event.getPlayer().sendMessage(configManager.getMessage("lamps-off")); if (anyLampOn) {
} event.getPlayer().sendMessage(configManager.getMessage("lampen-eingeschaltet"));
}
} else { if (anyLampOff) {
event.getPlayer().sendMessage(configManager.getMessage("no-blocks-connected")); event.getPlayer().sendMessage(configManager.getMessage("lampen-ausgeschaltet"));
} }
} if (anyNoteBlockPlayed) {
return; event.getPlayer().sendMessage(configManager.getMessage("notenblock-ausgeloest"));
} }
} else {
if (item == null || (!item.getType().equals(Material.STONE_BUTTON) && !item.getType().equals(Material.DAYLIGHT_DETECTOR))) { event.getPlayer().sendMessage(configManager.getMessage("keine-bloecke-verbunden"));
return; }
} }
return;
if (!item.hasItemMeta() || !item.getItemMeta().getDisplayName().contains("§6Steuer-")) { }
return;
} if (item == null || (!item.getType().equals(Material.STONE_BUTTON) && !item.getType().equals(Material.DAYLIGHT_DETECTOR) && !item.getType().equals(Material.NOTE_BLOCK))) {
return;
if (event.getAction() != Action.RIGHT_CLICK_BLOCK || block == null) { }
return;
} if (!item.hasItemMeta() || !item.getItemMeta().getDisplayName().contains("§6Steuer-")) {
return;
if (isDoor(block.getType()) || block.getType() == Material.REDSTONE_LAMP) { }
event.setCancelled(true);
if (event.getAction() != Action.RIGHT_CLICK_BLOCK || block == null) {
String buttonId = item.getItemMeta().hasLore() ? item.getItemMeta().getLore().get(0) : UUID.randomUUID().toString(); return;
List<String> connectedBlocks = dataManager.getConnectedBlocks(playerUUID, buttonId); }
if (connectedBlocks == null) {
connectedBlocks = new ArrayList<>(); if (isDoor(block.getType()) || block.getType() == Material.REDSTONE_LAMP || block.getType() == Material.NOTE_BLOCK) {
} event.setCancelled(true);
int maxDoors = configManager.getMaxDoors(); String buttonId = item.getItemMeta().hasLore() ? item.getItemMeta().getLore().get(0) : UUID.randomUUID().toString();
int maxLamps = configManager.getMaxLamps(); List<String> connectedBlocks = dataManager.getConnectedBlocks(playerUUID, buttonId);
int doorCount = (int) connectedBlocks.stream().filter(loc -> isDoor(getMaterialFromLocation(loc))).count(); if (connectedBlocks == null) {
int lampCount = (int) connectedBlocks.stream().filter(loc -> getMaterialFromLocation(loc) == Material.REDSTONE_LAMP).count(); connectedBlocks = new ArrayList<>();
}
if (isDoor(block.getType()) && doorCount >= maxDoors) {
event.getPlayer().sendMessage(configManager.getMessage("max-doors-reached")); int maxDoors = configManager.getMaxDoors();
return; int maxLamps = configManager.getMaxLamps();
} int maxNoteBlocks = configManager.getMaxNoteBlocks();
if (block.getType() == Material.REDSTONE_LAMP && lampCount >= maxLamps) { int doorCount = (int) connectedBlocks.stream().filter(loc -> isDoor(getMaterialFromLocation(loc))).count();
event.getPlayer().sendMessage(configManager.getMessage("max-lamps-reached")); int lampCount = (int) connectedBlocks.stream().filter(loc -> getMaterialFromLocation(loc) == Material.REDSTONE_LAMP).count();
return; int noteBlockCount = (int) connectedBlocks.stream().filter(loc -> getMaterialFromLocation(loc) == Material.NOTE_BLOCK).count();
}
if (isDoor(block.getType()) && doorCount >= maxDoors) {
String blockLocation = block.getWorld().getName() + "," + block.getX() + "," + block.getY() + "," + block.getZ(); event.getPlayer().sendMessage(configManager.getMessage("max-tueren-erreicht"));
if (!connectedBlocks.contains(blockLocation)) { return;
connectedBlocks.add(blockLocation); }
dataManager.setConnectedBlocks(playerUUID, buttonId, connectedBlocks); if (block.getType() == Material.REDSTONE_LAMP && lampCount >= maxLamps) {
updateButtonLore(item, buttonId); event.getPlayer().sendMessage(configManager.getMessage("max-lampen-erreicht"));
event.getPlayer().sendMessage(configManager.getMessage("block-connected")); return;
} else { }
event.getPlayer().sendMessage(configManager.getMessage("block-already-connected")); if (block.getType() == Material.NOTE_BLOCK && noteBlockCount >= maxNoteBlocks) {
} event.getPlayer().sendMessage(configManager.getMessage("max-notenbloecke-erreicht"));
} return;
} }
@EventHandler String blockLocation = block.getWorld().getName() + "," + block.getX() + "," + block.getY() + "," + block.getZ();
public void onBlockPlace(BlockPlaceEvent event) { if (!connectedBlocks.contains(blockLocation)) {
String playerUUID = event.getPlayer().getUniqueId().toString(); connectedBlocks.add(blockLocation);
dataManager.setConnectedBlocks(playerUUID, buttonId, connectedBlocks);
ItemStack item = event.getItemInHand(); updateButtonLore(item, buttonId);
Block block = event.getBlockPlaced(); event.getPlayer().sendMessage(configManager.getMessage("block-verbunden"));
} else {
if (item == null || (!item.getType().equals(Material.STONE_BUTTON) && !item.getType().equals(Material.DAYLIGHT_DETECTOR))) { event.getPlayer().sendMessage(configManager.getMessage("block-bereits-verbunden"));
return; }
} }
}
if (!item.hasItemMeta() || !item.getItemMeta().getDisplayName().contains("§6Steuer-")) {
return; @EventHandler
} public void onBlockPlace(BlockPlaceEvent event) {
String playerUUID = event.getPlayer().getUniqueId().toString();
String buttonId = item.getItemMeta().hasLore() ? item.getItemMeta().getLore().get(0) : UUID.randomUUID().toString(); ItemStack item = event.getItemInHand();
String blockLocation = block.getWorld().getName() + "," + block.getX() + "," + block.getY() + "," + block.getZ(); Block block = event.getBlockPlaced();
dataManager.addPlacedController(playerUUID, blockLocation, buttonId);
event.getPlayer().sendMessage(configManager.getMessage("controller-placed")); if (item == null || (!item.getType().equals(Material.STONE_BUTTON) && !item.getType().equals(Material.DAYLIGHT_DETECTOR) && !item.getType().equals(Material.NOTE_BLOCK))) {
} return;
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event) { if (!item.hasItemMeta() || !item.getItemMeta().getDisplayName().contains("§6Steuer-")) {
String playerUUID = event.getPlayer().getUniqueId().toString(); return;
}
Block block = event.getBlock();
String blockLocation = block.getWorld().getName() + "," + block.getX() + "," + block.getY() + "," + block.getZ(); String buttonId = item.getItemMeta().hasLore() ? item.getItemMeta().getLore().get(0) : UUID.randomUUID().toString();
String buttonId = dataManager.getButtonIdForPlacedController(playerUUID, blockLocation); String blockLocation = block.getWorld().getName() + "," + block.getX() + "," + block.getY() + "," + block.getZ();
dataManager.addPlacedController(playerUUID, blockLocation, buttonId);
if (buttonId != null) { event.getPlayer().sendMessage(configManager.getMessage("controller-platziert"));
dataManager.removePlacedController(playerUUID, blockLocation); }
dataManager.setConnectedBlocks(playerUUID, buttonId, null);
event.getPlayer().sendMessage(configManager.getMessage("controller-removed")); @EventHandler
} public void onBlockBreak(BlockBreakEvent event) {
} String playerUUID = event.getPlayer().getUniqueId().toString();
Block block = event.getBlock();
private boolean isDoor(Material material) { String blockLocation = block.getWorld().getName() + "," + block.getX() + "," + block.getY() + "," + block.getZ();
return material.toString().endsWith("_DOOR"); String buttonId = dataManager.getButtonIdForPlacedController(playerUUID, blockLocation);
}
if (buttonId != null) {
private Material getMaterialFromLocation(String locString) { dataManager.removePlacedController(playerUUID, blockLocation);
String[] parts = locString.split(","); dataManager.setConnectedBlocks(playerUUID, buttonId, null);
if (parts.length != 4) return null; event.getPlayer().sendMessage(configManager.getMessage("controller-entfernt"));
Location loc = new Location(plugin.getServer().getWorld(parts[0]), }
Integer.parseInt(parts[1]), }
Integer.parseInt(parts[2]),
Integer.parseInt(parts[3])); private boolean isDoor(Material material) {
return loc.getBlock().getType(); return material.toString().endsWith("_DOOR");
} }
private void updateButtonLore(ItemStack item, String buttonId) { private Material getMaterialFromLocation(String locString) {
ItemMeta meta = item.getItemMeta(); String[] parts = locString.split(",");
if (meta != null) { if (parts.length != 4) return null;
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>(); Location loc = new Location(plugin.getServer().getWorld(parts[0]),
if (!lore.contains(buttonId)) { Integer.parseInt(parts[1]),
lore.add(buttonId); Integer.parseInt(parts[2]),
meta.setLore(lore); Integer.parseInt(parts[3]));
item.setItemMeta(meta); return loc.getBlock().getType();
} }
}
} private void updateButtonLore(ItemStack item, String buttonId) {
} ItemMeta meta = item.getItemMeta();
if (meta != null) {
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
if (!lore.contains(buttonId)) {
lore.add(buttonId);
meta.setLore(lore);
item.setItemMeta(meta);
}
}
}
}