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

Merge branch 'master' into architectury/1.21.4

+48 -5
+32
common/src/main/java/net/lerariemann/infinity/mixin/qol/EditWorldScreenMixin.java
··· 1 + package net.lerariemann.infinity.mixin.qol; 2 + 3 + import it.unimi.dsi.fastutil.booleans.BooleanConsumer; 4 + import net.lerariemann.infinity.util.InfinityMethods; 5 + import net.minecraft.client.MinecraftClient; 6 + import net.minecraft.client.gui.screen.world.EditWorldScreen; 7 + import net.minecraft.client.gui.tooltip.Tooltip; 8 + import net.minecraft.client.gui.widget.ButtonWidget; 9 + import net.minecraft.client.gui.widget.DirectionalLayoutWidget; 10 + import net.minecraft.text.Text; 11 + import net.minecraft.world.level.storage.LevelStorage; 12 + import org.spongepowered.asm.mixin.Final; 13 + import org.spongepowered.asm.mixin.Mixin; 14 + import org.spongepowered.asm.mixin.Shadow; 15 + import org.spongepowered.asm.mixin.injection.At; 16 + import org.spongepowered.asm.mixin.injection.Inject; 17 + import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 18 + 19 + @Mixin(EditWorldScreen.class) 20 + public class EditWorldScreenMixin { 21 + 22 + @Shadow @Final private BooleanConsumer callback; 23 + 24 + @Inject(method = "<init>", at = @At(value = "RETURN", target = "Lnet/minecraft/world/GameRules;getBoolean(Lnet/minecraft/world/GameRules$Key;)Z")) 25 + void addButton(MinecraftClient client, LevelStorage.Session session, String levelName, BooleanConsumer callback, CallbackInfo ci) { 26 + var screen = (EditWorldScreen) (Object) this; 27 + screen.addDrawableChild(ButtonWidget.builder(Text.translatable("screen.infinity.delete_datapacks"), button -> { 28 + boolean bl = InfinityMethods.deleteLevel(session); 29 + this.callback.accept(!bl); 30 + }).width(200).tooltip(Tooltip.of(Text.translatable("screen.infinity.delete_datapacks.tooltip"), null)).build()); 31 + } 32 + }
+1 -1
common/src/main/java/net/lerariemann/infinity/mixin/qol/FireBlockMixin.java
··· 12 12 public class FireBlockMixin { 13 13 /* Disabling fire tick in infdims */ 14 14 @ModifyExpressionValue(method = "scheduledTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/GameRules;getBoolean(Lnet/minecraft/world/GameRules$Key;)Z")) 15 - boolean inj(boolean original, @Local(argsOnly = true) ServerWorld world) { 15 + boolean disableFireTick(boolean original, @Local(argsOnly = true) ServerWorld world) { 16 16 if (InfinityMethods.isInfinity(world)) return false; 17 17 return original; 18 18 }
+7 -1
common/src/main/java/net/lerariemann/infinity/util/InfinityMethods.java
··· 28 28 import net.minecraft.world.BlockRenderView; 29 29 import net.minecraft.world.World; 30 30 import net.minecraft.world.WorldAccess; 31 + import net.minecraft.world.level.storage.LevelStorage; 32 + import org.apache.commons.io.FileUtils; 31 33 32 34 import java.nio.charset.StandardCharsets; 33 35 import java.util.Arrays; ··· 251 253 } 252 254 253 255 static CustomModelDataComponent getColoredModel(int color) { 254 - return new CustomModelDataComponent(List.of(), List.of(), List.of(), List.of(color)); 256 + return new CustomModelDataComponent(List.of(), List.of(), List.of(), List.of(color)); 257 + } 258 + 259 + static boolean deleteLevel(LevelStorage.Session session) { 260 + return FileUtils.deleteQuietly(session.getDirectory().path().resolve("datapacks").toFile()); 255 261 } 256 262 }
+2
common/src/main/resources/assets/infinity/lang/en_us.json
··· 141 141 "recipe_info.portal.infinity.attuned": "The item is attuned to the portal used", 142 142 "recipe_info.iridescence.infinity.key": "No matter the key provided, a random one is born", 143 143 "recipe_info.iridescence.infinity.chromatic_matter": "Gets drenched with the liquid's hue", 144 + "screen.infinity.delete_datapacks": "[Infinity] Delete Datapacks", 145 + "screen.infinity.delete_datapacks.tooltip": "WARNING: This option will forcibly delete all datapacks in this world's files. Use to recover a world if a dimension is preventing the world from being loaded.", 144 146 "stat.infinity.portals_opened_stat": "Infinity portals opened", 145 147 "stat.infinity.dimensions_opened_stat": "Unique dimensions discovered", 146 148 "stat.infinity.worlds_destroyed_stat": "Unique dimensions destroyed",
+2 -1
common/src/main/resources/infinity.accesswidener
··· 15 15 accessible class net/minecraft/entity/passive/FishEntity$FishMoveControl 16 16 accessible class net/minecraft/registry/SimpleRegistry$TagLookup 17 17 accessible field net/minecraft/loot/context/LootContextTypes MAP Lcom/google/common/collect/BiMap; 18 - accessible field net/minecraft/client/render/BackgroundRenderer fogEnabled Z 18 + accessible field net/minecraft/client/render/BackgroundRenderer fogEnabled Z 19 + accessible method net/minecraft/client/gui/screen/Screen addDrawableChild (Lnet/minecraft/client/gui/Element;)Lnet/minecraft/client/gui/Element;
+1
common/src/main/resources/infinity.mixins.json
··· 63 63 "options.SkyRenderingMixin", 64 64 "options.SoundSystemMixin", 65 65 "options.WorldRendererMixin", 66 + "qol.EditWorldScreenMixin", 66 67 "qol.KeyboardMixin" 67 68 ], 68 69 "injectors": {
+3 -2
neoforge/src/main/java/net/lerariemann/infinity/neoforge/client/InfinityModNeoForgeClient.java
··· 16 16 import net.minecraft.fluid.FluidState; 17 17 import net.minecraft.util.Identifier; 18 18 import net.minecraft.util.math.BlockPos; 19 + import net.minecraft.util.math.ColorHelper; 19 20 import net.minecraft.world.BlockRenderView; 20 21 import net.neoforged.bus.api.IEventBus; 21 22 import net.neoforged.bus.api.SubscribeEvent; ··· 106 107 107 108 @Override 108 109 public int getTintColor() { 109 - return Iridescence.getTimeBasedColor(); 110 + return ColorHelper.Argb.fullAlpha(Iridescence.getTimeBasedColor()); 110 111 } 111 112 @Override 112 113 public int getTintColor(@NotNull FluidState state, @NotNull BlockRenderView getter, @NotNull BlockPos pos) { 113 - return Iridescence.getPosBasedColor(pos); 114 + return ColorHelper.Argb.fullAlpha(Iridescence.getPosBasedColor(pos)); 114 115 } 115 116 116 117 }, FluidTypes.IRIDESCENCE_TYPE.value());