diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 59f92614f..c3735469b 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -28,10 +28,13 @@ import com.volmit.iris.core.link.MythicMobsLink; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.engine.IrisWorlds; import com.volmit.iris.engine.framework.EngineCompositeGenerator; +import com.volmit.iris.engine.object.IrisBiome; +import com.volmit.iris.engine.object.IrisBiomeCustom; import com.volmit.iris.engine.object.IrisCompat; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.stream.utility.CachedStream2D; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.function.NastyRunnable; @@ -42,6 +45,7 @@ import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.plugin.Metrics; import com.volmit.iris.util.plugin.Permission; import com.volmit.iris.util.plugin.VolmitPlugin; +import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.GroupedExecutor; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.Queue; @@ -51,6 +55,7 @@ import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.generator.ChunkGenerator; @@ -115,7 +120,7 @@ public class Iris extends VolmitPlugin implements Listener { return null; } - private void installDataPacks() { + public void installDataPacks() { Iris.info("Checking Data Packs..."); boolean reboot = false; File packs = new File("plugins/Iris/packs"); @@ -323,6 +328,108 @@ public class Iris extends VolmitPlugin implements Listener { return instance.getDataFolder("cache", "temp"); } + public void verifyDataPacksPost() + { + File packs = new File("plugins/Iris/packs"); + File dpacks = getDatapacksFolder(); + + if (dpacks == null) { + Iris.error("Cannot find the datapacks folder! Please try generating a default world first maybe? Is this a new server?"); + return; + } + + boolean bad = false; + if (packs.exists()) { + for (File i : packs.listFiles()) { + if (i.isDirectory()) { + Iris.verbose("Checking Pack: " + i.getPath()); + IrisDataManager data = new IrisDataManager(i); + File dims = new File(i, "dimensions"); + + if (dims.exists()) { + for (File j : dims.listFiles()) { + if (j.getName().endsWith(".json")) { + IrisDimension dim = data.getDimensionLoader().load(j.getName().split("\\Q.\\E")[0]); + + if(!verifyDataPackInstalled(dim)) + { + bad = true; + } + } + } + } + } + } + } + + if(bad && INMS.get().supportsDataPacks()) + { + Iris.error(C.ITALIC + "You need to restart your server to properly generate custom biomes."); + Iris.error(C.ITALIC + "By continuing, Iris will use backup biomes in place of the custom biomes."); + Iris.error(C.UNDERLINE + "IT IS HIGHLY RECOMMENDED YOU RESTART THE SERVER BEFORE GENERATING!"); + + for(Player i : Bukkit.getOnlinePlayers()) + { + if(i.isOp() || Iris.perm.has(i)) + { + VolmitSender sender = new VolmitSender(i, getTag("WARNING")); + sender.sendMessage("There are some Iris Packs that have custom biomes in them"); + sender.sendMessage("You need to restart your server to use these packs."); + } + } + } + } + + public boolean verifyDataPackInstalled(IrisDimension dimension) + { + IrisDataManager idm = new IrisDataManager(getDataFolder("packs", dimension.getLoadKey())); + KSet keys = new KSet<>(); + boolean warn = false; + + for(IrisBiome i : dimension.getAllBiomes(() -> idm)) + { + if(i.isCustom()) + { + for(IrisBiomeCustom j : i.getCustomDerivitives()) + { + keys.add(dimension.getLoadKey() +":"+ j.getId()); + } + } + } + + if(!INMS.get().supportsDataPacks()) + { + if(!keys.isEmpty()) + { + Iris.warn("==================================================================================="); + Iris.warn("Pack " + dimension.getLoadKey() + " has " + keys.size() + " custom biome(s). "); + Iris.warn("Your server version does not yet support datapacks for iris."); + Iris.warn("The world will generate these biomes as backup biomes."); + Iris.warn("===================================================================================="); + } + + return true; + } + + for(String i : keys) + { + Object o = INMS.get().getCustomBiomeBaseFor(i); + + if(o == null) + { + Iris.warn("The Biome " + i + " is not registered on the server."); + warn = true; + } + } + + if(warn) + { + Iris.error("The Pack " + dimension.getLoadKey() + " is INCAPABLE of generating custom biomes, restart your server before generating with this pack!"); + } + + return !warn; + } + @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { return super.onCommand(sender, command, label, args); @@ -461,6 +568,7 @@ public class Iris extends VolmitPlugin implements Listener { } public void splash() { + J.a(this::verifyDataPacksPost, 20); if (!IrisSettings.get().getGeneral().isSplashLogoStartup()) { return; } diff --git a/src/main/java/com/volmit/iris/core/ProjectManager.java b/src/main/java/com/volmit/iris/core/ProjectManager.java index fe7c45638..98bd2b464 100644 --- a/src/main/java/com/volmit/iris/core/ProjectManager.java +++ b/src/main/java/com/volmit/iris/core/ProjectManager.java @@ -281,6 +281,8 @@ public class ProjectManager { } sender.sendMessage("Successfully Aquired " + d.getName()); + Iris.instance.installDataPacks(); + Iris.instance.verifyDataPacksPost(); } public KMap getListing(boolean cached) { diff --git a/src/main/java/com/volmit/iris/core/nms/INMSBinding.java b/src/main/java/com/volmit/iris/core/nms/INMSBinding.java index 383ac574d..c31b9e2e3 100644 --- a/src/main/java/com/volmit/iris/core/nms/INMSBinding.java +++ b/src/main/java/com/volmit/iris/core/nms/INMSBinding.java @@ -52,4 +52,9 @@ public interface INMSBinding { int countCustomBiomes(); void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk); + + default boolean supportsDataPacks() + { + return false; + } } diff --git a/src/main/java/com/volmit/iris/core/nms/v17_1/NMSBinding17_1.java b/src/main/java/com/volmit/iris/core/nms/v17_1/NMSBinding17_1.java index 3b65664cb..be0664c5c 100644 --- a/src/main/java/com/volmit/iris/core/nms/v17_1/NMSBinding17_1.java +++ b/src/main/java/com/volmit/iris/core/nms/v17_1/NMSBinding17_1.java @@ -43,6 +43,11 @@ public class NMSBinding17_1 implements INMSBinding { private final KMap baseBiomeCache = new KMap<>(); private Field biomeStorageCache = null; + public boolean supportsDataPacks() + { + return true; + } + private Object getBiomeStorage(ChunkGenerator.BiomeGrid g) { try { return getFieldForBiomeStorage(g).get(g); @@ -101,7 +106,16 @@ public class NMSBinding17_1 implements INMSBinding { @Override public Object getCustomBiomeBaseFor(String mckey) { - return getCustomBiomeRegistry().d(ResourceKey.a(IRegistry.aO, new MinecraftKey(mckey))); + try { + return getCustomBiomeRegistry().d(ResourceKey.a(IRegistry.aO, new MinecraftKey(mckey))); + } + + catch(Throwable e) + { + Iris.reportError(e); + } + + return null; } @SuppressWarnings("OptionalGetWithoutIsPresent") @@ -225,7 +239,7 @@ public class NMSBinding17_1 implements INMSBinding { } a.incrementAndGet(); - Iris.verbose("Custom Biome: " + k); + Iris.debug("Custom Biome: " + k); }); return a.get(); diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index d2763ddef..72484098e 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -31,12 +31,14 @@ import com.volmit.iris.engine.data.DirectWorldWriter; import com.volmit.iris.engine.data.chunk.TerrainChunk; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.IrisBiome; +import com.volmit.iris.engine.object.IrisBiomeCustom; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.IrisPosition; import com.volmit.iris.engine.parallel.BurstExecutor; import com.volmit.iris.engine.parallel.MultiBurst; 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.fakenews.FakeWorld; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form;