From f57fd269a5486cfc5b67e2e7e1da0db6d4c26695 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 22 Jan 2025 17:40:42 +0100 Subject: [PATCH] :sparkles: added double doors, yay Signed-off-by: Sebastian --- .../listeners/PlayerInteractListener.java | 73 ++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/src/main/java/moe/sebiann/system/listeners/PlayerInteractListener.java b/src/main/java/moe/sebiann/system/listeners/PlayerInteractListener.java index 397ac51..4a8ef5f 100644 --- a/src/main/java/moe/sebiann/system/listeners/PlayerInteractListener.java +++ b/src/main/java/moe/sebiann/system/listeners/PlayerInteractListener.java @@ -1,20 +1,27 @@ package moe.sebiann.system.listeners; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Door; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.ItemFrame; +import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; public class PlayerInteractListener implements Listener { @EventHandler - public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + public void onItemFrameInteract(PlayerInteractEntityEvent event) { if (!event.getHand().equals(org.bukkit.inventory.EquipmentSlot.HAND)) { return; } + Entity entity = event.getRightClicked(); + if (entity instanceof ItemFrame) { ItemFrame itemFrame = (ItemFrame) entity; @@ -27,5 +34,69 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { event.setCancelled(true); } } + + } + + @EventHandler + public void onDoorInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK || event.getClickedBlock() == null) { + return; + } + if (event.getPlayer().isSneaking()) { + return; + } + + Block clickedBlock = event.getClickedBlock(); + + if (!isDoor(clickedBlock.getType())) { + return; + } + + BlockData data = clickedBlock.getBlockData(); + if (!(data instanceof Door)) { + return; + } + + Door clickedDoor = (Door) data; + + boolean newOpenState = !clickedDoor.isOpen(); + clickedDoor.setOpen(newOpenState); + clickedBlock.setBlockData(clickedDoor, true); + + Block otherDoorBlock = findAdjacentDoor(clickedBlock); + if (otherDoorBlock != null) { + Door otherDoor = (Door) otherDoorBlock.getBlockData(); + otherDoor.setOpen(newOpenState); + otherDoorBlock.setBlockData(otherDoor, true); + } + + event.setCancelled(true); + } + + private boolean isDoor(Material material) { + return material == Material.OAK_DOOR || material == Material.IRON_DOOR || material == Material.SPRUCE_DOOR + || material == Material.BIRCH_DOOR || material == Material.JUNGLE_DOOR || material == Material.CHERRY_DOOR + || material == Material.DARK_OAK_DOOR || material == Material.PALE_OAK_DOOR || material == Material.ACACIA_DOOR + || material == Material.CRIMSON_DOOR || material == Material.WARPED_DOOR || material == Material.MANGROVE_DOOR + || material == Material.BAMBOO_DOOR || material == Material.COPPER_DOOR || material == Material.EXPOSED_COPPER_DOOR + || material == Material.WEATHERED_COPPER_DOOR || material == Material.OXIDIZED_COPPER_DOOR; + } + + + private Block findAdjacentDoor(Block doorBlock) { + // Check all adjacent blocks for another door + for (int dx = -1; dx <= 1; dx++) { + for (int dz = -1; dz <= 1; dz++) { + if (Math.abs(dx) == Math.abs(dz)) { + continue; // Skip diagonals and the same block + } + + Block adjacentBlock = doorBlock.getRelative(dx, 0, dz); + if (isDoor(adjacentBlock.getType())) { + return adjacentBlock; + } + } + } + return null; } }