From 58460416c3fcc09ec66dbcfabb0613252e406c61 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Fri, 7 Nov 2025 14:49:10 +0100 Subject: [PATCH] Improve WarpListener --- .../bausystem/features/warp/WarpListener.java | 74 ++++++++----------- 1 file changed, 32 insertions(+), 42 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpListener.java index 60121c90..f57ff726 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpListener.java @@ -21,6 +21,7 @@ package de.steamwar.bausystem.features.warp; import de.steamwar.bausystem.region.Region; import de.steamwar.core.Core; +import de.steamwar.core.SWPlayer; import de.steamwar.entity.RArmorStand; import de.steamwar.entity.REntityServer; import de.steamwar.linkage.Linked; @@ -30,7 +31,10 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; -import org.bukkit.event.player.*; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerItemHeldEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerToggleSneakEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; @@ -42,8 +46,21 @@ import java.util.Map; @Linked public class WarpListener implements Listener { - private Map warpEntityServer = new HashMap<>(); - private Map> selected = new HashMap<>(); + public static class WarpComponent implements SWPlayer.Component { + private REntityServer server; + private List selected = new ArrayList<>(); + + @Override + public void onMount(SWPlayer player) { + server = new REntityServer(); + server.addPlayer(player.getPlayer()); + } + + @Override + public void onUnmount(SWPlayer player) { + server.close(); + } + } @EventHandler public void onPlayerItemHeld(PlayerItemHeldEvent e) { @@ -65,20 +82,11 @@ public class WarpListener implements Listener { } private void reshow(Player p, Material material, boolean sneaking) { - REntityServer entityServer = warpEntityServer.get(p); - if (entityServer != null) { - entityServer.close(); - } - if (material != Material.COMPASS) { - warpEntityServer.remove(p); - return; - } - - selected.remove(p); - entityServer = new REntityServer(); - entityServer.addPlayer(p); - warpEntityServer.put(p, entityServer); + SWPlayer swPlayer = SWPlayer.of(p); + swPlayer.removeComponent(WarpComponent.class); + if (material != Material.COMPASS) return; + WarpComponent warpComponent = swPlayer.getComponentOrDefault(WarpComponent.class, WarpComponent::new); Vector current = p.getLocation().clone().add(p.getLocation().getDirection().multiply(5)).toVector(); Map locations = new HashMap<>(); @@ -99,12 +107,9 @@ public class WarpListener implements Listener { } } - REntityServer finalEntityServer = entityServer; locations.forEach((name, location) -> { Vector vector = location.toVector().subtract(p.getLocation().toVector()); - if (vector.getX() * vector.getX() + vector.getZ() * vector.getZ() < 25) { - return; - } + if (vector.getX() * vector.getX() + vector.getZ() * vector.getZ() < 25) return; vector.setY(0); Vector position = p.getLocation().toVector().clone().add(vector.normalize().multiply(5)); @@ -112,9 +117,9 @@ public class WarpListener implements Listener { if ((position.getX() - current.getX()) * (position.getX() - current.getX()) + (position.getZ() - current.getZ()) * (position.getZ() - current.getZ()) < 0.1) { name = "§a§l" + name; - selected.computeIfAbsent(p, player -> new ArrayList<>()).add(location); + warpComponent.selected.add(location); } - RArmorStand armorStand = new RArmorStand(finalEntityServer, position.toLocation(p.getWorld()), RArmorStand.Size.MARKER); + RArmorStand armorStand = new RArmorStand(warpComponent.server, position.toLocation(p.getWorld()), RArmorStand.Size.MARKER); armorStand.setDisplayName(name); armorStand.setNoGravity(true); armorStand.setInvisible(true); @@ -123,28 +128,13 @@ public class WarpListener implements Listener { @EventHandler(priority = EventPriority.LOWEST) public void onPlayerInteract(PlayerInteractEvent event) { - if (event.getPlayer().getInventory().getItemInMainHand().getType() != Material.COMPASS) { - return; - } - if (event.getAction() != Action.RIGHT_CLICK_AIR) { - return; - } - List locations = selected.getOrDefault(event.getPlayer(), new ArrayList<>()); - if (locations.size() != 1) { - return; - } - Location location = locations.get(0); + if (event.getPlayer().getInventory().getItemInMainHand().getType() != Material.COMPASS) return; + if (event.getAction() != Action.RIGHT_CLICK_AIR) return; + WarpComponent warpComponent = SWPlayer.of(event.getPlayer()).getComponent(WarpComponent.class).orElse(null); + if (warpComponent == null || warpComponent.selected.size() != 1) return; + Location location = warpComponent.selected.get(0); event.getPlayer().teleport(location); event.getPlayer().playSound(location, Sound.ENTITY_ENDERMAN_TELEPORT, SoundCategory.PLAYERS, 1, 1); event.setCancelled(true); } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - warpEntityServer.computeIfPresent(event.getPlayer(), (player, rEntityServer) -> { - rEntityServer.close(); - return null; - }); - selected.remove(event.getPlayer()); - } }