From 264e1b5471f7f987a59bb3e37101f9187dab2811 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 17 May 2026 21:17:04 +0200 Subject: [PATCH] rework of logic for bubble --- .../fr/openmc/core/features/cube/Cube.java | 60 ++------- .../core/features/cube/CubeCommands.java | 4 + .../cube/events/CubeActivateBubbleEvent.java | 26 ++++ .../events/CubeDesactivateBubbleEvent.java | 26 ++++ .../features/cube/listeners/CubeListener.java | 121 +++++++++++------- .../cube/tasks/CorruptedBubbleTask.java | 73 +++++++++++ .../cube/{ => tasks}/ReproductionTask.java | 3 +- 7 files changed, 217 insertions(+), 96 deletions(-) create mode 100644 src/main/java/fr/openmc/core/features/cube/events/CubeActivateBubbleEvent.java create mode 100644 src/main/java/fr/openmc/core/features/cube/events/CubeDesactivateBubbleEvent.java create mode 100644 src/main/java/fr/openmc/core/features/cube/tasks/CorruptedBubbleTask.java rename src/main/java/fr/openmc/core/features/cube/{ => tasks}/ReproductionTask.java (97%) diff --git a/src/main/java/fr/openmc/core/features/cube/Cube.java b/src/main/java/fr/openmc/core/features/cube/Cube.java index d15d4ac9d..48e58b4b4 100644 --- a/src/main/java/fr/openmc/core/features/cube/Cube.java +++ b/src/main/java/fr/openmc/core/features/cube/Cube.java @@ -1,9 +1,11 @@ package fr.openmc.core.features.cube; import fr.openmc.core.OMCPlugin; +import fr.openmc.core.features.cube.events.CubeActivateBubbleEvent; import fr.openmc.core.features.cube.listeners.RepulseEffectListener; import fr.openmc.core.features.cube.multiblocks.MultiBlock; -import fr.openmc.core.features.dream.DreamUtils; +import fr.openmc.core.features.cube.tasks.CorruptedBubbleTask; +import fr.openmc.core.features.cube.tasks.ReproductionTask; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; @@ -204,63 +206,17 @@ public void startMagneticShock() { public final int RADIUS_BUBBLE = this.radius * 4; public void startCorruptedBubble() { - Location center = this.getCenter(); - - int totalTicks = 20 * 1300; - startBubbleParticles(); if (corruptedBubbleTask != null) corruptedBubbleTask.cancel(); int intervalCorruption = 20 * 15; - corruptedBubbleTask = new BukkitRunnable() { - int elapsed = 0; - - @Override - public void run() { - if (elapsed >= totalTicks) { - cancel(); - corruptedBubbleTask = null; - return; - } - - for (int i = 0; i < 30; i++) { - double theta = Math.random() * 2 * Math.PI; - double phi = Math.random() * Math.PI; - double r = Math.random() * RADIUS_BUBBLE; - - double x = r * Math.sin(phi) * Math.cos(theta); - double y = r * Math.cos(phi); - double z = r * Math.sin(phi) * Math.sin(theta); - - if (isPartOf(new Location(origin.getWorld(), x, y, z))) continue; - - Location loc = center.clone().add(x, y, z); - Block block = loc.getBlock(); - Material type = block.getType(); - - if (!DreamUtils.isDreamWorld(loc)) { - switch (type) { - case DIRT, GRASS_BLOCK, SAND, GRAVEL -> block.setType(Material.WARPED_NYLIUM); - case OAK_LOG, BIRCH_LOG, SPRUCE_LOG, JUNGLE_LOG, DARK_OAK_LOG, - ACACIA_LOG, MANGROVE_LOG -> block.setType(Material.WARPED_STEM); - case AIR, LAPIS_BLOCK -> { - } - default -> block.setType(Material.SCULK); - } - } else { - switch (type) { - case MUD -> block.setType(Material.SAND); - case AIR, LAPIS_BLOCK -> { - } - default -> block.setType(Material.GRASS_BLOCK); - } - } - } + int totalTicks = 20 * 1300; + corruptedBubbleTask = new CorruptedBubbleTask(this, RADIUS_BUBBLE, intervalCorruption, totalTicks) + .runTaskTimer(OMCPlugin.getInstance(), 0L, intervalCorruption); - elapsed += intervalCorruption; - } - }.runTaskTimer(OMCPlugin.getInstance(), 0L, intervalCorruption); + Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> + Bukkit.getPluginManager().callEvent(new CubeActivateBubbleEvent(this))); } public void startBubbleParticles() { diff --git a/src/main/java/fr/openmc/core/features/cube/CubeCommands.java b/src/main/java/fr/openmc/core/features/cube/CubeCommands.java index cd769f227..1ac4e9c7a 100644 --- a/src/main/java/fr/openmc/core/features/cube/CubeCommands.java +++ b/src/main/java/fr/openmc/core/features/cube/CubeCommands.java @@ -1,5 +1,7 @@ package fr.openmc.core.features.cube; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.features.cube.events.CubeDesactivateBubbleEvent; import fr.openmc.core.features.cube.multiblocks.MultiBlock; import fr.openmc.core.features.cube.multiblocks.MultiBlockManager; import fr.openmc.core.utils.text.messages.MessageType; @@ -79,6 +81,8 @@ public void stopCorruptedBubble( cube.corruptedBubbleTask.cancel(); cube.corruptedBubbleTask = null; } + Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> + Bukkit.getPluginManager().callEvent(new CubeDesactivateBubbleEvent(cube))); MessagesManager.sendMessage(player, Component.text("Bulle corrompue arreté"), Prefix.STAFF, MessageType.SUCCESS, false); } diff --git a/src/main/java/fr/openmc/core/features/cube/events/CubeActivateBubbleEvent.java b/src/main/java/fr/openmc/core/features/cube/events/CubeActivateBubbleEvent.java new file mode 100644 index 000000000..985075d05 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/cube/events/CubeActivateBubbleEvent.java @@ -0,0 +1,26 @@ +package fr.openmc.core.features.cube.events; + +import fr.openmc.core.features.cube.Cube; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +@Getter +public class CubeActivateBubbleEvent extends Event { + private static final HandlerList HANDLERS = new HandlerList(); + private final Cube cube; + + public CubeActivateBubbleEvent(Cube cube) { + this.cube = cube; + } + + public static HandlerList getHandlerList() { + return HANDLERS; + } + + @Override + public @NotNull HandlerList getHandlers() { + return HANDLERS; + } +} diff --git a/src/main/java/fr/openmc/core/features/cube/events/CubeDesactivateBubbleEvent.java b/src/main/java/fr/openmc/core/features/cube/events/CubeDesactivateBubbleEvent.java new file mode 100644 index 000000000..d555ecc1e --- /dev/null +++ b/src/main/java/fr/openmc/core/features/cube/events/CubeDesactivateBubbleEvent.java @@ -0,0 +1,26 @@ +package fr.openmc.core.features.cube.events; + +import fr.openmc.core.features.cube.Cube; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +@Getter +public class CubeDesactivateBubbleEvent extends Event { + private static final HandlerList HANDLERS = new HandlerList(); + private final Cube cube; + + public CubeDesactivateBubbleEvent(Cube cube) { + this.cube = cube; + } + + public static HandlerList getHandlerList() { + return HANDLERS; + } + + @Override + public @NotNull HandlerList getHandlers() { + return HANDLERS; + } +} diff --git a/src/main/java/fr/openmc/core/features/cube/listeners/CubeListener.java b/src/main/java/fr/openmc/core/features/cube/listeners/CubeListener.java index 0697c8e9b..a384367dd 100644 --- a/src/main/java/fr/openmc/core/features/cube/listeners/CubeListener.java +++ b/src/main/java/fr/openmc/core/features/cube/listeners/CubeListener.java @@ -1,6 +1,8 @@ package fr.openmc.core.features.cube.listeners; import fr.openmc.core.features.cube.Cube; +import fr.openmc.core.features.cube.events.CubeActivateBubbleEvent; +import fr.openmc.core.features.cube.events.CubeDesactivateBubbleEvent; import fr.openmc.core.features.cube.events.EnterCubeZoneEvent; import fr.openmc.core.features.cube.events.ExitCubeZoneEvent; import fr.openmc.core.features.cube.multiblocks.MultiBlock; @@ -14,6 +16,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.potion.PotionEffect; @@ -38,6 +41,26 @@ public void onPlayerInteract(PlayerInteractEvent event) { } } + @EventHandler + public void onPlayerQuit(PlayerJoinEvent event) { + updatePlayerBubbleState(event.getPlayer()); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + for (MultiBlock mb : MultiBlockManager.getMultiBlocks()) { + if (!(mb instanceof Cube cube)) continue; + + Location center = cube.getCenter(); + double radius = cube.RADIUS_BUBBLE; + + if (!player.getWorld().equals(center.getWorld())) continue; + + if (player.getLocation().distance(center) <= radius) onPlayerExitBubble(player); + } + } + @EventHandler public void onPlayerMove(PlayerMoveEvent event) { Player player = event.getPlayer(); @@ -54,41 +77,78 @@ public void onPlayerMove(PlayerMoveEvent event) { @EventHandler public void onPlayerEnterAndLeaveCubeZone(PlayerMoveEvent event) { - Player player = event.getPlayer(); + updatePlayerBubbleState(event.getPlayer()); + } + + @EventHandler + public void onCubeBubbleStart(CubeActivateBubbleEvent event) { + Cube cube = event.getCube(); + + Location center = cube.getCenter(); + double radius = cube.RADIUS_BUBBLE; + + for (Player player : Bukkit.getOnlinePlayers()) { + if (!player.getWorld().equals(center.getWorld())) continue; + + if (player.getLocation().distance(center) <= radius) { + updatePlayerBubbleState(player); + } + } + } + + @EventHandler + public void onCubeBubbleStop(CubeDesactivateBubbleEvent event) { + Cube cube = event.getCube(); + + Location center = cube.getCenter(); + double radius = cube.RADIUS_BUBBLE; + + for (Player player : Bukkit.getOnlinePlayers()) { + if (!player.getWorld().equals(center.getWorld())) continue; + + if (player.getLocation().distance(center) <= radius) { + updatePlayerBubbleState(player); + } + } + } + + public void updatePlayerBubbleState(Player player) { if (!player.getLocation().getWorld().getName().equals("world") && !player.getLocation().getWorld().getName().equals(DreamDimensionManager.DIMENSION_NAME)) return; + UUID uuid = player.getUniqueId(); + boolean insideAny = false; - Cube cube = null; + Cube bestCube = null; for (MultiBlock mb : MultiBlockManager.getMultiBlocks()) { - if (!(mb instanceof Cube loopCube)) continue; + if (!(mb instanceof Cube cube)) continue; - Location center = loopCube.getCenter(); - double radius = loopCube.RADIUS_BUBBLE; + if (cube.corruptedBubbleTask == null) continue; - if (!player.getWorld().equals(center.getWorld())) continue; - cube = loopCube; + if (!player.getWorld().equals(cube.getCenter().getWorld())) continue; - if (player.getLocation().distance(center) <= radius) { + double dist = player.getLocation().distance(cube.getCenter()); + + if (dist <= cube.RADIUS_BUBBLE) { insideAny = true; + bestCube = cube; break; } } - - if (cube == null) { - throw new NullPointerException("No Cube found in world: " + player.getLocation().getWorld().getName()); - } - UUID uuid = player.getUniqueId(); + boolean alreadyInside = playersInBubble.contains(uuid); - if (insideAny && !playersInBubble.contains(uuid)) { + if (insideAny && !alreadyInside) { playersInBubble.add(uuid); - Bukkit.getPluginManager().callEvent(new EnterCubeZoneEvent(player, cube)); - if (cube.corruptedBubbleTask != null) onPlayerEnterBubble(player); - } else if (!insideAny && playersInBubble.contains(uuid)) { + Bukkit.getPluginManager().callEvent(new EnterCubeZoneEvent(player, bestCube)); + onPlayerEnterBubble(player); + return; + } + + if (!insideAny && alreadyInside) { playersInBubble.remove(uuid); - if (cube.corruptedBubbleTask != null) onPlayerExitBubble(player); + onPlayerExitBubble(player); Bukkit.getPluginManager().callEvent(new ExitCubeZoneEvent(player)); } } @@ -108,29 +168,4 @@ public void onPlayerExitBubble(Player player) { attr.setBaseValue(0.08); player.removePotionEffect(PotionEffectType.JUMP_BOOST); } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - Player player = event.getPlayer(); - for (MultiBlock mb : MultiBlockManager.getMultiBlocks()) { - if (!(mb instanceof Cube cube)) continue; - - if (cube.corruptedBubbleTask == null) continue; - - Location center = cube.getCenter(); - double radius = cube.RADIUS_BUBBLE; - - if (!player.getWorld().equals(center.getWorld())) continue; - - boolean inside = player.getLocation().distance(center) <= radius; - - if (!inside) continue; - - AttributeInstance attr = player.getAttribute(Attribute.GRAVITY); - if (attr != null) { - attr.setBaseValue(0.08); - } - player.removePotionEffect(PotionEffectType.JUMP_BOOST); - } - } } \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/features/cube/tasks/CorruptedBubbleTask.java b/src/main/java/fr/openmc/core/features/cube/tasks/CorruptedBubbleTask.java new file mode 100644 index 000000000..ccf95b515 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/cube/tasks/CorruptedBubbleTask.java @@ -0,0 +1,73 @@ +package fr.openmc.core.features.cube.tasks; + +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.features.cube.Cube; +import fr.openmc.core.features.cube.events.CubeDesactivateBubbleEvent; +import fr.openmc.core.features.dream.DreamUtils; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.scheduler.BukkitRunnable; + +public class CorruptedBubbleTask extends BukkitRunnable { + private final Cube cube; + private final int radiusBubble; + private final int totalTicks; + private final int interval; + private int elapsed = 0; + + public CorruptedBubbleTask(Cube cube, int radiusBubble, int intervalCorruption, int totalTicks) { + this.cube = cube; + this.radiusBubble = radiusBubble; + this.totalTicks = totalTicks; + this.interval = intervalCorruption; + } + + @Override + public void run() { + if (elapsed >= totalTicks) { + cancel(); + cube.corruptedBubbleTask = null; + Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> + Bukkit.getPluginManager().callEvent(new CubeDesactivateBubbleEvent(cube))); + return; + } + + for (int i = 0; i < 30; i++) { + double theta = Math.random() * 2 * Math.PI; + double phi = Math.random() * Math.PI; + double r = Math.random() * radiusBubble; + + double x = r * Math.sin(phi) * Math.cos(theta); + double y = r * Math.cos(phi); + double z = r * Math.sin(phi) * Math.sin(theta); + + if (cube.isPartOf(new Location(cube.getCenter().getWorld(), x, y, z))) continue; + + Location loc = cube.getCenter().clone().add(x, y, z); + Block block = loc.getBlock(); + Material type = block.getType(); + + if (!DreamUtils.isDreamWorld(loc)) { + switch (type) { + case DIRT, GRASS_BLOCK, SAND, GRAVEL -> block.setType(Material.WARPED_NYLIUM); + case OAK_LOG, BIRCH_LOG, SPRUCE_LOG, JUNGLE_LOG, DARK_OAK_LOG, + ACACIA_LOG, MANGROVE_LOG -> block.setType(Material.WARPED_STEM); + case AIR, LAPIS_BLOCK -> { + } + default -> block.setType(Material.SCULK); + } + } else { + switch (type) { + case MUD -> block.setType(Material.SAND); + case AIR, LAPIS_BLOCK -> { + } + default -> block.setType(Material.GRASS_BLOCK); + } + } + } + + elapsed += interval; + } +} diff --git a/src/main/java/fr/openmc/core/features/cube/ReproductionTask.java b/src/main/java/fr/openmc/core/features/cube/tasks/ReproductionTask.java similarity index 97% rename from src/main/java/fr/openmc/core/features/cube/ReproductionTask.java rename to src/main/java/fr/openmc/core/features/cube/tasks/ReproductionTask.java index 0b392ff0b..2b4ebbc46 100644 --- a/src/main/java/fr/openmc/core/features/cube/ReproductionTask.java +++ b/src/main/java/fr/openmc/core/features/cube/tasks/ReproductionTask.java @@ -1,5 +1,6 @@ -package fr.openmc.core.features.cube; +package fr.openmc.core.features.cube.tasks; +import fr.openmc.core.features.cube.Cube; import fr.openmc.core.features.cube.multiblocks.MultiBlockManager; import org.bukkit.Location; import org.bukkit.Particle;