diff --git a/src/main/java/com/volmit/iris/core/CommandManager.java b/src/main/java/com/volmit/iris/core/CommandManager.java index d20688aff..4c59f5df1 100644 --- a/src/main/java/com/volmit/iris/core/CommandManager.java +++ b/src/main/java/com/volmit/iris/core/CommandManager.java @@ -19,7 +19,7 @@ package com.volmit.iris.core; import com.volmit.iris.Iris; -import com.volmit.iris.core.decrees.CMDIris; +import com.volmit.iris.core.decrees.DecIris; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeSystem; @@ -37,7 +37,7 @@ public class CommandManager implements DecreeSystem { public VirtualDecreeCommand getRoot() { return commandCache.aquire(() -> { try { - return VirtualDecreeCommand.createRoot(new CMDIris()); + return VirtualDecreeCommand.createRoot(new DecIris()); } catch (Throwable e) { e.printStackTrace(); } diff --git a/src/main/java/com/volmit/iris/core/ProjectManager.java b/src/main/java/com/volmit/iris/core/ProjectManager.java index fb90ce471..9e7a9130a 100644 --- a/src/main/java/com/volmit/iris/core/ProjectManager.java +++ b/src/main/java/com/volmit/iris/core/ProjectManager.java @@ -329,11 +329,7 @@ public class ProjectManager { public void open(VolmitSender sender, long seed, String dimm) { try { - open(sender,seed, dimm, () -> - { - if (sender.isPlayer()) { - } - }); + open(sender,seed, dimm, () -> {}); } catch (Exception e) { Iris.reportError(e); sender.sendMessage("Error when creating studio world:"); diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioBeautify.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioBeautify.java index 16b465c3b..6c4fcd4a8 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioBeautify.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioBeautify.java @@ -73,7 +73,6 @@ public class CommandIrisStudioBeautify extends MortarCommand { return true; } - private int clean(VolmitSender s, File clean) { int c = 0; if (clean.isDirectory()) { @@ -131,6 +130,7 @@ public class CommandIrisStudioBeautify extends MortarCommand { } + @Override protected String getArgsUsage() { return "[project]"; diff --git a/src/main/java/com/volmit/iris/core/decrees/CMDIrisStudio.java b/src/main/java/com/volmit/iris/core/decrees/CMDIrisStudio.java deleted file mode 100644 index 8e83eea97..000000000 --- a/src/main/java/com/volmit/iris/core/decrees/CMDIrisStudio.java +++ /dev/null @@ -1,286 +0,0 @@ -/* - * 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.decrees; - -import com.volmit.iris.Iris; -import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.project.IrisProject; -import com.volmit.iris.core.project.loader.IrisData; -import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.object.dimensional.IrisDimension; -import com.volmit.iris.engine.object.objects.IrisObject; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.decree.DecreeExecutor; -import com.volmit.iris.util.decree.DecreeOrigin; -import com.volmit.iris.util.decree.annotations.Decree; -import com.volmit.iris.util.decree.annotations.Param; -import com.volmit.iris.util.format.C; -import com.volmit.iris.util.io.IO; -import com.volmit.iris.util.json.JSONArray; -import com.volmit.iris.util.json.JSONObject; -import com.volmit.iris.util.parallel.MultiBurst; -import com.volmit.iris.util.scheduling.J; -import com.volmit.iris.util.scheduling.jobs.Job; -import com.volmit.iris.util.scheduling.jobs.JobCollection; -import com.volmit.iris.util.scheduling.jobs.QueueJob; -import com.volmit.iris.util.scheduling.jobs.SingleJob; - -import java.awt.*; -import java.io.File; -import java.io.IOException; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - -@Decree(name = "studio", aliases = "std", description = "Studio Commands", studio = true) -public class CMDIrisStudio implements DecreeExecutor -{ - @Decree(description = "Open a new studio world", aliases = "o", sync = true) - public void open( - @Param(name = "dimension", defaultValue = "overworld", aliases = "dim", required = true) - IrisDimension dimension, - @Param(name = "seed", defaultValue = "1337", aliases = "s") - long seed) - { - Iris.proj.open(sender(), dimension.getLoadKey()); - } - - @Decree(description = "Create a new studio project", aliases = "+", sync = true) - public void create( - @Param(name = "name", required = true, description = "The name of this new Iris Project.") - String name, - @Param(name = "template", description = "Copy the contents of an existing project in your packs folder and use it as a template in this new project.") - IrisDimension template) - { - if (template != null) { - Iris.proj.create(sender(), name, template.getLoadKey()); - } else { - Iris.proj.create(sender(), name); - } - } - - @Decree(description = "Edit the biome at your current location", aliases = "eb", sync = true, origin = DecreeOrigin.PLAYER) - public void editBiome() - { - if (!Iris.proj.isProjectOpen()) { - sender().sendMessage(C.RED + "No open studio projects."); - return; - } - ; - try { - Desktop.getDesktop().open(Iris.proj.getActiveProject().getActiveProvider().getEngine().getBiome(sender().player().getLocation()).getLoadFile()); - } catch (Throwable e) { - Iris.reportError(e); - sender().sendMessage("Cant find the file. Are you in an Iris Studio world?"); - } - - } - - @Decree(description = "Close an open studio project", aliases = "x", sync = true) - public void close() - { - if (!Iris.proj.isProjectOpen()) { - sender().sendMessage(C.RED + "No open studio projects."); - return; - } - - Iris.proj.getActiveProject().getActiveProvider().getTarget().getWorld().evacuate(); - Iris.proj.close(); - sender().sendMessage(C.YELLOW + "Project Closed"); - } - - @Decree(description = "Clean an Iris Project, optionally beautifying JSON & fixing block ids with missing keys. Also rebuilds the vscode schemas. ") - public void clean( - @Param(name = "project", required = true, description = "The project to update") - IrisDimension project, - - @Param(name = "beautify", defaultValue = "true", description = "Filters all valid JSON files with a beautifier (indentation: 4)") - boolean beautify, - - @Param(name = "fix-ids", defaultValue = "true", description = "Fixes any block ids used such as \"dirt\" will be converted to \"minecraft:dirt\"") - boolean fixIds, - - @Param(name = "rewriteObjects", defaultValue = "false", description = "Imports all objects and re-writes them cleaning up positions & block data in the process.") - boolean rewriteObjects - ) { - KList jobs = new KList<>(); - KList files = new KList(); - files(Iris.instance.getDataFolder("packs", project.getLoadKey()), files); - MultiBurst burst = new MultiBurst("Cleaner", Thread.MIN_PRIORITY, Runtime.getRuntime().availableProcessors() * 2); - - jobs.add(new SingleJob("Updating Workspace", () -> { - if (!new IrisProject(Iris.proj.getWorkspaceFolder(project.getLoadKey())).updateWorkspace()) { - sender().sendMessage(C.GOLD + "Invalid project: " + project.getLoadKey() + ". Try deleting the code-workspace file and try again."); - } - J.sleep(250); - })); - - sender().sendMessage("Files: " + files.size()); - - if(fixIds) - { - QueueJob r = new QueueJob<>() { - @Override - public void execute(File f) { - try { - JSONObject p = new JSONObject(IO.readAll(f)); - fixBlocks(p); - J.sleep(1); - IO.writeAll(f, p.toString(4)); - - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public String getName() { - return "Fixing IDs"; - } - }; - - r.queue(files); - jobs.add(r); - } - - if(beautify) - { - QueueJob r = new QueueJob<>() { - @Override - public void execute(File f) { - try { - JSONObject p = new JSONObject(IO.readAll(f)); - IO.writeAll(f, p.toString(4)); - J.sleep(1); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public String getName() { - return "Beautify"; - } - }; - - r.queue(files); - jobs.add(r); - } - - if(rewriteObjects) - { - QueueJob q = new QueueJob() { - @Override - public void execute(Runnable runnable) { - runnable.run(); - J.sleep(50); - } - - @Override - public String getName() { - return "Rewriting Objects"; - } - }; - - IrisData data = new IrisData(Iris.proj.getWorkspaceFolder(project.getLoadKey())); - for (String f : data.getObjectLoader().getPossibleKeys()) { - CompletableFuture gg = burst.complete(() ->{ - File ff = data.getObjectLoader().findFile(f); - IrisObject oo = new IrisObject(0, 0, 0); - try { - oo.read(ff); - } catch (Throwable e) { - Iris.error("FAILER TO READ: " + f); - return; - } - - if (oo == null) { - Iris.error("FAILER TO READ: " + f); - return; - } - - try { - oo.write(ff); - } catch (IOException e) { - Iris.error("FAILURE TO WRITE: " + oo.getLoadFile()); - } - }); - - q.queue(() -> { - try { - gg.get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } - }); - } - - jobs.add(q); - } - - jobs.add(new SingleJob("Finishing Up", burst::shutdownNow)); - - new JobCollection("Cleaning", jobs).execute(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); - Iris.error("Failed to beautify " + clean.getAbsolutePath() + " You may have errors in your json!"); - } - } - } - - 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/decrees/CMDIris.java b/src/main/java/com/volmit/iris/core/decrees/DecIris.java similarity index 76% rename from src/main/java/com/volmit/iris/core/decrees/CMDIris.java rename to src/main/java/com/volmit/iris/core/decrees/DecIris.java index 4c3cdda4b..9335c3eb5 100644 --- a/src/main/java/com/volmit/iris/core/decrees/CMDIris.java +++ b/src/main/java/com/volmit/iris/core/decrees/DecIris.java @@ -18,20 +18,18 @@ package com.volmit.iris.core.decrees; +import com.volmit.iris.Iris; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.annotations.Decree; import com.volmit.iris.util.decree.annotations.Param; @Decree(name = "irisd", aliases = {"ird"}, description = "Basic Command") -public class CMDIris implements DecreeExecutor +public class DecIris implements DecreeExecutor { - private CMDIrisStudio studio; + private DecIrisStudio studio; - @Decree(description = "Ping self", aliases = "p") - public void ping( - @Param(name = "message",defaultValue = "Pong", aliases = {"msg", "m"}) - String message) - { - sender().sendMessage(message + "!"); + @Decree(description = "Print version information") + public void version(){ + sender().sendMessage("Iris v" + Iris.instance.getDescription().getVersion() + " by Volmit Software"); } } diff --git a/src/main/java/com/volmit/iris/core/decrees/DecIrisStudio.java b/src/main/java/com/volmit/iris/core/decrees/DecIrisStudio.java new file mode 100644 index 000000000..514236ea3 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/decrees/DecIrisStudio.java @@ -0,0 +1,724 @@ +/* + * 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.decrees; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.gui.NoiseExplorerGUI; +import com.volmit.iris.core.gui.VisionGUI; +import com.volmit.iris.core.project.IrisProject; +import com.volmit.iris.core.project.loader.IrisData; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.object.basic.IrisPosition; +import com.volmit.iris.engine.object.biome.IrisBiome; +import com.volmit.iris.engine.object.biome.IrisBiomePaletteLayer; +import com.volmit.iris.engine.object.common.IrisScript; +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.meta.InventorySlotType; +import com.volmit.iris.engine.object.noise.IrisGenerator; +import com.volmit.iris.engine.object.noise.IrisInterpolator; +import com.volmit.iris.engine.object.noise.IrisNoiseGenerator; +import com.volmit.iris.engine.object.noise.NoiseStyle; +import com.volmit.iris.engine.object.objects.IrisObject; +import com.volmit.iris.engine.object.regional.IrisRegion; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.decree.DecreeExecutor; +import com.volmit.iris.util.decree.DecreeOrigin; +import com.volmit.iris.util.decree.annotations.Decree; +import com.volmit.iris.util.decree.annotations.Param; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.function.Function2; +import com.volmit.iris.util.function.NoiseProvider; +import com.volmit.iris.util.interpolation.InterpolationMethod; +import com.volmit.iris.util.io.IO; +import com.volmit.iris.util.json.JSONArray; +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.parallel.MultiBurst; +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.QueueJob; +import com.volmit.iris.util.scheduling.jobs.SingleJob; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; + +import java.awt.*; +import java.io.File; +import java.io.IOException; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.function.Supplier; + +@Decree(name = "studio", aliases = {"std", "s"}, description = "Studio Commands", studio = true) +public class DecIrisStudio implements DecreeExecutor { + @Decree(description = "Open a new studio world", aliases = "o", sync = true) + public void open( + @Param(name = "dimension", defaultValue = "overworld", description = "The dimension to open a studio for", aliases = "dim") + IrisDimension dimension, + @Param(name = "seed", defaultValue = "1337", description = "The seed to generate the studio with", aliases = "s") + long seed) { + sender().sendMessage(C.GREEN + "Opening studio for the \"" + dimension.getName() + "\" pack (seed: " + seed + ")"); + Iris.proj.open(sender(), seed, dimension.getLoadKey()); + } + + @Decree(description = "Close an open studio project", aliases = "x", sync = true) + public void close() { + if (!Iris.proj.isProjectOpen()) { + sender().sendMessage(C.RED + "No open studio projects."); + return; + } + + Iris.proj.close(); + sender().sendMessage(C.GREEN + "Project Closed."); + } + + @Decree(description = "Create a new studio project", aliases = "+", sync = true) + public void create( + @Param(name = "name", description = "The name of this new Iris Project.") + String name, + @Param(name = "template", description = "Copy the contents of an existing project in your packs folder and use it as a template in this new project.") + IrisDimension template) + { + if (template != null) { + Iris.proj.create(sender(), name, template.getLoadKey()); + } else { + Iris.proj.create(sender(), name); + } + } + + @Decree(description = "Clean an Iris Project, optionally beautifying JSON & fixing block ids with missing keys. Also rebuilds the vscode schemas. ") + public void clean( + @Param(name = "project", description = "The project to update") + IrisDimension project, + + @Param(name = "beautify", defaultValue = "true", description = "Filters all valid JSON files with a beautifier (indentation: 4)") + boolean beautify, + + @Param(name = "fix-ids", defaultValue = "true", description = "Fixes any block ids used such as \"dirt\" will be converted to \"minecraft:dirt\"") + boolean fixIds, + + @Param(name = "rewriteObjects", defaultValue = "false", description = "Imports all objects and re-writes them cleaning up positions & block data in the process.") + boolean rewriteObjects + ) { + KList jobs = new KList<>(); + KList files = new KList(); + files(Iris.instance.getDataFolder("packs", project.getLoadKey()), files); + MultiBurst burst = new MultiBurst("Cleaner", Thread.MIN_PRIORITY, Runtime.getRuntime().availableProcessors() * 2); + + jobs.add(new SingleJob("Updating Workspace", () -> { + if (!new IrisProject(Iris.proj.getWorkspaceFolder(project.getLoadKey())).updateWorkspace()) { + sender().sendMessage(C.GOLD + "Invalid project: " + project.getLoadKey() + ". Try deleting the code-workspace file and try again."); + } + J.sleep(250); + })); + + sender().sendMessage("Files: " + files.size()); + + if(fixIds) + { + QueueJob r = new QueueJob<>() { + @Override + public void execute(File f) { + try { + JSONObject p = new JSONObject(IO.readAll(f)); + fixBlocks(p); + J.sleep(1); + IO.writeAll(f, p.toString(4)); + + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public String getName() { + return "Fixing IDs"; + } + }; + + r.queue(files); + jobs.add(r); + } + + if(beautify) + { + QueueJob r = new QueueJob<>() { + @Override + public void execute(File f) { + try { + JSONObject p = new JSONObject(IO.readAll(f)); + IO.writeAll(f, p.toString(4)); + J.sleep(1); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public String getName() { + return "Beautify"; + } + }; + + r.queue(files); + jobs.add(r); + } + + if(rewriteObjects) + { + QueueJob q = new QueueJob<>() { + @Override + public void execute(Runnable runnable) { + runnable.run(); + J.sleep(50); + } + + @Override + public String getName() { + return "Rewriting Objects"; + } + }; + + IrisData data = new IrisData(Iris.proj.getWorkspaceFolder(project.getLoadKey())); + for (String f : data.getObjectLoader().getPossibleKeys()) { + CompletableFuture gg = burst.complete(() ->{ + File ff = data.getObjectLoader().findFile(f); + IrisObject oo = new IrisObject(0, 0, 0); + try { + oo.read(ff); + } catch (Throwable e) { + Iris.error("FAILER TO READ: " + f); + return; + } + + try { + oo.write(ff); + } catch (IOException e) { + Iris.error("FAILURE TO WRITE: " + oo.getLoadFile()); + } + }); + + q.queue(() -> { + try { + gg.get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + }); + } + + jobs.add(q); + } + + jobs.add(new SingleJob("Finishing Up", burst::shutdownNow)); + + new JobCollection("Cleaning", jobs).execute(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); + Iris.error("Failed to beautify " + clean.getAbsolutePath() + " You may have errors in your json!"); + } + } + } + + 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); + } + } + } + + @Decree(description = "Get the version of a pack", aliases = {"v", "ver"}) + public void version( + @Param(name = "dimension", defaultValue = "overworld", description = "The dimension get the version of", aliases = "dim") + IrisDimension dimension + ) { + sender().sendMessage(C.GREEN + "The \"" + dimension.getName() + "\" pack has version: " + dimension.getVersion()); + } + + @Decree(description = "Convert objects in the \"convert\" folder", aliases = "conv") + public void convert() { + Iris.convert.check(sender()); + } + + + @Decree(description = "Edit the biome you're currently in", aliases = {"ebiome", "eb"}, origin = DecreeOrigin.PLAYER) + public void editbiome() { + + if (noStudio()) return; + + try { + Desktop.getDesktop().open(Iris.proj.getActiveProject().getActiveProvider().getEngine().getBiome(sender().player().getLocation()).getLoadFile()); + } catch (Throwable e) { + Iris.reportError(e); + sender().sendMessage(C.RED + "Cant find the file. Unsure why this happened."); + } + } + + @Decree(description = "Execute a script", aliases = {"ex", "exec", "run"}, origin = DecreeOrigin.PLAYER) + public void execute( + @Param(name = "script", description = "The script to run", aliases = {"s", "scr"}) + IrisScript script + ) { + engine().getExecution().execute(script.getLoadKey()); + } + + @Decree(description = "Open the noise explorer (External GUI)", aliases = "nmap") + public void noise() { + if (noGUI()) return; + sender().sendMessage(C.GREEN + "Opening Noise Explorer!"); + NoiseExplorerGUI.launch(); + } + + + @Decree(description = "Preview noise gens (External GUI)", aliases = {"generator", "gen"}) + public void explore( + @Param(name = "generator", description = "The generator to explore", aliases = {"gen", "g"}) + IrisGenerator generator, + @Param(name = "seed", description = "The seed to generate with", aliases = "s", defaultValue = "12345") + long seed + ){ + if (noGUI()) return; + sender().sendMessage(C.GREEN + "Opening Noise Explorer!"); + + Supplier> l = () -> { + + if (generator == null) { + return (x, z) -> 0D; + } + + return (x, z) -> generator.getHeight(x, z, new RNG(seed).nextParallelRNG(3245).lmax()); + }; + NoiseExplorerGUI.launch(l, "Custom Generator"); + } + + @Decree(description = "Find any biome", aliases = {"goto", "g"}, origin = DecreeOrigin.PLAYER) + public void find( + @Param(name = "biome", description = "The biome to find", aliases = "b") + IrisBiome biome + ){ + if (!IrisToolbelt.isIrisWorld(world())){ + sender().sendMessage(C.RED + "You must be in an Iris world to use this command!"); + return; + } + + IrisPosition l = engine().lookForBiome(biome, 10000, (v) -> sender().sendMessage("Looking for " + C.BOLD + C.WHITE + biome.getName() + C.RESET + C.GRAY + ": Checked " + Form.f(v) + " Places")); + + if (l == null) { + sender().sendMessage(C.RED + "Couldn't find " + biome.getName() + "."); + } else { + sender().sendMessage(C.GREEN + "Found " + biome.getName() + "!"); + J.s(() -> player().teleport(l.toLocation(world()))); + } + } + + @Decree(description = "Find any region", aliases = {"goto", "g"}, origin = DecreeOrigin.PLAYER) + public void find( + @Param(name = "region", description = "The region to find", aliases = "r") + IrisRegion region + ){ + if (!IrisToolbelt.isIrisWorld(world())){ + sender().sendMessage(C.RED + "You must be in an Iris world to use this command!"); + return; + } + + IrisPosition l = engine().lookForRegion(region, 10000, (v) -> sender().sendMessage("Looking for " + C.BOLD + C.WHITE + region.getName() + C.RESET + C.GRAY + ": Checked " + Form.f(v) + " Places")); + + if (l == null) { + sender().sendMessage(C.RED + "Couldn't find " + region.getName() + "."); + } else { + sender().sendMessage(C.GREEN + "Found " + region.getName() + "!"); + J.s(() -> player().teleport(l.toLocation(world()))); + } + } + + @Decree(description = "Hotload a studio", aliases = {"hot", "h", "reload"}, origin = DecreeOrigin.PLAYER) + public void hotload() { + if (noStudio()) return; + + access().hotload(); + } + + @Decree(description = "Show loot if a chest were right here", origin = DecreeOrigin.PLAYER, sync = true) + public void loot( + @Param(name = "fast", aliases = "f", description = "Fast insertion of items in virtual inventory (may cause performance drop)", defaultValue = "false") + boolean fast, + @Param(name = "add", aliases = "a", description = "Whether or not to append to the inventory currently open (if false, clears opened inventory)", defaultValue = "true") + boolean add + ) { + if (noStudio()) return; + + KList tables = engine().getLootTables(RNG.r, player().getLocation().getBlock()); + Inventory inv = Bukkit.createInventory(null, 27 * 2); + + try { + engine().addItems(true, inv, RNG.r, tables, InventorySlotType.STORAGE, player().getLocation().getBlockX(), player().getLocation().getBlockY(), player().getLocation().getBlockZ(), 1); + } catch (Throwable e){ + Iris.reportError(e); + sender().sendMessage(C.RED + "Cannot add items to virtual inventory because of: " + e.getMessage()); + return; + } + + + O ta = new O<>(); + ta.set(-1); + + ta.set(Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, () -> + { + if (!player().getOpenInventory().getType().equals(InventoryType.CHEST)) { + Bukkit.getScheduler().cancelTask(ta.get()); + sender().sendMessage(C.GREEN + "Opened inventory!"); + return; + } + + if (!add) { + inv.clear(); + } + + engine().addItems(true, inv, new RNG(RNG.r.imax()), tables, InventorySlotType.STORAGE, player().getLocation().getBlockX(), player().getLocation().getBlockY(), player().getLocation().getBlockZ(), 1); + }, 0, fast ? 5 : 35)); + + sender().sendMessage(C.GREEN + "Opening inventory now!"); + player().openInventory(inv); + } + + @Decree(description = "Render a world map (External GUI)", aliases = "render") + public void map() + { + if (noStudio()) return; + + if (noGUI()) return; + + VisionGUI.launch(engine(), 0); + sender().sendMessage(C.GREEN + "Opening map!"); + } + + @Decree(description = "Package a dimension into a compressed format", aliases = "package") + public void pkg( + @Param(name = "dimension", aliases = {"d", "dim"}, description = "The dimension pack to compress") + IrisDimension dimension, + @Param(name = "obfuscate", aliases = "o", description = "Whether or not to obfuscate the pack", defaultValue = "false") + boolean obfuscate, + @Param(name = "minify", aliases = "m", description = "Whether or not to minify the pack", defaultValue = "true") + boolean minify + ){ + Iris.proj.compilePackage(sender(), dimension.getLoadKey(), obfuscate, minify); + } + + @Decree(description = "Profiles a dimension's performance", origin = DecreeOrigin.PLAYER) + public void profile( + @Param(name = "dimension", aliases = {"d", "dim"}, description = "The dimension to profile") + IrisDimension dimension + ){ + File pack = dimension.getLoadFile().getParentFile().getParentFile(); + File report = Iris.instance.getDataFile("profile.txt"); + IrisProject project = new IrisProject(pack); + IrisData data = new IrisData(pack); + + KList fileText = new KList<>(); + + KMap styleTimings = new KMap<>(); + KMap interpolatorTimings = new KMap<>(); + KMap generatorTimings = new KMap<>(); + KMap biomeTimings = new KMap<>(); + KMap regionTimings = new KMap<>(); + + sender().sendMessage("Calculating Performance Metrics for Noise generators"); + + for (NoiseStyle i : NoiseStyle.values()) { + CNG c = i.create(new RNG(i.hashCode())); + + for (int j = 0; j < 3000; j++) { + c.noise(j, j + 1000, j * j); + c.noise(j, -j); + } + + PrecisionStopwatch px = PrecisionStopwatch.start(); + + for (int j = 0; j < 100000; j++) { + c.noise(j, j + 1000, j * j); + c.noise(j, -j); + } + + styleTimings.put(i, px.getMilliseconds()); + } + + fileText.add("Noise Style Performance Impacts: "); + + for (NoiseStyle i : styleTimings.sortKNumber()) { + fileText.add(i.name() + ": " + styleTimings.get(i)); + } + + fileText.add(""); + + sender().sendMessage("Calculating Interpolator Timings..."); + + for (InterpolationMethod i : InterpolationMethod.values()) { + IrisInterpolator in = new IrisInterpolator(); + in.setFunction(i); + in.setHorizontalScale(8); + + NoiseProvider np = (x, z) -> Math.random(); + + for (int j = 0; j < 3000; j++) { + in.interpolate(j, -j, np); + } + + PrecisionStopwatch px = PrecisionStopwatch.start(); + + for (int j = 0; j < 100000; j++) { + in.interpolate(j + 10000, -j - 100000, np); + } + + interpolatorTimings.put(i, px.getMilliseconds()); + } + + fileText.add("Noise Interpolator Performance Impacts: "); + + for (InterpolationMethod i : interpolatorTimings.sortKNumber()) { + fileText.add(i.name() + ": " + interpolatorTimings.get(i)); + } + + fileText.add(""); + + sender().sendMessage("Processing Generator Scores: "); + + KMap> btx = new KMap<>(); + + for (String i : data.getGeneratorLoader().getPossibleKeys()) { + KList vv = new KList<>(); + IrisGenerator g = data.getGeneratorLoader().load(i); + KList composites = g.getAllComposites(); + double score = 0; + int m = 0; + for (IrisNoiseGenerator j : composites) { + m++; + score += styleTimings.get(j.getStyle().getStyle()); + vv.add("Composite Noise Style " + m + " " + j.getStyle().getStyle().name() + ": " + styleTimings.get(j.getStyle().getStyle())); + } + + score += interpolatorTimings.get(g.getInterpolator().getFunction()); + vv.add("Interpolator " + g.getInterpolator().getFunction().name() + ": " + interpolatorTimings.get(g.getInterpolator().getFunction())); + generatorTimings.put(i, score); + btx.put(i, vv); + } + + fileText.add("Project Generator Performance Impacts: "); + + for (String i : generatorTimings.sortKNumber()) { + fileText.add(i + ": " + generatorTimings.get(i)); + + btx.get(i).forEach((ii) -> fileText.add(" " + ii)); + } + + fileText.add(""); + + KMap> bt = new KMap<>(); + + for (String i : data.getBiomeLoader().getPossibleKeys()) { + KList vv = new KList<>(); + IrisBiome b = data.getBiomeLoader().load(i); + double score = 0; + + int m = 0; + for (IrisBiomePaletteLayer j : b.getLayers()) { + m++; + score += styleTimings.get(j.getStyle().getStyle()); + vv.add("Palette Layer " + m + ": " + styleTimings.get(j.getStyle().getStyle())); + } + + score += styleTimings.get(b.getBiomeStyle().getStyle()); + vv.add("Biome Style: " + styleTimings.get(b.getBiomeStyle().getStyle())); + score += styleTimings.get(b.getChildStyle().getStyle()); + vv.add("Child Style: " + styleTimings.get(b.getChildStyle().getStyle())); + biomeTimings.put(i, score); + bt.put(i, vv); + } + + fileText.add("Project Biome Performance Impacts: "); + + for (String i : biomeTimings.sortKNumber()) { + fileText.add(i + ": " + biomeTimings.get(i)); + + bt.get(i).forEach((ff) -> fileText.add(" " + ff)); + } + + fileText.add(""); + + for (String i : data.getRegionLoader().getPossibleKeys()) { + IrisRegion b = data.getRegionLoader().load(i); + double score = 0; + + score += styleTimings.get(b.getLakeStyle().getStyle()); + score += styleTimings.get(b.getRiverStyle().getStyle()); + regionTimings.put(i, score); + } + + fileText.add("Project Region Performance Impacts: "); + + for (String i : regionTimings.sortKNumber()) { + fileText.add(i + ": " + regionTimings.get(i)); + } + + fileText.add(""); + + double m = 0; + for (double i : biomeTimings.v()) { + m += i; + } + m /= biomeTimings.size(); + double mm = 0; + for (double i : generatorTimings.v()) { + mm += i; + } + mm /= generatorTimings.size(); + m += mm; + double mmm = 0; + for (double i : regionTimings.v()) { + mmm += i; + } + mmm /= regionTimings.size(); + m += mmm; + + fileText.add("Average Score: " + m); + sender().sendMessage("Score: " + Form.duration(m, 0)); + + try { + IO.writeAll(report, fileText.toString("\n")); + } catch (IOException e) { + Iris.reportError(e); + e.printStackTrace(); + } + + sender().sendMessage(C.GREEN + "Done! " + report.getPath()); + } + + @Decree(description = "Summon an Iris Entity", origin = DecreeOrigin.PLAYER) + public void summon( + @Param(description = "The Iris Entity to spawn", aliases = "e", name = "entity") + IrisEntity entity + ) { + if (noStudio()){ + return; + } + sender().sendMessage(C.GREEN + "Spawning entity"); + entity.spawn(engine(), player().getLocation().clone().add(0, 2, 0)); + } + + @Decree(description = "Teleport to the active studio world", aliases = {"tps", "stp", "tp"}, origin = DecreeOrigin.PLAYER) + public void tpstudio(){ + if (!Iris.proj.isProjectOpen()){ + sender().sendMessage(C.RED + "No studio world is open!"); + return; + } + + if (engine().isStudio()){ + sender().sendMessage(C.RED + "You are already in a studio world!"); + return; + } + + sender().sendMessage(C.GREEN + "Sending you to the studio world!"); + player().teleport(Iris.proj.getActiveProject().getActiveProvider().getTarget().getWorld().spawnLocation()); + player().setGameMode(GameMode.SPECTATOR); + } + + @Decree(description = "Update your dimension project", aliases = {"upd", "u"}) + public void update( + @Param(name = "dimension", aliases = {"d", "dim"}, description = "The dimension to update the workspace of") + IrisDimension dimension + ){ + if (new IrisProject(dimension.getLoadFile().getParentFile().getParentFile()).updateWorkspace()) { + sender().sendMessage(C.GREEN + "Updated Code Workspace for " + dimension.getName()); + } else { + sender().sendMessage(C.RED + "Invalid project: " + dimension.getName() + ". Try deleting the code-workspace file and try again."); + } + } + + + /** + * @return true if server GUIs are not enabled + */ + private boolean noGUI() { + if (!IrisSettings.get().isUseServerLaunchedGuis()){ + sender().sendMessage(C.RED + "You must have server launched GUIs enabled in the settings!"); + return true; + } + return false; + } + + /** + * @return true if no studio is open or the player is not in one + */ + private boolean noStudio(){ + if (!sender().isPlayer()){ + sender().sendMessage(C.RED + "Players only (this is a config error. Ask support to add DecreeOrigin.PLAYER to the command you tried to run)"); + return true; + } + if (!Iris.proj.isProjectOpen()){ + sender().sendMessage(C.RED + "No studio world is open!"); + return true; + } + if (!engine().isStudio()){ + sender().sendMessage(C.RED + "You must be in a studio world!"); + return true; + } + return false; + } +} diff --git a/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java b/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java index 78a1c3ea9..be64f4d24 100644 --- a/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java +++ b/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java @@ -20,6 +20,7 @@ package com.volmit.iris.engine; import com.volmit.iris.Iris; import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.engine.object.common.IrisScript; import com.volmit.iris.engine.scripting.EngineExecutionEnvironment; import com.volmit.iris.engine.scripting.IrisScriptingAPI; import com.volmit.iris.util.format.C; @@ -54,9 +55,13 @@ public class IrisExecutionEnvironment implements EngineExecutionEnvironment { } public void execute(String script) { - Iris.debug("Execute Script (void) " + C.DARK_GREEN + script); + execute(getEngine().getData().getScriptLoader().load(script)); + } + + public void execute(IrisScript script) { + Iris.debug("Execute Script (void) " + C.DARK_GREEN + script.getLoadKey()); try { - javaScriptEngine.exec("", 0, 0, getEngine().getData().getScriptLoader().load(script)); + javaScriptEngine.exec("", 0, 0, script); } catch (BSFException e) { e.printStackTrace(); } diff --git a/src/main/java/com/volmit/iris/engine/scripting/EngineExecutionEnvironment.java b/src/main/java/com/volmit/iris/engine/scripting/EngineExecutionEnvironment.java index 100279ece..b91e02ebb 100644 --- a/src/main/java/com/volmit/iris/engine/scripting/EngineExecutionEnvironment.java +++ b/src/main/java/com/volmit/iris/engine/scripting/EngineExecutionEnvironment.java @@ -19,6 +19,7 @@ package com.volmit.iris.engine.scripting; import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.engine.object.common.IrisScript; import org.apache.bsf.BSFManager; public interface EngineExecutionEnvironment { diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java b/src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java index d930f6b48..5c27073f4 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java +++ b/src/main/java/com/volmit/iris/util/decree/DecreeExecutor.java @@ -21,7 +21,10 @@ package com.volmit.iris.util.decree; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.platform.PlatformChunkGenerator; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.plugin.VolmitSender; +import org.bukkit.World; +import org.bukkit.entity.Player; public interface DecreeExecutor { default VolmitSender sender() @@ -29,6 +32,11 @@ public interface DecreeExecutor { return DecreeContext.get(); } + default Player player() + { + return sender().player(); + } + default Engine engine() { if(sender().isPlayer() && IrisToolbelt.access(sender().player().getWorld()) != null) @@ -42,6 +50,22 @@ public interface DecreeExecutor { return null; } + default PlatformChunkGenerator access() + { + if(sender().isPlayer()) { + return IrisToolbelt.access(world()); + } + return null; + } + + default World world() + { + if (sender().isPlayer()){ + return sender().player().getWorld(); + } + return null; + } + default T get(T v, T ifUndefined) { return v == null ? ifUndefined : v; diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java b/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java index 85376f295..4bf5291ae 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java +++ b/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java @@ -25,7 +25,6 @@ import com.volmit.iris.util.decree.exceptions.DecreeWhichException; import lombok.Data; import java.lang.reflect.Parameter; -import java.util.Arrays; @Data public class DecreeParameter { @@ -57,7 +56,7 @@ public class DecreeParameter { } public boolean isRequired() { - return param.required(); + return !hasDefault(); } public KList getNames() { @@ -80,11 +79,11 @@ public class DecreeParameter { } public Object getDefaultValue() throws DecreeParsingException, DecreeWhichException { - return param.defaultValue().isEmpty() ? null : getHandler().parse(param.defaultValue()); + return param.defaultValue().trim().isEmpty() ? null : getHandler().parse(param.defaultValue().trim()); } public boolean hasDefault() { - return !param.defaultValue().isEmpty(); + return !param.defaultValue().trim().isEmpty(); } public String example() { diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java b/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java index 97360c1bb..547b6cbd1 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java +++ b/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java @@ -174,8 +174,7 @@ public interface DecreeSystem extends CommandExecutor, TabCompleter { * @param type The type to handle * @return The corresponding {@link DecreeParameterHandler}, or null */ - static DecreeParameterHandler getHandler(Class type) - { + static DecreeParameterHandler getHandler(Class type) { for(DecreeParameterHandler i : handlers) { if(i.supports(type)) @@ -183,6 +182,7 @@ public interface DecreeSystem extends CommandExecutor, TabCompleter { return i; } } + Iris.error("Unhandled type in Decree Parameter: " + type.getName() + ". This is bad!"); return null; } } diff --git a/src/main/java/com/volmit/iris/util/decree/annotations/Decree.java b/src/main/java/com/volmit/iris/util/decree/annotations/Decree.java index 5d569ad1b..5406e2fb0 100644 --- a/src/main/java/com/volmit/iris/util/decree/annotations/Decree.java +++ b/src/main/java/com/volmit/iris/util/decree/annotations/Decree.java @@ -42,6 +42,10 @@ public @interface Decree { */ boolean studio() default false; + /** + * If the node's functions MUST be run in sync, set this to true.
+ * Defaults to false + */ boolean sync() default false; /** diff --git a/src/main/java/com/volmit/iris/util/decree/annotations/Param.java b/src/main/java/com/volmit/iris/util/decree/annotations/Param.java index dab1c9c83..aba076a73 100644 --- a/src/main/java/com/volmit/iris/util/decree/annotations/Param.java +++ b/src/main/java/com/volmit/iris/util/decree/annotations/Param.java @@ -35,8 +35,6 @@ public @interface Param { */ String name(); - boolean required() default false; - /** * The description of this parameter, used in help-popups in game.
* The default value is {@link #DEFAULT_DESCRIPTION} diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java new file mode 100644 index 000000000..ac4d35d56 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java @@ -0,0 +1,105 @@ +package com.volmit.iris.util.decree.handlers; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.project.loader.IrisData; +import com.volmit.iris.engine.object.dimensional.IrisDimension; +import com.volmit.iris.engine.object.entity.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.exceptions.DecreeWhichException; + +import java.io.File; + +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 = new IrisData(i, true); + 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) + * @throws DecreeWhichException Thrown when multiple results are possible + */ + @Override + public IrisEntity parse(String in) throws DecreeParsingException, DecreeWhichException { + try + { + KList options = getPossibilities(in); + + if(options.isEmpty()) + { + throw new DecreeParsingException("Unable to find Entity \"" + in + "\""); + } + + else if(options.size() > 1) + { + throw new DecreeWhichException(); + } + + return options.get(0); + } + catch(DecreeParsingException e){ + throw e; + } + catch(Throwable e) + { + throw new DecreeParsingException("Unable to find Entity \"" + in + "\" because of an uncaught exception: " + e); + } + } + + /** + * 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); + } + + @Override + public String getRandomDefault() + { + return "entity"; + } +} diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java new file mode 100644 index 000000000..62d0c2545 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java @@ -0,0 +1,78 @@ +package com.volmit.iris.util.decree.handlers; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.project.loader.IrisData; +import com.volmit.iris.engine.object.noise.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.exceptions.DecreeWhichException; + +import java.io.File; + +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 = new IrisData(i, true); + 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) throws DecreeParsingException, DecreeWhichException { + try + { + KList options = getPossibilities(in); + + if(options.isEmpty()) + { + throw new DecreeParsingException("Unable to find Generator \"" + in + "\""); + } + + else if(options.size() > 1) + { + throw new DecreeWhichException(); + } + + return options.get(0); + } + catch(DecreeParsingException e){ + throw e; + } + catch(Throwable e) + { + throw new DecreeParsingException("Unable to find Generator \"" + in + "\" because of an uncaught exception: " + e); + } + } + + @Override + public boolean supports(Class type) { + return type.equals(IrisGenerator.class); + } + + @Override + public String getRandomDefault() + { + return "generator"; + } +} diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java new file mode 100644 index 000000000..3e8315d0c --- /dev/null +++ b/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java @@ -0,0 +1,78 @@ +package com.volmit.iris.util.decree.handlers; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.project.loader.IrisData; +import com.volmit.iris.engine.object.common.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.exceptions.DecreeWhichException; + +import java.io.File; + +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 = new IrisData(i, true); + 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) throws DecreeParsingException, DecreeWhichException { + try + { + KList options = getPossibilities(in); + + if(options.isEmpty()) + { + throw new DecreeParsingException("Unable to find Script \"" + in + "\""); + } + + else if(options.size() > 1) + { + throw new DecreeWhichException(); + } + + return options.get(0); + } + catch(DecreeParsingException e){ + throw e; + } + catch(Throwable e) + { + throw new DecreeParsingException("Unable to find Script \"" + in + "\" because of an uncaught exception: " + e); + } + } + + @Override + public boolean supports(Class type) { + return type.equals(IrisScript.class); + } + + @Override + public String getRandomDefault() + { + return "script"; + } +} diff --git a/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java b/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java index 627f8fb09..a2d732ee9 100644 --- a/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java +++ b/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java @@ -462,7 +462,7 @@ public class VirtualDecreeCommand { try { - if(value == null && !i.getParam().defaultValue().trim().isEmpty()) + if(value == null && i.hasDefault()) { value = i.getDefaultValue(); } @@ -617,6 +617,14 @@ public class VirtualDecreeCommand { return Objects.hash(getName(), getDescription(), getType(), getPath()); } + @Override + public boolean equals(Object obj){ + if (!(obj instanceof VirtualDecreeCommand)){ + return false; + } + return this.hashCode() == obj.hashCode(); + } + public boolean matches(String in) { KList a = getNames();