From 64850aaf45e8ec4405dd398ec20b6d30a24aa3fa Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 17 Apr 2026 10:40:06 +0200 Subject: [PATCH] =?UTF-8?q?J=C3=A1=20m=C3=A1m=20pr=C3=A1vo=20sed=C4=9Bt!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xyz/soukup/ecoCraftCore/EcoCraftCore.java | 2 + .../xyz/soukup/ecoCraftCore/sit/LetMeSit.java | 142 ++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 src/main/java/xyz/soukup/ecoCraftCore/sit/LetMeSit.java diff --git a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java index 907b7f6..72fee3f 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java @@ -46,6 +46,7 @@ import xyz.soukup.ecoCraftCore.database.DaoRegistry; import xyz.soukup.ecoCraftCore.messages.Messages; import xyz.soukup.ecoCraftCore.shop.ShopLogic; import xyz.soukup.ecoCraftCore.sign.SignEditCommand; +import xyz.soukup.ecoCraftCore.sit.LetMeSit; import xyz.soukup.ecoCraftCore.virtualChest.VirtualChestLogic; import java.io.IOException; @@ -303,6 +304,7 @@ public final class EcoCraftCore extends JavaPlugin { pm.registerEvents(new RegionEvents(), this); pm.registerEvents(new MineWorldManager(), this); pm.registerEvents(new JoinLeaveMessageSupress(), this); + pm.registerEvents(new LetMeSit(), this); EventManager events = PacketEvents.getAPI().getEventManager(); events.registerListener(new ChunkModifier(this), PacketListenerPriority.NORMAL); diff --git a/src/main/java/xyz/soukup/ecoCraftCore/sit/LetMeSit.java b/src/main/java/xyz/soukup/ecoCraftCore/sit/LetMeSit.java new file mode 100644 index 0000000..65a6296 --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/sit/LetMeSit.java @@ -0,0 +1,142 @@ +package xyz.soukup.ecoCraftCore.sit; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.Bisected; +import org.bukkit.block.data.type.Stairs; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.vehicle.VehicleExitEvent; +import org.bukkit.persistence.PersistentDataType; +import xyz.soukup.ecoCraftCore.utilities.PDC; + + +public class LetMeSit implements Listener { + + @EventHandler + public void onStairsClick(PlayerInteractEvent event){ + Player player = event.getPlayer(); + + if (player.isSneaking()){ + return; + } + + if (event.getAction() != Action.RIGHT_CLICK_BLOCK){ + return; + } + + Block block = event.getClickedBlock(); + + if (block == null){ + return; + } + + if (!(block.getBlockData() instanceof Stairs stairs)){ + return; + } + + if (stairs.getHalf() == Bisected.Half.TOP){ + return; + } + + switch (stairs.getShape()) { + case INNER_LEFT: + case INNER_RIGHT: + case OUTER_LEFT: + case OUTER_RIGHT: + return; + } + + float yaw = switch (stairs.getFacing()) { + case NORTH -> 0f; + case WEST -> -90f; + case EAST -> 90f; + default -> 180f; + }; + + Location location = block.getLocation(); + location.add(0.5, 0.5, 0.5); + location.setYaw(yaw); + + World world = location.getWorld(); + + + + for (Entity entity : world.getNearbyEntities(location, 0.5, 1,0.5)){ + if (!(entity instanceof ArmorStand armorStand)){ + continue; + } + + if (PDC.getUniversal(armorStand, "chair", PersistentDataType.BOOLEAN) == null){ + continue; + } + + if (!armorStand.getPassengers().isEmpty()){ + return; + } + + player.setRotation(armorStand.getYaw(), 0f); + armorStand.addPassenger(player); + event.setCancelled(true); + return; + } + + ArmorStand armorStand = world.spawn(location, ArmorStand.class, stand -> { + stand.setInvisible(true); + stand.setInvulnerable(true); + stand.setGravity(false); + stand.setSilent(true); + stand.setMarker(true); + }); + + PDC.setUniversal(armorStand, "chair", true, PersistentDataType.BOOLEAN); + player.setRotation(yaw, 0f); + armorStand.addPassenger(player); + event.setCancelled(true); + } + + @EventHandler + public void unmount(VehicleExitEvent event){ + Location location = event.getVehicle().getLocation(); + cleanArmorStand(location); + } + + @EventHandler + public void playerLeave(PlayerQuitEvent event){ + Location location = event.getPlayer().getLocation(); + cleanArmorStand(location); + } + + @EventHandler + public void teleport(PlayerTeleportEvent event){ + Location location = event.getFrom(); + cleanArmorStand(location); + } + + private void cleanArmorStand(Location location){ + World world = location.getWorld(); + for (Entity entity : world.getNearbyEntities(location, 0.5, 1,0.5)){ + if (!(entity instanceof ArmorStand armorStand)){ + continue; + } + + if (PDC.getUniversal(armorStand, "chair", PersistentDataType.BOOLEAN) == null){ + continue; + } + + if (!armorStand.getPassengers().isEmpty()){ + continue; + } + + armorStand.remove(); + } + } +}