From 914aaff10bfcaba05798b2caafef344b2f11926f Mon Sep 17 00:00:00 2001 From: lars Date: Sat, 13 Dec 2025 16:02:23 +0100 Subject: [PATCH] added deathrun listener for border; fixed listener problem when disabling appliance --- .../event/appliances/deathrun/Deathrun.java | 31 ++++++++++++++-- .../deathrun/DeathrunPlayerMoveListener.java | 35 +++++++++++++++++++ .../eventController/EventController.java | 7 ++-- 3 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/DeathrunPlayerMoveListener.java diff --git a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/Deathrun.java b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/Deathrun.java index 4f053ba..ca59167 100644 --- a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/Deathrun.java +++ b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/Deathrun.java @@ -7,22 +7,42 @@ import eu.mhsl.craftattack.spawn.event.appliances.eventController.scoreboard.Eve import net.kyori.adventure.text.Component; import net.kyori.adventure.title.Title; import org.bukkit.Bukkit; +import org.bukkit.Particle; import org.bukkit.World; import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; +import java.util.List; + @Appliance.Flags(autoload = false) public class Deathrun extends Appliance implements Event, Scorable { private final EventScoreboardBuilder scoreboardBuilder = new EventScoreboardBuilder(this, 3, 2, 3); + private final double borderDistance = 100; @Override - public void initialize(@NotNull JavaPlugin plugin) { + public void onEnable() { World world = Bukkit.getWorlds().getFirst(); world.getWorldBorder().setCenter(world.getSpawnLocation()); world.getWorldBorder().setSize(20); } + public double getBorderDistance() { + return this.borderDistance; + } + + public void spawnParticleWall(Player p, double xMin, double xMax, double yMin, double yMax, double zMin, double zMax) { + Particle particle = Particle.WAX_ON; + + for (double y = yMin; y <= yMax; y += 0.5) { + for (double z = zMin; z <= zMax; z += 0.5) { + for (double x = xMin; x <= xMax; x += 0.5) { + p.spawnParticle(particle, x, y, z, 1, 0.05, 0.05, 0.05, 0); + } + } + } + } + @Override public void onDisable() { World world = Bukkit.getWorlds().getFirst(); @@ -64,4 +84,11 @@ public class Deathrun extends Appliance implements Event, Scorable { public EventScoreboardBuilder getScoreboardBuilder() { return this.scoreboardBuilder; } + + @Override + protected @NotNull List listeners() { + return List.of( + new DeathrunPlayerMoveListener() + ); + } } diff --git a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/DeathrunPlayerMoveListener.java b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/DeathrunPlayerMoveListener.java new file mode 100644 index 0000000..45941fd --- /dev/null +++ b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/DeathrunPlayerMoveListener.java @@ -0,0 +1,35 @@ +package eu.mhsl.craftattack.spawn.event.appliances.deathrun; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerMoveEvent; + +public class DeathrunPlayerMoveListener extends ApplianceListener { + @EventHandler + public void onPlayerMove(PlayerMoveEvent event) { + Location spawnLocation = Bukkit.getWorlds().getFirst().getSpawnLocation(); + double minX = spawnLocation.x() - this.getAppliance().getBorderDistance(); + double minZ = spawnLocation.z() - this.getAppliance().getBorderDistance(); + double maxZ = spawnLocation.z() + this.getAppliance().getBorderDistance(); + if(event.getTo().x() < minX + 5) { + this.getAppliance().spawnParticleWall(event.getPlayer(), minX-0.2, minX-0.2, event.getTo().y()-0.5, event.getTo().y()+2.5, event.getTo().z()-1.5, event.getTo().z()+1.5); + if(event.getTo().x() < minX) { + event.setTo(event.getTo().clone().set(minX, event.getTo().y(), event.getTo().z())); + } + } + if(event.getTo().z() < minZ + 5) { + this.getAppliance().spawnParticleWall(event.getPlayer(), event.getTo().x()-1.5, event.getTo().x()+1.5, event.getTo().y()-0.5, event.getTo().y()+2.5, minZ-0.2, minZ-0.2); + if(event.getTo().z() < minZ) { + event.setTo(event.getTo().clone().set(event.getTo().x(), event.getTo().y(), minZ)); + } + } + if(event.getTo().z() > maxZ - 5) { + this.getAppliance().spawnParticleWall(event.getPlayer(), event.getTo().x()-1.5, event.getTo().x()+1.5, event.getTo().y()-0.5, event.getTo().y()+2.5, maxZ+0.2, maxZ+0.2); + if(event.getTo().z() > maxZ) { + event.setTo(event.getTo().clone().set(event.getTo().x(), event.getTo().y(), maxZ)); + } + } + } +} diff --git a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/EventController.java b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/EventController.java index de70211..cde5154 100644 --- a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/EventController.java +++ b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/EventController.java @@ -25,10 +25,11 @@ public class EventController extends Appliance { } public void loadEvent(Appliance appliance) { - if(!(appliance instanceof Event event)) throw new IllegalArgumentException("Appliance has to implement Event."); + if(!(appliance instanceof Event)) throw new IllegalArgumentException("Appliance has to implement Event."); this.unloadEvent(); - Main.instance().restartAppliance(appliance.getClass()); - this.selectedEvent = event; + Appliance newAppliance = Main.instance().restartAppliance(appliance.getClass()); + if(!(newAppliance instanceof Event newEvent)) throw new IllegalArgumentException("Appliance has to implement Event."); + this.selectedEvent = newEvent; } public void unloadEvent() {