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

amendment mod selectors; bumblezone amendment

Lera 3f31ff49 3d7a2c70

+83 -33
+3 -1
CHANGELOG-LATEST.md
··· 9 9 ### Technical 10 10 - The mod now makes use of data generation, improving consistency between versions. 11 11 - Payload-related code is compartmentalised, which should not affect anything observable to the user but might spawn unknown bugs. 12 + - Amendments can now use excluding mod selectors, i.e. "!minecraft" to affect everything except vanilla minecraft content. 12 13 13 14 ### Fixes 14 15 - Corals no longer crash world generation. (Cass) 15 - - Custom packets are correctly registered on the client. (Cass, 1.21.1 Neoforge) 16 + - Custom packets are correctly registered on the client. (Cass, 1.21.1 Neoforge) 17 + - The 11th amendment was changed to blacklist bumblezone biomes instead of structures.
+19 -2
src/main/java/net/lerariemann/infinity/compat/cloth/AmendmentConfigFactory.java
··· 11 11 import me.shedaniel.clothconfig2.impl.builders.SubCategoryBuilder; 12 12 import net.lerariemann.infinity.util.core.CommonIO; 13 13 import net.lerariemann.infinity.util.core.NbtUtils; 14 + import net.lerariemann.infinity.util.platform.InfinityPlatform; 14 15 import net.minecraft.nbt.CompoundTag; 15 16 import net.minecraft.nbt.ListTag; 16 17 import net.minecraft.nbt.StringTag; 17 18 import net.minecraft.nbt.Tag; 18 19 import net.minecraft.network.chat.Component; 20 + 21 + import java.io.File; 19 22 import java.util.*; 20 23 24 + import static net.lerariemann.infinity.InfinityMod.LOGGER; 25 + import static net.lerariemann.infinity.InfinityMod.configPath; 21 26 import static net.lerariemann.infinity.compat.cloth.ClothConfigFactory.*; 22 27 23 28 public class AmendmentConfigFactory { ··· 30 35 boolean edited = false; 31 36 ConfigCategory amendmentCategory; 32 37 ConfigBuilder builder; 38 + public static List<String> allModIds; 33 39 34 40 AmendmentConfigFactory(ConfigBuilder builder) { 35 41 this.builder = builder; ··· 139 145 140 146 void build() { 141 147 var area = addStringDropdownOption("area", always, 142 - Lists.newArrayList("blocks", "fluids", "items", "structures", "trees", "mobs")); 143 - addStringOption("mod", always); 148 + Lists.newArrayList("blocks", "fluids", "items", "structures", "biomes", "trees", "mobs")); 149 + 150 + var v = configPath.resolve("modular").toFile().listFiles(File::isDirectory); 151 + if (v != null) allModIds = Arrays.stream(v).map(File::getName).toList(); 152 + else allModIds = InfinityPlatform.INSTANCE.getModsLoaded(); 153 + List<String> res = new ArrayList<>(); 154 + res.add("all"); 155 + res.add("!minecraft"); 156 + res.addAll(allModIds); 157 + allModIds.forEach(s -> { 158 + if (!s.equals("minecraft")) res.add("!" + s); 159 + }); 160 + addStringDropdownOption("mod", always, res); 144 161 145 162 var selector = addStringDropdownOption("selector", always, 146 163 Lists.newArrayList("all", "matching", "matching_any", "matching_block_tag", "containing"));
-1
src/main/java/net/lerariemann/infinity/compat/cloth/ClothConfigFactory.java
··· 1 1 package net.lerariemann.infinity.compat.cloth; 2 2 3 - 4 3 import com.google.gson.*; 5 4 import com.mojang.brigadier.exceptions.CommandSyntaxException; 6 5 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
+11
src/main/java/net/lerariemann/infinity/util/config/Amendment.java
··· 32 32 if (mod.equals("all")) { 33 33 modSelector = new UniversalModSelector(); 34 34 } 35 + else if (mod.startsWith("!")) { 36 + String notMod = mod.substring(1); 37 + if (!InfinityPlatform.INSTANCE.isModLoaded(notMod)) modSelector = new UniversalModSelector(); 38 + else modSelector = new ExceptModSelector(notMod); 39 + } 35 40 else if (!InfinityPlatform.INSTANCE.isModLoaded(mod)) return null; 36 41 else modSelector = new MatchingModSelector(mod); 37 42 ··· 103 108 @Override 104 109 public boolean applies(String modId) { 105 110 return modId.equals(this.mod); 111 + } 112 + } 113 + public record ExceptModSelector(String mod) implements ModSelector { 114 + @Override 115 + public boolean applies(String modId) { 116 + return !modId.equals(this.mod); 106 117 } 107 118 } 108 119
+2
src/main/java/net/lerariemann/infinity/util/platform/InfinityPlatform.java
··· 29 29 *///?} 30 30 31 31 import java.nio.file.Path; 32 + import java.util.List; 32 33 33 34 public interface InfinityPlatform { 34 35 int version = ··· 83 84 *///?} 84 85 85 86 boolean isModLoaded(String modid); 87 + List<String> getModsLoaded(); 86 88 String loader(); 87 89 Path getConfigFolder(); 88 90 boolean isDevelopment();
+6
src/main/java/net/lerariemann/infinity/util/platform/fabric/FabricPlatformImpl.java
··· 42 42 import net.minecraft.world.level.material.MapColor; 43 43 44 44 import java.nio.file.Path; 45 + import java.util.List; 45 46 46 47 public class FabricPlatformImpl implements InfinityPlatform { 47 48 48 49 @Override 49 50 public boolean isModLoaded(String modid) { 50 51 return FabricLoader.getInstance().isModLoaded(modid); 52 + } 53 + 54 + @Override 55 + public List<String> getModsLoaded() { 56 + return FabricLoader.getInstance().getAllMods().stream().map(c -> c.getMetadata().getId()).toList(); 51 57 } 52 58 53 59 @Override
+7
src/main/java/net/lerariemann/infinity/util/platform/forge/ForgePlatformImpl.java
··· 31 31 import net.minecraftforge.fml.ModLoadingContext; 32 32 import net.minecraftforge.fml.loading.FMLEnvironment; 33 33 import net.minecraftforge.fml.loading.FMLPaths; 34 + import net.minecraftforge.forgespi.language.IModInfo; 34 35 35 36 import java.nio.file.Path; 37 + import java.util.List; 36 38 37 39 public class ForgePlatformImpl implements InfinityPlatform { 38 40 @Override 39 41 public boolean isModLoaded(String modid) { 40 42 return ModList.get().isLoaded(modid); 43 + } 44 + 45 + @Override 46 + public List<String> getModsLoaded() { 47 + return ModList.get().getMods().stream().map(IModInfo::getModId).toList(); 41 48 } 42 49 43 50 @Override
+10 -10
src/main/java/net/lerariemann/infinity/util/platform/neoforge/InfinityModNeoForgeClient.java
··· 19 19 import net.minecraft.client.renderer.ItemBlockRenderTypes; 20 20 import net.minecraft.client.renderer.RenderType; 21 21 //? if >1.21.4 { 22 - import net.minecraft.client.renderer.chunk.ChunkSectionLayer; 22 + /^import net.minecraft.client.renderer.chunk.ChunkSectionLayer; 23 23 import net.lerariemann.infinity.item.tint.InfinityTintSource; 24 24 25 - //?} 25 + ^///?} 26 26 import net.minecraft.core.BlockPos; 27 27 import net.minecraft.resources.ResourceLocation; 28 28 import net.minecraft.world.level.BlockAndTintGetter; ··· 72 72 event.register(InfinityMethods::getBookBoxColor, ModBlocks.BOOK_BOX.get()); 73 73 } 74 74 //? if <1.21.4 { 75 - /^@SubscribeEvent 75 + @SubscribeEvent 76 76 public static void registerItemColorHandlers(RegisterColorHandlersEvent.Item event) { 77 77 event.register(InfinityMethods::getOverlayColorFromComponents, 78 78 ModItems.TRANSFINITE_KEY.get(), ··· 86 86 event.register(InfinityMethods::getDiscColorFromComponents, 87 87 ModItems.DISC.get()); 88 88 } 89 - ^///?} else { 90 - @SubscribeEvent 89 + //?} else { 90 + /^@SubscribeEvent 91 91 public static void registerItemColorHandlers(RegisterColorHandlersEvent.ItemTintSources event) { 92 92 event.register(InfinityMethods.getId("color"), InfinityTintSource.MAP_CODEC); 93 93 } 94 - //?} 94 + ^///?} 95 95 @SubscribeEvent 96 96 public static void registerMenuScreens(RegisterMenuScreensEvent event) { 97 97 event.register(ModScreenHandlers.F4.get(), F4Screen::new); ··· 104 104 @SubscribeEvent 105 105 public static void registerFluidRenderLayers(FMLClientSetupEvent event) { 106 106 //? if >1.21.4 { 107 - ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceStill().get(), ChunkSectionLayer.TRANSLUCENT); 107 + /^ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceStill().get(), ChunkSectionLayer.TRANSLUCENT); 108 108 ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceFlowing().get(), ChunkSectionLayer.TRANSLUCENT); 109 - //?} else { 110 - /^ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceStill().get(), RenderType.translucent()); 109 + ^///?} else { 110 + ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceStill().get(), RenderType.translucent()); 111 111 ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceFlowing().get(), RenderType.translucent()); 112 - ^///?} 112 + //?} 113 113 } 114 114 115 115 @SubscribeEvent
+6 -6
src/main/java/net/lerariemann/infinity/util/platform/neoforge/InfinityModNeoforge.java
··· 3 3 //? neoforge { 4 4 /*import net.lerariemann.infinity.InfinityMod; 5 5 //? if >1.21.4 { 6 - import net.lerariemann.infinity.compat.ModCompat; 6 + /^import net.lerariemann.infinity.compat.ModCompat; 7 7 import net.lerariemann.infinity.compat.rrv.RrvIntegration; 8 - //?} 8 + ^///?} 9 9 import net.lerariemann.infinity.registry.core.ModBlocks; 10 10 import net.lerariemann.infinity.registry.core.ModEntities; 11 11 import net.lerariemann.infinity.registry.core.ModItemFunctions; ··· 40 40 ModFluidsNeoforge.registerModFluids(); 41 41 ModEffectsNeoforge.register(eventBus); 42 42 //? if <1.21.2 { 43 - /^if (InfinityPlatform.INSTANCE.isModLoaded("create")) 43 + if (InfinityPlatform.INSTANCE.isModLoaded("create")) 44 44 net.lerariemann.infinity.compat.CreateCompat.register(); 45 - ^///?} 45 + //?} 46 46 } 47 47 48 48 @SubscribeEvent ··· 77 77 ModItemFunctions.registerDispenserBehaviour(); 78 78 // this is less than ideal but i cannot figure out why the proper solution isn't working 79 79 //? if >1.21.4 { 80 - if (ModCompat.RRV) 80 + /^if (ModCompat.RRV) 81 81 RrvIntegration.initialize(); 82 - //?} 82 + ^///?} 83 83 } 84 84 85 85 @SubscribeEvent
+17 -11
src/main/java/net/lerariemann/infinity/util/platform/neoforge/NeoForgePlatformImpl.java
··· 36 36 import net.neoforged.fml.loading.FMLEnvironment; 37 37 import net.neoforged.fml.loading.FMLPaths; 38 38 //? if >1.21.4 { 39 - import net.neoforged.neoforge.client.network.ClientPacketDistributor; 40 - //?} 39 + /^import net.neoforged.neoforge.client.network.ClientPacketDistributor; 40 + ^///?} 41 41 import net.neoforged.neoforge.common.NeoForge; 42 42 import net.neoforged.neoforge.common.Tags; 43 43 import net.neoforged.neoforge.event.level.LevelEvent; 44 44 import net.neoforged.neoforge.network.PacketDistributor; 45 + import net.neoforged.neoforgespi.language.IModInfo; 45 46 46 47 import java.nio.file.Path; 48 + import java.util.List; 47 49 import java.util.function.Supplier; 48 50 49 51 public class NeoForgePlatformImpl implements InfinityPlatform { 50 52 @Override 51 53 public boolean isModLoaded(String modid) { 52 54 return ModList.get().isLoaded(modid); 55 + } 56 + @Override 57 + public List<String> getModsLoaded() { 58 + return ModList.get().getMods().stream().map(IModInfo::getModId).toList(); 53 59 } 54 60 55 61 @Override ··· 84 90 @Override 85 91 public void sendC2SPayload(FriendlyPacket payload) { 86 92 //? <1.21.2 { 87 - /^PacketDistributor.sendToServer(payload); 88 - ^///?} else { 89 - ClientPacketDistributor.sendToServer(payload); 90 - //?} 93 + PacketDistributor.sendToServer(payload); 94 + //?} else { 95 + /^ClientPacketDistributor.sendToServer(payload); 96 + ^///?} 91 97 } 92 98 93 99 /^* ··· 140 146 public RegistrySupplier<LiquidBlock> getIridBlockForReg() { 141 147 var properties = VersionMethods.copyBlockProperties(Blocks.WATER).mapColor(MapColor.COLOR_MAGENTA) 142 148 //? if >1.21.2 143 - .setId(ModBlocks.registryKey("iridescence")) 149 + /^.setId(ModBlocks.registryKey("iridescence"))^/ 144 150 ; 145 151 return ModBlocks.BLOCKS.register("iridescence", () -> 146 152 new IridescenceLiquidBlockNeoforge(InfinityPlatform.INSTANCE.getIridescenceStill(), properties)); ··· 210 216 public Item.Properties deferredIntComponent(String id, RegistrySupplier<DataComponentType<Integer>> componentTypeSupplier, int i) { 211 217 return new Item.Properties().component(componentTypeSupplier, i) 212 218 //? if >1.21.4 213 - .setId(ModItems.registryKey(id)) 219 + /^.setId(ModItems.registryKey(id))^/ 214 220 ; 215 221 } 216 222 @Override 217 223 public ItemEnchantments getEnchantments(ItemStack weapon, MinecraftServer s) { 218 224 return weapon.getAllEnchantments(s.registryAccess() 219 225 //? if >1.21.4 { 220 - .lookupOrThrow(Registries.ENCHANTMENT)); 221 - //?} else { 222 226 /^.lookupOrThrow(Registries.ENCHANTMENT)); 223 - ^///?} 227 + ^///?} else { 228 + .lookupOrThrow(Registries.ENCHANTMENT)); 229 + //?} 224 230 } 225 231 226 232 @Override
+2 -2
src/main/resources/config/common/amendments.json
··· 1 1 { 2 - "amendment_version": 3, 2 + "amendment_version": 4, 3 3 "elements": [ 4 4 { 5 5 "area": "fluids", ··· 83 83 "value": 0.1 84 84 }, 85 85 { 86 - "area": "structures", 86 + "area": "biomes", 87 87 "mod": "the_bumblezone", 88 88 "selector": "all", 89 89 "results": "erase"