From 5bf6687f1f0a8402d7681aedb1da5b6db690c259 Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Sun, 22 Aug 2021 03:04:30 -0400 Subject: [PATCH] Compiling --- src/main/java/com/volmit/iris/Iris.java | 5 +- .../command/studio/CommandIrisStudio.java | 3 + .../studio/CommandIrisStudioCompile.java | 68 +++++++++ .../volmit/iris/core/project/IrisProject.java | 135 +++++++++++++++++- .../iris/core/project/loader/IrisData.java | 56 +++++++- .../core/project/loader/IrisRegistrant.java | 4 + .../engine/modifier/IrisCaveModifier.java | 4 +- .../iris/engine/object/biome/IrisBiome.java | 7 + .../engine/object/block/IrisBlockData.java | 7 + .../iris/engine/object/cave/IrisCave.java | 7 + .../iris/engine/object/common/IrisScript.java | 7 + .../object/dimensional/IrisDimension.java | 7 + .../iris/engine/object/entity/IrisEntity.java | 7 + .../engine/object/jigsaw/IrisJigsawPiece.java | 7 + .../engine/object/jigsaw/IrisJigsawPool.java | 7 + .../object/jigsaw/IrisJigsawStructure.java | 7 + .../engine/object/loot/IrisLootTable.java | 7 + .../iris/engine/object/mods/IrisMod.java | 7 + .../engine/object/noise/IrisExpression.java | 7 + .../engine/object/noise/IrisGenerator.java | 7 + .../engine/object/objects/IrisObject.java | 7 + .../engine/object/regional/IrisRegion.java | 7 + .../engine/object/spawners/IrisSpawner.java | 7 + .../scheduling/jobs/ParallelQueueJob.java | 42 ++++++ .../iris/util/scheduling/jobs/QueueJob.java | 21 +-- 25 files changed, 434 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioCompile.java create mode 100644 src/main/java/com/volmit/iris/util/scheduling/jobs/ParallelQueueJob.java diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index e21764a34..46b66ae70 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -18,7 +18,6 @@ package com.volmit.iris; -import com.google.gson.Gson; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.command.CommandIris; import com.volmit.iris.core.command.PermissionIris; @@ -32,6 +31,7 @@ import com.volmit.iris.core.project.loader.IrisData; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.engine.object.biome.IrisBiome; import com.volmit.iris.engine.object.biome.IrisBiomeCustom; +import com.volmit.iris.engine.object.block.IrisBlockData; import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.engine.object.compat.IrisCompat; import com.volmit.iris.engine.object.dimensional.IrisDimension; @@ -49,7 +49,6 @@ 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.parallel.BurstExecutor; import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.*; import com.volmit.iris.util.reflect.ShadeFix; @@ -117,12 +116,10 @@ public class Iris extends VolmitPlugin implements Listener { sender.setTag(getTag()); instance = this; compat = IrisCompat.configured(getDataFile("compat.json")); - linkMultiverseCore = new MultiverseCoreLink(); linkOraxen = new OraxenLink(); linkMythicMobs = new MythicMobsLink(); configWatcher = new FileWatcher(getDataFile("settings.json")); - services.values().forEach(IrisService::onEnable); services.values().forEach(this::registerListener); } diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudio.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudio.java index 993cdf13f..ada87b74f 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudio.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudio.java @@ -32,6 +32,9 @@ public class CommandIrisStudio extends MortarCommand { @Command private CommandIrisStudioExecute execute; + @Command + private CommandIrisStudioCompile compile; + @Command private CommandIrisStudioOpen open; diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioCompile.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioCompile.java new file mode 100644 index 000000000..6aacda65a --- /dev/null +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioCompile.java @@ -0,0 +1,68 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.core.command.studio; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.project.IrisProject; +import com.volmit.iris.core.service.ConversionSVC; +import com.volmit.iris.core.service.StudioSVC; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.plugin.MortarCommand; +import com.volmit.iris.util.plugin.VolmitSender; +import com.volmit.iris.util.scheduling.jobs.Job; +import com.volmit.iris.util.scheduling.jobs.JobCollection; + +public class CommandIrisStudioCompile extends MortarCommand { + public CommandIrisStudioCompile() { + super("compile"); + requiresPermission(Iris.perm.studio); + setDescription("Compiles a pack for speed"); + setCategory("Studio"); + } + + @Override + public void addTabOptions(VolmitSender sender, String[] args, KList list) { + + } + + @Override + public boolean handle(VolmitSender sender, String[] args) { + if (!IrisSettings.get().isStudio()) { + sender.sendMessage("To use Iris Studio, please enable studio in Iris/settings.json"); + return true; + } + + if(args.length == 0) + { + sender.sendMessage(getArgsUsage()); + return true; + } + + IrisProject project = new IrisProject(Iris.instance.getDataFolder(StudioSVC.WORKSPACE_NAME, args[0])); + project.compile(sender); + + return true; + } + + @Override + protected String getArgsUsage() { + return "[project]"; + } +} 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 bc4564a3b..875175bdc 100644 --- a/src/main/java/com/volmit/iris/core/project/IrisProject.java +++ b/src/main/java/com/volmit/iris/core/project/IrisProject.java @@ -22,6 +22,7 @@ import com.google.gson.Gson; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.project.loader.IrisData; +import com.volmit.iris.core.project.loader.IrisRegistrant; import com.volmit.iris.core.project.loader.ResourceLoader; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.object.biome.IrisBiome; @@ -30,6 +31,7 @@ import com.volmit.iris.engine.object.dimensional.IrisDimension; import com.volmit.iris.engine.object.entity.IrisEntity; import com.volmit.iris.engine.object.loot.IrisLootTable; import com.volmit.iris.engine.object.noise.IrisGenerator; +import com.volmit.iris.engine.object.objects.IrisObject; import com.volmit.iris.engine.object.objects.IrisObjectPlacement; import com.volmit.iris.engine.object.regional.IrisRegion; import com.volmit.iris.engine.object.spawners.IrisSpawner; @@ -38,6 +40,7 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.exceptions.IrisException; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.io.IO; import com.volmit.iris.util.json.JSONArray; @@ -48,6 +51,10 @@ import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.O; import com.volmit.iris.util.scheduling.PrecisionStopwatch; +import com.volmit.iris.util.scheduling.jobs.Job; +import com.volmit.iris.util.scheduling.jobs.JobCollection; +import com.volmit.iris.util.scheduling.jobs.ParallelQueueJob; +import com.volmit.iris.util.scheduling.jobs.QueueJob; import lombok.Data; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -443,7 +450,6 @@ public class IrisProject { return null; } - public static int clean(VolmitSender s, File clean) { int c = 0; if (clean.isDirectory()) { @@ -499,4 +505,131 @@ public class IrisProject { } } } + + public void compile(VolmitSender sender) { + IrisData data = IrisData.get(getPath()); + KList jobs = new KList(); + KList files = new KList(); + KList objects = new KList(); + files(getPath(), files); + filesObjects(getPath(), objects); + + jobs.add(new ParallelQueueJob() { + @Override + public void execute(File f) { + try { + JSONObject p = new JSONObject(IO.readAll(f)); + fixBlocks(p); + scanForErrors(data, f, p, sender); + IO.writeAll(f, p.toString(4)); + + } catch (Throwable e) { + sender.sendMessage(C.RED + "JSON Error "+ f.getPath() + ": " + e.getMessage()); + } + } + + @Override + public String getName() { + return "JSON"; + } + }.queue(files)); + + jobs.add(new ParallelQueueJob() { + @Override + public void execute(File f) { + try { + IrisObject o = new IrisObject(0,0,0); + o.read(f); + + if(o.getBlocks().isEmpty()) + { + sender.sendMessage(C.RED + "IOB " + f.getPath() + " has 0 blocks!"); + } + + if(o.getW() == 0 || o.getH() == 0 || o.getD() == 0) + { + sender.sendMessage(C.RED + "IOB " + f.getPath() + " is not 3D!"); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public String getName() { + return "IOB"; + } + }.queue(objects)); + new JobCollection("Compile", jobs).execute(sender); + } + + private void scanForErrors(IrisData data, File f, JSONObject p, VolmitSender sender) { + String key = data.toLoadKey(f); + ResourceLoader loader = data.getTypedLoaderFor(f); + + if(loader == null) + { + sender.sendMessage("Can't find loader for " + f.getPath()); + return; + } + + IrisRegistrant load = loader.load(key); + load.scanForErrors(p, sender); + } + + public void files(File clean, KList files) { + if (clean.isDirectory()) { + for (File i : clean.listFiles()) { + files(i, files); + } + } else if (clean.getName().endsWith(".json")) { + try { + files.add(clean); + } catch (Throwable e) { + Iris.reportError(e); + } + } + } + + public void filesObjects(File clean, KList files) { + if (clean.isDirectory()) { + for (File i : clean.listFiles()) { + filesObjects(i, files); + } + } else if (clean.getName().endsWith(".iob")) { + try { + files.add(clean); + } catch (Throwable e) { + Iris.reportError(e); + } + } + } + + private void fixBlocks(JSONObject obj) { + for (String i : obj.keySet()) { + Object o = obj.get(i); + + if (i.equals("block") && o instanceof String && !o.toString().trim().isEmpty() && !o.toString().contains(":")) { + obj.put(i, "minecraft:" + o); + } + + if (o instanceof JSONObject) { + fixBlocks((JSONObject) o); + } else if (o instanceof JSONArray) { + fixBlocks((JSONArray) o); + } + } + } + + private void fixBlocks(JSONArray obj) { + for (int i = 0; i < obj.length(); i++) { + Object o = obj.get(i); + + if (o instanceof JSONObject) { + fixBlocks((JSONObject) o); + } else if (o instanceof JSONArray) { + fixBlocks((JSONArray) o); + } + } + } } diff --git a/src/main/java/com/volmit/iris/core/project/loader/IrisData.java b/src/main/java/com/volmit/iris/core/project/loader/IrisData.java index dbb52eb4d..518a151ab 100644 --- a/src/main/java/com/volmit/iris/core/project/loader/IrisData.java +++ b/src/main/java/com/volmit/iris/core/project/loader/IrisData.java @@ -19,6 +19,7 @@ package com.volmit.iris.core.project.loader; import com.volmit.iris.Iris; +import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.biome.IrisBiome; import com.volmit.iris.engine.object.block.IrisBlockData; @@ -43,8 +44,9 @@ import com.volmit.iris.util.math.RNG; import lombok.Data; import java.io.File; -import java.util.Objects; +import java.util.*; import java.util.function.Function; +import java.util.stream.Collectors; @Data public class IrisData { @@ -89,6 +91,23 @@ public class IrisData { dataLoaders.v().forEach(IrisData::cleanupEngine); } + public ResourceLoader getTypedLoaderFor(File f) { + String[] k = f.getPath().split("\\Q"+File.separator+"\\E"); + + for(String i : k) + { + for(ResourceLoader j : loaders.values()) + { + if(j.getFolderName().equals(i)) + { + return j; + } + } + } + + return null; + } + public void cleanupEngine() { if(engine != null && engine.isClosed()) @@ -311,4 +330,39 @@ public class IrisData { return null; } + + public String toLoadKey(File f) { + if(f.getPath().startsWith(getDataFolder().getPath())) + { + String[] full = f.getPath().split("\\Q" + File.separator + "\\E"); + String[] df = getDataFolder().getPath().split("\\Q" + File.separator + "\\E"); + String g = ""; + boolean m = true; + for(int i = 0; i < full.length; i++) + { + if(i >= df.length) + { + if(m) + { + m = false; + continue; + } + + g += "/" + full[i]; + } + } + + String ff = g.toString().substring(1).split("\\Q.\\E")[0]; + return ff; + } + + else + { + Iris.error("Forign file from loader " + f.getPath() + " (loader realm: " + getDataFolder().getPath() + ")"); + } + + Iris.error("Failed to load " + f.getPath() + " (loader realm: " + getDataFolder().getPath() + ")"); + + return null; + } } \ No newline at end of file diff --git a/src/main/java/com/volmit/iris/core/project/loader/IrisRegistrant.java b/src/main/java/com/volmit/iris/core/project/loader/IrisRegistrant.java index c457f19b4..40072e565 100644 --- a/src/main/java/com/volmit/iris/core/project/loader/IrisRegistrant.java +++ b/src/main/java/com/volmit/iris/core/project/loader/IrisRegistrant.java @@ -24,6 +24,8 @@ import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.annotations.RegistryListResource; import com.volmit.iris.engine.object.common.IrisScript; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.Data; import java.awt.*; @@ -55,4 +57,6 @@ public abstract class IrisRegistrant { return getLoadFile(); } + + public abstract void scanForErrors(JSONObject p, VolmitSender sender); } diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisCaveModifier.java b/src/main/java/com/volmit/iris/engine/modifier/IrisCaveModifier.java index 302752a9a..a4d6517f2 100644 --- a/src/main/java/com/volmit/iris/engine/modifier/IrisCaveModifier.java +++ b/src/main/java/com/volmit/iris/engine/modifier/IrisCaveModifier.java @@ -237,7 +237,7 @@ public class IrisCaveModifier extends EngineAssignedModifier { } public boolean canAir(Material m, BlockData caveFluid) { - return (B.isSolid(m) || + return (m.isSolid() || (B.isDecorant(m.createBlockData())) || m.equals(Material.AIR) || m.equals(caveFluid.getMaterial()) || m.equals(B.getMaterial("CAVE_AIR"))) @@ -249,6 +249,6 @@ public class IrisCaveModifier extends EngineAssignedModifier { } public boolean can(Material m) { - return B.isSolid(m) && !m.equals(Material.BEDROCK); + return m.isSolid() && !m.equals(Material.BEDROCK); } } diff --git a/src/main/java/com/volmit/iris/engine/object/biome/IrisBiome.java b/src/main/java/com/volmit/iris/engine/object/biome/IrisBiome.java index 4994393f9..e086f36cd 100644 --- a/src/main/java/com/volmit/iris/engine/object/biome/IrisBiome.java +++ b/src/main/java/com/volmit/iris/engine/object/biome/IrisBiome.java @@ -48,8 +48,10 @@ import com.volmit.iris.util.data.B; import com.volmit.iris.util.data.DataProvider; import com.volmit.iris.util.data.VanillaBiomeMap; import com.volmit.iris.util.inventorygui.RandomColor; +import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.noise.CNG; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -696,4 +698,9 @@ public class IrisBiome extends IrisRegistrant implements IRare { public String getTypeName() { return "Biome"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/block/IrisBlockData.java b/src/main/java/com/volmit/iris/engine/object/block/IrisBlockData.java index 693f5811e..df29b7a01 100644 --- a/src/main/java/com/volmit/iris/engine/object/block/IrisBlockData.java +++ b/src/main/java/com/volmit/iris/engine/object/block/IrisBlockData.java @@ -26,6 +26,8 @@ import com.volmit.iris.engine.object.annotations.*; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.data.B; +import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -216,4 +218,9 @@ public class IrisBlockData extends IrisRegistrant { public String getTypeName() { return "Block"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/cave/IrisCave.java b/src/main/java/com/volmit/iris/engine/object/cave/IrisCave.java index 740933cac..13483cd7d 100644 --- a/src/main/java/com/volmit/iris/engine/object/cave/IrisCave.java +++ b/src/main/java/com/volmit/iris/engine/object/cave/IrisCave.java @@ -24,11 +24,13 @@ import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.noise.IrisWorm; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.data.B; +import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.noise.Worm; import com.volmit.iris.util.noise.Worm3; import com.volmit.iris.util.noise.WormIterator3; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -56,4 +58,9 @@ public class IrisCave extends IrisRegistrant { public String getTypeName() { return "Cave"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/common/IrisScript.java b/src/main/java/com/volmit/iris/engine/object/common/IrisScript.java index 413b488e9..0ad77ac6b 100644 --- a/src/main/java/com/volmit/iris/engine/object/common/IrisScript.java +++ b/src/main/java/com/volmit/iris/engine/object/common/IrisScript.java @@ -19,6 +19,8 @@ package com.volmit.iris.engine.object.common; import com.volmit.iris.core.project.loader.IrisRegistrant; +import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.Data; import lombok.EqualsAndHashCode; @@ -48,4 +50,9 @@ public class IrisScript extends IrisRegistrant { public String toString() { return source; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java b/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java index 6b9af843a..0c9aa95eb 100644 --- a/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java +++ b/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java @@ -50,9 +50,11 @@ import com.volmit.iris.engine.object.villager.IrisVillagerOverride; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.data.DataProvider; import com.volmit.iris.util.io.IO; +import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.noise.CNG; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -543,4 +545,9 @@ public class IrisDimension extends IrisRegistrant { public String getTypeName() { return "Dimension"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/entity/IrisEntity.java b/src/main/java/com/volmit/iris/engine/object/entity/IrisEntity.java index e9d10dd5f..b78044a1c 100644 --- a/src/main/java/com/volmit/iris/engine/object/entity/IrisEntity.java +++ b/src/main/java/com/volmit/iris/engine/object/entity/IrisEntity.java @@ -32,7 +32,9 @@ import com.volmit.iris.engine.object.meta.IrisEffect; import com.volmit.iris.engine.object.spawners.IrisSurface; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.format.C; +import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.AllArgsConstructor; @@ -380,4 +382,9 @@ public class IrisEntity extends IrisRegistrant { public String getTypeName() { return "Entity"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawPiece.java b/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawPiece.java index 87e9e2526..054db8418 100644 --- a/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawPiece.java +++ b/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawPiece.java @@ -30,6 +30,8 @@ import com.volmit.iris.engine.object.objects.IrisObject; import com.volmit.iris.engine.object.objects.IrisObjectPlacement; import com.volmit.iris.engine.object.objects.ObjectPlaceMode; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -136,4 +138,9 @@ public class IrisJigsawPiece extends IrisRegistrant { public String getTypeName() { return "Jigsaw Piece"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawPool.java b/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawPool.java index 35316d0ea..8dd1a8aeb 100644 --- a/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawPool.java +++ b/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawPool.java @@ -24,6 +24,8 @@ import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.annotations.RegistryListResource; import com.volmit.iris.engine.object.annotations.Required; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -54,4 +56,9 @@ public class IrisJigsawPool extends IrisRegistrant { public String getTypeName() { return "Jigsaw Pool"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawStructure.java b/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawStructure.java index af36ce9fa..c786948ca 100644 --- a/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawStructure.java +++ b/src/main/java/com/volmit/iris/engine/object/jigsaw/IrisJigsawStructure.java @@ -24,6 +24,8 @@ import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.annotations.*; import com.volmit.iris.engine.object.feature.IrisFeature; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -144,4 +146,9 @@ public class IrisJigsawStructure extends IrisRegistrant { public String getTypeName() { return "Jigsaw Structure"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/loot/IrisLootTable.java b/src/main/java/com/volmit/iris/engine/object/loot/IrisLootTable.java index 2f6a2656e..221781d44 100644 --- a/src/main/java/com/volmit/iris/engine/object/loot/IrisLootTable.java +++ b/src/main/java/com/volmit/iris/engine/object/loot/IrisLootTable.java @@ -25,7 +25,9 @@ import com.volmit.iris.engine.object.annotations.MinNumber; import com.volmit.iris.engine.object.annotations.Required; import com.volmit.iris.engine.object.meta.InventorySlotType; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -96,4 +98,9 @@ public class IrisLootTable extends IrisRegistrant { public String getTypeName() { return "Loot"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/mods/IrisMod.java b/src/main/java/com/volmit/iris/engine/object/mods/IrisMod.java index 0dc83583e..19d4d4476 100644 --- a/src/main/java/com/volmit/iris/engine/object/mods/IrisMod.java +++ b/src/main/java/com/volmit/iris/engine/object/mods/IrisMod.java @@ -25,6 +25,8 @@ import com.volmit.iris.engine.object.objects.IrisObject; import com.volmit.iris.engine.object.objects.IrisObjectReplace; import com.volmit.iris.engine.object.regional.IrisRegion; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -113,4 +115,9 @@ public class IrisMod extends IrisRegistrant { public String getTypeName() { return "Mod"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/noise/IrisExpression.java b/src/main/java/com/volmit/iris/engine/object/noise/IrisExpression.java index 578070b1d..977cf1e4d 100644 --- a/src/main/java/com/volmit/iris/engine/object/noise/IrisExpression.java +++ b/src/main/java/com/volmit/iris/engine/object/noise/IrisExpression.java @@ -28,7 +28,9 @@ import com.volmit.iris.engine.object.annotations.ArrayType; import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.annotations.Required; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.stream.ProceduralStream; import com.volmit.iris.util.stream.interpolation.Interpolated; import lombok.AllArgsConstructor; @@ -128,4 +130,9 @@ public class IrisExpression extends IrisRegistrant { public String getTypeName() { return "Expression"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/noise/IrisGenerator.java b/src/main/java/com/volmit/iris/engine/object/noise/IrisGenerator.java index 6a1c0d12c..f61c171db 100644 --- a/src/main/java/com/volmit/iris/engine/object/noise/IrisGenerator.java +++ b/src/main/java/com/volmit/iris/engine/object/noise/IrisGenerator.java @@ -26,8 +26,10 @@ import com.volmit.iris.engine.object.common.IRare; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.interpolation.IrisInterpolation; +import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.noise.CellGenerator; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -295,4 +297,9 @@ public class IrisGenerator extends IrisRegistrant { public String getTypeName() { return "Generator"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/objects/IrisObject.java b/src/main/java/com/volmit/iris/engine/object/objects/IrisObject.java index d485d3aaf..8c6ade3d5 100644 --- a/src/main/java/com/volmit/iris/engine/object/objects/IrisObject.java +++ b/src/main/java/com/volmit/iris/engine/object/objects/IrisObject.java @@ -31,10 +31,12 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.data.B; import com.volmit.iris.util.interpolation.IrisInterpolation; +import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.math.AxisAlignedBB; import com.volmit.iris.util.math.BlockPosition; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.IrisLock; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -994,4 +996,9 @@ public class IrisObject extends IrisRegistrant { public String getTypeName() { return "Object"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/regional/IrisRegion.java b/src/main/java/com/volmit/iris/engine/object/regional/IrisRegion.java index c24ea2ab8..728d99c80 100644 --- a/src/main/java/com/volmit/iris/engine/object/regional/IrisRegion.java +++ b/src/main/java/com/volmit/iris/engine/object/regional/IrisRegion.java @@ -44,8 +44,10 @@ import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.data.DataProvider; import com.volmit.iris.util.data.VanillaBiomeMap; import com.volmit.iris.util.inventorygui.RandomColor; +import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.noise.CNG; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -572,4 +574,9 @@ public class IrisRegion extends IrisRegistrant implements IRare { public String getTypeName() { return "Region"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/engine/object/spawners/IrisSpawner.java b/src/main/java/com/volmit/iris/engine/object/spawners/IrisSpawner.java index ece3c420c..2a0e98687 100644 --- a/src/main/java/com/volmit/iris/engine/object/spawners/IrisSpawner.java +++ b/src/main/java/com/volmit/iris/engine/object/spawners/IrisSpawner.java @@ -28,6 +28,8 @@ import com.volmit.iris.engine.object.basic.IrisWeather; import com.volmit.iris.engine.object.biome.IrisBiome; import com.volmit.iris.engine.object.entity.IrisEntitySpawn; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -106,4 +108,9 @@ public class IrisSpawner extends IrisRegistrant { public String getTypeName() { return "Spawner"; } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } diff --git a/src/main/java/com/volmit/iris/util/scheduling/jobs/ParallelQueueJob.java b/src/main/java/com/volmit/iris/util/scheduling/jobs/ParallelQueueJob.java new file mode 100644 index 000000000..579b5303d --- /dev/null +++ b/src/main/java/com/volmit/iris/util/scheduling/jobs/ParallelQueueJob.java @@ -0,0 +1,42 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.util.scheduling.jobs; + +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.parallel.BurstExecutor; +import com.volmit.iris.util.parallel.MultiBurst; + +public abstract class ParallelQueueJob extends QueueJob { + @Override + public void execute() { + while (queue.isNotEmpty()) { + BurstExecutor b = MultiBurst.burst.burst(queue.size()); + KList q = queue.copy(); + queue.clear(); + for(T i : q) + { + b.queue(() -> { + execute(i); + completeWork(); + }); + } + b.complete(); + } + } +} diff --git a/src/main/java/com/volmit/iris/util/scheduling/jobs/QueueJob.java b/src/main/java/com/volmit/iris/util/scheduling/jobs/QueueJob.java index 4ee511545..6d0338b7e 100644 --- a/src/main/java/com/volmit/iris/util/scheduling/jobs/QueueJob.java +++ b/src/main/java/com/volmit/iris/util/scheduling/jobs/QueueJob.java @@ -18,27 +18,32 @@ package com.volmit.iris.util.scheduling.jobs; +import com.sun.jna.platform.unix.X11; import com.volmit.iris.util.collection.KList; +import java.util.concurrent.atomic.AtomicInteger; + public abstract class QueueJob implements Job { - private final KList queue; - private int totalWork; - private int completed; + final KList queue; + protected int totalWork; + private AtomicInteger completed; public QueueJob() { totalWork = 0; - completed = 0; + completed = new AtomicInteger(0); queue = new KList<>(); } - public void queue(T t) { + public QueueJob queue(T t) { queue.add(t); totalWork++; + return this; } - public void queue(KList f) { + public QueueJob queue(KList f) { queue.addAll(f); totalWork += f.size(); + return this; } public abstract void execute(T t); @@ -54,7 +59,7 @@ public abstract class QueueJob implements Job { @Override public void completeWork() { - completed++; + completed.incrementAndGet(); } @Override @@ -64,6 +69,6 @@ public abstract class QueueJob implements Job { @Override public int getWorkCompleted() { - return completed; + return completed.get(); } }