Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.

Merge branch 'master' into architectury/1.21.3

+32 -25
+7 -6
common/src/main/java/net/lerariemann/infinity/block/entity/ChromaticBlockEntity.java
··· 4 4 import net.lerariemann.infinity.registry.core.ModBlockEntities; 5 5 import net.lerariemann.infinity.registry.core.ModComponentTypes; 6 6 import net.lerariemann.infinity.registry.core.ModItems; 7 + import net.lerariemann.infinity.util.core.NbtUtils; 7 8 import net.lerariemann.infinity.util.var.ColorLogic; 8 9 import net.minecraft.block.BlockState; 9 10 import net.minecraft.block.entity.BlockEntity; ··· 159 160 @Override 160 161 public void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) { 161 162 super.readNbt(nbt, registryLookup); 162 - if (nbt.contains("color", NbtElement.INT_TYPE)) 163 + if (nbt.getType("color") == NbtElement.INT_TYPE) 163 164 setColor(nbt.getInt("color")); 164 - else if (nbt.contains("color", NbtElement.COMPOUND_TYPE)) { 165 - NbtCompound color = nbt.getCompound("color"); 166 - hue = color.getShort("h"); 167 - saturation = color.getShort("s"); 168 - brightness = color.getShort("b"); 165 + else if (nbt.getType("color") == NbtElement.COMPOUND_TYPE) { 166 + NbtCompound color = NbtUtils.getCompound(nbt, "color"); 167 + hue = NbtUtils.getShort(color, "h"); 168 + saturation = NbtUtils.getShort(color, "s"); 169 + brightness = NbtUtils.getShort(color, "b"); 169 170 updateColor(); 170 171 } 171 172 }
+2 -2
common/src/main/java/net/lerariemann/infinity/dimensions/RandomNoisePreset.java
··· 220 220 biomestoadd.add(NbtString.of(biome)); 221 221 sequence.add(ruleWrap(biomestoadd, rule)); 222 222 } 223 - sequence.add(CommonIO.readAndFormat( 223 + sequence.add(NbtUtils.getCompound(CommonIO.readAndFormat( 224 224 InfinityMod.utilPath + "/surface_rule/default.json", 225 225 defaultBlock("minecraft:grass_block"), 226 226 defaultBlock("minecraft:dirt"), 227 227 defaultBlock("minecraft:dirt"), 228 228 defaultBlock("minecraft:stone"), 229 - defaultBlock("minecraft:gravel")).getCompound("rule")); 229 + defaultBlock("minecraft:gravel")), "rule")); 230 230 return sequence; 231 231 } 232 232
+1 -1
common/src/main/java/net/lerariemann/infinity/dimensions/features/fluid_springs/RandomSpring.java
··· 31 31 } 32 32 config.putBoolean("requires_block_below", random.nextBoolean()); 33 33 config.put("state", NbtUtils.nameToElement(PROVIDER.randomName(random, ConfigType.FLUIDS))); 34 - config.putString("valid_blocks", daddy.default_block.getString("Name")); 34 + config.putString("valid_blocks", NbtUtils.getString(daddy.default_block, "Name")); 35 35 return feature(config); 36 36 } 37 37
+1 -1
common/src/main/java/net/lerariemann/infinity/dimensions/features/raw_generation/RandomShape.java
··· 31 31 public NbtCompound feature() { 32 32 NbtCompound config = new NbtCompound(); 33 33 NbtList replaceable = new NbtList(); 34 - replaceable.add(NbtUtils.nameToElement(parent.parent.parent.default_fluid.getString("Name"))); 34 + replaceable.add(NbtUtils.nameToElement(NbtUtils.getString(parent.parent.parent.default_fluid, "Name"))); 35 35 config.put("replaceable", replaceable); 36 36 if (!usePreset) addRandomBlockProvider(config, "block_provider", ConfigType.FULL_BLOCKS_WG); 37 37 else config.put("block_provider", PROVIDER.randomPreset(random, useBands ? "weighted_state_provider" : "noise_provider"));
+2 -1
common/src/main/java/net/lerariemann/infinity/options/PitchShifter.java
··· 1 1 package net.lerariemann.infinity.options; 2 2 3 + import net.lerariemann.infinity.util.core.NbtUtils; 3 4 import net.minecraft.nbt.NbtCompound; 4 5 import net.minecraft.nbt.NbtElement; 5 6 ··· 31 32 } 32 33 33 34 static PitchShifter decode(NbtCompound comp) { 34 - return switch(comp.getString("type")) { 35 + return switch(NbtUtils.getString(comp, "type")) { 35 36 case "constant" -> new Constant(getFloat(comp, "value", 1)); 36 37 case "add" -> new Add(getFloat(comp, "value", 1)); 37 38 default -> Empty.INSTANCE;
+2 -2
common/src/main/java/net/lerariemann/infinity/options/PortalColorApplier.java
··· 24 24 } 25 25 static PortalColorApplier of(NbtCompound data, int defaultColor) { 26 26 if (!data.contains("portal_color")) return new PortalColorApplier.Simple(defaultColor); 27 - if (data.contains("portal_color", NbtElement.INT_TYPE)) return new PortalColorApplier.Simple(NbtUtils.getInt(data, "portal_color")); 27 + if (data.getType("portal_color") == NbtElement.INT_TYPE) return new PortalColorApplier.Simple(NbtUtils.getInt(data, "portal_color")); 28 28 NbtCompound applierData = NbtUtils.getCompound(data, "portal_color"); 29 29 return switch (NbtUtils.getString(applierData, "type", "")) { 30 30 case "simple" -> new PortalColorApplier.Simple(NbtUtils.getInt(applierData, "value")); 31 - case "checker" -> new PortalColorApplier.Checker(applierData.getList("values", NbtElement.INT_TYPE)); 31 + case "checker" -> new PortalColorApplier.Checker(NbtUtils.getList(applierData, "values", NbtElement.INT_TYPE)); 32 32 case "random_hue" -> new PortalColorApplier.RandomHue(applierData); 33 33 case "random" -> PortalColorApplier.RandomColor.INSTANCE; 34 34 default -> new PortalColorApplier.Simple(defaultColor);
+3 -2
common/src/main/java/net/lerariemann/infinity/util/config/SoundScanner.java
··· 7 7 import net.lerariemann.infinity.util.InfinityMethods; 8 8 import net.lerariemann.infinity.util.core.CommonIO; 9 9 import net.lerariemann.infinity.util.core.ConfigType; 10 + import net.lerariemann.infinity.util.core.NbtUtils; 10 11 import net.lerariemann.infinity.util.core.RandomProvider; 11 12 import net.lerariemann.infinity.util.loading.DimensionGrabber; 12 13 import net.minecraft.block.jukebox.JukeboxSong; ··· 52 53 public static void unpackDownloadedPack(NbtCompound songIds, MinecraftClient cl) { 53 54 //the client unpacks a non-empty payload only when needed, meaning only if it doesn't have necessary files yet 54 55 if (!songIds.isEmpty() && !Files.exists(cl.getResourcePackDir().resolve("infinity/assets/infinity/sounds.json"))) { 55 - cl.execute(() -> saveResourcePack(cl, songIds.getList("entries", NbtElement.STRING_TYPE).stream() 56 + cl.execute(() -> saveResourcePack(cl, NbtUtils.getList(songIds, "entries", NbtElement.STRING_TYPE).stream() 56 57 .map(NbtElement::asString).map(Identifier::of), false)); 57 58 } 58 59 else if (isPreloaded()) { ··· 113 114 if (!data.contains("jukeboxes") || !data.contains("entries")) return; 114 115 if (Files.exists(server.getSavePath(WorldSavePath.DATAPACKS).resolve("client_sound_pack_data.json"))) return; 115 116 116 - NbtCompound allJukeboxes = data.getCompound("jukeboxes"); 117 + NbtCompound allJukeboxes = NbtUtils.getCompound(data, "jukeboxes"); 117 118 Path pathJukeboxes = server.getSavePath(WorldSavePath.DATAPACKS).resolve("infinity/data/infinity/jukebox_song"); 118 119 for (String key: allJukeboxes.getKeys()) { 119 120 if (allJukeboxes.get(key) instanceof NbtCompound jukebox) {
+3 -3
common/src/main/java/net/lerariemann/infinity/util/config/SurfaceRuleScanner.java
··· 23 23 o.ifPresent(settings -> { 24 24 Optional<NbtElement> c = ChunkGeneratorSettings.CODEC.encodeStart(NbtOps.INSTANCE, settings).result(); 25 25 c.ifPresent(e -> { 26 - Tree t = new Tree(((NbtCompound) e).getCompound("surface_rule")); 26 + Tree t = new Tree(NbtUtils.getCompound(((NbtCompound) e), "surface_rule")); 27 27 t.biomeLocations.keySet().forEach(biome -> { 28 28 if (!map.containsKey(biome)) map.put(biome, t.wrappedRule(biome)); 29 29 }); ··· 85 85 else { 86 86 TreeLeaf l = addOfRule(next, where, true); 87 87 if(Objects.requireNonNull(c.get("biome_is")).getNbtType().equals(NbtList.TYPE)) { 88 - c.getList("biome_is", NbtElement.STRING_TYPE).forEach(e -> addBiomeLoc(e.asString(), l.i)); 88 + NbtUtils.getList(c, "biome_is", NbtElement.STRING_TYPE).forEach(e -> addBiomeLoc(e.asString(), l.i)); 89 89 } 90 90 } 91 91 } 92 92 case "sequence", "minecraft:sequence" -> { 93 - NbtList sq = rule.getList("sequence", NbtElement.COMPOUND_TYPE); 93 + NbtList sq = NbtUtils.getList(rule, "sequence", NbtElement.COMPOUND_TYPE); 94 94 sq.forEach(e -> add((NbtCompound)e, where)); 95 95 } 96 96 default -> {
+3
common/src/main/java/net/lerariemann/infinity/util/core/NbtUtils.java
··· 46 46 static boolean getBoolean(NbtCompound data, String key) { 47 47 return data.getBoolean(key); 48 48 } 49 + static short getShort(NbtCompound data, String key) { 50 + return data.getShort(key); 51 + } 49 52 static NbtList getList(NbtCompound data, String key, byte nbttype) { 50 53 return data.getList(key, nbttype); 51 54 }
+5 -5
common/src/main/java/net/lerariemann/infinity/util/core/RandomProvider.java
··· 60 60 } 61 61 Path root = configPath.resolve("infinity.json"); 62 62 if (!root.toFile().exists()) return def; 63 - NbtCompound rules = CommonIO.read(configPath.resolve("infinity.json")).getCompound("gameRules"); 63 + NbtCompound rules = NbtUtils.getCompound(CommonIO.read(configPath.resolve("infinity.json")), "gameRules"); 64 64 if (!rules.contains(key)) return def; 65 65 return applier2.apply(rules, key); 66 66 } ··· 125 125 if (elem!=null) { 126 126 if (elem.getType() == NbtElement.INT_TYPE) gameRulesInt.put(s, NbtUtils.getInt(gameRules, s)); 127 127 if (elem.getType() == NbtElement.DOUBLE_TYPE) gameRulesDouble.put(s, NbtUtils.getDouble(gameRules, s)); 128 - else this.gameRules.put(s, gameRules.getBoolean(s)); 128 + else this.gameRules.put(s, NbtUtils.getBoolean(gameRules, s)); 129 129 } 130 130 } 131 131 NbtCompound rootChances = NbtUtils.getCompound(rootConfig, "rootChances"); ··· 136 136 } 137 137 } 138 138 139 - NbtList disabledDimensions = rootConfig.getList("disabledDimensions", NbtElement.STRING_TYPE); 139 + NbtList disabledDimensions = NbtUtils.getList(rootConfig, "disabledDimensions", NbtElement.STRING_TYPE); 140 140 for (NbtElement jsonElement : disabledDimensions) { 141 - this.disabledDimensions.add(jsonElement.asString()); 141 + this.disabledDimensions.add(String.valueOf(jsonElement)); 142 142 } 143 143 } 144 144 ··· 207 207 Path file = dir.resolve(type.getKey() + ".json"); 208 208 if (file.toFile().exists()) { 209 209 NbtCompound base = CommonIO.read(file); 210 - List<NbtCompound> list = base.getList("elements", NbtElement.COMPOUND_TYPE).stream().map(e -> (NbtCompound)e).toList(); 210 + List<NbtCompound> list = NbtUtils.getList(base, "elements", NbtElement.COMPOUND_TYPE).stream().map(e -> (NbtCompound)e).toList(); 211 211 registry.put(type, new WeighedStructure.Simple(list, type.getDef())); 212 212 } 213 213 }
+3 -2
common/src/main/java/net/lerariemann/infinity/util/teleport/PortalCreator.java
··· 12 12 import net.lerariemann.infinity.registry.core.ModItems; 13 13 import net.lerariemann.infinity.util.InfinityMethods; 14 14 import net.lerariemann.infinity.util.core.CommonIO; 15 + import net.lerariemann.infinity.util.core.NbtUtils; 15 16 import net.lerariemann.infinity.util.core.RandomProvider; 16 17 import net.lerariemann.infinity.util.loading.DimensionGrabber; 17 18 import net.lerariemann.infinity.options.PortalColorApplier; ··· 322 323 String key = id.getPath(); 323 324 if (comp.contains(key)) { 324 325 NbtList l; 325 - if (comp.contains(key, NbtElement.STRING_TYPE)) { 326 + if (comp.getType(key) == NbtElement.STRING_TYPE) { 326 327 l = new NbtList(); 327 328 l.add(comp.get(key)); 328 329 } 329 - else l = comp.getList(key, NbtElement.STRING_TYPE); 330 + else l = NbtUtils.getList(comp, key, NbtElement.STRING_TYPE); 330 331 NbtString nbts = NbtString.of(value); 331 332 if (l.contains(nbts)) return; //no need to record a value twice 332 333 comp.remove(key);