diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index db0d69377..07e01c6e4 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -459,15 +459,17 @@ private void enable() { initialize("com.volmit.iris.core.service").forEach((i) -> services.put((Class) i.getClass(), (IrisService) i)); INMS.get(); IO.delete(new File("iris")); + compat = IrisCompat.configured(getDataFile("compat.json")); + ServerConfigurator.configure(); + new IrisContextInjector(); IrisSafeguard.IrisSafeguardSystem(); getSender().setTag(getTag()); - compat = IrisCompat.configured(getDataFile("compat.json")); + IrisSafeguard.earlySplash(); linkMultiverseCore = new MultiverseCoreLink(); linkMythicMobs = new MythicMobsLink(); configWatcher = new FileWatcher(getDataFile("settings.json")); services.values().forEach(IrisService::onEnable); services.values().forEach(this::registerListener); - registerListener(new IrisContextInjector()); J.s(() -> { J.a(() -> PaperLib.suggestPaper(this)); J.a(() -> IO.delete(getTemp())); diff --git a/core/src/main/java/com/volmit/iris/core/ServerConfigurator.java b/core/src/main/java/com/volmit/iris/core/ServerConfigurator.java index aace8e897..ffeae3115 100644 --- a/core/src/main/java/com/volmit/iris/core/ServerConfigurator.java +++ b/core/src/main/java/com/volmit/iris/core/ServerConfigurator.java @@ -31,6 +31,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.format.C; +import com.volmit.iris.util.misc.ServerProperties; import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.J; import lombok.Data; @@ -97,6 +98,7 @@ private static KList getDatapacksFolder() { } KList worlds = new KList<>(); Bukkit.getServer().getWorlds().forEach(w -> worlds.add(new File(w.getWorldFolder(), "datapacks"))); + if (worlds.isEmpty()) worlds.add(new File(Bukkit.getWorldContainer(), ServerProperties.LEVEL_NAME + "/datapacks")); return worlds; } diff --git a/core/src/main/java/com/volmit/iris/core/nms/INMS.java b/core/src/main/java/com/volmit/iris/core/nms/INMS.java index d9a960341..3daefa900 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/INMS.java +++ b/core/src/main/java/com/volmit/iris/core/nms/INMS.java @@ -37,7 +37,7 @@ public class INMS { "1.21.4", "v1_21_R3" ); private static final List PACKS = List.of( - new Version(21, 4, "31010"), + new Version(21, 4, "31020"), new Version(21, 2, "31000"), new Version(20, 1, "3910") ); diff --git a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java index ac3894f65..25e5f688b 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java +++ b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java @@ -32,15 +32,12 @@ import com.volmit.iris.util.nbt.tag.CompoundTag; import org.bukkit.*; import org.bukkit.block.Biome; -import org.bukkit.entity.Dolphin; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.generator.ChunkGenerator; -import org.bukkit.generator.structure.Structure; import org.bukkit.inventory.ItemStack; -import java.awt.*; import java.awt.Color; public interface INMSBinding { @@ -93,6 +90,9 @@ public interface INMSBinding { MCABiomeContainer newBiomeContainer(int min, int max); default World createWorld(WorldCreator c) { + if (missingDimensionTypes(true, true, true)) + throw new IllegalStateException("Missing dimenstion types to create world"); + try (var ignored = injectLevelStems()) { return c.createWorld(); } @@ -130,11 +130,9 @@ default int getSpawnChunkCount(World world) { KList getStructureKeys(); - default AutoClosing injectLevelStems() { - return new AutoClosing(() -> {}); - } + AutoClosing injectLevelStems(); - default Pair injectUncached(boolean overworld, boolean nether, boolean end) { - return new Pair<>(0, injectLevelStems()); - } + Pair injectUncached(boolean overworld, boolean nether, boolean end); + + boolean missingDimensionTypes(boolean overworld, boolean nether, boolean end); } diff --git a/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java b/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java index fa722e688..33f83ddd4 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java +++ b/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java @@ -20,7 +20,9 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; +import com.volmit.iris.core.nms.container.AutoClosing; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.Pair; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; @@ -118,6 +120,21 @@ public KList getStructureKeys() { return new KList<>(list); } + @Override + public AutoClosing injectLevelStems() { + return new AutoClosing(() -> {}); + } + + @Override + public Pair injectUncached(boolean overworld, boolean nether, boolean end) { + return new Pair<>(0, new AutoClosing(() -> {})); + } + + @Override + public boolean missingDimensionTypes(boolean overworld, boolean nether, boolean end) { + return false; + } + @Override public CompoundTag serializeEntity(Entity location) { return null; diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java index 4fb25371a..5217be9f2 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java @@ -1,6 +1,7 @@ package com.volmit.iris.core.safeguard; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; public class IrisSafeguard { public static boolean unstablemode = false; @@ -11,5 +12,13 @@ public static void IrisSafeguardSystem() { Iris.info("Enabled Iris SafeGuard"); ServerBootSFG.BootCheck(); } + + public static void earlySplash() { + if (ServerBootSFG.safeguardPassed || IrisSettings.get().getGeneral().DoomsdayAnnihilationSelfDestructMode) + return; + + Iris.instance.splash(); + UtilsSFG.splash(); + } } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index a1de18768..2c59c2ae9 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -3,6 +3,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.v1X.NMSBinding1X; +import com.volmit.iris.engine.object.IrisContextInjector; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; @@ -29,6 +30,7 @@ public class ServerBootSFG { public static boolean isJRE = false; public static boolean hasPrivileges = true; public static boolean unsuportedversion = false; + public static boolean missingDimensionTypes = false; protected static boolean safeguardPassed; public static boolean passedserversoftware = true; protected static int count; @@ -110,6 +112,12 @@ public static void BootCheck() { severityMedium++; } + if (IrisContextInjector.isMissingDimensionTypes()) { + missingDimensionTypes = true; + joiner.add("Missing Dimension Types"); + severityHigh++; + } + allIncompatibilities = joiner.toString(); safeguardPassed = (severityHigh == 0 && severityMedium == 0 && severityLow == 0); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java index cfff91b62..c45cfc7bb 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java @@ -39,6 +39,11 @@ public static void printIncompatibleWarnings() { Iris.safeguard(C.RED + "Server Version"); Iris.safeguard(C.RED + "- Iris only supports 1.20.1 > 1.21.4"); } + if (ServerBootSFG.missingDimensionTypes) { + Iris.safeguard(C.RED + "Dimension Types"); + Iris.safeguard(C.RED + "- Required Iris dimension types were not loaded."); + Iris.safeguard(C.RED + "- If this still happens after a restart please contact support."); + } if (!ServerBootSFG.passedserversoftware) { Iris.safeguard(C.YELLOW + "Unsupported Server Software"); Iris.safeguard(C.YELLOW + "- Please consider using Paper or Purpur instead."); diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisContextInjector.java b/core/src/main/java/com/volmit/iris/engine/object/IrisContextInjector.java index 772a4c560..3ecafab8a 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisContextInjector.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisContextInjector.java @@ -3,6 +3,7 @@ import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.container.AutoClosing; import com.volmit.iris.util.misc.ServerProperties; +import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; @@ -15,6 +16,8 @@ import static com.volmit.iris.Iris.instance; public class IrisContextInjector implements Listener { + @Getter + private static boolean missingDimensionTypes = false; private AutoClosing autoClosing = null; private final int totalWorlds; private int worldCounter = 0; @@ -35,6 +38,12 @@ public IrisContextInjector() { if (Bukkit.getAllowNether()) i++; if (Bukkit.getAllowEnd()) i++; + if (INMS.get().missingDimensionTypes(overworld, nether, end)) { + missingDimensionTypes = true; + totalWorlds = 0; + return; + } + if (overworld || nether || end) { var pair = INMS.get().injectUncached(overworld, nether, end); i += pair.getA() - 3; @@ -42,6 +51,7 @@ public IrisContextInjector() { } totalWorlds = i; + instance.registerListener(this); } @EventHandler diff --git a/core/src/main/java/com/volmit/iris/util/misc/ServerProperties.java b/core/src/main/java/com/volmit/iris/util/misc/ServerProperties.java index b79e844f1..ecfc4f518 100644 --- a/core/src/main/java/com/volmit/iris/util/misc/ServerProperties.java +++ b/core/src/main/java/com/volmit/iris/util/misc/ServerProperties.java @@ -10,7 +10,7 @@ public class ServerProperties { public static final File SERVER_PROPERTIES; public static final File BUKKIT_YML; - public static final String LEVEL_NAME = DATA.getProperty("level-name", "world"); + public static final String LEVEL_NAME; static { String[] args = ProcessHandle.current() @@ -20,11 +20,13 @@ public class ServerProperties { String propertiesPath = "server.properties"; String bukkitYml = "bukkit.yml"; + String levelName = null; for (int i = 0; i < args.length - 1; i++) { switch (args[i]) { case "-c", "--config" -> propertiesPath = args[i + 1]; case "-b", "--bukkit-settings" -> bukkitYml = args[i + 1]; + case "-w", "--level-name", "--world" -> levelName = args[i + 1]; } } @@ -35,5 +37,8 @@ public class ServerProperties { } catch (IOException e) { throw new RuntimeException(e); } + + if (levelName != null) LEVEL_NAME = levelName; + else LEVEL_NAME = DATA.getProperty("level-name", "world"); } } diff --git a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java index 0a0e51a6e..66723b82a 100644 --- a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java +++ b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java @@ -38,7 +38,9 @@ import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -47,6 +49,9 @@ import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.FlatLevelSource; +import net.minecraft.world.level.levelgen.flat.FlatLayerInfo; +import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -673,6 +678,15 @@ public com.volmit.iris.core.nms.container.Pair injectUncac })); } + @Override + public boolean missingDimensionTypes(boolean overworld, boolean nether, boolean end) { + var registry = registry().registryOrThrow(Registries.DIMENSION_TYPE); + if (overworld) overworld = !registry.containsKey(createIrisKey(LevelStem.OVERWORLD)); + if (nether) nether = !registry.containsKey(createIrisKey(LevelStem.NETHER)); + if (end) end = !registry.containsKey(createIrisKey(LevelStem.END)); + return overworld || nether || end; + } + private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) { return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext( old.resources(), @@ -703,23 +717,32 @@ private AutoClosing inject(Function(Registries.LEVEL_STEM, Lifecycle.experimental()); - if (overworld) register(fake, levelStems, dimensions, LevelStem.OVERWORLD); - if (nether) register(fake, levelStems, dimensions, LevelStem.NETHER); - if (end) register(fake, levelStems, dimensions, LevelStem.END); + if (overworld) register(fake, dimensions, source, LevelStem.OVERWORLD); + if (nether) register(fake, dimensions, source, LevelStem.NETHER); + if (end) register(fake, dimensions, source, LevelStem.END); copy(fake, datapack.registry(Registries.LEVEL_STEM).orElse(null)); - if (copy) copy(fake, levelStems); + if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM)); return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze(); } - private void register(MappedRegistry target, Registry levelStems, Registry dimensions, ResourceKey key) { + private void register(MappedRegistry target, Registry dimensions, FlatLevelSource source, ResourceKey key) { + var loc = createIrisKey(key); target.register(key, new LevelStem( - dimensions.getHolderOrThrow(ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()))), - levelStems.getOrThrow(key).generator() + dimensions.getHolder(ResourceKey.create(Registries.DIMENSION_TYPE, loc)).orElseThrow(() -> new IllegalStateException("Missing dimension type " + loc + " in " + dimensions.keySet())), + source ), Lifecycle.stable()); } @@ -732,4 +755,8 @@ private void copy(MappedRegistry target, Registry source) target.register(key, value, info); }); } + + private ResourceLocation createIrisKey(ResourceKey key) { + return new ResourceLocation("iris", key.location().getPath()); + } } diff --git a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java index 924e04791..6ef8bd4a8 100644 --- a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java +++ b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java @@ -28,9 +28,14 @@ import net.minecraft.server.commands.data.BlockDataAccessor; import net.minecraft.tags.TagKey; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.FlatLevelSource; +import net.minecraft.world.level.levelgen.flat.FlatLayerInfo; +import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -674,6 +679,15 @@ public com.volmit.iris.core.nms.container.Pair injectUncac })); } + @Override + public boolean missingDimensionTypes(boolean overworld, boolean nether, boolean end) { + var registry = registry().registryOrThrow(Registries.DIMENSION_TYPE); + if (overworld) overworld = !registry.containsKey(createIrisKey(LevelStem.OVERWORLD)); + if (nether) nether = !registry.containsKey(createIrisKey(LevelStem.NETHER)); + if (end) end = !registry.containsKey(createIrisKey(LevelStem.END)); + return overworld || nether || end; + } + private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) { return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext( old.resources(), @@ -704,23 +718,32 @@ private AutoClosing inject(Function(Registries.LEVEL_STEM, Lifecycle.experimental()); - if (overworld) register(fake, levelStems, dimensions, LevelStem.OVERWORLD); - if (nether) register(fake, levelStems, dimensions, LevelStem.NETHER); - if (end) register(fake, levelStems, dimensions, LevelStem.END); + if (overworld) register(fake, dimensions, source, LevelStem.OVERWORLD); + if (nether) register(fake, dimensions, source, LevelStem.NETHER); + if (end) register(fake, dimensions, source, LevelStem.END); copy(fake, datapack.registry(Registries.LEVEL_STEM).orElse(null)); - if (copy) copy(fake, levelStems); + if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM)); return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze(); } - private void register(MappedRegistry target, Registry levelStems, Registry dimensions, ResourceKey key) { + private void register(MappedRegistry target, Registry dimensions, FlatLevelSource source, ResourceKey key) { + var loc = createIrisKey(key); target.register(key, new LevelStem( - dimensions.getHolderOrThrow(ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()))), - levelStems.getOrThrow(key).generator() + dimensions.getHolder(ResourceKey.create(Registries.DIMENSION_TYPE, loc)).orElseThrow(() -> new IllegalStateException("Missing dimension type " + loc + " in " + dimensions.keySet())), + source ), Lifecycle.stable()); } @@ -733,4 +756,8 @@ private void copy(MappedRegistry target, Registry source) target.register(key, value, info); }); } + + private ResourceLocation createIrisKey(ResourceKey key) { + return new ResourceLocation("iris", key.location().getPath()); + } } diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java index 283e4a594..84eec1ff5 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java @@ -28,9 +28,14 @@ import net.minecraft.server.commands.data.BlockDataAccessor; import net.minecraft.tags.TagKey; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.FlatLevelSource; +import net.minecraft.world.level.levelgen.flat.FlatLayerInfo; +import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -675,6 +680,15 @@ public com.volmit.iris.core.nms.container.Pair injectUncac })); } + @Override + public boolean missingDimensionTypes(boolean overworld, boolean nether, boolean end) { + var registry = registry().registryOrThrow(Registries.DIMENSION_TYPE); + if (overworld) overworld = !registry.containsKey(createIrisKey(LevelStem.OVERWORLD)); + if (nether) nether = !registry.containsKey(createIrisKey(LevelStem.NETHER)); + if (end) end = !registry.containsKey(createIrisKey(LevelStem.END)); + return overworld || nether || end; + } + private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) { return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext( old.resources(), @@ -705,23 +719,32 @@ private AutoClosing inject(Function(Registries.LEVEL_STEM, Lifecycle.experimental()); - if (overworld) register(fake, levelStems, dimensions, LevelStem.OVERWORLD); - if (nether) register(fake, levelStems, dimensions, LevelStem.NETHER); - if (end) register(fake, levelStems, dimensions, LevelStem.END); + if (overworld) register(fake, dimensions, source, LevelStem.OVERWORLD); + if (nether) register(fake, dimensions, source, LevelStem.NETHER); + if (end) register(fake, dimensions, source, LevelStem.END); copy(fake, datapack.registry(Registries.LEVEL_STEM).orElse(null)); - if (copy) copy(fake, levelStems); + if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM)); return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze(); } - private void register(MappedRegistry target, Registry levelStems, Registry dimensions, ResourceKey key) { + private void register(MappedRegistry target, Registry dimensions, FlatLevelSource source, ResourceKey key) { + var loc = createIrisKey(key); target.register(key, new LevelStem( - dimensions.getHolderOrThrow(ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()))), - levelStems.getOrThrow(key).generator() + dimensions.getHolder(ResourceKey.create(Registries.DIMENSION_TYPE, loc)).orElseThrow(() -> new IllegalStateException("Missing dimension type " + loc + " in " + dimensions.keySet())), + source ), Lifecycle.stable()); } @@ -734,4 +757,8 @@ private void copy(MappedRegistry target, Registry source) target.register(key, value, info); }); } + + private ResourceLocation createIrisKey(ResourceKey key) { + return new ResourceLocation("iris", key.location().getPath()); + } } diff --git a/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/NMSBinding.java b/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/NMSBinding.java index 14e103eb5..0dffeb195 100644 --- a/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/NMSBinding.java +++ b/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/NMSBinding.java @@ -38,11 +38,16 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.FlatLevelSource; +import net.minecraft.world.level.levelgen.flat.FlatLayerInfo; +import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -700,6 +705,15 @@ public com.volmit.iris.core.nms.container.Pair injectUncac })); } + @Override + public boolean missingDimensionTypes(boolean overworld, boolean nether, boolean end) { + var registry = registry().registryOrThrow(Registries.DIMENSION_TYPE); + if (overworld) overworld = !registry.containsKey(createIrisKey(LevelStem.OVERWORLD)); + if (nether) nether = !registry.containsKey(createIrisKey(LevelStem.NETHER)); + if (end) end = !registry.containsKey(createIrisKey(LevelStem.END)); + return overworld || nether || end; + } + private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) { return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext( old.resources(), @@ -730,23 +744,32 @@ private AutoClosing inject(Function(Registries.LEVEL_STEM, Lifecycle.experimental()); - if (overworld) register(fake, levelStems, dimensions, LevelStem.OVERWORLD); - if (nether) register(fake, levelStems, dimensions, LevelStem.NETHER); - if (end) register(fake, levelStems, dimensions, LevelStem.END); + if (overworld) register(fake, dimensions, source, LevelStem.OVERWORLD); + if (nether) register(fake, dimensions, source, LevelStem.NETHER); + if (end) register(fake, dimensions, source, LevelStem.END); copy(fake, datapack.registry(Registries.LEVEL_STEM).orElse(null)); - if (copy) copy(fake, levelStems); + if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM)); return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze(); } - private void register(MappedRegistry target, Registry levelStems, Registry dimensions, ResourceKey key) { + private void register(MappedRegistry target, Registry dimensions, FlatLevelSource source, ResourceKey key) { + var loc = createIrisKey(key); target.register(key, new LevelStem( - dimensions.getHolder(new ResourceLocation("iris", key.location().getPath())).orElseThrow(), - levelStems.getOrThrow(key).generator() + dimensions.getHolder(ResourceKey.create(Registries.DIMENSION_TYPE, loc)).orElseThrow(() -> new IllegalStateException("Missing dimension type " + loc + " in " + dimensions.keySet())), + source ), RegistrationInfo.BUILT_IN); } @@ -759,4 +782,8 @@ private void copy(MappedRegistry target, Registry source) target.register(key, value, info); }); } + + private ResourceLocation createIrisKey(ResourceKey key) { + return new ResourceLocation("iris", key.location().getPath()); + } } diff --git a/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/NMSBinding.java b/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/NMSBinding.java index da85e16de..71b59e65a 100644 --- a/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/NMSBinding.java +++ b/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/NMSBinding.java @@ -32,11 +32,16 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.chunk.status.WorldGenContext; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.FlatLevelSource; +import net.minecraft.world.level.levelgen.flat.FlatLayerInfo; +import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -704,6 +709,15 @@ public com.volmit.iris.core.nms.container.Pair injectUncac })); } + @Override + public boolean missingDimensionTypes(boolean overworld, boolean nether, boolean end) { + var registry = registry().registryOrThrow(Registries.DIMENSION_TYPE); + if (overworld) overworld = !registry.containsKey(createIrisKey(LevelStem.OVERWORLD)); + if (nether) nether = !registry.containsKey(createIrisKey(LevelStem.NETHER)); + if (end) end = !registry.containsKey(createIrisKey(LevelStem.END)); + return overworld || nether || end; + } + private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) { return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext( old.resources(), @@ -734,23 +748,32 @@ private AutoClosing inject(Function(Registries.LEVEL_STEM, Lifecycle.experimental()); - if (overworld) register(fake, levelStems, dimensions, LevelStem.OVERWORLD); - if (nether) register(fake, levelStems, dimensions, LevelStem.NETHER); - if (end) register(fake, levelStems, dimensions, LevelStem.END); + if (overworld) register(fake, dimensions, source, LevelStem.OVERWORLD); + if (nether) register(fake, dimensions, source, LevelStem.NETHER); + if (end) register(fake, dimensions, source, LevelStem.END); copy(fake, datapack.registry(Registries.LEVEL_STEM).orElse(null)); - if (copy) copy(fake, levelStems); + if (copy) copy(fake, access.registryOrThrow(Registries.LEVEL_STEM)); return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze(); } - private void register(MappedRegistry target, Registry levelStems, Registry dimensions, ResourceKey key) { + private void register(MappedRegistry target, Registry dimensions, FlatLevelSource source, ResourceKey key) { + var loc = createIrisKey(key); target.register(key, new LevelStem( - dimensions.getHolder(ResourceLocation.fromNamespaceAndPath("iris", key.location().getPath())).orElseThrow(), - levelStems.getOrThrow(key).generator() + dimensions.getHolder(ResourceKey.create(Registries.DIMENSION_TYPE, loc)).orElseThrow(() -> new IllegalStateException("Missing dimension type " + loc + " in " + dimensions.keySet())), + source ), RegistrationInfo.BUILT_IN); } @@ -763,4 +786,8 @@ private void copy(MappedRegistry target, Registry source) target.register(key, value, info); }); } + + private ResourceLocation createIrisKey(ResourceKey key) { + return ResourceLocation.fromNamespaceAndPath("iris", key.location().getPath()); + } } diff --git a/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/NMSBinding.java b/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/NMSBinding.java index 5773392ae..27a379228 100644 --- a/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/NMSBinding.java +++ b/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/NMSBinding.java @@ -27,11 +27,16 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.chunk.status.WorldGenContext; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.FlatLevelSource; +import net.minecraft.world.level.levelgen.flat.FlatLayerInfo; +import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -694,6 +699,15 @@ public Pair injectUncached(boolean overworld, boolean neth })); } + @Override + public boolean missingDimensionTypes(boolean overworld, boolean nether, boolean end) { + var registry = registry().lookupOrThrow(Registries.DIMENSION_TYPE); + if (overworld) overworld = !registry.containsKey(createIrisKey(LevelStem.OVERWORLD)); + if (nether) nether = !registry.containsKey(createIrisKey(LevelStem.NETHER)); + if (end) end = !registry.containsKey(createIrisKey(LevelStem.END)); + return overworld || nether || end; + } + private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) { return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext( old.resources(), @@ -724,23 +738,32 @@ private AutoClosing inject(Function(Registries.LEVEL_STEM, Lifecycle.experimental()); - if (overworld) register(fake, levelStems, dimensions, LevelStem.OVERWORLD); - if (nether) register(fake, levelStems, dimensions, LevelStem.NETHER); - if (end) register(fake, levelStems, dimensions, LevelStem.END); + if (overworld) register(fake, dimensions, source, LevelStem.OVERWORLD); + if (nether) register(fake, dimensions, source, LevelStem.NETHER); + if (end) register(fake, dimensions, source, LevelStem.END); copy(fake, datapack.lookup(Registries.LEVEL_STEM).orElse(null)); - if (copy) copy(fake, levelStems); + if (copy) copy(fake, access.lookupOrThrow(Registries.LEVEL_STEM)); return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze(); } - private void register(MappedRegistry target, Registry levelStems, Registry dimensions, ResourceKey key) { + private void register(MappedRegistry target, Registry dimensions, FlatLevelSource source, ResourceKey key) { + var loc = createIrisKey(key); target.register(key, new LevelStem( - dimensions.get(ResourceLocation.fromNamespaceAndPath("iris", key.location().getPath())).orElseThrow(), - levelStems.getValueOrThrow(key).generator() + dimensions.get(loc).orElseThrow(() -> new IllegalStateException("Missing dimension type " + loc + " in " + dimensions.keySet())), + source ), RegistrationInfo.BUILT_IN); } @@ -753,4 +776,8 @@ private void copy(MappedRegistry target, Registry source) target.register(key, value, info); }); } + + private ResourceLocation createIrisKey(ResourceKey key) { + return ResourceLocation.fromNamespaceAndPath("iris", key.location().getPath()); + } } diff --git a/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/NMSBinding.java b/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/NMSBinding.java index e31895550..efb282d86 100644 --- a/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/NMSBinding.java +++ b/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/NMSBinding.java @@ -39,7 +39,9 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -49,6 +51,9 @@ import net.minecraft.world.level.chunk.status.WorldGenContext; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.FlatLevelSource; +import net.minecraft.world.level.levelgen.flat.FlatLayerInfo; +import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -693,6 +698,15 @@ public Pair injectUncached(boolean overworld, boolean neth })); } + @Override + public boolean missingDimensionTypes(boolean overworld, boolean nether, boolean end) { + var registry = registry().lookupOrThrow(Registries.DIMENSION_TYPE); + if (overworld) overworld = !registry.containsKey(createIrisKey(LevelStem.OVERWORLD)); + if (nether) nether = !registry.containsKey(createIrisKey(LevelStem.NETHER)); + if (end) end = !registry.containsKey(createIrisKey(LevelStem.END)); + return overworld || nether || end; + } + private WorldLoader.DataLoadContext supplier(WorldLoader.DataLoadContext old) { return dataLoadContext.aquire(() -> new WorldLoader.DataLoadContext( old.resources(), @@ -723,23 +737,32 @@ private AutoClosing inject(Function(Registries.LEVEL_STEM, Lifecycle.experimental()); - if (overworld) register(fake, levelStems, dimensions, LevelStem.OVERWORLD); - if (nether) register(fake, levelStems, dimensions, LevelStem.NETHER); - if (end) register(fake, levelStems, dimensions, LevelStem.END); + if (overworld) register(fake, dimensions, source, LevelStem.OVERWORLD); + if (nether) register(fake, dimensions, source, LevelStem.NETHER); + if (end) register(fake, dimensions, source, LevelStem.END); copy(fake, datapack.lookup(Registries.LEVEL_STEM).orElse(null)); - if (copy) copy(fake, levelStems); + if (copy) copy(fake, access.lookupOrThrow(Registries.LEVEL_STEM)); return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze(); } - private void register(MappedRegistry target, Registry levelStems, Registry dimensions, ResourceKey key) { + private void register(MappedRegistry target, Registry dimensions, FlatLevelSource source, ResourceKey key) { + var loc = createIrisKey(key); target.register(key, new LevelStem( - dimensions.get(ResourceLocation.fromNamespaceAndPath("iris", key.location().getPath())).orElseThrow(), - levelStems.getValueOrThrow(key).generator() + dimensions.get(loc).orElseThrow(() -> new IllegalStateException("Missing dimension type " + loc + " in " + dimensions.keySet())), + source ), RegistrationInfo.BUILT_IN); } @@ -752,4 +775,8 @@ private void copy(MappedRegistry target, Registry source) target.register(key, value, info); }); } + + private ResourceLocation createIrisKey(ResourceKey key) { + return ResourceLocation.fromNamespaceAndPath("iris", key.location().getPath()); + } }