Added rotating rails

This commit is contained in:
Teriuihi 2023-07-28 03:00:43 +02:00
parent 06f04d6fb2
commit 74eab9512e

View File

@ -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<Rail.Shape> collect = rail.getShapes().stream().sorted().toList();
Iterator<Rail.Shape> 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;