From 3981b0976d516b5af6db7edfc78919d2376feeb8 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Sat, 20 Sep 2025 23:05:16 +0200 Subject: [PATCH] cleanup command framework and fix random locator fails --- .../iris/core/commands/CommandDeveloper.java | 3 +- .../iris/core/commands/CommandJigsaw.java | 4 +- .../iris/core/commands/CommandObject.java | 6 +- .../iris/core/commands/CommandStudio.java | 4 +- .../volmit/iris/core/service/CommandSVC.java | 10 ++- .../volmit/iris/engine/framework/Engine.java | 4 +- .../iris/util/decree/DecreeContext.java | 21 ++--- .../iris/util/decree/DecreeExecutor.java | 9 +++ .../util/decree/DecreeParameterHandler.java | 2 +- .../volmit/iris/util/decree/DecreeSystem.java | 27 ++++--- .../util/decree/handlers/BiomeHandler.java | 59 +------------- .../util/decree/handlers/CaveHandler.java | 58 +------------- .../decree/handlers/DimensionHandler.java | 53 ++----------- .../util/decree/handlers/EntityHandler.java | 79 +------------------ .../decree/handlers/GeneratorHandler.java | 55 +------------ .../decree/handlers/JigsawPieceHandler.java | 58 +------------- .../decree/handlers/JigsawPoolHandler.java | 58 +------------- .../handlers/JigsawStructureHandler.java | 58 +------------- .../util/decree/handlers/RegionHandler.java | 58 +------------- .../util/decree/handlers/ScriptHandler.java | 55 +------------ .../NullableDimensionHandler.java | 54 +------------ .../decree/specialhandlers/ObjectHandler.java | 6 +- .../specialhandlers/RegistrantHandler.java | 73 +++++++++++++++++ .../decree/virtual/VirtualDecreeCommand.java | 32 +++++--- 24 files changed, 196 insertions(+), 650 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/util/decree/specialhandlers/RegistrantHandler.java diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index d1c1f169a..5b0ab41cf 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -71,7 +71,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import java.util.stream.Stream; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -159,7 +158,7 @@ public class CommandDeveloper implements DecreeExecutor { @SneakyThrows @Decree(description = "Generate Iris structures for all loaded datapack structures") public void generateStructures( - @Param(description = "The pack to add the generated structures to", aliases = "pack", defaultValue = "---", customHandler = NullableDimensionHandler.class) + @Param(description = "The pack to add the generated structures to", aliases = "pack", defaultValue = "null", customHandler = NullableDimensionHandler.class) IrisDimension dimension, @Param(description = "Ignore existing structures", defaultValue = "false") boolean force diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java b/core/src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java index 3022b866c..7777f1764 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java @@ -48,7 +48,7 @@ public class CommandJigsaw implements DecreeExecutor { IrisJigsawPiece piece ) { File dest = piece.getLoadFile(); - new JigsawEditor(player(), piece, IrisData.loadAnyObject(piece.getObject()), dest); + new JigsawEditor(player(), piece, IrisData.loadAnyObject(piece.getObject(), data()), dest); } @Decree(description = "Place a jigsaw structure") @@ -78,7 +78,7 @@ public class CommandJigsaw implements DecreeExecutor { @Param(description = "The object to use for this piece", customHandler = ObjectHandler.class) String object ) { - IrisObject o = IrisData.loadAnyObject(object); + IrisObject o = IrisData.loadAnyObject(object, data()); if (object == null) { sender().sendMessage(C.RED + "Failed to find existing object"); diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandObject.java b/core/src/main/java/com/volmit/iris/core/commands/CommandObject.java index ccbf91c11..fd057b300 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandObject.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandObject.java @@ -136,7 +136,7 @@ public class CommandObject implements DecreeExecutor { @Param(description = "The object to analyze", customHandler = ObjectHandler.class) String object ) { - IrisObject o = IrisData.loadAnyObject(object); + IrisObject o = IrisData.loadAnyObject(object, data()); sender().sendMessage("Object Size: " + o.getW() + " * " + o.getH() + " * " + o.getD() + ""); sender().sendMessage("Blocks Used: " + NumberFormat.getIntegerInstance().format(o.getBlocks().size())); @@ -201,7 +201,7 @@ public class CommandObject implements DecreeExecutor { @Decree(description = "Shrink an object to its minimum size") public void shrink(@Param(description = "The object to shrink", customHandler = ObjectHandler.class) String object) { - IrisObject o = IrisData.loadAnyObject(object); + IrisObject o = IrisData.loadAnyObject(object, data()); sender().sendMessage("Current Object Size: " + o.getW() + " * " + o.getH() + " * " + o.getD()); o.shrinkwrap(); sender().sendMessage("New Object Size: " + o.getW() + " * " + o.getH() + " * " + o.getD()); @@ -325,7 +325,7 @@ public class CommandObject implements DecreeExecutor { // @Param(description = "The scale interpolator to use", defaultValue = "none") // IrisObjectPlacementScaleInterpolator interpolator ) { - IrisObject o = IrisData.loadAnyObject(object); + IrisObject o = IrisData.loadAnyObject(object, data()); double maxScale = Double.max(10 - o.getBlocks().size() / 10000d, 1); if (scale > maxScale) { sender().sendMessage(C.YELLOW + "Indicated scale exceeds maximum. Downscaled to maximum: " + maxScale); diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java index 6ebb7bac1..555ce4f48 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java @@ -171,9 +171,9 @@ public class CommandStudio implements DecreeExecutor { var loc = player().getLocation().clone(); J.a(() -> { - DecreeContext.touch(sender); PlatformChunkGenerator plat = IrisToolbelt.access(world); Engine engine = plat.getEngine(); + DecreeContext.touch(sender); try (SyncExecutor executor = new SyncExecutor(20)) { int x = loc.getBlockX() >> 4; int z = loc.getBlockZ() >> 4; @@ -247,6 +247,8 @@ public class CommandStudio implements DecreeExecutor { } catch (Throwable e) { sender().sendMessage("Error while regenerating chunks"); e.printStackTrace(); + } finally { + DecreeContext.remove(); } }); } diff --git a/core/src/main/java/com/volmit/iris/core/service/CommandSVC.java b/core/src/main/java/com/volmit/iris/core/service/CommandSVC.java index d2e56d587..7ca3ba94e 100644 --- a/core/src/main/java/com/volmit/iris/core/service/CommandSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/CommandSVC.java @@ -23,6 +23,7 @@ import com.volmit.iris.core.commands.CommandIris; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.decree.DecreeContext; import com.volmit.iris.util.decree.DecreeSystem; import com.volmit.iris.util.decree.virtual.VirtualDecreeCommand; import com.volmit.iris.util.format.C; @@ -44,7 +45,14 @@ public class CommandSVC implements IrisService, DecreeSystem { @Override public void onEnable() { Iris.instance.getCommand("iris").setExecutor(this); - J.a(() -> getRoot().cacheAll()); + J.a(() -> { + DecreeContext.touch(Iris.getSender()); + try { + getRoot().cacheAll(); + } finally { + DecreeContext.remove(); + } + }); } @Override diff --git a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java index e6ac9f954..9d5cfad00 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -863,7 +863,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat default void gotoBiome(IrisBiome biome, Player player, boolean teleport) { Set regionKeys = getDimension() .getAllRegions(this).stream() - .filter((i) -> i.getAllBiomes(this).contains(biome)) + .filter((i) -> i.getAllBiomeIds().contains(biome.getLoadKey())) .map(IrisRegistrant::getLoadKey) .collect(Collectors.toSet()); Locator lb = Locator.surfaceBiome(biome.getLoadKey()); @@ -959,7 +959,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat } default void gotoRegion(IrisRegion r, Player player, boolean teleport) { - if (!getDimension().getAllRegions(this).contains(r)) { + if (!getDimension().getRegions().contains(r.getLoadKey())) { player.sendMessage(C.RED + r.getName() + " is not defined in the dimension!"); return; } diff --git a/core/src/main/java/com/volmit/iris/util/decree/DecreeContext.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeContext.java index f8ee1e233..b19fe32f4 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/DecreeContext.java +++ b/core/src/main/java/com/volmit/iris/util/decree/DecreeContext.java @@ -18,29 +18,20 @@ package com.volmit.iris.util.decree; -import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.plugin.VolmitSender; -import com.volmit.iris.util.scheduling.ChronoLatch; public class DecreeContext { - private static final ChronoLatch cl = new ChronoLatch(60000); - private static final KMap context = new KMap<>(); + private static final ThreadLocal context = new ThreadLocal<>(); public static VolmitSender get() { - return context.get(Thread.currentThread()); + return context.get(); } public static void touch(VolmitSender c) { - synchronized (context) { - context.put(Thread.currentThread(), c); + context.set(c); + } - if (cl.flip()) { - for (Thread i : context.k()) { - if (!i.isAlive()) { - context.remove(i); - } - } - } - } + public static void remove() { + context.remove(); } } diff --git a/core/src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java index 8d25d6ca3..12404d1c0 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java +++ b/core/src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java @@ -18,6 +18,7 @@ package com.volmit.iris.util.decree; +import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.platform.PlatformChunkGenerator; @@ -34,6 +35,14 @@ public interface DecreeExecutor { return sender().player(); } + default IrisData data() { + var access = access(); + if (access != null) { + return access.getData(); + } + return null; + } + default Engine engine() { if (sender().isPlayer() && IrisToolbelt.access(sender().player().getWorld()) != null) { PlatformChunkGenerator gen = IrisToolbelt.access(sender().player().getWorld()); diff --git a/core/src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java index ee959d2b3..097361799 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java @@ -23,7 +23,7 @@ import com.volmit.iris.util.decree.exceptions.DecreeParsingException; import java.util.concurrent.atomic.AtomicReference; -public interface DecreeParameterHandler { +public interface DecreeParameterHandler extends DecreeExecutor { /** * Should return the possible values for this type * diff --git a/core/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java b/core/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java index d22a8b822..5edacb51f 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java +++ b/core/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java @@ -133,23 +133,32 @@ public interface DecreeSystem extends CommandExecutor, TabCompleter { default boolean call(VolmitSender sender, String[] args) { DecreeContext.touch(sender); - return getRoot().invoke(sender, enhanceArgs(args)); + try { + return getRoot().invoke(sender, enhanceArgs(args)); + } finally { + DecreeContext.remove(); + } } @Nullable @Override default List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { - KList enhanced = new KList<>(args); - KList v = getRoot().tabComplete(enhanced, enhanced.toString(" ")); - v.removeDuplicates(); + DecreeContext.touch(new VolmitSender(sender)); + try { + KList enhanced = new KList<>(args); + KList v = getRoot().tabComplete(enhanced, enhanced.toString(" ")); + v.removeDuplicates(); - if (sender instanceof Player) { - if (IrisSettings.get().getGeneral().isCommandSounds()) { - ((Player) sender).playSound(((Player) sender).getLocation(), Sound.BLOCK_AMETHYST_BLOCK_CHIME, 0.25f, RNG.r.f(0.125f, 1.95f)); + if (sender instanceof Player) { + if (IrisSettings.get().getGeneral().isCommandSounds()) { + ((Player) sender).playSound(((Player) sender).getLocation(), Sound.BLOCK_AMETHYST_BLOCK_CHIME, 0.25f, RNG.r.f(0.125f, 1.95f)); + } } - } - return v; + return v; + } finally { + DecreeContext.remove(); + } } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java index ca950c8e6..36f78ee16 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java @@ -18,63 +18,12 @@ package com.volmit.iris.util.decree.handlers; -import com.volmit.iris.Iris; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.IrisBiome; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.specialhandlers.RegistrantHandler; -import java.io.File; -import java.util.stream.Collectors; - -public class BiomeHandler implements DecreeParameterHandler { - @Override - public KList getPossibilities() { - KMap p = new KMap<>(); - - //noinspection ConstantConditions - for (File i : Iris.instance.getDataFolder("packs").listFiles()) { - if (i.isDirectory()) { - IrisData data = IrisData.get(i); - for (IrisBiome j : data.getBiomeLoader().loadAll(data.getBiomeLoader().getPossibleKeys())) { - p.putIfAbsent(j.getLoadKey(), j); - } - - data.close(); - } - } - - return p.v(); - } - - @Override - public String toString(IrisBiome dim) { - return dim.getLoadKey(); - } - - @Override - public IrisBiome parse(String in, boolean force) throws DecreeParsingException { - if (in.equals("null")) { - return null; - } - KList options = getPossibilities(in); - - if (options.isEmpty()) { - throw new DecreeParsingException("Unable to find Biome \"" + in + "\""); - } - - try { - return options.stream().filter((i) -> toString(i).equalsIgnoreCase(in)).collect(Collectors.toList()).get(0); - } catch (Throwable e) { - throw new DecreeParsingException("Unable to filter which Biome \"" + in + "\""); - } - } - - @Override - public boolean supports(Class type) { - return type.equals(IrisBiome.class); +public class BiomeHandler extends RegistrantHandler { + public BiomeHandler() { + super(IrisBiome.class, true); } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/handlers/CaveHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/CaveHandler.java index db8f86651..bd14aab68 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/handlers/CaveHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/handlers/CaveHandler.java @@ -18,62 +18,12 @@ package com.volmit.iris.util.decree.handlers; -import com.volmit.iris.Iris; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.IrisCave; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.specialhandlers.RegistrantHandler; -import java.io.File; -import java.util.stream.Collectors; - -public class CaveHandler implements DecreeParameterHandler { - @Override - public KList getPossibilities() { - KMap p = new KMap<>(); - - //noinspection ConstantConditions - for (File i : Iris.instance.getDataFolder("packs").listFiles()) { - if (i.isDirectory()) { - IrisData data = IrisData.get(i); - for (IrisCave j : data.getCaveLoader().loadAll(data.getCaveLoader().getPossibleKeys())) { - p.putIfAbsent(j.getLoadKey(), j); - } - - data.close(); - } - } - - return p.v(); - } - - @Override - public String toString(IrisCave dim) { - return dim.getLoadKey(); - } - - @Override - public IrisCave parse(String in, boolean force) throws DecreeParsingException { - if (in.equals("null")) { - return null; - } - KList options = getPossibilities(in); - - if (options.isEmpty()) { - throw new DecreeParsingException("Unable to find Cave \"" + in + "\""); - } - try { - return options.stream().filter((i) -> toString(i).equalsIgnoreCase(in)).collect(Collectors.toList()).get(0); - } catch (Throwable e) { - throw new DecreeParsingException("Unable to filter which Cave\"" + in + "\""); - } - } - - @Override - public boolean supports(Class type) { - return type.equals(IrisCave.class); +public class CaveHandler extends RegistrantHandler { + public CaveHandler() { + super(IrisCave.class, true); } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java index 5d36af07f..d8eeb998c 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java @@ -18,65 +18,22 @@ package com.volmit.iris.util.decree.handlers; -import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.IrisDimension; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeParameterHandler; import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.specialhandlers.RegistrantHandler; -import java.io.File; - -public class DimensionHandler implements DecreeParameterHandler { - @Override - public KList getPossibilities() { - KMap p = new KMap<>(); - - //noinspection ConstantConditions - for (File i : Iris.instance.getDataFolder("packs").listFiles()) { - if (i.isDirectory()) { - IrisData data = IrisData.get(i); - for (IrisDimension j : data.getDimensionLoader().loadAll(data.getDimensionLoader().getPossibleKeys())) { - p.putIfAbsent(j.getLoadKey(), j); - } - - data.close(); - } - } - - return p.v(); - } - - @Override - public String toString(IrisDimension dim) { - return dim.getLoadKey(); +public class DimensionHandler extends RegistrantHandler { + public DimensionHandler() { + super(IrisDimension.class, false); } @Override public IrisDimension parse(String in, boolean force) throws DecreeParsingException { - if (in.equalsIgnoreCase("default")) { return parse(IrisSettings.get().getGenerator().getDefaultWorldType()); } - - KList options = getPossibilities(in); - - - if (options.isEmpty()) { - throw new DecreeParsingException("Unable to find Dimension \"" + in + "\""); - } - try { - return options.stream().filter((i) -> toString(i).equalsIgnoreCase(in)).toList().get(0); - } catch (Throwable e) { - throw new DecreeParsingException("Unable to filter which Dimension \"" + in + "\""); - } - } - - @Override - public boolean supports(Class type) { - return type.equals(IrisDimension.class); + return super.parse(in, force); } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java index 01034c747..3cf4b4e08 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java @@ -18,84 +18,13 @@ package com.volmit.iris.util.decree.handlers; -import com.volmit.iris.Iris; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.IrisEntity; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.specialhandlers.RegistrantHandler; -import java.io.File; -import java.util.stream.Collectors; +public class EntityHandler extends RegistrantHandler { -public class EntityHandler implements DecreeParameterHandler { - - /** - * Should return the possible values for this type - * - * @return Possibilities for this type. - */ - @Override - public KList getPossibilities() { - KMap p = new KMap<>(); - - //noinspection ConstantConditions - for (File i : Iris.instance.getDataFolder("packs").listFiles()) { - if (i.isDirectory()) { - IrisData data = IrisData.get(i); - for (IrisEntity j : data.getEntityLoader().loadAll(data.getEntityLoader().getPossibleKeys())) { - p.putIfAbsent(j.getLoadKey(), j); - } - - data.close(); - } - } - - return p.v(); - } - - /** - * Converting the type back to a string (inverse of the {@link #parse(String) parse} method) - * - * @param entity The input of the designated type to convert to a String - * @return The resulting string - */ - @Override - public String toString(IrisEntity entity) { - return entity.getLoadKey(); - } - - /** - * Should parse a String into the designated type - * - * @param in The string to parse - * @return The value extracted from the string, of the designated type - * @throws DecreeParsingException Thrown when the parsing fails (ex: "oop" translated to an integer throws this) - */ - @Override - public IrisEntity parse(String in, boolean force) throws DecreeParsingException { - KList options = getPossibilities(in); - - if (options.isEmpty()) { - throw new DecreeParsingException("Unable to find Entity \"" + in + "\""); - } - try { - return options.stream().filter((i) -> toString(i).equalsIgnoreCase(in)).collect(Collectors.toList()).get(0); - } catch (Throwable e) { - throw new DecreeParsingException("Unable to filter which Entity \"" + in + "\""); - } - } - - /** - * Returns whether a certain type is supported by this handler
- * - * @param type The type to check - * @return True if supported, false if not - */ - @Override - public boolean supports(Class type) { - return type.equals(IrisEntity.class); + public EntityHandler() { + super(IrisEntity.class, false); } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java index 7a89ef155..8b1baf0ae 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java @@ -18,59 +18,12 @@ package com.volmit.iris.util.decree.handlers; -import com.volmit.iris.Iris; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.IrisGenerator; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.specialhandlers.RegistrantHandler; -import java.io.File; -import java.util.stream.Collectors; - -public class GeneratorHandler implements DecreeParameterHandler { - @Override - public KList getPossibilities() { - KMap p = new KMap<>(); - - //noinspection ConstantConditions - for (File i : Iris.instance.getDataFolder("packs").listFiles()) { - if (i.isDirectory()) { - IrisData data = IrisData.get(i); - for (IrisGenerator j : data.getGeneratorLoader().loadAll(data.getGeneratorLoader().getPossibleKeys())) { - p.putIfAbsent(j.getLoadKey(), j); - } - - data.close(); - } - } - - return p.v(); - } - - @Override - public String toString(IrisGenerator gen) { - return gen.getLoadKey(); - } - - @Override - public IrisGenerator parse(String in, boolean force) throws DecreeParsingException { - KList options = getPossibilities(in); - - if (options.isEmpty()) { - throw new DecreeParsingException("Unable to find Generator \"" + in + "\""); - } - try { - return options.stream().filter((i) -> toString(i).equalsIgnoreCase(in)).collect(Collectors.toList()).get(0); - } catch (Throwable e) { - throw new DecreeParsingException("Unable to filter which Generator \"" + in + "\""); - } - } - - @Override - public boolean supports(Class type) { - return type.equals(IrisGenerator.class); +public class GeneratorHandler extends RegistrantHandler { + public GeneratorHandler() { + super(IrisGenerator.class, false); } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPieceHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPieceHandler.java index 0457674be..3199d3039 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPieceHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPieceHandler.java @@ -18,62 +18,12 @@ package com.volmit.iris.util.decree.handlers; -import com.volmit.iris.Iris; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.IrisJigsawPiece; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.specialhandlers.RegistrantHandler; -import java.io.File; -import java.util.stream.Collectors; - -public class JigsawPieceHandler implements DecreeParameterHandler { - @Override - public KList getPossibilities() { - KMap p = new KMap<>(); - - //noinspection ConstantConditions - for (File i : Iris.instance.getDataFolder("packs").listFiles()) { - if (i.isDirectory()) { - IrisData data = IrisData.get(i); - for (IrisJigsawPiece j : data.getJigsawPieceLoader().loadAll(data.getJigsawPieceLoader().getPossibleKeys())) { - p.putIfAbsent(j.getLoadKey(), j); - } - - data.close(); - } - } - - return p.v(); - } - - @Override - public String toString(IrisJigsawPiece dim) { - return dim.getLoadKey(); - } - - @Override - public IrisJigsawPiece parse(String in, boolean force) throws DecreeParsingException { - if (in.equals("null")) { - return null; - } - KList options = getPossibilities(in); - - if (options.isEmpty()) { - throw new DecreeParsingException("Unable to find Jigsaw Piece \"" + in + "\""); - } - try { - return options.stream().filter((i) -> toString(i).equalsIgnoreCase(in)).collect(Collectors.toList()).get(0); - } catch (Throwable e) { - throw new DecreeParsingException("Unable to filter which Jigsaw Piece \"" + in + "\""); - } - } - - @Override - public boolean supports(Class type) { - return type.equals(IrisJigsawPiece.class); +public class JigsawPieceHandler extends RegistrantHandler { + public JigsawPieceHandler() { + super(IrisJigsawPiece.class, true); } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPoolHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPoolHandler.java index da29d9fe8..83a14ab4c 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPoolHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawPoolHandler.java @@ -18,62 +18,12 @@ package com.volmit.iris.util.decree.handlers; -import com.volmit.iris.Iris; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.IrisJigsawPool; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.specialhandlers.RegistrantHandler; -import java.io.File; -import java.util.stream.Collectors; - -public class JigsawPoolHandler implements DecreeParameterHandler { - @Override - public KList getPossibilities() { - KMap p = new KMap<>(); - - //noinspection ConstantConditions - for (File i : Iris.instance.getDataFolder("packs").listFiles()) { - if (i.isDirectory()) { - IrisData data = IrisData.get(i); - for (IrisJigsawPool j : data.getJigsawPoolLoader().loadAll(data.getJigsawPoolLoader().getPossibleKeys())) { - p.putIfAbsent(j.getLoadKey(), j); - } - - data.close(); - } - } - - return p.v(); - } - - @Override - public String toString(IrisJigsawPool dim) { - return dim.getLoadKey(); - } - - @Override - public IrisJigsawPool parse(String in, boolean force) throws DecreeParsingException { - if (in.equals("null")) { - return null; - } - KList options = getPossibilities(in); - - if (options.isEmpty()) { - throw new DecreeParsingException("Unable to find Jigsaw Pool \"" + in + "\""); - } - try { - return options.stream().filter((i) -> toString(i).equalsIgnoreCase(in)).collect(Collectors.toList()).get(0); - } catch (Throwable e) { - throw new DecreeParsingException("Unable to filter which Jigsaw Pool \"" + in + "\""); - } - } - - @Override - public boolean supports(Class type) { - return type.equals(IrisJigsawPool.class); +public class JigsawPoolHandler extends RegistrantHandler { + public JigsawPoolHandler() { + super(IrisJigsawPool.class, true); } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawStructureHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawStructureHandler.java index 21dec6246..b7d6e35cd 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawStructureHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/handlers/JigsawStructureHandler.java @@ -18,62 +18,12 @@ package com.volmit.iris.util.decree.handlers; -import com.volmit.iris.Iris; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.IrisJigsawStructure; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.specialhandlers.RegistrantHandler; -import java.io.File; -import java.util.stream.Collectors; - -public class JigsawStructureHandler implements DecreeParameterHandler { - @Override - public KList getPossibilities() { - KMap p = new KMap<>(); - - //noinspection ConstantConditions - for (File i : Iris.instance.getDataFolder("packs").listFiles()) { - if (i.isDirectory()) { - IrisData data = IrisData.get(i); - for (IrisJigsawStructure j : data.getJigsawStructureLoader().loadAll(data.getJigsawStructureLoader().getPossibleKeys())) { - p.putIfAbsent(j.getLoadKey(), j); - } - - data.close(); - } - } - - return p.v(); - } - - @Override - public String toString(IrisJigsawStructure dim) { - return dim.getLoadKey(); - } - - @Override - public IrisJigsawStructure parse(String in, boolean force) throws DecreeParsingException { - if (in.equals("null")) { - return null; - } - KList options = getPossibilities(in); - - if (options.isEmpty()) { - throw new DecreeParsingException("Unable to find Jigsaw Structure \"" + in + "\""); - } - try { - return options.stream().filter((i) -> toString(i).equalsIgnoreCase(in)).collect(Collectors.toList()).get(0); - } catch (Throwable e) { - throw new DecreeParsingException("Unable to filter which Jigsaw Structure \"" + in + "\""); - } - } - - @Override - public boolean supports(Class type) { - return type.equals(IrisJigsawStructure.class); +public class JigsawStructureHandler extends RegistrantHandler { + public JigsawStructureHandler() { + super(IrisJigsawStructure.class, true); } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java index c12c5be09..5b47af457 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java @@ -18,62 +18,12 @@ package com.volmit.iris.util.decree.handlers; -import com.volmit.iris.Iris; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.IrisRegion; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.specialhandlers.RegistrantHandler; -import java.io.File; -import java.util.stream.Collectors; - -public class RegionHandler implements DecreeParameterHandler { - @Override - public KList getPossibilities() { - KMap p = new KMap<>(); - - //noinspection ConstantConditions - for (File i : Iris.instance.getDataFolder("packs").listFiles()) { - if (i.isDirectory()) { - IrisData data = IrisData.get(i); - for (IrisRegion j : data.getRegionLoader().loadAll(data.getRegionLoader().getPossibleKeys())) { - p.putIfAbsent(j.getLoadKey(), j); - } - - data.close(); - } - } - - return p.v(); - } - - @Override - public String toString(IrisRegion dim) { - return dim.getLoadKey(); - } - - @Override - public IrisRegion parse(String in, boolean force) throws DecreeParsingException { - if (in.equals("null")) { - return null; - } - KList options = getPossibilities(in); - - if (options.isEmpty()) { - throw new DecreeParsingException("Unable to find Region \"" + in + "\""); - } - try { - return options.stream().filter((i) -> toString(i).equalsIgnoreCase(in)).collect(Collectors.toList()).get(0); - } catch (Throwable e) { - throw new DecreeParsingException("Unable to filter which Region \"" + in + "\""); - } - } - - @Override - public boolean supports(Class type) { - return type.equals(IrisRegion.class); +public class RegionHandler extends RegistrantHandler { + public RegionHandler() { + super(IrisRegion.class, true); } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java b/core/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java index a32670cf6..f5eaf01a4 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java @@ -18,59 +18,12 @@ package com.volmit.iris.util.decree.handlers; -import com.volmit.iris.Iris; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.IrisScript; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.specialhandlers.RegistrantHandler; -import java.io.File; -import java.util.stream.Collectors; - -public class ScriptHandler implements DecreeParameterHandler { - @Override - public KList getPossibilities() { - KMap p = new KMap<>(); - - //noinspection ConstantConditions - for (File i : Iris.instance.getDataFolder("packs").listFiles()) { - if (i.isDirectory()) { - IrisData data = IrisData.get(i); - for (IrisScript j : data.getScriptLoader().loadAll(data.getScriptLoader().getPossibleKeys())) { - p.putIfAbsent(j.getLoadKey(), j); - } - - data.close(); - } - } - - return p.v(); - } - - @Override - public String toString(IrisScript script) { - return script.getLoadKey(); - } - - @Override - public IrisScript parse(String in, boolean force) throws DecreeParsingException { - KList options = getPossibilities(in); - - if (options.isEmpty()) { - throw new DecreeParsingException("Unable to find Script \"" + in + "\""); - } - try { - return options.stream().filter((i) -> toString(i).equalsIgnoreCase(in)).collect(Collectors.toList()).get(0); - } catch (Throwable e) { - throw new DecreeParsingException("Unable to filter which Script \"" + in + "\""); - } - } - - @Override - public boolean supports(Class type) { - return type.equals(IrisScript.class); +public class ScriptHandler extends RegistrantHandler { + public ScriptHandler() { + super(IrisScript.class, false); } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/NullableDimensionHandler.java b/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/NullableDimensionHandler.java index 706dd61a5..c8278558b 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/NullableDimensionHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/NullableDimensionHandler.java @@ -18,67 +18,21 @@ package com.volmit.iris.util.decree.specialhandlers; -import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.IrisDimension; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeParameterHandler; import com.volmit.iris.util.decree.exceptions.DecreeParsingException; -import java.io.File; - -public class NullableDimensionHandler implements DecreeParameterHandler { - @Override - public KList getPossibilities() { - KMap p = new KMap<>(); - - //noinspection ConstantConditions - for (File i : Iris.instance.getDataFolder("packs").listFiles()) { - if (i.isDirectory()) { - IrisData data = IrisData.get(i); - for (IrisDimension j : data.getDimensionLoader().loadAll(data.getDimensionLoader().getPossibleKeys())) { - p.putIfAbsent(j.getLoadKey(), j); - } - - data.close(); - } - } - - return p.v(); - } - - @Override - public String toString(IrisDimension dim) { - return dim.getLoadKey(); +public class NullableDimensionHandler extends RegistrantHandler { + public NullableDimensionHandler() { + super(IrisDimension.class, true); } @Override public IrisDimension parse(String in, boolean force) throws DecreeParsingException { - if (in.equalsIgnoreCase("---")) - return null; - if (in.equalsIgnoreCase("default")) { return parse(IrisSettings.get().getGenerator().getDefaultWorldType()); } - - KList options = getPossibilities(in); - - - if (options.isEmpty()) { - throw new DecreeParsingException("Unable to find Dimension \"" + in + "\""); - } - try { - return options.stream().filter((i) -> toString(i).equalsIgnoreCase(in)).toList().get(0); - } catch (Throwable e) { - throw new DecreeParsingException("Unable to filter which Dimension \"" + in + "\""); - } - } - - @Override - public boolean supports(Class type) { - return type.equals(IrisDimension.class); + return super.parse(in, force); } @Override diff --git a/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/ObjectHandler.java b/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/ObjectHandler.java index ee7d30901..84d3dceb0 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/ObjectHandler.java +++ b/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/ObjectHandler.java @@ -31,11 +31,15 @@ public class ObjectHandler implements DecreeParameterHandler { @Override public KList getPossibilities() { KList p = new KList<>(); + IrisData data = data(); + if (data != null) { + return new KList<>(data.getObjectLoader().getPossibleKeys()); + } //noinspection ConstantConditions for (File i : Iris.instance.getDataFolder("packs").listFiles()) { if (i.isDirectory()) { - IrisData data = IrisData.get(i); + data = IrisData.get(i); p.add(data.getObjectLoader().getPossibleKeys()); } } diff --git a/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/RegistrantHandler.java b/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/RegistrantHandler.java new file mode 100644 index 000000000..a249a92ce --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/decree/specialhandlers/RegistrantHandler.java @@ -0,0 +1,73 @@ +package com.volmit.iris.util.decree.specialhandlers; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.core.loader.IrisRegistrant; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.decree.DecreeParameterHandler; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +public abstract class RegistrantHandler implements DecreeParameterHandler { + private final Class type; + private final String name; + private final boolean nullable; + + public RegistrantHandler(Class type, boolean nullable) { + this.type = type; + this.name = type.getSimpleName().replaceFirst("Iris", ""); + this.nullable = nullable; + } + + @Override + public KList getPossibilities() { + KList p = new KList<>(); + Set known = new HashSet<>(); + IrisData data = data(); + if (data != null) { + return data.getLoader(type).loadAll(data.getLoader(type).getPossibleKeys()).qadd(null); + } + + //noinspection ConstantConditions + for (File i : Iris.instance.getDataFolder("packs").listFiles()) { + if (i.isDirectory()) { + data = IrisData.get(i); + for (T j : data.getLoader(type).loadAll(data.getLoader(type).getPossibleKeys())) { + if (known.add(j.getLoadKey())) + p.add(j); + } + } + } + + return p; + } + + @Override + public String toString(T t) { + return t != null ? t.getLoadKey() : "null"; + } + + @Override + public T parse(String in, boolean force) throws DecreeParsingException { + if (in.equals("null") && nullable) { + return null; + } + KList options = getPossibilities(in); + if (options.isEmpty()) { + throw new DecreeParsingException("Unable to find " + name + " \"" + in + "\""); + } + + return options.stream() + .filter((i) -> toString(i).equalsIgnoreCase(in)) + .findFirst() + .orElseThrow(() -> new DecreeParsingException("Unable to filter which " + name + " \"" + in + "\"")); + } + + @Override + public boolean supports(Class type) { + return type.equals(this.type); + } +} diff --git a/core/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java b/core/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java index f1eeab8b7..4bd5e9168 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java +++ b/core/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java @@ -478,21 +478,27 @@ public class VirtualDecreeCommand { } DecreeContext.touch(sender); - Runnable rx = () -> { - try { + try { + Runnable rx = () -> { DecreeContext.touch(sender); - getNode().getMethod().setAccessible(true); - getNode().getMethod().invoke(getNode().getInstance(), params); - } catch (Throwable e) { - e.printStackTrace(); - throw new RuntimeException("Failed to execute "); // TODO: - } - }; + try { + getNode().getMethod().setAccessible(true); + getNode().getMethod().invoke(getNode().getInstance(), params); + } catch (Throwable e) { + e.printStackTrace(); + throw new RuntimeException("Failed to execute "); // TODO: + } finally { + DecreeContext.remove(); + } + }; - if (getNode().isSync()) { - J.s(rx); - } else { - rx.run(); + if (getNode().isSync()) { + J.s(rx); + } else { + rx.run(); + } + } finally { + DecreeContext.remove(); } return true;