diff --git a/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarManager.java b/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarManager.java index efce3629e..70bebd142 100644 --- a/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarManager.java +++ b/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarManager.java @@ -3,6 +3,8 @@ import fr.openmc.core.OMCPlugin; import fr.openmc.core.features.dream.events.AltarBindEvent; import fr.openmc.core.features.dream.events.AltarCraftingEvent; +import fr.openmc.core.features.dream.mecanism.altar.tasks.AltarCheckTask; +import fr.openmc.core.features.dream.mecanism.altar.tasks.AltarParticlesTask; import fr.openmc.core.features.dream.models.registry.items.DreamItem; import fr.openmc.core.features.dream.registries.DreamItemRegistry; import fr.openmc.core.utils.bukkit.ItemUtils; diff --git a/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarParticlesTask.java b/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarParticlesTask.java deleted file mode 100644 index 749a2ee39..000000000 --- a/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarParticlesTask.java +++ /dev/null @@ -1,46 +0,0 @@ -package fr.openmc.core.features.dream.mecanism.altar; - -import fr.openmc.core.features.dream.models.registry.DreamBlock; -import fr.openmc.core.features.dream.registries.DreamBlocksRegistry; -import org.bukkit.Location; -import org.bukkit.Particle; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.List; - -public class AltarParticlesTask extends BukkitRunnable { - - @Override - public void run() { - List altars = DreamBlocksRegistry.getDreamBlocksByType("altar"); - if (altars.isEmpty()) return; - - for (DreamBlock altar : altars) { - Location center = altar.location().clone().add(0.5, 1.5, 0.5); - - boolean nearby = false; - for (Player player : center.getWorld().getPlayers()) { - if (player.getLocation().distanceSquared(center) <= 30 * 30) { - nearby = true; - break; - } - } - - if (!nearby) continue; - - for (int i = 0; i < 360; i += 20) { - double radians = Math.toRadians(i); - double x = Math.cos(radians) * 0.7; - double z = Math.sin(radians) * 0.7; - - center.getWorld().spawnParticle( - Particle.DUST, - center.clone().add(x, 0, z), - 1, - new Particle.DustOptions(org.bukkit.Color.ORANGE, 1.5f) - ); - } - } - } -} diff --git a/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarCheckTask.java b/src/main/java/fr/openmc/core/features/dream/mecanism/altar/tasks/AltarCheckTask.java similarity index 91% rename from src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarCheckTask.java rename to src/main/java/fr/openmc/core/features/dream/mecanism/altar/tasks/AltarCheckTask.java index d3864747d..d5e5a3624 100644 --- a/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarCheckTask.java +++ b/src/main/java/fr/openmc/core/features/dream/mecanism/altar/tasks/AltarCheckTask.java @@ -1,5 +1,6 @@ -package fr.openmc.core.features.dream.mecanism.altar; +package fr.openmc.core.features.dream.mecanism.altar.tasks; +import fr.openmc.core.features.dream.mecanism.altar.AltarManager; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; diff --git a/src/main/java/fr/openmc/core/features/dream/mecanism/altar/tasks/AltarParticlesTask.java b/src/main/java/fr/openmc/core/features/dream/mecanism/altar/tasks/AltarParticlesTask.java new file mode 100644 index 000000000..04d813df3 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/dream/mecanism/altar/tasks/AltarParticlesTask.java @@ -0,0 +1,72 @@ +package fr.openmc.core.features.dream.mecanism.altar.tasks; + +import fr.openmc.core.features.dream.generation.DreamDimensionManager; +import fr.openmc.core.features.dream.models.registry.DreamBlock; +import fr.openmc.core.features.dream.registries.DreamBlocksRegistry; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; + +public class AltarParticlesTask extends BukkitRunnable { + + private static final List CIRCLE_PARTICLE = new ArrayList<>(); + + static { + for (int i = 0; i < 360; i += 20) { + double radians = Math.toRadians(i); + CIRCLE_PARTICLE.add(new Vector( + Math.cos(radians) * 0.7, + 0, + Math.sin(radians) * 0.7 + )); + } + } + + @Override + public void run() { + if (Bukkit.getOnlinePlayers().isEmpty()) return; + + for (Player player : Bukkit.getOnlinePlayers()) { + if (!player.getWorld().getName().equals(DreamDimensionManager.DIMENSION_NAME)) continue; + Location playerLoc = player.getLocation(); + World world = playerLoc.getWorld(); + + List altars = DreamBlocksRegistry.getDreamBlocksByType("altar"); + + for (DreamBlock altar : altars) { + if (altar.location().getWorld() != world) continue; + + Location center = altar.location(); + + if (center.distanceSquared(playerLoc) > 30 * 30) continue; + + spawnCircleParticles(center); + } + } + } + + private void spawnCircleParticles(Location base) { + World world = base.getWorld(); + double x = base.getX() + 0.5; + double y = base.getY() + 1.5; + double z = base.getZ() + 0.5; + + for (Vector vec : CIRCLE_PARTICLE) { + world.spawnParticle( + Particle.DUST, + x + vec.getX(), + y, + z + vec.getZ(), + 1, + new Particle.DustOptions(org.bukkit.Color.ORANGE, 1.5f) + ); + } + } +} diff --git a/src/main/java/fr/openmc/core/features/dream/registries/DreamBlocksRegistry.java b/src/main/java/fr/openmc/core/features/dream/registries/DreamBlocksRegistry.java index f9ec9c486..0f29f3171 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/DreamBlocksRegistry.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/DreamBlocksRegistry.java @@ -18,7 +18,9 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class DreamBlocksRegistry { @@ -27,6 +29,8 @@ public class DreamBlocksRegistry { private static final List dreamBlocks = new ArrayList<>(); + private static final Map> cacheByType = new HashMap<>(); + public static void init() { OMCPlugin.registerEvents( new DreamBlocksListeners(), @@ -84,15 +88,12 @@ public static void addDreamBlock(String type, Location loc) { DreamBlock entry = new DreamBlock(type, loc); if (!dreamBlocks.contains(entry)) { dreamBlocks.add(entry); + cacheByType.computeIfAbsent(type.toLowerCase(), k -> new ArrayList<>()) + .add(entry); save(); } } - public static void removeDreamBlock(Location loc) { - dreamBlocks.removeIf(e -> e.location().equals(loc)); - save(); - } - public static boolean isDreamBlock(Location loc) { return dreamBlocks.stream().anyMatch(e -> e.location().equals(loc)); } @@ -106,6 +107,6 @@ public static List getDreamBlocks() { } public static List getDreamBlocksByType(String type) { - return dreamBlocks.stream().filter(e -> e.type().equalsIgnoreCase(type)).toList(); + return cacheByType.getOrDefault(type.toLowerCase(), new ArrayList<>()); } } \ No newline at end of file