diff --git a/pom.xml b/pom.xml
index 20c9b1d8f..a76ae5a34 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
bytecode.ninja
Iris
- 1.0.27
+ 1.0.28
Iris
false
@@ -161,10 +161,6 @@
WorldEdit
https://maven.enginehub.org/repo/
-
- everything
- https://repo.citizensnpcs.co/
-
@@ -201,13 +197,6 @@
4.9.1
provided
-
- net.citizensnpcs
- citizens
- 2.0.27-SNAPSHOT
- jar
- provided
-
com.github.ben-manes.caffeine
diff --git a/src/main/java/com/volmit/iris/command/CommandIris.java b/src/main/java/com/volmit/iris/command/CommandIris.java
index 05fb9f7a8..7cbcbb1fa 100644
--- a/src/main/java/com/volmit/iris/command/CommandIris.java
+++ b/src/main/java/com/volmit/iris/command/CommandIris.java
@@ -51,6 +51,9 @@ public class CommandIris extends MortarCommand
@Command
private CommandIrisReload reload;
+ @Command
+ private CommandIrisCapture capture;
+
public CommandIris()
{
super("iris", "ir", "irs");
diff --git a/src/main/java/com/volmit/iris/command/CommandIrisCapture.java b/src/main/java/com/volmit/iris/command/CommandIrisCapture.java
new file mode 100644
index 000000000..fed77fa3f
--- /dev/null
+++ b/src/main/java/com/volmit/iris/command/CommandIrisCapture.java
@@ -0,0 +1,295 @@
+package com.volmit.iris.command;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.file.Files;
+import java.nio.file.attribute.FileTime;
+import java.time.Duration;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Chunk;
+import org.bukkit.FluidCollisionMode;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.entity.Player;
+import org.bukkit.util.BlockVector;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.gen.IrisTerrainProvider;
+import com.volmit.iris.gen.scaffold.IrisWorlds;
+import com.volmit.iris.object.IrisBiome;
+import com.volmit.iris.object.IrisObject;
+import com.volmit.iris.object.IrisObjectPlacement;
+import com.volmit.iris.util.Form;
+import com.volmit.iris.util.KList;
+import com.volmit.iris.util.KMap;
+import com.volmit.iris.util.KSet;
+import com.volmit.iris.util.M;
+import com.volmit.iris.util.MortarCommand;
+import com.volmit.iris.util.MortarSender;
+import com.volmit.iris.util.Spiraler;
+
+import io.papermc.lib.PaperLib;
+
+public class CommandIrisCapture extends MortarCommand
+{
+ public CommandIrisCapture()
+ {
+ super("capture", "report", "capt");
+ setDescription("Capture nearby information to help with reporting problems");
+ requiresPermission(Iris.perm.studio);
+ setCategory("World");
+ }
+
+ @Override
+ public boolean handle(MortarSender sender, String[] args)
+ {
+ if(sender.isPlayer())
+ {
+ Player p = sender.player();
+ World world = p.getWorld();
+
+ if(!IrisWorlds.isIrisWorld(world))
+ {
+ sender.sendMessage("You must be in an iris world.");
+ return true;
+ }
+
+ IrisTerrainProvider g = IrisWorlds.getProvider(world);
+ KList chunks = new KList<>();
+ int bx = p.getLocation().getChunk().getX();
+ int bz = p.getLocation().getChunk().getZ();
+
+ try
+ {
+ Location l = p.getTargetBlockExact(48, FluidCollisionMode.NEVER).getLocation();
+
+ if(l != null)
+ {
+ int cx = l.getChunk().getX();
+ int cz = l.getChunk().getZ();
+ new Spiraler(3, 3, (x, z) -> chunks.addIfMissing(world.getChunkAt(x + cx, z + cz))).drain();
+ }
+ }
+
+ catch(Throwable e)
+ {
+
+ }
+
+ new Spiraler(3, 3, (x, z) -> chunks.addIfMissing(world.getChunkAt(x + bx, z + bz))).drain();
+ sender.sendMessage("Capturing IGenData from " + chunks.size() + " nearby chunks.");
+ try
+ {
+ File ff = Iris.instance.getDataFile("reports/" + M.ms() + ".txt");
+ PrintWriter pw = new PrintWriter(ff);
+ pw.println("=== Iris Chunk Report ===");
+ pw.println("Iris Version: " + Iris.instance.getDescription().getVersion());
+ pw.println("Bukkit Version: " + Bukkit.getBukkitVersion());
+ pw.println("MC Version: " + Bukkit.getVersion());
+ pw.println("PaperSpigot: " + (PaperLib.isPaper() ? "Yup!" : "Not Paper"));
+ pw.println("Report Captured At: " + new Date().toString());
+ pw.println("Chunks: (" + chunks.size() + "): ");
+
+ for(Chunk i : chunks)
+ {
+ pw.println("- [" + i.getX() + ", " + i.getZ() + "]");
+ }
+
+ int regions = 0;
+ long size = 0;
+ String age = "No idea...";
+
+ try
+ {
+ for(File i : new File(world.getWorldFolder(), "region").listFiles())
+ {
+ if(i.isFile())
+ {
+ size += i.length();
+ }
+ }
+ }
+
+ catch(Throwable e)
+ {
+
+ }
+
+ try
+ {
+ FileTime creationTime = (FileTime) Files.getAttribute(world.getWorldFolder().toPath(), "creationTime");
+ age = hrf(Duration.of(M.ms() - creationTime.toMillis(), ChronoUnit.MILLIS));
+ }
+ catch(IOException ex)
+ {
+
+ }
+
+ KList biomes = new KList<>();
+ KList caveBiomes = new KList<>();
+ KMap>> objects = new KMap<>();
+
+ for(Chunk i : chunks)
+ {
+ for(int j = 0; j < 16; j += 3)
+ {
+ if(j >= 16)
+ {
+ continue;
+ }
+
+ for(int k = 0; k < 16; k += 3)
+ {
+ if(k >= 16)
+ {
+ continue;
+ }
+
+ IrisBiome bb = g.sampleTrueBiome((i.getX() * 16) + j, (i.getZ() * 16) + k);
+ IrisBiome bxf = g.sampleTrueBiome((i.getX() * 16) + j, 3, (i.getZ() * 16) + k);
+ biomes.addIfMissing(bb.getName() + " [" + Form.capitalize(bb.getInferredType().name().toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")");
+ caveBiomes.addIfMissing(bxf.getName() + " (" + bxf.getLoadFile().getName() + ")");
+ exportObjects(bb, pw, g, objects);
+ exportObjects(bxf, pw, g, objects);
+ }
+ }
+ }
+
+ pw.println();
+ pw.println("====== World Info =======");
+ pw.println("World Name: " + world.getName());
+ pw.println("Age: " + age);
+ pw.println("Folder: " + world.getWorldFolder().getPath());
+ pw.println("Regions: " + Form.f(regions));
+ pw.println("Chunks: <" + Form.f(regions * 32 * 32));
+ pw.println("World Size: >" + Form.fileSize(size));
+ pw.println();
+ pw.println("===== Nearby Biomes =====");
+ pw.println("Found " + biomes.size() + " Biome(s): ");
+
+ for(String i : biomes)
+ {
+ pw.println("- " + i);
+ }
+ pw.println();
+
+ pw.println("Found " + caveBiomes.size() + " Underground Biome(s): ");
+
+ for(String i : caveBiomes)
+ {
+ pw.println("- " + i);
+ }
+
+ pw.println();
+
+ pw.println("======== Objects ========");
+
+ for(String i : objects.k())
+ {
+ pw.println("- " + i);
+
+ for(String j : objects.get(i).k())
+ {
+ pw.println(" @ " + j);
+
+ for(String k : objects.get(i).get(j))
+ {
+ pw.println(" * " + k);
+ }
+ }
+ }
+
+ pw.println();
+ pw.close();
+
+ sender.sendMessage("Reported to: " + ff.getPath());
+ }
+
+ catch(FileNotFoundException e)
+ {
+ e.printStackTrace();
+ }
+
+ return true;
+ }
+
+ else
+ {
+ sender.sendMessage("Players only.");
+ }
+
+ return true;
+ }
+
+ private void exportObjects(IrisBiome bb, PrintWriter pw, IrisTerrainProvider g, KMap>> objects)
+ {
+ String n1 = bb.getName() + " [" + Form.capitalize(bb.getInferredType().name().toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")";
+ int m = 0;
+ KSet stop = new KSet<>();
+ for(IrisObjectPlacement f : bb.getObjects())
+ {
+ m++;
+ String n2 = "Placement #" + m + " (" + f.getPlace().size() + " possible objects)";
+
+ for(String i : f.getPlace())
+ {
+ String nn3 = i + ": [ERROR] Failed to find object!";
+
+ try
+ {
+ if(stop.contains(i))
+ {
+ continue;
+ }
+
+ File ff = g.getData().getObjectLoader().findFile(i);
+ BlockVector sz = IrisObject.sampleSize(ff);
+ nn3 = i + ": size=[" + sz.getBlockX() + "," + sz.getBlockY() + "," + sz.getBlockZ() + "] location=[" + ff.getPath() + "]";
+ stop.add(i);
+ }
+
+ catch(Throwable e)
+ {
+
+ }
+
+ String n3 = nn3;
+
+ objects.compute(n1, (k1, v1) ->
+ {
+ if(v1 == null)
+ {
+ return new KMap<>();
+ }
+
+ return v1;
+ }).compute(n2, (k, v) ->
+ {
+ if(v == null)
+ {
+ return new KList().qaddIfMissing(n3);
+ }
+
+ v.addIfMissing(n3);
+ return v;
+ });
+ }
+ }
+ }
+
+ public static String hrf(Duration duration)
+ {
+ return duration.toString().substring(2).replaceAll("(\\d[HMS])(?!$)", "$1 ").toLowerCase();
+ }
+
+ @Override
+ protected String getArgsUsage()
+ {
+ return "[thread-count]";
+ }
+}
diff --git a/src/main/java/com/volmit/iris/link/CitizensLink.java b/src/main/java/com/volmit/iris/link/CitizensLink.java
index af3a56960..db04ca729 100644
--- a/src/main/java/com/volmit/iris/link/CitizensLink.java
+++ b/src/main/java/com/volmit/iris/link/CitizensLink.java
@@ -1,11 +1,6 @@
package com.volmit.iris.link;
-import net.citizensnpcs.api.CitizensAPI;
-import net.citizensnpcs.api.npc.NPC;
import org.bukkit.Bukkit;
-import org.bukkit.Location;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.EntityType;
import org.bukkit.plugin.Plugin;
public class CitizensLink
@@ -20,17 +15,17 @@ public class CitizensLink
return getCitizens() != null;
}
- public Entity spawn(EntityType type, String npcType, Location a)
- {
- if(!supported())
- {
- return null;
- }
-
- NPC npc = CitizensAPI.getNPCRegistry().createNPC(type, "");
- npc.spawn(a);
- return npc.getEntity();
- }
+ // public Entity spawn(EntityType type, String npcType, Location a)
+ // {
+ // if(!supported())
+ // {
+ // return null;
+ // }
+ //
+ // NPC npc = CitizensAPI.getNPCRegistry().createNPC(type, "");
+ // npc.spawn(a);
+ // return npc.getEntity();
+ // }
public Plugin getCitizens()
{
diff --git a/src/main/java/com/volmit/iris/util/KList.java b/src/main/java/com/volmit/iris/util/KList.java
index 157df5da0..6035b6b0e 100644
--- a/src/main/java/com/volmit/iris/util/KList.java
+++ b/src/main/java/com/volmit/iris/util/KList.java
@@ -686,6 +686,12 @@ public class KList extends ArrayList implements List
return this;
}
+ public KList qaddIfMissing(T t)
+ {
+ addIfMissing(t);
+ return this;
+ }
+
public KList removeDuplicates()
{
KSet v = new KSet<>();