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

Create 6.0 support

+194 -12
+17 -2
common/build.gradle
··· 14 14 url = "https://maven.terraformersmc.com/" 15 15 } 16 16 maven { url 'https://jitpack.io' } 17 + exclusiveContent { 18 + forRepository { 19 + maven { 20 + name = "Fabricators of Create" 21 + url = "https://mvn.devos.one/snapshots" 22 + } 23 + } 24 + filter { 25 + includeGroup "io.github.fabricators_of_create" 26 + includeGroup "io.github.fabricators_of_create.Porting-Lib" 27 + includeGroup "com.tterrag.registrate_fabric" 28 + includeGroup "io.github.tropheusj" 29 + includeGroup "com.simibubi.create" 30 + } 31 + } 17 32 } 18 33 19 34 dependencies { ··· 39 54 // EMI 40 55 modCompileOnly("dev.emi:emi-xplat-intermediary:$emi_version+$minecraft_version:api") 41 56 42 - // Ponder 57 + // Create 43 58 modCompileOnly("net.createmod.ponder:Ponder-Fabric-${minecraft_version}:${ponder_version}") 44 - 59 + modCompileOnly("com.simibubi.create:create-fucked-up-${minecraft_version}:6.0.6+053024d") { transitive = false } 45 60 } 46 61 47 62 loom {
+60
common/src/main/java/net/lerariemann/infinity/block/custom/RailHelper.java
··· 1 + package net.lerariemann.infinity.block.custom; 2 + 3 + import com.mojang.serialization.MapCodec; 4 + import dev.architectury.platform.Platform; 5 + import net.lerariemann.infinity.compat.CreateCompat; 6 + import net.lerariemann.infinity.registry.core.ModBlockEntities; 7 + import net.minecraft.block.BlockState; 8 + import net.minecraft.block.BlockWithEntity; 9 + import net.minecraft.block.Blocks; 10 + import net.minecraft.block.entity.BlockEntity; 11 + import net.minecraft.server.world.ServerWorld; 12 + import net.minecraft.util.Identifier; 13 + import net.minecraft.util.math.BlockPos; 14 + import net.minecraft.util.math.random.Random; 15 + import net.minecraft.world.World; 16 + import org.jetbrains.annotations.Nullable; 17 + 18 + public class RailHelper extends BlockWithEntity { 19 + public RailHelper(Settings settings) { 20 + super(settings); 21 + } 22 + 23 + @Override 24 + protected MapCodec<? extends BlockWithEntity> getCodec() { 25 + return null; 26 + } 27 + 28 + @Override 29 + public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) { 30 + world.scheduleBlockTick(pos, this, 1); 31 + } 32 + 33 + @Override 34 + public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { 35 + if (Platform.isModLoaded("create")) { 36 + CreateCompat.reattachRails(world, pos, getBlockEntity(world, pos)); 37 + } 38 + else world.setBlockState(pos, Blocks.AIR.getDefaultState()); 39 + } 40 + 41 + public static RHBEntity getBlockEntity(ServerWorld world, BlockPos pos) { 42 + return ((RHBEntity)world.getBlockEntity(pos)); 43 + } 44 + 45 + @Override 46 + public @Nullable BlockEntity createBlockEntity(BlockPos pos, BlockState state) { 47 + return new RHBEntity(pos, state); 48 + } 49 + 50 + public static class RHBEntity extends BlockEntity { 51 + public Identifier trackBlock; 52 + public String shape; 53 + 54 + public RHBEntity(BlockPos pos, BlockState state) { 55 + super(ModBlockEntities.RAIL_HELPER.get(), pos, state); 56 + trackBlock = null; 57 + shape = "xo"; 58 + } 59 + } 60 + }
+87
common/src/main/java/net/lerariemann/infinity/compat/CreateCompat.java
··· 1 + package net.lerariemann.infinity.compat; 2 + 3 + import com.simibubi.create.api.contraption.train.PortalTrackProvider; 4 + import com.simibubi.create.content.trains.track.AllPortalTracks; 5 + import com.simibubi.create.content.trains.track.TrackBlock; 6 + import com.simibubi.create.content.trains.track.TrackShape; 7 + import net.createmod.catnip.math.BlockFace; 8 + import net.lerariemann.infinity.block.custom.RailHelper; 9 + import net.lerariemann.infinity.block.entity.InfinityPortalBlockEntity; 10 + import net.lerariemann.infinity.registry.core.ModBlocks; 11 + import net.minecraft.block.Block; 12 + import net.minecraft.block.BlockState; 13 + import net.minecraft.block.Blocks; 14 + import net.minecraft.registry.Registries; 15 + import net.minecraft.server.MinecraftServer; 16 + import net.minecraft.server.world.ServerWorld; 17 + import net.minecraft.state.property.Properties; 18 + import net.minecraft.util.math.BlockPos; 19 + import net.minecraft.util.math.Direction; 20 + import net.minecraft.world.World; 21 + 22 + import java.util.Optional; 23 + import java.util.Set; 24 + 25 + public class CreateCompat { 26 + private static PortalTrackProvider.Exit infinityPortalProvider(ServerWorld worldFrom, BlockFace blockFace) { 27 + MinecraftServer server = worldFrom.getServer(); 28 + // if (!server.isNetherAllowed()) return null; 29 + BlockPos posFrom = blockFace.getConnectedPos(); 30 + if (worldFrom.getBlockEntity(posFrom) instanceof InfinityPortalBlockEntity ipbe 31 + && ipbe.isConnectedBothSides()) { //we only allow trains through if portals are in sync 32 + ServerWorld worldTo = ipbe.getDimensionAsWorld(); 33 + BlockPos posTo = ipbe.getOtherSidePos(); 34 + assert posTo != null; 35 + Direction targetDirection = blockFace.getFace(); 36 + Direction.Axis axisTo = worldTo.getBlockState(posTo).get(Properties.HORIZONTAL_AXIS); 37 + if (targetDirection.getAxis().equals(axisTo)) { 38 + targetDirection = targetDirection.rotateYClockwise(); 39 + } 40 + return new PortalTrackProvider.Exit(worldTo, new BlockFace(posTo.offset(targetDirection), targetDirection.getOpposite())); 41 + } 42 + return null; 43 + } 44 + 45 + public static void register() { 46 + AllPortalTracks.tryRegisterIntegration(ModBlocks.PORTAL.get().arch$registryName(), CreateCompat::infinityPortalProvider); 47 + } 48 + 49 + public static void tryModifyRails(InfinityPortalBlockEntity ipbe) { 50 + World w = ipbe.getWorld(); 51 + if (w instanceof ServerWorld worldFrom) { 52 + BlockPos posFrom = ipbe.getPos(); 53 + BlockState state = worldFrom.getBlockState(posFrom); 54 + if (!state.isOf(ModBlocks.PORTAL.get())) return; 55 + Set<Direction> toCheck = state.get(Properties.HORIZONTAL_AXIS).equals(Direction.Axis.X) ? 56 + Set.of(Direction.NORTH, Direction.SOUTH) : Set.of(Direction.EAST, Direction.WEST); 57 + for (Direction dir : toCheck) { 58 + BlockPos posTrack = posFrom.offset(dir); 59 + BlockState bs = worldFrom.getBlockState(posTrack); 60 + if (bs.getBlock() instanceof TrackBlock) 61 + modifyRails(ipbe, worldFrom, posTrack, bs); 62 + } 63 + } 64 + } 65 + 66 + public static void modifyRails(InfinityPortalBlockEntity ipbe, ServerWorld worldFrom, 67 + BlockPos posTrack, BlockState bs) { 68 + if (ipbe.isConnectedBothSides()) { 69 + if (!bs.contains(TrackBlock.SHAPE)) return; 70 + worldFrom.setBlockState(posTrack, ModBlocks.RAIL_HELPER.get().getDefaultState()); 71 + RailHelper.RHBEntity e = RailHelper.getBlockEntity(worldFrom, posTrack); 72 + e.trackBlock = Registries.BLOCK.getId(bs.getBlock()); 73 + e.shape = switch (bs.get(TrackBlock.SHAPE)) { 74 + case TN, TS -> "zo"; 75 + default -> "xo"; 76 + }; 77 + } 78 + worldFrom.setBlockState(posTrack, Blocks.AIR.getDefaultState()); 79 + } 80 + public static void reattachRails(ServerWorld world, BlockPos pos, RailHelper.RHBEntity e) { 81 + BlockState bs; 82 + Optional<Block> b = Registries.BLOCK.getOrEmpty(e.trackBlock); 83 + if (b.isEmpty() || !(b.get() instanceof TrackBlock)) bs = Blocks.AIR.getDefaultState(); 84 + else bs = b.get().getDefaultState().with(TrackBlock.SHAPE, e.shape.equals("zo") ? TrackShape.ZO : TrackShape.XO); 85 + world.setBlockState(pos, bs); 86 + } 87 + }
+5
common/src/main/java/net/lerariemann/infinity/registry/core/ModBlockEntities.java
··· 6 6 import dev.architectury.registry.registries.DeferredRegister; 7 7 import dev.architectury.registry.registries.RegistrySupplier; 8 8 import net.lerariemann.infinity.InfinityMod; 9 + import net.lerariemann.infinity.block.custom.RailHelper; 9 10 import net.lerariemann.infinity.block.entity.*; 10 11 import net.minecraft.block.entity.BlockEntityType; 11 12 import net.minecraft.datafixer.TypeReferences; ··· 37 38 BlockEntityType.Builder.create(ChromaticBlockEntity::new, 38 39 ModBlocks.CHROMATIC_WOOL.get(), 39 40 ModBlocks.CHROMATIC_CARPET.get()).build(type("chromatic"))); 41 + public static final RegistrySupplier<BlockEntityType<RailHelper.RHBEntity>> RAIL_HELPER = 42 + BLOCK_ENTITY_TYPES.register("rail_helper_block_entity", () -> 43 + BlockEntityType.Builder.create(RailHelper.RHBEntity::new, 44 + ModBlocks.RAIL_HELPER.get()).build(type("rail_helper_block_entity"))); 40 45 41 46 42 47 public static void registerBlockEntities() {
+3
common/src/main/java/net/lerariemann/infinity/registry/core/ModBlocks.java
··· 6 6 import net.lerariemann.infinity.util.PlatformMethods; 7 7 import net.lerariemann.infinity.block.custom.*; 8 8 import net.minecraft.block.*; 9 + import net.minecraft.block.piston.PistonBehavior; 9 10 import net.minecraft.registry.RegistryKeys; 10 11 import net.minecraft.sound.BlockSoundGroup; 11 12 ··· 52 53 new NotesBlock(AbstractBlock.Settings.copy(Blocks.NOTE_BLOCK).ticksRandomly())); 53 54 public static final RegistrySupplier<Block> HAUNTED_AIR = BLOCKS.register("haunted_air", () -> 54 55 new HauntedBlock(Blocks.AIR)); 56 + public static final RegistrySupplier<RailHelper> RAIL_HELPER = BLOCKS.register("rail_helper", () -> 57 + new RailHelper(AbstractBlock.Settings.create().strength(-1.0F, 3600000.8F).mapColor(MapColor.CLEAR).dropsNothing().nonOpaque().allowsSpawning(Blocks::never).noBlockBreakParticles().pistonBehavior(PistonBehavior.BLOCK))); 55 58 56 59 public static void registerModBlocks() { 57 60 InfinityMod.LOGGER.debug("Registering blocks for " + MOD_ID);
+10 -7
common/src/main/java/net/lerariemann/infinity/util/teleport/PortalCreator.java
··· 4 4 import net.lerariemann.infinity.InfinityMod; 5 5 import net.lerariemann.infinity.access.MinecraftServerAccess; 6 6 import net.lerariemann.infinity.block.custom.Boopable; 7 + import net.lerariemann.infinity.compat.CreateCompat; 7 8 import net.lerariemann.infinity.compat.DimLibCompat; 8 9 import net.lerariemann.infinity.registry.core.ModBlocks; 9 10 import net.lerariemann.infinity.block.custom.InfinityPortalBlock; ··· 227 228 228 229 static PortalModifierUnion forInitialSetupping(ServerWorld world, BlockPos pos, Identifier id, boolean open) { 229 230 PortalColorApplier applier = PortalColorApplier.of(id, world.getServer()); 230 - return new PortalModifierUnion() 231 + PortalModifierUnion union = new PortalModifierUnion() 231 232 .addSetupper(infPortalSetupper(world, pos)) 232 - .addModifier(npbe -> { 233 - npbe.setDimension(id); 234 - npbe.setColor(applier.apply(npbe.getPos())); 235 - npbe.setOpen(open); 236 - npbe.markDirty(); 237 - }); 233 + .addModifier(nbpe -> nbpe.setDimension(id)) 234 + .addModifier(npbe -> npbe.setColor(applier.apply(npbe.getPos()))) 235 + .addModifier(npbe -> npbe.setOpen(open)) 236 + .addModifier(BlockEntity::markDirty); 237 + if (Platform.isModLoaded("create")) { 238 + union.addModifier(CreateCompat::tryModifyRails); 239 + } 240 + return union; 238 241 } 239 242 240 243 /**
+8 -3
gradle.properties
··· 3 3 org.gradle.parallel=true 4 4 5 5 # Mod properties 6 - mod_version = 2.5.0 6 + mod_version = 2.5.1 7 7 maven_group = net.lerariemann 8 8 archives_name = infinity 9 9 enabled_platforms = fabric,neoforge 10 - tbversion = 0 10 + tbversion = 1 11 11 12 12 # Minecraft properties 13 13 minecraft_version = 1.21.1 ··· 41 41 cct_version = 1.115.0 42 42 emi_version = 1.1.18 43 43 dimlib_version = v1.1.0-mc1.21.1 44 - ponder_version = 1.0.52 44 + 45 + # Create - NeoForge 46 + create_forge_version = 6.0.6-98 47 + ponder_version = 1.0.59 48 + flywheel_forge_version = 1.0.4 49 + registrate_forge_version = MC1.21-1.3.0+62
+4
neoforge/src/main/java/net/lerariemann/infinity/neoforge/InfinityModNeoForge.java
··· 1 1 package net.lerariemann.infinity.neoforge; 2 2 3 + import dev.architectury.platform.Platform; 3 4 import net.lerariemann.infinity.InfinityMod; 5 + import net.lerariemann.infinity.compat.CreateCompat; 4 6 import net.lerariemann.infinity.util.neoforge.NeoItems; 5 7 import net.lerariemann.infinity.registry.core.ModBlocks; 6 8 import net.lerariemann.infinity.registry.core.ModEntities; ··· 57 59 ModStats.load(); 58 60 ModBlocks.registerFlammableBlocks(); 59 61 ModItemFunctions.registerDispenserBehaviour(); 62 + if (Platform.isModLoaded("create")) 63 + CreateCompat.register(); 60 64 } 61 65 62 66 public static MinecraftClient client() {