From 9455860554e0f08e4846ed5d0eba341591a35b98 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 9 Aug 2021 04:27:43 -0400 Subject: [PATCH] Fixes --- src/main/java/com/volmit/iris/Iris.java | 13 +- .../studio/CommandIrisStudioHotload.java | 3 + .../iris/core/events/IrisEngineEvent.java | 4 + .../volmit/iris/core/project/IrisProject.java | 10 +- .../com/volmit/iris/engine/IrisEngine.java | 1 - .../framework/EngineAssignedWorldManager.java | 14 ++ .../engine/platform/BukkitChunkGenerator.java | 30 ++++- .../iris/engine/platform/EngineProvider.java | 3 + .../java/com/volmit/iris/util/format/C.java | 23 +++- .../volmit/iris/util/plugin/VolmitSender.java | 125 +++++++++++++++++- 10 files changed, 205 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 1d1dcb9a2..8b341670a 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -30,6 +30,7 @@ import com.volmit.iris.core.link.OraxenLink; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.project.loader.IrisData; import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.object.noise.NoiseStyle; import com.volmit.iris.engine.platform.BukkitChunkGenerator; import com.volmit.iris.engine.object.biome.IrisBiome; import com.volmit.iris.engine.object.biome.IrisBiomeCustom; @@ -47,6 +48,7 @@ import com.volmit.iris.util.io.InstanceState; import com.volmit.iris.util.io.JarScanner; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.noise.CNG; import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.Metrics; import com.volmit.iris.util.plugin.Permission; @@ -68,6 +70,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.generator.ChunkGenerator; import org.bukkit.plugin.Plugin; @@ -170,7 +173,15 @@ public class Iris extends VolmitPlugin implements Listener { } public static void callEvent(Event e) { - J.s(() -> Bukkit.getPluginManager().callEvent(e)); + if(!e.isAsynchronous()) + { + J.s(() -> Bukkit.getPluginManager().callEvent(e)); + } + + else + { + Bukkit.getPluginManager().callEvent(e); + } } public static KList initialize(String s, Class slicedClass) { diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioHotload.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioHotload.java index 399f0c7a9..48febaa33 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioHotload.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioHotload.java @@ -23,8 +23,11 @@ import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.platform.PlatformChunkGenerator; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.MortarCommand; import com.volmit.iris.util.plugin.VolmitSender; +import com.volmit.iris.util.scheduling.J; import org.bukkit.World; import org.bukkit.entity.Player; diff --git a/src/main/java/com/volmit/iris/core/events/IrisEngineEvent.java b/src/main/java/com/volmit/iris/core/events/IrisEngineEvent.java index 11f2c1d4f..c33c5a37b 100644 --- a/src/main/java/com/volmit/iris/core/events/IrisEngineEvent.java +++ b/src/main/java/com/volmit/iris/core/events/IrisEngineEvent.java @@ -32,6 +32,10 @@ public class IrisEngineEvent extends Event { private static final HandlerList handlers = new HandlerList(); private Engine engine; + public IrisEngineEvent() { + super(true); + } + @Override public HandlerList getHandlers() { return handlers; diff --git a/src/main/java/com/volmit/iris/core/project/IrisProject.java b/src/main/java/com/volmit/iris/core/project/IrisProject.java index 08dd2ca88..7c0de8c13 100644 --- a/src/main/java/com/volmit/iris/core/project/IrisProject.java +++ b/src/main/java/com/volmit/iris/core/project/IrisProject.java @@ -198,11 +198,11 @@ public class IrisProject { double v = (double) gx.getEngine().getGenerated() / (double) req; if (sender.isPlayer()) { - sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generating " + Form.pc(v) + ((C.GRAY + " (" + (req - gx.getEngine().getGenerated()) + " Left)")))); - J.sleep(50); + sender.sendProgress(v, "Generating"); + J.sleep(16); } else { - sender.sendMessage(C.WHITE + "Generating " + Form.pc(v) + ((C.GRAY + " (" + (req - gx.getEngine().getGenerated()) + " Left)"))); - J.sleep(1000); + sender.sendProgress(v, "Generating"); + J.sleep(16); } } if (sender.isPlayer()) { @@ -225,7 +225,7 @@ public class IrisProject { assert world != null; sender.player().teleport(world.getSpawnLocation()); } else { - sender.sendMessage(C.WHITE + "Generating Complete!"); + sender.sendAction(C.IRIS + "Generation Complete"); } Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index 4b1e099b7..9895a8b1c 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -135,7 +135,6 @@ public class IrisEngine extends BlockPopulator implements Engine { effects = new IrisEngineEffects(this); art = J.ar(effects::tickRandomPlayer, 0); J.a(this::computeBiomeMaxes); - Iris.callEvent(new IrisEngineHotloadEvent(this)); context = new IrisContext(this); context.touch(); this.complex = new IrisComplex(this); diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java b/src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java index eb222f423..753192e5f 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java @@ -19,13 +19,17 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.Iris; +import com.volmit.iris.core.events.IrisEngineHotloadEvent; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.plugin.VolmitSender; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Sound; import org.bukkit.entity.EnderSignal; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; @@ -49,6 +53,16 @@ public abstract class EngineAssignedWorldManager extends EngineAssignedComponent taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::onTick, 0, 0); } + @EventHandler + public void on(IrisEngineHotloadEvent e) { + for(Player i : e.getEngine().getWorld().getPlayers()) + { + i.playSound(i.getLocation(), Sound.ITEM_TRIDENT_RETURN, 1f, 1.6f); + VolmitSender s = new VolmitSender(i); + s.sendTitle(C.IRIS + "Engine " + C.AQUA + "Hotloaded", 70, 60, 410); + } + } + @EventHandler public void on(WorldSaveEvent e) { if (e.getWorld().equals(getTarget().getWorld().realWorld())) { diff --git a/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java b/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java index f0a251905..4c3120b6a 100644 --- a/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java +++ b/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java @@ -19,6 +19,7 @@ package com.volmit.iris.engine.platform; import com.volmit.iris.Iris; +import com.volmit.iris.core.events.IrisEngineHotloadEvent; import com.volmit.iris.core.project.loader.IrisData; import com.volmit.iris.engine.IrisEngine; import com.volmit.iris.engine.data.chunk.TerrainChunk; @@ -31,7 +32,9 @@ import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.io.IO; import com.volmit.iris.util.io.ReactiveFolder; import com.volmit.iris.util.parallel.MultiBurst; +import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; +import com.volmit.iris.util.scheduling.Looper; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -45,10 +48,7 @@ import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.List; import java.util.Random; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChunkGenerator { private static final BlockData ERROR_BLOCK = Material.RED_GLAZED_TERRACOTTA.createBlockData(); @@ -58,18 +58,36 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun private final String dimensionKey; private final ReactiveFolder folder; private final KList populators; + private final ChronoLatch hotloadChecker; + private final Looper hotloader; private final boolean studio; public BukkitChunkGenerator(IrisWorld world, boolean studio, File dataLocation, String dimensionKey) { populators = new KList<>(); this.world = world; + this.hotloadChecker = new ChronoLatch(1000, false); this.studio = studio; this.dataLocation = dataLocation; this.dimensionKey = dimensionKey; - this.folder = new ReactiveFolder(dataLocation, (_a, _b, _c) -> initialize()); + this.folder = new ReactiveFolder(dataLocation, (_a, _b, _c) -> hotload()); this.provider = new EngineProvider(); initialize(); + + this.hotloader = new Looper() { + @Override + protected long loop() { + if(hotloadChecker.flip()) + { + folder.check(); + } + + return 250; + } + }; + hotloader.setPriority(Thread.MIN_PRIORITY); + hotloader.start(); + hotloader.setName(getTarget().getWorld().name() + " Hotloader"); } public Engine getEngine() @@ -84,6 +102,7 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun @Override public void close() { + hotloader.interrupt(); provider.close(); } @@ -92,7 +111,6 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun return studio; } - @Override public void hotload() { initialize(); @@ -103,6 +121,7 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun provider.provideEngine(world, dimensionKey, dataLocation, isStudio(), (e) -> { populators.clear(); populators.add((BlockPopulator) e); + folder.checkIgnore(); }); } @@ -110,6 +129,7 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random ignored, int x, int z, @NotNull BiomeGrid biome) { try { + Iris.debug("Generated " + x + " " + z); PrecisionStopwatch ps = PrecisionStopwatch.start(); TerrainChunk tc = TerrainChunk.create(world, biome); Hunk blocks = Hunk.view((ChunkData) tc); diff --git a/src/main/java/com/volmit/iris/engine/platform/EngineProvider.java b/src/main/java/com/volmit/iris/engine/platform/EngineProvider.java index bde7e7216..c3996af3f 100644 --- a/src/main/java/com/volmit/iris/engine/platform/EngineProvider.java +++ b/src/main/java/com/volmit/iris/engine/platform/EngineProvider.java @@ -18,6 +18,8 @@ package com.volmit.iris.engine.platform; +import com.volmit.iris.Iris; +import com.volmit.iris.core.events.IrisEngineHotloadEvent; import com.volmit.iris.core.project.loader.IrisData; import com.volmit.iris.engine.IrisEngine; import com.volmit.iris.engine.framework.Engine; @@ -46,6 +48,7 @@ public class EngineProvider { post.accept(engine); return engine; })); + engine.get().whenComplete((e, x) -> Iris.callEvent(new IrisEngineHotloadEvent(e))); } public Engine getEngine() diff --git a/src/main/java/com/volmit/iris/util/format/C.java b/src/main/java/com/volmit/iris/util/format/C.java index 5cda679ea..eab2ae239 100644 --- a/src/main/java/com/volmit/iris/util/format/C.java +++ b/src/main/java/com/volmit/iris/util/format/C.java @@ -19,6 +19,7 @@ package com.volmit.iris.util.format; import com.volmit.iris.Iris; +import com.volmit.iris.util.plugin.VolmitSender; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.TextComponent; import org.apache.commons.lang.Validate; @@ -368,6 +369,10 @@ public enum C { } public static String aura(String s, int hrad, int srad, int vrad) { + return aura(s, hrad, srad, vrad, 0.3D); + } + + public static String aura(String s, int hrad, int srad, int vrad, double pulse) { String msg = compress(s); StringBuilder b = new StringBuilder(); boolean c = false; @@ -379,11 +384,19 @@ public enum C { C o = C.getByChar(i); if (hrad != 0 || srad != 0 || vrad != 0) { - b.append(""); + if(pulse > 0) + { + b.append(VolmitSender.pulse(spinToHex(o, hrad, srad, vrad), spinToHex(o, -hrad, -srad, -vrad), pulse)); + } + + else + { + b.append(""); + } } else { b.append(C.getByChar(i).token); } diff --git a/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java b/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java index 3c3ee4321..53b5ce26c 100644 --- a/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java +++ b/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java @@ -21,10 +21,16 @@ package com.volmit.iris.util.plugin; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.math.M; +import com.volmit.iris.util.scheduling.J; import lombok.Getter; import lombok.Setter; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.transformation.inbuild.GradientTransformation; +import net.kyori.adventure.text.minimessage.transformation.inbuild.RainbowTransformation; +import net.kyori.adventure.title.Title; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -33,8 +39,14 @@ import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.plugin.Plugin; +import java.time.Duration; import java.util.Set; import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; /** * Represents a volume sender. A command sender with extra crap in it @@ -181,6 +193,114 @@ public class VolmitSender implements CommandSender { s.sendMessage("========================================================"); } + public void sendTitle(String title, String subtitle, int i, int s, int o) + { + Iris.audiences.player(player()).showTitle(Title.title( + createComponent(title), + createComponent(subtitle), + Title.Times.of(Duration.ofMillis(i), Duration.ofMillis(s), Duration.ofMillis(o)))); + } + + public static long getTick() + { + return M.ms() / 16; + } + + public void sendProgress(double percent, String thing) + { + if(percent < 0) + { + int l = 44; + int g = (int) (1D * l); + sendTitle(C.IRIS + thing + " ", 0, 500, 250); + sendActionNoProcessing("" + "" + pulse("#00ff80","#00373d",1D)+" " + Form.repeat(" ", g) + "" + Form.repeat(" ", l - g)); + } + + else + { + int l = 44; + int g = (int) (percent * l); + sendTitle(C.IRIS + thing + " " + C.BLUE + "" + Form.pc(percent, 0), 0, 500, 250); + sendActionNoProcessing("" + "" + pulse("#00ff80","#00373d",1D)+" " + Form.repeat(" ", g) + "" + Form.repeat(" ", l - g)); + } + } + + public static String pulse(String colorA, String colorB, double speed) + { + return ""; + } + + public static String pulse(double speed) { + return Form.f(invertSpread((((getTick()*15D * speed)%1000D)/1000D)), 3); + } + + public static double invertSpread(double v) { + return ((1D - v) * 2D) - 1D; + } + + public void sendAction(String action) + { + Iris.audiences.player(player()).sendActionBar(createNoPrefixComponent(action)); + } + + public void sendActionNoProcessing(String action) + { + Iris.audiences.player(player()).sendActionBar(createNoPrefixComponentNoProcessing(action)); + } + + public void sendTitle(String subtitle, int i, int s, int o) + { + Iris.audiences.player(player()).showTitle(Title.title( + createNoPrefixComponent(" "), + createNoPrefixComponent(subtitle), + Title.Times.of(Duration.ofMillis(i), Duration.ofMillis(s), Duration.ofMillis(o)))); + } + + private Component createNoPrefixComponent(String message) + { + String t = C.translateAlternateColorCodes('&', message); + String a = C.aura(t, IrisSettings.get().getGeneral().getSpinh(), IrisSettings.get().getGeneral().getSpins(), IrisSettings.get().getGeneral().getSpinb(), 0.36); + return MiniMessage.get().parse(a); + } + + private Component createNoPrefixComponentNoProcessing(String message) + { + return MiniMessage.get().parse(message); + } + + private Component createComponent(String message) + { + String t = C.translateAlternateColorCodes('&', getTag() + message); + String a = C.aura(t, IrisSettings.get().getGeneral().getSpinh(), IrisSettings.get().getGeneral().getSpins(), IrisSettings.get().getGeneral().getSpinb()); + return MiniMessage.get().parse(a); + } + + public void showWaiting(String passive, CompletableFuture f) + { + AtomicInteger v = new AtomicInteger(); + AtomicReference g = new AtomicReference<>(); + v.set(J.ar(() -> { + if(f.isDone() && g.get() != null) + { + J.car(v.get()); + sendAction(" "); + return; + } + + sendProgress(-1, passive); + }, 0)); + J.a(() -> { + try { + g.set(f.get()); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + }); + + } + @Override public void sendMessage(String message) { if (message.contains("")) { @@ -189,10 +309,7 @@ public class VolmitSender implements CommandSender { } try { - String t = C.translateAlternateColorCodes('&', getTag() + message); - String a = C.aura(t, IrisSettings.get().getGeneral().getSpinh(), IrisSettings.get().getGeneral().getSpins(), IrisSettings.get().getGeneral().getSpinb()); - Component c = MiniMessage.get().parse(a); - Iris.audiences.sender(s).sendMessage(c); + Iris.audiences.sender(s).sendMessage(createComponent(message)); } catch (Throwable e) { String t = C.translateAlternateColorCodes('&', getTag() + message); String a = C.aura(t, IrisSettings.get().getGeneral().getSpinh(), IrisSettings.get().getGeneral().getSpins(), IrisSettings.get().getGeneral().getSpinb());