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

more disc stuff & multiversioned fixes

Lera ebdc7cd7 53ae1896

+97 -50
+3
CHANGELOG-LATEST.md
··· 1 1 ### Features 2 2 - Haunted dimensions are significantly refactored; `notes` dimension is populated with features and opened to the public. 3 3 - "Notes" block is removed as the new implementation does not use it. 4 + - Custom music discs (dropped from chaos creepers when killed by skeletons): 5 + - are backported to 1.20; 6 + - empty ones from the creative inventory now have a tooltip and can be burned to a random song on rightclick. 4 7 - Footprints are given a use: throwing them in a portal creates a special exit-only portal that counts as a valid destination for returning from any dimension - helpful if the original portal you went through gets destroyed or overwritten by another player. 5 8 6 9 ### Technical
+7
docs/blocks-and-items.mdx
··· 45 45 - Infinity Portals can also be used for Portal Crafting, tossing various items in will result in them changing form (TNT to Reset Charge, Lectern to Transfinite Altar, etc.) 46 46 A full list of crafting recipes can be found in EMI. 47 47 48 + ## Music Disc 49 + 50 + These discs can be obtained from chaos creepers when they are killed by skeletons, 51 + and the music selection on them is much wider than that of regular creepers; 52 + it can have any song in the game burned on it (defined with custom tags). 53 + The ones in the creative inventory lack these tags and do not play anything, but can be burned to a random song on right click. 54 + 48 55 ## Reset Charge 49 56 50 57 The Reset Charge is an anti-lag tool that can be used to erase dimension definition files - if you place and activate one,
-14
src/main/java/net/lerariemann/infinity/features/NotesJukeboxFeature.java
··· 10 10 import net.minecraft.world.level.levelgen.feature.Feature; 11 11 import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; 12 12 import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; 13 - //? if >1.21 { 14 - import net.lerariemann.infinity.InfinityMod; 15 - import net.lerariemann.infinity.registry.core.ModComponentTypes; 16 - import net.lerariemann.infinity.registry.core.ModItems; 17 13 import net.lerariemann.infinity.util.InfinityMethods; 18 - import net.lerariemann.infinity.util.VersionMethods; 19 - import net.lerariemann.infinity.util.core.ConfigType; 20 14 import net.minecraft.world.level.block.entity.HopperBlockEntity; 21 - import net.minecraft.core.component.DataComponentMap; 22 - import net.minecraft.core.component.DataComponents; 23 - import net.minecraft.core.registries.Registries; 24 - import net.minecraft.resources.ResourceKey; 25 - import net.minecraft.resources.ResourceLocation; 26 15 import net.minecraft.util.RandomSource; 27 - import net.minecraft.world.item.EitherHolder; 28 16 import net.minecraft.world.item.ItemStack; 29 - import net.minecraft.world.item.JukeboxPlayable; 30 - //?} 31 17 32 18 public class NotesJukeboxFeature extends Feature<NoneFeatureConfiguration> { 33 19 public NotesJukeboxFeature(Codec<NoneFeatureConfiguration> codec) {
+75 -20
src/main/java/net/lerariemann/infinity/item/DiscItem.java
··· 2 2 3 3 //? if <1.21 { 4 4 /*import net.lerariemann.infinity.access.MinecraftServerAccess; 5 - import net.lerariemann.infinity.registry.core.ModComponentTypes; 6 - import net.lerariemann.infinity.registry.core.ModItems; 7 - import net.lerariemann.infinity.util.InfinityMethods; 8 - import net.lerariemann.infinity.util.VersionMethods; 9 5 import net.minecraft.ChatFormatting; 10 6 import net.minecraft.core.BlockPos; 11 7 import net.minecraft.nbt.CompoundTag; 12 8 import net.minecraft.network.chat.Component; 13 - import net.minecraft.server.MinecraftServer; 14 9 import net.minecraft.sounds.SoundEvents; 15 10 import net.minecraft.stats.Stats; 16 11 import net.minecraft.world.InteractionResult; 17 12 import net.minecraft.world.entity.player.Player; 18 - import net.minecraft.world.item.ItemStack; 19 - import net.minecraft.world.item.RecordItem; 20 - import net.minecraft.world.item.TooltipFlag; 21 13 import net.minecraft.world.item.context.UseOnContext; 22 14 import net.minecraft.world.level.Level; 23 15 import net.minecraft.world.level.block.Blocks; ··· 29 21 import org.jetbrains.annotations.NotNull; 30 22 31 23 import java.util.List; 32 - *///?} 33 - 24 + *///?} else { 34 25 import net.lerariemann.infinity.InfinityMod; 35 - import net.lerariemann.infinity.registry.core.ModComponentTypes; 36 - import net.lerariemann.infinity.registry.core.ModItems; 37 - import net.lerariemann.infinity.util.InfinityMethods; 38 - import net.lerariemann.infinity.util.VersionMethods; 39 26 import net.lerariemann.infinity.util.core.ConfigType; 27 + import net.minecraft.ChatFormatting; 40 28 import net.minecraft.core.component.DataComponentMap; 41 29 import net.minecraft.core.component.DataComponents; 42 30 import net.minecraft.core.registries.Registries; 31 + import net.minecraft.network.chat.Component; 32 + import net.minecraft.world.item.component.TooltipDisplay; 33 + import net.minecraft.network.chat.MutableComponent; 43 34 import net.minecraft.resources.ResourceKey; 44 35 import net.minecraft.resources.ResourceLocation; 36 + //?} 37 + import net.lerariemann.infinity.registry.core.ModComponentTypes; 38 + import net.lerariemann.infinity.registry.core.ModItems; 39 + import net.lerariemann.infinity.util.InfinityMethods; 40 + import net.lerariemann.infinity.util.VersionMethods; 45 41 import net.minecraft.server.MinecraftServer; 46 - import net.minecraft.world.item.EitherHolder; 47 - import net.minecraft.world.item.ItemStack; 48 - import net.minecraft.world.item.JukeboxPlayable; 42 + import net.minecraft.world.level.Level; 43 + import net.minecraft.world.InteractionHand; 44 + import net.minecraft.world.InteractionResult; 45 + import net.minecraft.world.item.*; 46 + //? if <1.21.5 { 47 + /*import net.minecraft.world.InteractionResultHolder; 48 + *///?} 49 + import net.minecraft.world.entity.player.Player; 50 + 51 + import java.util.function.Consumer; 49 52 50 53 public class DiscItem 51 54 //? if <1.21 { 52 55 /*extends RecordItem 53 - *///?} 56 + *///?} else { 57 + extends Item 58 + //?} 54 59 { 55 - //? if <1.21 { 60 + public static String emptySubtitle = "subtitles.music.missing"; 61 + //? if <1.21 { 56 62 /* 57 - public static String emptySubtitle = "infinity.subtitle.missing"; 58 63 public static int defaultDuration = 185; 59 64 60 65 public DiscItem(Properties builder) { ··· 107 112 } 108 113 } 109 114 *///?} else { 115 + public DiscItem(Properties properties) { 116 + super(properties); 117 + } 118 + 119 + @Override 120 + public void appendHoverText(ItemStack stack, TooltipContext context, 121 + //? if >1.21.2 { 122 + TooltipDisplay tooltipDisplay, Consumer<Component> tooltipAdder 123 + //?} else { 124 + /*List<Component> tooltip 125 + *///?} 126 + , TooltipFlag type) { 127 + //? if >1.21.2 { 128 + super.appendHoverText(stack, context, tooltipDisplay, tooltipAdder, type); 129 + //?} else { 130 + /*super.appendHoverText(stack, context, tooltip, type); 131 + Consumer<Component> tooltipAdder = tooltip::add; 132 + *///?} 133 + if (isBlank(stack)) { 134 + MutableComponent mutableText = Component.translatable(emptySubtitle).withStyle(ChatFormatting.GRAY); 135 + tooltipAdder.accept(mutableText); 136 + } 137 + } 138 + 110 139 public static ItemStack getRandom(MinecraftServer server) { 111 140 ItemStack stack = ModItems.DISC.get().getDefaultInstance(); 112 141 ResourceLocation song = VersionMethods.id(InfinityMod.provider.randomName(InfinityMod.random, ConfigType.JUKEBOXES)); ··· 120 149 return stack; 121 150 } 122 151 //?} 152 + public static boolean isBlank(ItemStack st) { 153 + //? if <1.21 { 154 + /*return !st.getOrCreateTag().contains("sound_id"); 155 + *///?} else { 156 + return !st.getComponents().has(DataComponents.JUKEBOX_PLAYABLE); 157 + //?} 158 + } 159 + 160 + @Override 161 + public 162 + //? if <1.21.5 { 163 + /*InteractionResultHolder<ItemStack> 164 + *///?} else { 165 + InteractionResult 166 + //?} 167 + use(Level world, Player player, InteractionHand hand) { 168 + ItemStack st = player.getItemInHand(hand); 169 + if (isBlank(st)) { 170 + player.setItemInHand(hand, st.copyWithCount(st.getCount() - 1)); 171 + if (!world.isClientSide()) { 172 + player.getInventory().add(getRandom(world.getServer())); 173 + } 174 + return VersionMethods.success(player.getItemInHand(hand)); 175 + } 176 + return VersionMethods.pass(st); 177 + } 123 178 }
+10 -10
src/main/java/net/lerariemann/infinity/mixin/options/WorldRendererMixin.java
··· 2 2 3 3 //? if <1.21.2 { 4 4 /*import com.mojang.blaze3d.vertex.VertexBuffer; 5 - import net.minecraft.client.resources.sounds.SimpleSoundInstance; 6 - import net.minecraft.client.resources.sounds.SoundInstance; 7 - import net.minecraft.core.BlockPos; 8 - import net.minecraft.network.chat.Component; 9 - import net.minecraft.sounds.SoundEvent; 10 - import net.minecraft.world.item.RecordItem; 11 - import net.minecraft.world.level.Level; 12 - import net.minecraft.world.phys.Vec3; 13 5 import org.spongepowered.asm.mixin.injection.Constant; 14 6 import org.spongepowered.asm.mixin.injection.ModifyConstant; 15 7 import net.lerariemann.infinity.util.InfinityMethods; 16 8 *///?} else { 17 - 18 9 import com.mojang.blaze3d.buffers.GpuBufferSlice; 19 10 import com.mojang.blaze3d.framegraph.FrameGraphBuilder; 20 11 import com.mojang.blaze3d.framegraph.FramePass; ··· 32 23 import net.minecraft.client.Camera; 33 24 //? if >1.21 { 34 25 import net.minecraft.client.renderer.*; 35 - //?} 26 + //?} else { 27 + /*import net.minecraft.client.resources.sounds.SimpleSoundInstance; 28 + import net.minecraft.client.resources.sounds.SoundInstance; 29 + import net.minecraft.core.BlockPos; 30 + import net.minecraft.network.chat.Component; 31 + import net.minecraft.sounds.SoundEvent; 32 + import net.minecraft.world.item.RecordItem; 33 + import net.minecraft.world.level.Level; 34 + import net.minecraft.world.phys.Vec3; 35 + *///?} 36 36 import net.minecraft.client.Minecraft; 37 37 import net.minecraft.client.multiplayer.ClientLevel; 38 38 //? if >1.21.2 && neoforge {
+1 -6
src/main/java/net/lerariemann/infinity/registry/core/ModItems.java
··· 139 139 registerItemAfter("f4", Items.WRITABLE_BOOK, F4Item::new, 140 140 new Item.Properties().rarity(Rarity.UNCOMMON)); 141 141 public static final RegistrySupplier<Item> DISC = 142 - registerItemAfter("disc", Items.MUSIC_DISC_PIGSTEP, 143 - //? if >1.21 { 144 - Item::new, 145 - //?} else { 146 - /*DiscItem::new, 147 - *///?} 142 + registerItemAfter("disc", Items.MUSIC_DISC_PIGSTEP, DiscItem::new, 148 143 new Item.Properties().rarity(Rarity.RARE)); 149 144 public static final RegistrySupplier<Item> IRIDESCENT_POTION = 150 145 registerItemAfter("iridescent_potion", Items.HONEY_BOTTLE, settings ->
+1
src/main/resources/assets/infinity/lang/en_us.json
··· 148 148 "stat.infinity.dimensions_opened_stat": "Unique dimensions discovered", 149 149 "stat.infinity.worlds_destroyed_stat": "Unique dimensions destroyed", 150 150 "stat.infinity.iridescence_stat": "Iridescent journeys had", 151 + "subtitles.music.missing": "Song not set", 151 152 "subtitles.music.ivory.hope_instilled": "ivory - hope instilled", 152 153 "subtitles.music.ivory.challenger": "ivory - challenger", 153 154 "subtitles.music.c418.classic": "Classic Minecraft music by C418",