Improve WarpListener

This commit is contained in:
2025-11-07 14:49:10 +01:00
parent 40ac7b2139
commit 58460416c3
@@ -21,6 +21,7 @@ package de.steamwar.bausystem.features.warp;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.core.Core; import de.steamwar.core.Core;
import de.steamwar.core.SWPlayer;
import de.steamwar.entity.RArmorStand; import de.steamwar.entity.RArmorStand;
import de.steamwar.entity.REntityServer; import de.steamwar.entity.REntityServer;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
@@ -30,7 +31,10 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; 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.inventory.ItemStack;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
@@ -42,8 +46,21 @@ import java.util.Map;
@Linked @Linked
public class WarpListener implements Listener { public class WarpListener implements Listener {
private Map<Player, REntityServer> warpEntityServer = new HashMap<>(); public static class WarpComponent implements SWPlayer.Component {
private Map<Player, List<Location>> selected = new HashMap<>(); private REntityServer server;
private List<Location> 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 @EventHandler
public void onPlayerItemHeld(PlayerItemHeldEvent e) { public void onPlayerItemHeld(PlayerItemHeldEvent e) {
@@ -65,20 +82,11 @@ public class WarpListener implements Listener {
} }
private void reshow(Player p, Material material, boolean sneaking) { private void reshow(Player p, Material material, boolean sneaking) {
REntityServer entityServer = warpEntityServer.get(p); SWPlayer swPlayer = SWPlayer.of(p);
if (entityServer != null) { swPlayer.removeComponent(WarpComponent.class);
entityServer.close(); if (material != Material.COMPASS) return;
}
if (material != Material.COMPASS) {
warpEntityServer.remove(p);
return;
}
selected.remove(p);
entityServer = new REntityServer();
entityServer.addPlayer(p);
warpEntityServer.put(p, entityServer);
WarpComponent warpComponent = swPlayer.getComponentOrDefault(WarpComponent.class, WarpComponent::new);
Vector current = p.getLocation().clone().add(p.getLocation().getDirection().multiply(5)).toVector(); Vector current = p.getLocation().clone().add(p.getLocation().getDirection().multiply(5)).toVector();
Map<String, Location> locations = new HashMap<>(); Map<String, Location> locations = new HashMap<>();
@@ -99,12 +107,9 @@ public class WarpListener implements Listener {
} }
} }
REntityServer finalEntityServer = entityServer;
locations.forEach((name, location) -> { locations.forEach((name, location) -> {
Vector vector = location.toVector().subtract(p.getLocation().toVector()); Vector vector = location.toVector().subtract(p.getLocation().toVector());
if (vector.getX() * vector.getX() + vector.getZ() * vector.getZ() < 25) { if (vector.getX() * vector.getX() + vector.getZ() * vector.getZ() < 25) return;
return;
}
vector.setY(0); vector.setY(0);
Vector position = p.getLocation().toVector().clone().add(vector.normalize().multiply(5)); 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) { if ((position.getX() - current.getX()) * (position.getX() - current.getX()) + (position.getZ() - current.getZ()) * (position.getZ() - current.getZ()) < 0.1) {
name = "§a§l" + name; 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.setDisplayName(name);
armorStand.setNoGravity(true); armorStand.setNoGravity(true);
armorStand.setInvisible(true); armorStand.setInvisible(true);
@@ -123,28 +128,13 @@ public class WarpListener implements Listener {
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onPlayerInteract(PlayerInteractEvent event) { public void onPlayerInteract(PlayerInteractEvent event) {
if (event.getPlayer().getInventory().getItemInMainHand().getType() != Material.COMPASS) { if (event.getPlayer().getInventory().getItemInMainHand().getType() != Material.COMPASS) return;
return; if (event.getAction() != Action.RIGHT_CLICK_AIR) return;
} WarpComponent warpComponent = SWPlayer.of(event.getPlayer()).getComponent(WarpComponent.class).orElse(null);
if (event.getAction() != Action.RIGHT_CLICK_AIR) { if (warpComponent == null || warpComponent.selected.size() != 1) return;
return; Location location = warpComponent.selected.get(0);
}
List<Location> locations = selected.getOrDefault(event.getPlayer(), new ArrayList<>());
if (locations.size() != 1) {
return;
}
Location location = locations.get(0);
event.getPlayer().teleport(location); event.getPlayer().teleport(location);
event.getPlayer().playSound(location, Sound.ENTITY_ENDERMAN_TELEPORT, SoundCategory.PLAYERS, 1, 1); event.getPlayer().playSound(location, Sound.ENTITY_ENDERMAN_TELEPORT, SoundCategory.PLAYERS, 1, 1);
event.setCancelled(true); event.setCancelled(true);
} }
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
warpEntityServer.computeIfPresent(event.getPlayer(), (player, rEntityServer) -> {
rEntityServer.close();
return null;
});
selected.remove(event.getPlayer());
}
} }