diff --git a/src/main/java/com/alttd/playerutils/event_listeners/RotateBlockEvent.java b/src/main/java/com/alttd/playerutils/event_listeners/RotateBlockEvent.java index a2b54ef..1736d99 100644 --- a/src/main/java/com/alttd/playerutils/event_listeners/RotateBlockEvent.java +++ b/src/main/java/com/alttd/playerutils/event_listeners/RotateBlockEvent.java @@ -6,10 +6,7 @@ import org.bukkit.Material; import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.data.Bisected; -import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.Directional; -import org.bukkit.block.data.Orientable; +import org.bukkit.block.data.*; import org.bukkit.block.data.type.Fence; import org.bukkit.block.data.type.Stairs; import org.bukkit.block.data.type.Wall; @@ -24,6 +21,7 @@ import org.bukkit.inventory.ItemStack; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; public class RotateBlockEvent implements Listener { @@ -69,6 +67,8 @@ public class RotateBlockEvent implements Listener { } else if (Tag.FENCES.isTagged(type)) { event.setCancelled(true); toggleFence(block, event.getBlockFace(), player); + } else if(Tag.RAILS.isTagged(type)) { + toggleRails(block, player); } else if (block.getBlockData() instanceof Directional directional) { event.setCancelled(true); rotateDirectionalBlock(block, directional, player); @@ -78,6 +78,42 @@ public class RotateBlockEvent implements Listener { } } + private void toggleRails(Block block, Player player) { + if (!(block instanceof Rail rail)) { + return; + } + + if (cannotBuild(block, player)) { + return; + } + + rail.setShape(getNextRailShape(rail, player.isSneaking())); + block.setBlockData(rail); + } + + private Rail.Shape getNextRailShape(Rail rail, boolean reverse) { + Rail.Shape shape = rail.getShape(); + List collect = rail.getShapes().stream().sorted().toList(); + Iterator iterator = collect.iterator(); + + if (reverse) { + Rail.Shape last = iterator.next(); + if (last.equals(shape)) + return collect.get(collect.size() - 1); + while (iterator.hasNext()) { + Rail.Shape next = iterator.next(); + if (next.equals(shape)) + return last; + last = next; + } + return collect.get(0); + } else { + while (iterator.hasNext() && !iterator.next().equals(shape)) + ; + return iterator.hasNext() ? iterator.next() : collect.get(0); + } + } + private void rotateOrientableBlock(Block block, Orientable orientable, Player player) { if (cannotBuild(block, player)) { return;