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

Compare changes

Choose any two refs to compare.

+11503 -5872
+15 -8
CHANGELOG-LATEST.md
··· 1 - ### Fixed 2 - - Create train tracks now respect offsets from the center of the portal; this makes it possible to route two tracks through the same portal. (Lera) 3 - - Chests in dungeons in random dimensions were missing their contents, now they aren't. (Lera) 4 - - Beacon structure from `missing` now generates correctly. (Cassian) 5 - - F4 config screen was bugged on 1.21.8, it is fixed. (Cassian) 6 - - A crash with a "tinted leaves" particle is fixed. (1.21.8, Cassian) 7 - - Chromatic potion brewing recipe is viewable in RRV. (1.21.8, Cassian) 8 9 ### Technical 10 - - Config file structure is reworked in the jar to make differences between Minecraft versions easier to handle, this should not have any effect on anything user-facing but i'll include this change here just in case it spawns some bug.
··· 1 + ### Features 2 + - Haunted dimensions are significantly refactored; `notes` dimension is populated with features and opened to the public. 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. 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. 8 9 ### Technical 10 + - The mod now makes use of data generation, improving consistency between versions. 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. 13 + 14 + ### Fixes 15 + - Corals no longer crash world generation. (Cass) 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.
+15
CHANGELOG.md
··· 1 ## [2.6.3 - 24/I/2026] 2 ### Fixed: 3 - Iridescence fluid rendering (in world and in EMI) (Forge 1.20)
··· 1 + ## [2.6.5 - 25/I/2026] 2 + A crucial crash exclusive to Fabric 1.21.8 is fixed which was triggering a ConcurrentModificationException on every portal activation. 3 + 4 + ## [2.6.4 - 25/I/2026] 5 + ### Fixed 6 + - Create train tracks now respect offsets from the center of the portal; this makes it possible to route two tracks through the same portal. (Lera) 7 + - Chests in dungeons in random dimensions were missing their contents, now they aren't. (Lera) 8 + - Beacon structure from `missing` now generates correctly. (Cassian) 9 + - F4 config screen was bugged on 1.21.8, it is fixed. (Cassian) 10 + - A crash with a "tinted leaves" particle is fixed. (1.21.8, Cassian) 11 + - Chromatic potion brewing recipe is viewable in RRV. (1.21.8, Cassian) 12 + 13 + ### Technical 14 + - Config file structure is reworked in the jar to make differences between Minecraft versions easier to handle, this should not have any effect on anything user-facing but i'll include this change here just in case it spawns some bug. 15 + 16 ## [2.6.3 - 24/I/2026] 17 ### Fixed: 18 - Iridescence fluid rendering (in world and in EMI) (Forge 1.20)
+14 -6
build.fabric.gradle.kts
··· 11 version = "${property("mod.version")}+${property("deps.minecraft")}" 12 if (property("mod.test_build") != "0") version = "$version-tb${property("mod.test_build")}" 13 14 tasks.named<ProcessResources>("processResources") { 15 fun prop(name: String) = project.property(name) as String 16 ··· 211 } 212 213 214 - //fabricApi { 215 - // configureDataGeneration() { 216 - // outputDirectory = file("$rootDir/src/main/generated") 217 - // client = true 218 - // } 219 - //} 220 221 tasks.named("processResources") { 222 dependsOn(":${stonecutter.current.project}:stonecutterGenerate")
··· 11 version = "${property("mod.version")}+${property("deps.minecraft")}" 12 if (property("mod.test_build") != "0") version = "$version-tb${property("mod.test_build")}" 13 14 + val majorVersion = if (stonecutter.eval(stonecutter.current.version, ">=1.21.2")) { 15 + 22 16 + } else if (stonecutter.eval(stonecutter.current.version, ">=1.21")) { 17 + 21 18 + } else { 19 + 20 20 + } 21 + 22 + 23 tasks.named<ProcessResources>("processResources") { 24 fun prop(name: String) = project.property(name) as String 25 ··· 220 } 221 222 223 + fabricApi { 224 + configureDataGeneration { 225 + client = true 226 + } 227 + } 228 229 tasks.named("processResources") { 230 dependsOn(":${stonecutter.current.project}:stonecutterGenerate")
+4
build.forge.gradle.kts
··· 216 } 217 } 218 219 220 tasks { 221 processResources {
··· 216 } 217 } 218 219 + tasks.register<Sync>("syncDatagen") { 220 + from(project(":${minecraft}-fabric").tasks.named("runDatagen")) 221 + into(file("src/main/generated/")) 222 + } 223 224 tasks { 225 processResources {
+10
build.neoforge.gradle.kts
··· 127 sourceSet(sourceSets["main"]) 128 } 129 } 130 } 131 132 dependencies { ··· 159 160 } 161 162 163 tasks { 164 processResources {
··· 127 sourceSet(sourceSets["main"]) 128 } 129 } 130 + sourceSets["main"].resources.srcDir("src/main/generated") 131 } 132 133 dependencies { ··· 160 161 } 162 163 + tasks.named("processResources") { 164 + dependsOn(":${stonecutter.current.project}:stonecutterGenerate") 165 + } 166 + 167 + tasks.register<Sync>("syncDatagen") { 168 + from(project(":${minecraft}-fabric").tasks.named("runDatagen")) 169 + exclude("**/.cache") 170 + into(file("src/main/generated/")) 171 + } 172 173 tasks { 174 processResources {
+8
docs/_meta.json
···
··· 1 + { 2 + "blocks-and-items.mdx": "Blocks and Items", 3 + "Configuring-the-mod.mdx": "Configuring the mod", 4 + "Updating-the-mod.mdx": "Updating the mod", 5 + "easter-eggs.mdx": "Easter egg dimensions", 6 + "Invocation.mdx": "Cosmic Invocation", 7 + "dimension-options.mdx": "Custom dimension options" 8 + }
+79
docs/blocks-and-items.mdx
···
··· 1 + --- 2 + title: Blocks and Items 3 + hide_meta: true 4 + --- 5 + 6 + ## Ant Block 7 + 8 + An implementation of the Langton's Ant algorithm, it is a block that moves when placed on white and black blocks and transmutes them to opposite color. 9 + 10 + ## Biome Bottle 11 + 12 + Biome Bottles allow for changing the surrounding biome to one obtained from a Chaos Creeper. 13 + - Empty ones are obtainable by throwing Glass Bottles into an Infinity Portal 14 + - Using a Biome Bottle on a Chaos Creeper will extract the biome from the Creeper into the bottle. 15 + - You can combine with other bottles of the same biome to increase stored charge in the crafting grid. 16 + - You can release the biome by placing the Biome Bottle on a Transfinite Altar, and then clicking the altar with an empty hand. 17 + 18 + ## Box of Infinite Books 19 + 20 + The Box of Infinite Books will give an infinite amount of the same book, determined by the block's position in the world. 21 + Move the Book Box, you'll get new books. 22 + 23 + - The Box of Infinite Books is craftable by throwing Bookshelf blocks into an Infinity Portal. 24 + 25 + ## A Very Fine Item 26 + 27 + When eaten, A Very Fine Item will send you back to your respawn point. 28 + 29 + ## Footprint 30 + 31 + Footprint items can be thrown to the portal to make it exit-only. Such portals serve as valid destinations for teleporting from any dimension in case a dedicated portal 32 + for that dimension can not be found. Useful in multiplayer to prevent generation of new exit portals around your base if someone else overwrites the original portal. 33 + 34 + ## Iridescence 35 + 36 + Iridescence is a colourful fluid that when touched gives the player colourful shaders and when drank from a bottle, sends you on a journey through dimensions. 37 + Iridescence will also can convert mobs to their chaos variety (skeletons, creepers and slimes). 38 + Chaos Creepers will inherit the biome in which they are in when converted, which can be quite useful when paired with Biome Bottles. 39 + 40 + ## Infinity Portal 41 + 42 + The Infinity Portal is the base of the mod. Throwing a Book and Quill, Written Book, or Transfinite Key into a Nether Portal 43 + will convert it into a colourful and random Infinity Portal. 44 + 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 + A full list of crafting recipes can be found in EMI. 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 + 55 + ## Reset Charge 56 + 57 + The Reset Charge is an anti-lag tool that can be used to erase dimension definition files - if you place and activate one, 58 + the dimension you're in becomes "timebombed" which means it will be deleted on the next server restart. 59 + It is immediately unusable and all existing players rapidly start taking damage to get them out. 60 + HOWEVER, the chunk data is not erased, so if the dimension is reopened, all the block changes in there will still be present. 61 + 62 + - Obtained by throwing TNT into an Infinity Portal. 63 + - Activated by Shift + Right Click with an empty hand. 64 + - Right click picks them up. 65 + 66 + They are not usable in non-infinite dimensions. 67 + 68 + ## Transfinite Key 69 + 70 + Transfinite Keys can be used to move and copy portals. 71 + - Throwing an Amethyst Shard into an Infinity Portal will give you a key linked to that dimension. 72 + - Throwing a Transfinite Key into a Nether or Infinity Portal will create a portal that links to the dimension stored inside the key. 73 + 74 + ## Transfinite Altar 75 + 76 + Transfinite Altars have multiple unique purposes. 77 + - As a decorative block, they can be dyed by right clicking with a dye (like signs), and given a pattern by right clicking with a sunflower. 78 + - When a Biome Bottle is placed on them, they can be right clicked to release the biome inside to the surrounding area. 79 + - Placing an Ant Block on one summons a miniboss, the Bishop of Lang.
+8
docs/sinytra-wiki.json
···
··· 1 + { 2 + "modid": "infinity", 3 + "id": "infinite-dimensions", 4 + "platforms": { 5 + "modrinth": "infinite-dimensions", 6 + "curseforge": "infinite-dimensions" 7 + } 8 + }
+2 -2
gradle.properties
··· 5 mod.id=infinity 6 mod.name=Infinite Dimensions 7 mod.group=net.lerariemann 8 - mod.version=2.6.4 9 - mod.test_build=0 10 11 deps.fabric-loader=0.18.4 12 deps.kaleido=0.3.3+1.3.2
··· 5 mod.id=infinity 6 mod.name=Infinite Dimensions 7 mod.group=net.lerariemann 8 + mod.version=2.7.0 9 + mod.test_build=2 10 11 deps.fabric-loader=0.18.4 12 deps.kaleido=0.3.3+1.3.2
+4 -1
src/main/java/net/lerariemann/infinity/InfinityMod.java
··· 3 import net.lerariemann.infinity.access.MinecraftServerAccess; 4 import net.lerariemann.infinity.dimensions.RandomText; 5 import net.lerariemann.infinity.registry.core.*; 6 import net.lerariemann.infinity.registry.var.*; 7 import net.lerariemann.infinity.util.platform.InfinityPlatform; 8 import net.lerariemann.infinity.util.config.ConfigManager; ··· 30 RandomProvider p = new RandomProvider(server); 31 p.kickGhostsOut(server.registryAccess()); 32 provider = p; 33 - if (!((MinecraftServerAccess)server).infinity$needsInvocation()) ModMaterialRules.RandomBlockMaterialRule.setProvider(p); 34 } 35 36 public static void init() {
··· 3 import net.lerariemann.infinity.access.MinecraftServerAccess; 4 import net.lerariemann.infinity.dimensions.RandomText; 5 import net.lerariemann.infinity.registry.core.*; 6 + import net.lerariemann.infinity.registry.payload.ModPayloads; 7 import net.lerariemann.infinity.registry.var.*; 8 import net.lerariemann.infinity.util.platform.InfinityPlatform; 9 import net.lerariemann.infinity.util.config.ConfigManager; ··· 31 RandomProvider p = new RandomProvider(server); 32 p.kickGhostsOut(server.registryAccess()); 33 provider = p; 34 + if (!((MinecraftServerAccess)server).infinity$needsInvocation()) { 35 + provider.updateDependencies(); 36 + } 37 } 38 39 public static void init() {
+3 -2
src/main/java/net/lerariemann/infinity/InfinityModClient.java
··· 6 import net.lerariemann.infinity.item.F4Item; 7 import net.lerariemann.infinity.registry.core.ModEntities; 8 import net.lerariemann.infinity.registry.core.ModItems; 9 - import net.lerariemann.infinity.registry.var.ModPayloads; 10 import net.lerariemann.infinity.registry.var.ModScreenHandlers; 11 import net.lerariemann.infinity.util.VersionMethods; 12 import net.minecraft.client.KeyMapping; ··· 41 ClientTickEvent.CLIENT_POST.register(client -> { 42 while (f4ConfigKey.consumeClick()) if (client.player != null 43 && client.player.getItemInHand(InteractionHand.MAIN_HAND).is(ModItems.F4.get())) { 44 - ModPayloads.F4DeployC2SPayload.INSTANCE.send(); 45 var result = F4Item.deploy(client.level, client.player, InteractionHand.MAIN_HAND); 46 ItemStack interactionHolderResult = VersionMethods.getInteractionHolderResult(result); 47 if (interactionHolderResult != null)
··· 6 import net.lerariemann.infinity.item.F4Item; 7 import net.lerariemann.infinity.registry.core.ModEntities; 8 import net.lerariemann.infinity.registry.core.ModItems; 9 + import net.lerariemann.infinity.registry.payload.ModPayloads; 10 + import net.lerariemann.infinity.registry.payload.c2s.F4DeployC2SPayload; 11 import net.lerariemann.infinity.registry.var.ModScreenHandlers; 12 import net.lerariemann.infinity.util.VersionMethods; 13 import net.minecraft.client.KeyMapping; ··· 42 ClientTickEvent.CLIENT_POST.register(client -> { 43 while (f4ConfigKey.consumeClick()) if (client.player != null 44 && client.player.getItemInHand(InteractionHand.MAIN_HAND).is(ModItems.F4.get())) { 45 + F4DeployC2SPayload.INSTANCE.send(); 46 var result = F4Item.deploy(client.level, client.player, InteractionHand.MAIN_HAND); 47 ItemStack interactionHolderResult = VersionMethods.getInteractionHolderResult(result); 48 if (interactionHolderResult != null)
+10
src/main/java/net/lerariemann/infinity/access/MinecraftServerAccess.java
··· 1 package net.lerariemann.infinity.access; 2 3 import net.minecraft.resources.ResourceKey; 4 import net.minecraft.world.level.Level; 5 import net.minecraft.world.level.dimension.LevelStem; ··· 14 void infinity$onInvocation(); 15 16 void infinity$setDimensionProvider(); 17 }
··· 1 package net.lerariemann.infinity.access; 2 3 + import net.minecraft.nbt.CompoundTag; 4 import net.minecraft.resources.ResourceKey; 5 import net.minecraft.world.level.Level; 6 import net.minecraft.world.level.dimension.LevelStem; ··· 15 void infinity$onInvocation(); 16 17 void infinity$setDimensionProvider(); 18 + 19 + //? if <1.21 { 20 + /*void infinity$setJukeboxDataMap(CompoundTag data); 21 + boolean infinity$hasJukeboxes(); 22 + 23 + String infinity$getRandomJukeboxId(); 24 + String infinity$getJukeboxSubtitle(String id); 25 + int infinity$getJukeboxDuration(String id); 26 + *///?} 27 }
+6
src/main/java/net/lerariemann/infinity/access/WorldRendererAccess.java
··· 1 package net.lerariemann.infinity.access; 2 3 public interface WorldRendererAccess { 4 void infinity$setNeedsStars(boolean b); 5 }
··· 1 package net.lerariemann.infinity.access; 2 3 + import net.minecraft.core.BlockPos; 4 + import net.minecraft.sounds.SoundEvent; 5 + 6 public interface WorldRendererAccess { 7 void infinity$setNeedsStars(boolean b); 8 + //? if <1.21 { 9 + /*void infinity$playMusic(BlockPos pos, SoundEvent sound, String desc); 10 + *///?} 11 }
-5
src/main/java/net/lerariemann/infinity/block/custom/AltarBlock.java
··· 130 ModCriteria.BIOME_BOTTLE.get().trigger(player, bbbe); 131 bbbe.startTicking(); 132 } 133 - //bishop miniboss battle 134 - if (world.getBlockState(pos.above()).is(ModBlocks.ANT.get())) { 135 - world.removeBlock(pos.above(), false); 136 - (new BishopBattle(world)).start(pos.above()); 137 - } 138 } 139 140 @Override
··· 130 ModCriteria.BIOME_BOTTLE.get().trigger(player, bbbe); 131 bbbe.startTicking(); 132 } 133 } 134 135 @Override
+13 -5
src/main/java/net/lerariemann/infinity/block/custom/AntBlock.java
··· 1 package net.lerariemann.infinity.block.custom; 2 3 import net.lerariemann.infinity.util.platform.InfinityPlatform; 4 import net.lerariemann.infinity.util.VersionMethods; 5 import net.minecraft.MethodsReturnNonnullByDefault; 6 import net.minecraft.core.BlockPos; 7 import net.minecraft.core.Direction; ··· 25 import com.mojang.serialization.MapCodec; 26 //?} 27 //? if neoforge { 28 - import javax.annotation.ParametersAreNonnullByDefault; 29 - //?} 30 import java.util.Objects; 31 import java.util.logging.Handler; 32 33 @MethodsReturnNonnullByDefault 34 //? if neoforge { 35 - @ParametersAreNonnullByDefault 36 - //?} 37 public class AntBlock extends HorizontalDirectionalBlock { 38 //? if >1.21 { 39 public static final MapCodec<AntBlock> CODEC = simpleCodec(AntBlock::new); ··· 148 } 149 @Override 150 public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { 151 - world.scheduleTick(pos, this, 1); 152 } 153 154 protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
··· 1 package net.lerariemann.infinity.block.custom; 2 3 + import net.lerariemann.infinity.registry.core.ModBlocks; 4 import net.lerariemann.infinity.util.platform.InfinityPlatform; 5 import net.lerariemann.infinity.util.VersionMethods; 6 + import net.lerariemann.infinity.util.var.BishopBattle; 7 import net.minecraft.MethodsReturnNonnullByDefault; 8 import net.minecraft.core.BlockPos; 9 import net.minecraft.core.Direction; ··· 27 import com.mojang.serialization.MapCodec; 28 //?} 29 //? if neoforge { 30 + /*import javax.annotation.ParametersAreNonnullByDefault; 31 + *///?} 32 import java.util.Objects; 33 import java.util.logging.Handler; 34 35 @MethodsReturnNonnullByDefault 36 //? if neoforge { 37 + /*@ParametersAreNonnullByDefault 38 + *///?} 39 public class AntBlock extends HorizontalDirectionalBlock { 40 //? if >1.21 { 41 public static final MapCodec<AntBlock> CODEC = simpleCodec(AntBlock::new); ··· 150 } 151 @Override 152 public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { 153 + //bishop miniboss battle 154 + if (world instanceof ServerLevel level && world.getBlockState(pos.below()).is(ModBlocks.ALTAR.get())) { 155 + world.removeBlock(pos, false); 156 + world.removeBlock(pos.below(), false); 157 + (new BishopBattle(level)).start(pos.below()); 158 + } 159 + else world.scheduleTick(pos, this, 1); 160 } 161 162 protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
+4 -4
src/main/java/net/lerariemann/infinity/block/custom/BiomeBottleBlock.java
··· 44 import net.minecraft.world.phys.shapes.VoxelShape; 45 import org.jetbrains.annotations.Nullable; 46 //? if neoforge { 47 - import javax.annotation.ParametersAreNonnullByDefault; 48 - //?} 49 50 import java.util.*; 51 import java.util.stream.Collectors; 52 53 @MethodsReturnNonnullByDefault 54 //? if neoforge { 55 - @ParametersAreNonnullByDefault 56 - //?} 57 public class BiomeBottleBlock extends BaseEntityBlock { 58 //? if >1.21 { 59 public static final MapCodec<BiomeBottleBlock> CODEC = simpleCodec(BiomeBottleBlock::new);
··· 44 import net.minecraft.world.phys.shapes.VoxelShape; 45 import org.jetbrains.annotations.Nullable; 46 //? if neoforge { 47 + /*import javax.annotation.ParametersAreNonnullByDefault; 48 + *///?} 49 50 import java.util.*; 51 import java.util.stream.Collectors; 52 53 @MethodsReturnNonnullByDefault 54 //? if neoforge { 55 + /*@ParametersAreNonnullByDefault 56 + *///?} 57 public class BiomeBottleBlock extends BaseEntityBlock { 58 //? if >1.21 { 59 public static final MapCodec<BiomeBottleBlock> CODEC = simpleCodec(BiomeBottleBlock::new);
-69
src/main/java/net/lerariemann/infinity/block/custom/HauntedBlock.java
··· 1 - package net.lerariemann.infinity.block.custom; 2 - 3 - import net.lerariemann.infinity.options.InfinityOptions; 4 - import net.lerariemann.infinity.registry.core.ModBlocks; 5 - import net.lerariemann.infinity.util.VersionMethods; 6 - import net.minecraft.MethodsReturnNonnullByDefault; 7 - import net.minecraft.core.BlockPos; 8 - import net.minecraft.core.Direction; 9 - import net.minecraft.server.level.ServerLevel; 10 - import net.minecraft.util.RandomSource; 11 - import net.minecraft.world.level.BlockGetter; 12 - import net.minecraft.world.level.Level; 13 - import net.minecraft.world.level.block.Block; 14 - import net.minecraft.world.level.block.RenderShape; 15 - import net.minecraft.world.level.block.state.BlockState; 16 - import net.minecraft.world.phys.shapes.CollisionContext; 17 - import net.minecraft.world.phys.shapes.VoxelShape; 18 - 19 - @MethodsReturnNonnullByDefault 20 - @Deprecated 21 - public class HauntedBlock extends Block { 22 - BlockState original; 23 - 24 - public HauntedBlock(Block original) { 25 - super(VersionMethods.copyBlockProperties(original) 26 - //? if >1.21.4 27 - .setId(ModBlocks.registryKey("haunted_air")) 28 - ); 29 - this.original = original.defaultBlockState(); 30 - } 31 - 32 - @Override 33 - public VoxelShape getCollisionShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { 34 - return original.getCollisionShape(world, pos); 35 - } 36 - @Override 37 - public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { 38 - return original.getShape(world, pos); 39 - } 40 - @Override 41 - public RenderShape getRenderShape(BlockState state) { 42 - return original.getRenderShape(); 43 - } 44 - 45 - @Override 46 - public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { 47 - super.onPlace(state, world, pos, oldState, notify); 48 - int t = InfinityOptions.access(world).getHauntingTicks(world.random); 49 - if (t > 0) world.scheduleTick(pos, this, t); 50 - } 51 - @Override 52 - public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { 53 - super.tick(state, world, pos, random); 54 - world.setBlockAndUpdate(pos, original); 55 - } 56 - @Override 57 - public void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { 58 - world.setBlockAndUpdate(pos, original); 59 - } 60 - 61 - @Override 62 - public int getSignal(BlockState state, BlockGetter world, BlockPos pos, Direction direction) { 63 - return 15; 64 - } 65 - @Override 66 - public boolean isSignalSource(BlockState state) { 67 - return true; 68 - } 69 - }
···
+4 -2
src/main/java/net/lerariemann/infinity/block/custom/InfinityPortalBlock.java
··· 209 if (isRecipe) { 210 bl.set(true); 211 } 212 - else InfinityMod.provider.getPortalKeyAsItem().ifPresent(item -> { //opening a portal by tossing a key in 213 if (e.getItem().is(item)) { 214 InfinityPortal.tryUpdateOpenStatus(ipbe, world, pos, server); 215 if (ipbe.isOpen()) return; ··· 224 }); 225 } 226 if (entity instanceof Player player 227 - && InfinityMod.provider.isPortalKeyBlank()) { 228 ServerLevel world1 = server.getLevel(ResourceKey.create(Registries.DIMENSION, ipbe.getDimension())); 229 if ((world1 == null) || !ipbe.isOpen()) { 230 PortalCreator.openWithStatIncrease(player, server, world, pos);
··· 209 if (isRecipe) { 210 bl.set(true); 211 } 212 + else if (!ipbe.isFootprint()) InfinityMod.provider.getPortalKeyAsItem().ifPresent(item -> { //opening a portal by tossing a key in 213 if (e.getItem().is(item)) { 214 InfinityPortal.tryUpdateOpenStatus(ipbe, world, pos, server); 215 if (ipbe.isOpen()) return; ··· 224 }); 225 } 226 if (entity instanceof Player player 227 + && !player.isOnPortalCooldown() 228 + && InfinityMod.provider.isPortalKeyBlank() 229 + && !ipbe.isFootprint()) { 230 ServerLevel world1 = server.getLevel(ResourceKey.create(Registries.DIMENSION, ipbe.getDimension())); 231 if ((world1 == null) || !ipbe.isOpen()) { 232 PortalCreator.openWithStatIncrease(player, server, world, pos);
-156
src/main/java/net/lerariemann/infinity/block/custom/NotesBlock.java
··· 1 - package net.lerariemann.infinity.block.custom; 2 - 3 - import net.lerariemann.infinity.block.entity.ChromaticBlockEntity; 4 - import net.lerariemann.infinity.options.InfinityOptions; 5 - import net.minecraft.core.BlockPos; 6 - import net.minecraft.core.particles.ParticleTypes; 7 - import net.minecraft.server.level.ServerLevel; 8 - import net.minecraft.sounds.SoundSource; 9 - import net.minecraft.stats.Stats; 10 - import net.minecraft.util.RandomSource; 11 - import net.minecraft.world.InteractionHand; 12 - import net.minecraft.world.InteractionResult; 13 - import net.minecraft.world.entity.Entity; 14 - import net.minecraft.world.entity.player.Player; 15 - import net.minecraft.world.level.Level; 16 - import net.minecraft.world.level.block.Block; 17 - import net.minecraft.world.level.block.NoteBlock; 18 - import net.minecraft.world.level.block.state.BlockState; 19 - import net.minecraft.world.level.block.state.StateDefinition; 20 - import net.minecraft.world.level.block.state.properties.BlockStateProperties; 21 - import net.minecraft.world.level.block.state.properties.BooleanProperty; 22 - import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; 23 - import net.minecraft.world.level.gameevent.GameEvent; 24 - //? if >1.21.4 { 25 - import net.minecraft.world.level.redstone.Orientation; 26 - //?} 27 - import net.minecraft.world.phys.BlockHitResult; 28 - import org.jetbrains.annotations.Nullable; 29 - 30 - public class NotesBlock extends Block { 31 - public static final BooleanProperty POWERED = BlockStateProperties.POWERED; 32 - public static final BooleanProperty TICKING = BooleanProperty.create("ticking"); 33 - public NotesBlock(Properties settings) { 34 - super(settings); 35 - this.registerDefaultState(this.defaultBlockState().setValue(POWERED, false).setValue(TICKING, true)); 36 - } 37 - 38 - @Override 39 - protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) { 40 - super.createBlockStateDefinition(builder); 41 - builder.add(POWERED); 42 - builder.add(TICKING); 43 - } 44 - 45 - @Override 46 - //? if >1.21 { 47 - protected 48 - //?} else { 49 - /*public 50 - *///?} 51 - boolean isRandomlyTicking(BlockState state) { 52 - return state.hasProperty(TICKING) && state.getValue(TICKING); 53 - } 54 - 55 - @Override 56 - //? if >1.21 { 57 - protected 58 - //?} else { 59 - /*public 60 - *///?} 61 - void neighborChanged(BlockState state, Level world, BlockPos pos, Block sourceBlock, 62 - //? if >1.21.2 { 63 - Orientation orientation 64 - //?} else { 65 - /*BlockPos sourcePos 66 - *///?} 67 - , boolean notify) { 68 - boolean bl = world.hasNeighborSignal(pos); 69 - if (bl != state.getValue(POWERED)) { 70 - if (bl) this.play(null, world, pos); 71 - world.setBlock(pos, state.setValue(POWERED, bl), 3); 72 - } 73 - } 74 - 75 - public boolean isTicking(ServerLevel world, BlockState state) { 76 - return state.getValue(TICKING) && (!InfinityOptions.access(world).isHaunted()); 77 - } 78 - 79 - @Override 80 - //? if >1.21 { 81 - protected 82 - //?} else { 83 - /*public 84 - *///?} 85 - void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { 86 - if (isTicking(world, state) && random.nextInt(115) == 0) { 87 - this.play(null, world, pos); 88 - } 89 - } 90 - 91 - @Override 92 - //? if <1.21 { 93 - /*public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { 94 - *///?} else { 95 - protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) { 96 - //?} 97 - if (world.isClientSide()) { 98 - return InteractionResult.SUCCESS; 99 - } else { 100 - boolean bl = state.getValue(TICKING); 101 - world.setBlock(pos, state.setValue(TICKING, !bl), 3); 102 - play(player, world, pos); 103 - player.awardStat(Stats.TUNE_NOTEBLOCK); 104 - return InteractionResult.CONSUME; 105 - } 106 - } 107 - 108 - @Override 109 - //? if >1.21 { 110 - protected 111 - //?} else { 112 - /*public 113 - *///?} 114 - void attack(BlockState state, Level world, BlockPos pos, Player player) { 115 - if (!world.isClientSide()) { 116 - play(player, world, pos); 117 - player.awardStat(Stats.PLAY_NOTEBLOCK); 118 - } 119 - } 120 - 121 - public void play(@Nullable Entity entity, Level world, BlockPos pos) { 122 - if (world.getBlockState(pos.above()).isAir()) { 123 - world.blockEvent(pos, this, 0, 0); 124 - world.gameEvent(entity, GameEvent.NOTE_BLOCK_PLAY, pos); 125 - } 126 - } 127 - 128 - @Override 129 - //? if >1.21 { 130 - protected 131 - //?} else { 132 - /*public 133 - *///?} 134 - boolean triggerEvent(BlockState state, Level world, BlockPos pos, int type, int data) { 135 - NoteBlockInstrument noteBlockInstrument; 136 - float f; 137 - if (world.getBlockEntity(pos.below()) instanceof ChromaticBlockEntity e) { 138 - noteBlockInstrument = NoteBlockInstrument.GUITAR; 139 - f = (float)Math.pow(2.0, 2 * (e.brightness / 255f) - 1); 140 - } 141 - else { 142 - NoteBlockInstrument[] instruments = NoteBlockInstrument.values(); 143 - noteBlockInstrument = instruments[world.random.nextInt(instruments.length-7)]; 144 - if (noteBlockInstrument.isTunable()) { 145 - int i = world.random.nextInt(24); 146 - f = NoteBlock.getPitchFromNote(i); 147 - world.addParticle(ParticleTypes.NOTE, pos.getX() + 0.5, pos.getY() + 1.2, pos.getZ() + 0.5, i / 24.0, 0.0F, 0.0F); 148 - } else { 149 - f = 1.0F; 150 - } 151 - } 152 - 153 - world.playSeededSound(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, noteBlockInstrument.getSoundEvent(), SoundSource.RECORDS, 3.0F, f, world.random.nextLong()); 154 - return true; 155 - } 156 - }
···
+2 -2
src/main/java/net/lerariemann/infinity/block/custom/RailHelper.java
··· 36 @Override 37 public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { 38 //? if <1.21.2 || fabric { 39 - /*if (ModCompat.CREATE) { 40 CreateCompat.reattachRails(world, pos, getBlockEntity(world, pos)); 41 }else 42 - *///?} 43 world.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); 44 } 45
··· 36 @Override 37 public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { 38 //? if <1.21.2 || fabric { 39 + if (ModCompat.CREATE) { 40 CreateCompat.reattachRails(world, pos, getBlockEntity(world, pos)); 41 }else 42 + //?} 43 world.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); 44 } 45
+4 -4
src/main/java/net/lerariemann/infinity/block/entity/BiomeBottleBlockEntity.java
··· 33 import net.minecraft.core.component.DataComponentMap; 34 //?} 35 //? if neoforge { 36 - import javax.annotation.ParametersAreNonnullByDefault; 37 - //?} 38 39 @MethodsReturnNonnullByDefault 40 //? if neoforge { 41 - @ParametersAreNonnullByDefault 42 - //?} 43 public class BiomeBottleBlockEntity extends TintableBlockEntity { 44 private final ContainerData propertyDelegate; 45 private ResourceLocation biome;
··· 33 import net.minecraft.core.component.DataComponentMap; 34 //?} 35 //? if neoforge { 36 + /*import javax.annotation.ParametersAreNonnullByDefault; 37 + *///?} 38 39 @MethodsReturnNonnullByDefault 40 //? if neoforge { 41 + /*@ParametersAreNonnullByDefault 42 + *///?} 43 public class BiomeBottleBlockEntity extends TintableBlockEntity { 44 private final ContainerData propertyDelegate; 45 private ResourceLocation biome;
+3 -2
src/main/java/net/lerariemann/infinity/block/entity/InfinityPortalBlockEntity.java
··· 26 import org.jetbrains.annotations.Nullable; 27 28 //? if neoforge 29 - import javax.annotation.ParametersAreNonnullByDefault; 30 import java.util.Random; 31 32 @MethodsReturnNonnullByDefault 33 //? if neoforge 34 - @ParametersAreNonnullByDefault 35 public class InfinityPortalBlockEntity extends TintableBlockEntity { 36 private final ContainerData propertyDelegate; 37 private ResourceLocation dimension; ··· 85 } 86 @Nullable 87 public BlockPos getOtherSidePos() { return this.otherSidePos; } 88 89 public void setDimension(long c) { 90 setColor((int)c);
··· 26 import org.jetbrains.annotations.Nullable; 27 28 //? if neoforge 29 + /*import javax.annotation.ParametersAreNonnullByDefault;*/ 30 import java.util.Random; 31 32 @MethodsReturnNonnullByDefault 33 //? if neoforge 34 + /*@ParametersAreNonnullByDefault*/ 35 public class InfinityPortalBlockEntity extends TintableBlockEntity { 36 private final ContainerData propertyDelegate; 37 private ResourceLocation dimension; ··· 85 } 86 @Nullable 87 public BlockPos getOtherSidePos() { return this.otherSidePos; } 88 + public boolean isFootprint() { return this.dimension.getNamespace().equals("footprint"); } 89 90 public void setDimension(long c) { 91 setColor((int)c);
+9 -9
src/main/java/net/lerariemann/infinity/compat/CreateCompat.java
··· 7 import com.simibubi.create.content.trains.track.TrackShape; 8 import net.createmod.catnip.math.BlockFace; 9 *///?} else if fabric { 10 - /*import com.zurrtum.create.api.contraption.train.PortalTrackProvider; 11 import com.zurrtum.create.catnip.math.BlockFace; 12 import com.zurrtum.create.content.trains.track.AllPortalTracks; 13 import com.zurrtum.create.content.trains.track.TrackBlock; 14 import com.zurrtum.create.content.trains.track.TrackShape; 15 - *///?} 16 //? if <1.21.2 || fabric { 17 - /*import net.lerariemann.infinity.block.custom.RailHelper; 18 import net.lerariemann.infinity.block.entity.InfinityPortalBlockEntity; 19 import net.lerariemann.infinity.registry.core.ModBlocks; 20 import net.lerariemann.infinity.util.InfinityMethods; ··· 32 33 import java.util.Optional; 34 import java.util.Set; 35 - *///?} 36 37 public class CreateCompat { 38 //? if <1.21.2 || fabric { 39 - /*private static PortalTrackProvider.Exit infinityPortalProvider(ServerLevel worldFrom, BlockFace blockFace) { 40 MinecraftServer server = worldFrom.getServer(); 41 //? if <1.21 42 - /^if (!server.isNetherEnabled()) return null;^/ 43 //? if >1.21.9 { 44 - /^server.getGameRules().getRule(GameRules.RULE_ALLOW_NETHER); 45 - ^///?} 46 BlockPos posFrom = blockFace.getConnectedPos(); 47 if (worldFrom.getBlockEntity(posFrom) instanceof InfinityPortalBlockEntity ipbe 48 && ipbe.isConnectedBothSides()) { //we only allow trains through if portals are in sync ··· 141 else bs = b.get().defaultBlockState().setValue(TrackBlock.SHAPE, e.shape.equals("zo") ? TrackShape.ZO : TrackShape.XO); 142 world.setBlockAndUpdate(pos, bs); 143 } 144 - *///?} 145 }
··· 7 import com.simibubi.create.content.trains.track.TrackShape; 8 import net.createmod.catnip.math.BlockFace; 9 *///?} else if fabric { 10 + import com.zurrtum.create.api.contraption.train.PortalTrackProvider; 11 import com.zurrtum.create.catnip.math.BlockFace; 12 import com.zurrtum.create.content.trains.track.AllPortalTracks; 13 import com.zurrtum.create.content.trains.track.TrackBlock; 14 import com.zurrtum.create.content.trains.track.TrackShape; 15 + //?} 16 //? if <1.21.2 || fabric { 17 + import net.lerariemann.infinity.block.custom.RailHelper; 18 import net.lerariemann.infinity.block.entity.InfinityPortalBlockEntity; 19 import net.lerariemann.infinity.registry.core.ModBlocks; 20 import net.lerariemann.infinity.util.InfinityMethods; ··· 32 33 import java.util.Optional; 34 import java.util.Set; 35 + //?} 36 37 public class CreateCompat { 38 //? if <1.21.2 || fabric { 39 + private static PortalTrackProvider.Exit infinityPortalProvider(ServerLevel worldFrom, BlockFace blockFace) { 40 MinecraftServer server = worldFrom.getServer(); 41 //? if <1.21 42 + /*if (!server.isNetherEnabled()) return null;*/ 43 //? if >1.21.9 { 44 + /*server.getGameRules().getRule(GameRules.RULE_ALLOW_NETHER); 45 + *///?} 46 BlockPos posFrom = blockFace.getConnectedPos(); 47 if (worldFrom.getBlockEntity(posFrom) instanceof InfinityPortalBlockEntity ipbe 48 && ipbe.isConnectedBothSides()) { //we only allow trains through if portals are in sync ··· 141 else bs = b.get().defaultBlockState().setValue(TrackBlock.SHAPE, e.shape.equals("zo") ? TrackShape.ZO : TrackShape.XO); 142 world.setBlockAndUpdate(pos, bs); 143 } 144 + //?} 145 }
+6 -6
src/main/java/net/lerariemann/infinity/compat/PonderCompat.java
··· 3 //? if <1.21.2 4 /*import net.createmod.ponder.api.level.PonderLevel;*/ 5 //? if >1.21.4 && fabric { 6 - /*import com.zurrtum.create.client.ponder.api.level.PonderLevel; 7 - *///?} 8 import net.minecraft.world.level.Level; 9 10 public class PonderCompat { 11 public static boolean isPonderLevel(Level world) { 12 //? if <1.21.2 || fabric { 13 - /*return world instanceof PonderLevel; 14 - *///?} else { 15 - return false; 16 - //?} 17 } 18 }
··· 3 //? if <1.21.2 4 /*import net.createmod.ponder.api.level.PonderLevel;*/ 5 //? if >1.21.4 && fabric { 6 + import com.zurrtum.create.client.ponder.api.level.PonderLevel; 7 + //?} 8 import net.minecraft.world.level.Level; 9 10 public class PonderCompat { 11 public static boolean isPonderLevel(Level world) { 12 //? if <1.21.2 || fabric { 13 + return world instanceof PonderLevel; 14 + //?} else { 15 + /*return false; 16 + *///?} 17 } 18 }
+21 -3
src/main/java/net/lerariemann/infinity/compat/cloth/AmendmentConfigFactory.java
··· 11 import me.shedaniel.clothconfig2.impl.builders.SubCategoryBuilder; 12 import net.lerariemann.infinity.util.core.CommonIO; 13 import net.lerariemann.infinity.util.core.NbtUtils; 14 import net.minecraft.nbt.CompoundTag; 15 import net.minecraft.nbt.ListTag; 16 import net.minecraft.nbt.StringTag; 17 import net.minecraft.nbt.Tag; 18 import net.minecraft.network.chat.Component; 19 import java.util.*; 20 21 import static net.lerariemann.infinity.compat.cloth.ClothConfigFactory.*; 22 23 public class AmendmentConfigFactory { ··· 30 boolean edited = false; 31 ConfigCategory amendmentCategory; 32 ConfigBuilder builder; 33 34 AmendmentConfigFactory(ConfigBuilder builder) { 35 this.builder = builder; ··· 139 140 void build() { 141 var area = addStringDropdownOption("area", always, 142 - Lists.newArrayList("blocks", "fluids", "items", "structures", "trees", "mobs")); 143 - addStringOption("mod", always); 144 145 var selector = addStringDropdownOption("selector", always, 146 Lists.newArrayList("all", "matching", "matching_any", "matching_block_tag", "containing")); ··· 218 219 private void addListOption(String name, Requirement req) { 220 List<String> current = getSafeList(name); 221 - if (!Objects.equals(current.get(current.size()-1), "")) current.add(""); 222 subCategory.add(parent.builder.entryBuilder().startStrList( 223 Component.translatable("config.infinity.amendments."+name), 224 current)
··· 11 import me.shedaniel.clothconfig2.impl.builders.SubCategoryBuilder; 12 import net.lerariemann.infinity.util.core.CommonIO; 13 import net.lerariemann.infinity.util.core.NbtUtils; 14 + import net.lerariemann.infinity.util.platform.InfinityPlatform; 15 import net.minecraft.nbt.CompoundTag; 16 import net.minecraft.nbt.ListTag; 17 import net.minecraft.nbt.StringTag; 18 import net.minecraft.nbt.Tag; 19 import net.minecraft.network.chat.Component; 20 + 21 + import java.io.File; 22 import java.util.*; 23 24 + import static net.lerariemann.infinity.InfinityMod.configPath; 25 import static net.lerariemann.infinity.compat.cloth.ClothConfigFactory.*; 26 27 public class AmendmentConfigFactory { ··· 34 boolean edited = false; 35 ConfigCategory amendmentCategory; 36 ConfigBuilder builder; 37 + public static List<String> allModIds; 38 39 AmendmentConfigFactory(ConfigBuilder builder) { 40 this.builder = builder; ··· 144 145 void build() { 146 var area = addStringDropdownOption("area", always, 147 + Lists.newArrayList("blocks", "fluids", "items", "structures", "biomes", "trees", "mobs")); 148 + 149 + var v = configPath.resolve("modular").toFile().listFiles(File::isDirectory); 150 + if (v != null) allModIds = Arrays.stream(v).map(File::getName).toList(); 151 + else allModIds = InfinityPlatform.INSTANCE.getModsLoaded(); 152 + List<String> res = new ArrayList<>(); 153 + res.add("all"); 154 + res.add("any_of"); 155 + res.add("!minecraft"); 156 + res.addAll(allModIds); 157 + allModIds.forEach(s -> { 158 + if (!s.equals("minecraft")) res.add("!" + s); 159 + }); 160 + var modSelector = addStringDropdownOption("mod", always, res); 161 + addListOption("mods", matches(modSelector, "any_of")); 162 + addStringDropdownOption("load_if_mod", always, allModIds); 163 164 var selector = addStringDropdownOption("selector", always, 165 Lists.newArrayList("all", "matching", "matching_any", "matching_block_tag", "containing")); ··· 237 238 private void addListOption(String name, Requirement req) { 239 List<String> current = getSafeList(name); 240 subCategory.add(parent.builder.entryBuilder().startStrList( 241 Component.translatable("config.infinity.amendments."+name), 242 current)
-1
src/main/java/net/lerariemann/infinity/compat/cloth/ClothConfigFactory.java
··· 1 package net.lerariemann.infinity.compat.cloth; 2 3 - 4 import com.google.gson.*; 5 import com.mojang.brigadier.exceptions.CommandSyntaxException; 6 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
··· 1 package net.lerariemann.infinity.compat.cloth; 2 3 import com.google.gson.*; 4 import com.mojang.brigadier.exceptions.CommandSyntaxException; 5 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
+128
src/main/java/net/lerariemann/infinity/data/InfinityAdvancementProvider.java
···
··· 1 + package net.lerariemann.infinity.data; 2 + 3 + //? fabric { 4 + 5 + import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; 6 + import net.fabricmc.fabric.api.datagen.v1.provider.FabricAdvancementProvider; 7 + import net.lerariemann.infinity.InfinityMod; 8 + import net.lerariemann.infinity.registry.core.ModItems; 9 + import net.lerariemann.infinity.registry.var.ModCriteria; 10 + import net.lerariemann.infinity.util.VersionMethods; 11 + import net.minecraft.advancements.Advancement; 12 + //? >1.21 { 13 + import net.minecraft.advancements.AdvancementHolder; 14 + import static net.minecraft.advancements.AdvancementRequirements.*; 15 + import static net.minecraft.advancements.AdvancementRequirements.Strategy.OR; 16 + import static net.minecraft.advancements.AdvancementType.TASK; 17 + //?} else { 18 + /*import static net.minecraft.advancements.FrameType.TASK; 19 + import static net.minecraft.advancements.RequirementsStrategy.OR; 20 + *///?} 21 + import net.minecraft.advancements.Criterion; 22 + import net.minecraft.core.HolderLookup; 23 + import net.minecraft.network.chat.Component; 24 + import net.minecraft.world.item.Items; 25 + 26 + import java.util.Optional; 27 + import java.util.concurrent.CompletableFuture; 28 + import java.util.function.Consumer; 29 + 30 + 31 + 32 + public class InfinityAdvancementProvider extends FabricAdvancementProvider { 33 + 34 + public InfinityAdvancementProvider(FabricDataOutput dataOutput, CompletableFuture<HolderLookup.Provider> registryLookup) { 35 + super(dataOutput 36 + //? >1.21 37 + , registryLookup 38 + ); 39 + } 40 + 41 + @Override 42 + public void generateAdvancement( 43 + //? if >1.21 { 44 + HolderLookup.Provider registryLookup, Consumer<AdvancementHolder> consumer 45 + //?} else { 46 + /*Consumer<Advancement> consumer 47 + *///?} 48 + ) { 49 + var acidTest = Advancement.Builder.advancement() 50 + //.parent(iridescence) 51 + .display( 52 + ModItems.TRANSFINITE_KEY.get(), // The display icon 53 + Component.translatable("advancements.infinity.acid_test.title"), // The title 54 + Component.literal("advancements.infinity.acid_test.description"), // The description 55 + null, // Background image for the tab in the advancements page, if this is a root advancement (has no parent) 56 + TASK, // TASK, CHALLENGE, or GOAL 57 + true, // Show the toast when completing it 58 + true, // Announce it to chat 59 + false // Hide it in the advancement tab until it's achieved 60 + ) 61 + .addCriterion("creeper", mobChangeCriterion("minecraft:creeper")) 62 + .addCriterion("skeleton", mobChangeCriterion("minecraft:skeleton")) 63 + .addCriterion("slime", mobChangeCriterion("minecraft:slime")) 64 + .addCriterion("pawn", mobChangeCriterion("infinity:chaos_pawn")) 65 + .requirements(OR) 66 + // Give the advancement an id 67 + .save(consumer, InfinityMod.MOD_ID + ":acid_test"); 68 + // FIXME - generating advancements with parents appears to be broken on 1.20? 69 + //? if >1.21 { 70 + var multiverseRoot = Advancement.Builder.advancement() 71 + .parent(VersionMethods.id("minecraft", "story/enter_the_nether")) 72 + .display( 73 + Items.WRITABLE_BOOK, // The display icon 74 + Component.translatable("advancements.infinity.multiverse_start.title"), // The title 75 + Component.literal("advancements.infinity.multiverse_start.description"), // The description 76 + null, // Background image for the tab in the advancements page, if this is a root advancement (has no parent) 77 + TASK, // TASK, CHALLENGE, or GOAL 78 + true, // Show the toast when completing it 79 + true, // Announce it to chat 80 + false // Hide it in the advancement tab until it's achieved 81 + ) 82 + .addCriterion("infinity_dims_open", dimsOpenCriterion(1)) 83 + // Give the advancement an id 84 + .save(consumer, InfinityMod.MOD_ID + ":multiverse_root"); 85 + 86 + var allTime = Advancement.Builder.advancement() 87 + .parent(multiverseRoot) 88 + .display( 89 + Items.CLOCK, // The display icon 90 + Component.translatable("advancements.infinity.all_time.title"), // The title 91 + Component.literal("advancements.infinity.all_time.description"), // The description 92 + null, // Background image for the tab in the advancements page, if this is a root advancement (has no parent) 93 + TASK, // TASK, CHALLENGE, or GOAL 94 + true, // Show the toast when completing it 95 + true, // Announce it to chat 96 + false // Hide it in the advancement tab until it's achieved 97 + ) 98 + .addCriterion("infinity_dims_closed", dimsClosedCriterion(1)) 99 + // Give the advancement an id 100 + .save(consumer, InfinityMod.MOD_ID + ":all_time"); 101 + //?} 102 + } 103 + 104 + public Criterion mobChangeCriterion(String data) { 105 + //? if >1.21 { 106 + return ModCriteria.CONVERT_MOB.get().createCriterion(new ModCriteria.DataConditions(Optional.empty(), data)); 107 + //?} else { 108 + /*return new Criterion(ModCriteria.DataConditions.create(data, ModCriteria.CONVERT_MOB.get().getId())); 109 + *///?} 110 + } 111 + 112 + public Criterion dimsOpenCriterion(int data) { 113 + //? if >1.21 { 114 + return ModCriteria.DIMS_OPENED.get().createCriterion(new ModCriteria.ScoredConditions(Optional.empty(), data)); 115 + //?} else { 116 + /*return new Criterion(ModCriteria.ScoredConditions.create(data, ModCriteria.DIMS_OPENED.get().getId())); 117 + *///?} 118 + } 119 + 120 + public Criterion dimsClosedCriterion(int data) { 121 + //? if >1.21 { 122 + return ModCriteria.DIMS_CLOSED.get().createCriterion(new ModCriteria.ScoredConditions(Optional.empty(), data)); 123 + //?} else { 124 + /*return new Criterion(ModCriteria.ScoredConditions.create(data, ModCriteria.DIMS_CLOSED.get().getId())); 125 + *///?} 126 + } 127 + } 128 + //?}
+31
src/main/java/net/lerariemann/infinity/data/InfinityDataGenerator.java
···
··· 1 + package net.lerariemann.infinity.data; 2 + 3 + //? fabric { 4 + 5 + import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; 6 + import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; 7 + import net.lerariemann.infinity.data.loot.InfinityBlockLootTableProvider; 8 + import net.lerariemann.infinity.data.recipe.InfinityRecipeProvider; 9 + import net.lerariemann.infinity.data.tags.InfinityBlockTagProvider; 10 + import net.lerariemann.infinity.data.tags.InfinityEntityTagProvider; 11 + import net.lerariemann.infinity.data.tags.InfinityFluidTagProvider; 12 + import net.lerariemann.infinity.data.tags.InfinityItemTagProvider; 13 + 14 + public class InfinityDataGenerator implements DataGeneratorEntrypoint { 15 + @Override 16 + public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { 17 + FabricDataGenerator.Pack pack = fabricDataGenerator.createPack(); 18 + //tags 19 + pack.addProvider(InfinityBlockTagProvider::new); 20 + pack.addProvider(InfinityItemTagProvider::new); 21 + pack.addProvider(InfinityFluidTagProvider::new); 22 + pack.addProvider(InfinityEntityTagProvider::new); 23 + //loot tables 24 + pack.addProvider(InfinityBlockLootTableProvider::new); 25 + // advancements - buggy on 1.20 and really don't change enough to matter 26 + // pack.addProvider(InfinityAdvancementProvider::new); 27 + // recipes 28 + pack.addProvider(InfinityRecipeProvider::new); 29 + } 30 + } 31 + //?}
+40
src/main/java/net/lerariemann/infinity/data/loot/InfinityBlockLootTableProvider.java
···
··· 1 + package net.lerariemann.infinity.data.loot; 2 + 3 + //? fabric { 4 + 5 + import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; 6 + import net.fabricmc.fabric.api.datagen.v1.provider.FabricBlockLootTableProvider; 7 + import net.lerariemann.infinity.registry.core.ModBlocks; 8 + import net.minecraft.core.HolderLookup; 9 + import net.minecraft.world.item.Items; 10 + 11 + import java.util.concurrent.CompletableFuture; 12 + 13 + public class InfinityBlockLootTableProvider extends FabricBlockLootTableProvider { 14 + 15 + public InfinityBlockLootTableProvider(FabricDataOutput dataOutput, CompletableFuture<HolderLookup.Provider> registryLookup) { 16 + super(dataOutput 17 + //? if >1.21 18 + , registryLookup 19 + ); 20 + } 21 + 22 + @Override 23 + public void generate() { 24 + //todo altar 25 + dropSelf(ModBlocks.ANT.get()); 26 + //todo biome bottle 27 + dropSelf(ModBlocks.BOOK_BOX.get()); 28 + //todo chromatic carpet 29 + //todo chromatic wool 30 + dropSelf(ModBlocks.COSMIC_ALTAR.get()); 31 + dropSelf(ModBlocks.CURSOR.get()); 32 + dropSelf(ModBlocks.IRIDESCENT_CARPET.get()); 33 + dropSelf(ModBlocks.IRIDESCENT_WOOL.get()); 34 + dropOther(ModBlocks.IRIDESCENT_KELP.get(), Items.KELP); 35 + dropOther(ModBlocks.IRIDESCENT_KELP_PLANT.get(), Items.KELP); 36 + createSlabItemTable(ModBlocks.NETHERITE_SLAB.get()); 37 + dropSelf(ModBlocks.NETHERITE_STAIRS.get()); 38 + } 39 + } 40 + //?}
+100
src/main/java/net/lerariemann/infinity/data/recipe/BiomeBottleCombiningRecipeBuilder.java
···
··· 1 + package net.lerariemann.infinity.data.recipe; 2 + 3 + import net.minecraft.core.registries.Registries; 4 + import net.minecraft.data.recipes.RecipeBuilder; 5 + //? >1.21 { 6 + import net.minecraft.data.recipes.RecipeOutput; 7 + import net.minecraft.advancements.AdvancementHolder; 8 + import net.minecraft.advancements.Criterion; 9 + import net.minecraft.world.item.crafting.CraftingBookCategory; 10 + import net.minecraft.resources.ResourceKey; 11 + import net.lerariemann.infinity.item.function.BiomeBottleCombiningRecipe; 12 + //?} else { 13 + /*import net.lerariemann.infinity.util.InfinityMethods; 14 + import net.minecraft.data.recipes.FinishedRecipe; 15 + import net.lerariemann.infinity.registry.core.ModItemFunctions; 16 + import com.google.gson.JsonObject; 17 + import net.minecraft.advancements.CriterionTriggerInstance; 18 + *///?} 19 + import net.minecraft.resources.ResourceLocation; 20 + import net.minecraft.world.item.Item; 21 + import net.minecraft.world.item.crafting.Recipe; 22 + import net.minecraft.world.item.crafting.RecipeSerializer; 23 + import org.jetbrains.annotations.Nullable; 24 + 25 + import java.util.function.Consumer; 26 + 27 + import static net.lerariemann.infinity.registry.core.ModBlocks.BIOME_BOTTLE; 28 + 29 + public class BiomeBottleCombiningRecipeBuilder implements RecipeBuilder { 30 + 31 + BiomeBottleCombiningRecipeBuilder() {} 32 + 33 + @Override 34 + public RecipeBuilder group(@Nullable String groupName) { 35 + return null; 36 + } 37 + 38 + @Override 39 + public Item getResult() { 40 + return BIOME_BOTTLE.get().asItem(); 41 + } 42 + 43 + //? if >1.21.2 { 44 + public void save(RecipeOutput recipeOutput, ResourceKey<Recipe<?>> id) { 45 + BiomeBottleCombiningRecipe recipe = new BiomeBottleCombiningRecipe(CraftingBookCategory.MISC); 46 + recipeOutput.accept(id, recipe, null); 47 + } 48 + //?} else if >1.21 { 49 + /*public void save(RecipeOutput recipeOutput, ResourceLocation id) { 50 + BiomeBottleCombiningRecipe recipe = new BiomeBottleCombiningRecipe(CraftingBookCategory.MISC); 51 + recipeOutput.accept(id, recipe, null); 52 + } 53 + *///?} 54 + 55 + //? >1.21 { 56 + 57 + @Override 58 + public RecipeBuilder unlockedBy(String name, Criterion<?> criterion) { 59 + return null; 60 + } 61 + //?} else { 62 + /*@Override 63 + public RecipeBuilder unlockedBy(String criterionName, CriterionTriggerInstance criterionTrigger) { 64 + return null; 65 + } 66 + 67 + @Override 68 + public void save(Consumer<FinishedRecipe> finishedRecipeConsumer, ResourceLocation recipeId) { 69 + finishedRecipeConsumer.accept(new CombiningRecipeResult()); 70 + } 71 + 72 + private static class CombiningRecipeResult implements FinishedRecipe { 73 + @Override 74 + public void serializeRecipeData(JsonObject json) { 75 + json.addProperty("category", "misc"); 76 + } 77 + 78 + @Override 79 + public ResourceLocation getId() { 80 + return InfinityMethods.getId("biome_bottle_combining"); 81 + } 82 + 83 + @Override 84 + public RecipeSerializer<?> getType() { 85 + return ModItemFunctions.BIOME_BOTTLE_COMBINING.get(); 86 + } 87 + 88 + @Override 89 + public @Nullable JsonObject serializeAdvancement() { 90 + return null; 91 + } 92 + 93 + @Override 94 + public @Nullable ResourceLocation getAdvancementId() { 95 + return null; 96 + } 97 + } 98 + *///?} 99 + 100 + }
+101
src/main/java/net/lerariemann/infinity/data/recipe/ChromaCarpetRecipeBuilder.java
···
··· 1 + package net.lerariemann.infinity.data.recipe; 2 + 3 + 4 + import net.minecraft.core.registries.Registries; 5 + import net.minecraft.data.recipes.RecipeBuilder; 6 + //? >1.21 { 7 + import net.minecraft.data.recipes.RecipeOutput; 8 + import net.minecraft.advancements.AdvancementHolder; 9 + import net.minecraft.advancements.Criterion; 10 + import net.minecraft.world.item.crafting.CraftingBookCategory; 11 + import net.minecraft.resources.ResourceKey; 12 + import net.lerariemann.infinity.item.function.ChromaCarpetRecipe; 13 + //?} else { 14 + /*import net.lerariemann.infinity.util.InfinityMethods; 15 + import net.minecraft.data.recipes.FinishedRecipe; 16 + import net.lerariemann.infinity.registry.core.ModItemFunctions; 17 + import com.google.gson.JsonObject; 18 + import net.minecraft.advancements.CriterionTriggerInstance; 19 + *///?} 20 + import net.minecraft.resources.ResourceLocation; 21 + import net.minecraft.world.item.Item; 22 + import net.minecraft.world.item.crafting.Recipe; 23 + import net.minecraft.world.item.crafting.RecipeSerializer; 24 + import org.jetbrains.annotations.Nullable; 25 + 26 + import java.util.function.Consumer; 27 + 28 + import static net.lerariemann.infinity.registry.core.ModBlocks.BIOME_BOTTLE; 29 + 30 + public class ChromaCarpetRecipeBuilder implements RecipeBuilder { 31 + 32 + ChromaCarpetRecipeBuilder() {} 33 + 34 + @Override 35 + public RecipeBuilder group(@Nullable String groupName) { 36 + return null; 37 + } 38 + 39 + @Override 40 + public Item getResult() { 41 + return BIOME_BOTTLE.get().asItem(); 42 + } 43 + 44 + //? if >1.21.2 { 45 + public void save(RecipeOutput recipeOutput, ResourceKey<Recipe<?>> id) { 46 + ChromaCarpetRecipe recipe = new ChromaCarpetRecipe(CraftingBookCategory.MISC); 47 + recipeOutput.accept(id, recipe, null); 48 + } 49 + //?} else if >1.21 { 50 + /*public void save(RecipeOutput recipeOutput, ResourceLocation id) { 51 + ChromaCarpetRecipe recipe = new ChromaCarpetRecipe(CraftingBookCategory.MISC); 52 + recipeOutput.accept(id, recipe, null); 53 + } 54 + *///?} 55 + 56 + //? >1.21 { 57 + 58 + @Override 59 + public RecipeBuilder unlockedBy(String name, Criterion<?> criterion) { 60 + return null; 61 + } 62 + //?} else { 63 + /*@Override 64 + public RecipeBuilder unlockedBy(String criterionName, CriterionTriggerInstance criterionTrigger) { 65 + return null; 66 + } 67 + 68 + @Override 69 + public void save(Consumer<FinishedRecipe> finishedRecipeConsumer, ResourceLocation recipeId) { 70 + finishedRecipeConsumer.accept(new CombiningRecipeResult()); 71 + } 72 + 73 + private static class CombiningRecipeResult implements FinishedRecipe { 74 + @Override 75 + public void serializeRecipeData(JsonObject json) { 76 + json.addProperty("category", "misc"); 77 + } 78 + 79 + @Override 80 + public ResourceLocation getId() { 81 + return InfinityMethods.getId("chromatic_carpet_from_wool"); 82 + } 83 + 84 + @Override 85 + public RecipeSerializer<?> getType() { 86 + return ModItemFunctions.CARPET.get(); 87 + } 88 + 89 + @Override 90 + public @Nullable JsonObject serializeAdvancement() { 91 + return null; 92 + } 93 + 94 + @Override 95 + public @Nullable ResourceLocation getAdvancementId() { 96 + return null; 97 + } 98 + } 99 + *///?} 100 + 101 + }
+117
src/main/java/net/lerariemann/infinity/data/recipe/ChromaticColoringRecipeBuilder.java
···
··· 1 + package net.lerariemann.infinity.data.recipe; 2 + 3 + 4 + import net.lerariemann.infinity.item.function.ChromaticColoringRecipe; 5 + import net.lerariemann.infinity.registry.core.ModItemFunctions; 6 + import net.lerariemann.infinity.util.InfinityMethods; 7 + import net.minecraft.core.registries.BuiltInRegistries; 8 + import net.minecraft.core.registries.Registries; 9 + import net.minecraft.data.recipes.RecipeBuilder; 10 + //? >1.21 { 11 + import net.minecraft.data.recipes.RecipeOutput; 12 + import net.minecraft.advancements.AdvancementHolder; 13 + import net.minecraft.advancements.Criterion; 14 + //?} else { 15 + /*import net.minecraft.data.recipes.FinishedRecipe; 16 + import net.lerariemann.infinity.registry.core.ModItemFunctions; 17 + import com.google.gson.JsonObject; 18 + import net.minecraft.advancements.CriterionTriggerInstance; 19 + *///?} 20 + import net.minecraft.resources.ResourceKey; 21 + import net.minecraft.resources.ResourceLocation; 22 + import net.minecraft.world.item.Item; 23 + import net.minecraft.world.item.crafting.Ingredient; 24 + import net.minecraft.world.item.crafting.Recipe; 25 + import net.minecraft.world.item.crafting.RecipeSerializer; 26 + import net.minecraft.world.level.ItemLike; 27 + import org.jetbrains.annotations.Nullable; 28 + 29 + import java.util.Locale; 30 + import java.util.function.Consumer; 31 + 32 + public class ChromaticColoringRecipeBuilder implements RecipeBuilder { 33 + private final Ingredient input; 34 + private final Item output; 35 + 36 + ChromaticColoringRecipeBuilder(Ingredient input, ItemLike output) { 37 + this.input = input; 38 + this.output = output.asItem(); 39 + 40 + } 41 + 42 + @Override 43 + public RecipeBuilder group(@Nullable String groupName) { 44 + return null; 45 + } 46 + 47 + 48 + 49 + @Override 50 + public Item getResult() { 51 + return this.output; 52 + } 53 + 54 + //? if >1.21.2 { 55 + public void save(RecipeOutput recipeOutput, ResourceKey<Recipe<?>> id) { 56 + ChromaticColoringRecipe recipe = new ChromaticColoringRecipe(input, output.getDefaultInstance()); 57 + recipeOutput.accept(id, recipe, null); 58 + } 59 + //?} 60 + 61 + //? >1.21 { 62 + public void save(RecipeOutput recipeOutput, ResourceLocation id) { 63 + //? if <1.21.2 { 64 + /*ChromaticColoringRecipe recipe = new ChromaticColoringRecipe(input, output.getDefaultInstance()); 65 + recipeOutput.accept(id, recipe, null); 66 + *///?} else { 67 + save(recipeOutput, ResourceKey.create(Registries.RECIPE, id)); 68 + //?} 69 + } 70 + 71 + @Override 72 + public RecipeBuilder unlockedBy(String name, Criterion<?> criterion) { 73 + return null; 74 + } 75 + //?} else { 76 + /*@Override 77 + public RecipeBuilder unlockedBy(String criterionName, CriterionTriggerInstance criterionTrigger) { 78 + return null; 79 + } 80 + 81 + @Override 82 + public void save(Consumer<FinishedRecipe> finishedRecipeConsumer, ResourceLocation recipeId) { 83 + finishedRecipeConsumer.accept(new CollisionRecipeResult()); 84 + } 85 + 86 + private class CollisionRecipeResult implements FinishedRecipe { 87 + @Override 88 + public void serializeRecipeData(JsonObject json) { 89 + json.add("input", input.toJson()); 90 + JsonObject result = new JsonObject(); 91 + result.addProperty("item", BuiltInRegistries.ITEM.getKey(output).toString()); 92 + json.add("output", result); 93 + } 94 + 95 + @Override 96 + public ResourceLocation getId() { 97 + return BuiltInRegistries.ITEM.getKey(output); 98 + } 99 + 100 + @Override 101 + public RecipeSerializer<?> getType() { 102 + return ModItemFunctions.CHROMATIC_COLORING.get(); 103 + } 104 + 105 + @Override 106 + public @Nullable JsonObject serializeAdvancement() { 107 + return null; 108 + } 109 + 110 + @Override 111 + public @Nullable ResourceLocation getAdvancementId() { 112 + return null; 113 + } 114 + } 115 + *///?} 116 + 117 + }
+160
src/main/java/net/lerariemann/infinity/data/recipe/CollisionRecipeBuilder.java
···
··· 1 + package net.lerariemann.infinity.data.recipe; 2 + 3 + 4 + import net.lerariemann.infinity.item.function.CollisionCraftingRecipe; 5 + import net.lerariemann.infinity.util.InfinityMethods; 6 + import net.minecraft.advancements.Advancement; 7 + import net.minecraft.core.registries.BuiltInRegistries; 8 + import net.minecraft.core.registries.Registries; 9 + import net.minecraft.data.recipes.RecipeBuilder; 10 + //? >1.21 { 11 + import net.minecraft.data.recipes.RecipeOutput; 12 + import net.minecraft.advancements.AdvancementHolder; 13 + import net.minecraft.advancements.Criterion; 14 + //?} else { 15 + /*import net.minecraft.data.recipes.FinishedRecipe; 16 + import net.lerariemann.infinity.registry.core.ModItemFunctions; 17 + import com.google.gson.JsonObject; 18 + import net.minecraft.advancements.CriterionTriggerInstance; 19 + *///?} 20 + import net.minecraft.resources.ResourceKey; 21 + import net.minecraft.resources.ResourceLocation; 22 + import net.minecraft.world.item.Item; 23 + import net.minecraft.world.item.crafting.Ingredient; 24 + import net.minecraft.world.item.crafting.Recipe; 25 + import net.minecraft.world.item.crafting.RecipeSerializer; 26 + import net.minecraft.world.item.crafting.RecipeType; 27 + import net.minecraft.world.level.ItemLike; 28 + import org.jetbrains.annotations.Nullable; 29 + 30 + import java.util.Locale; 31 + import java.util.function.Consumer; 32 + 33 + public class CollisionRecipeBuilder implements RecipeBuilder { 34 + private final CollisionCraftingRecipe.Type type; 35 + private final Ingredient input; 36 + private final Item output; 37 + private final String lore; 38 + 39 + CollisionRecipeBuilder(CollisionCraftingRecipe.Type type, Ingredient input, ItemLike output, String lore) { 40 + //? if >1.21 { 41 + if (lore.isEmpty()) { 42 + this.lore = "empty"; 43 + } else { 44 + this.lore = lore; 45 + } 46 + //?} else { 47 + /*this.lore = lore; 48 + *///?} 49 + this.type = type; 50 + this.input = input; 51 + this.output = output.asItem(); 52 + 53 + } 54 + 55 + @Override 56 + public RecipeBuilder group(@Nullable String groupName) { 57 + return null; 58 + } 59 + 60 + public ResourceLocation getDefaultId() { 61 + return InfinityMethods.getId(BuiltInRegistries.ITEM.getKey(output).getPath() + "_from_" + type.name().toLowerCase(Locale.ROOT)); 62 + } 63 + 64 + @Override 65 + public Item getResult() { 66 + return this.output; 67 + } 68 + 69 + //? if >1.21.2 { 70 + public void save(RecipeOutput recipeOutput, ResourceKey<Recipe<?>> id) { 71 + CollisionCraftingRecipe recipe = switch (type) { 72 + case IRIDESCENCE -> new CollisionCraftingRecipe.OfIridescence(input, output.getDefaultInstance(), lore); 73 + case PORTAL -> new CollisionCraftingRecipe.OfPortal(input, output.getDefaultInstance(), lore); 74 + }; 75 + recipeOutput.accept(id, recipe, null); 76 + } 77 + //?} 78 + 79 + //? >1.21 { 80 + public void save(RecipeOutput recipeOutput, ResourceLocation id) { 81 + //? if <1.21.2 { 82 + /*CollisionCraftingRecipe recipe = switch (type) { 83 + case IRIDESCENCE -> new CollisionCraftingRecipe.OfIridescence(input, output.getDefaultInstance(), lore); 84 + case PORTAL -> new CollisionCraftingRecipe.OfPortal(input, output.getDefaultInstance(), lore); 85 + }; 86 + recipeOutput.accept(id, recipe, null); 87 + *///?} else { 88 + save(recipeOutput, ResourceKey.create(Registries.RECIPE, id)); 89 + //?} 90 + } 91 + 92 + @Override 93 + public void save(RecipeOutput recipeOutput) { 94 + save(recipeOutput, getDefaultId()); 95 + } 96 + 97 + @Override 98 + public void save(RecipeOutput recipeOutput, String id) { 99 + save(recipeOutput, ResourceLocation.parse(id)); 100 + } 101 + 102 + @Override 103 + public RecipeBuilder unlockedBy(String name, Criterion<?> criterion) { 104 + return null; 105 + } 106 + //?} else { 107 + /*@Override 108 + public RecipeBuilder unlockedBy(String criterionName, CriterionTriggerInstance criterionTrigger) { 109 + return null; 110 + } 111 + 112 + @Override 113 + public void save(Consumer<FinishedRecipe> finishedRecipeConsumer, ResourceLocation recipeId) { 114 + finishedRecipeConsumer.accept(new CollisionRecipeResult()); 115 + } 116 + 117 + @Override 118 + public void save(Consumer<FinishedRecipe> finishedRecipeConsumer, String recipeId) { 119 + save(finishedRecipeConsumer, new ResourceLocation(recipeId)); 120 + } 121 + 122 + private class CollisionRecipeResult implements FinishedRecipe { 123 + @Override 124 + public void serializeRecipeData(JsonObject json) { 125 + if (!lore.isEmpty()) { 126 + json.addProperty("lore", lore); 127 + } 128 + 129 + json.add("input", input.toJson()); 130 + JsonObject result = new JsonObject(); 131 + result.addProperty("item", BuiltInRegistries.ITEM.getKey(output).toString()); 132 + json.add("output", result); 133 + } 134 + 135 + @Override 136 + public ResourceLocation getId() { 137 + return getDefaultId(); 138 + } 139 + 140 + @Override 141 + public RecipeSerializer<?> getType() { 142 + return switch (type) { 143 + case IRIDESCENCE -> ModItemFunctions.IRIDESCENCE_CRAFTING.get(); 144 + case PORTAL -> ModItemFunctions.PORTAL_CRAFTING.get(); 145 + }; 146 + } 147 + 148 + @Override 149 + public @Nullable JsonObject serializeAdvancement() { 150 + return null; 151 + } 152 + 153 + @Override 154 + public @Nullable ResourceLocation getAdvancementId() { 155 + return null; 156 + } 157 + } 158 + *///?} 159 + 160 + }
+102
src/main/java/net/lerariemann/infinity/data/recipe/F4RechargingRecipeBuilder.java
···
··· 1 + package net.lerariemann.infinity.data.recipe; 2 + 3 + 4 + import net.lerariemann.infinity.item.function.F4RechargingRecipe; 5 + import net.minecraft.core.registries.Registries; 6 + import net.minecraft.data.recipes.RecipeBuilder; 7 + //? >1.21 { 8 + import net.minecraft.data.recipes.RecipeOutput; 9 + import net.minecraft.advancements.AdvancementHolder; 10 + import net.minecraft.advancements.Criterion; 11 + import net.minecraft.world.item.crafting.CraftingBookCategory; 12 + import net.minecraft.resources.ResourceKey; 13 + import net.lerariemann.infinity.item.function.ChromaCarpetRecipe; 14 + //?} else { 15 + /*import net.lerariemann.infinity.util.InfinityMethods; 16 + import net.minecraft.data.recipes.FinishedRecipe; 17 + import net.lerariemann.infinity.registry.core.ModItemFunctions; 18 + import com.google.gson.JsonObject; 19 + import net.minecraft.advancements.CriterionTriggerInstance; 20 + *///?} 21 + import net.minecraft.resources.ResourceLocation; 22 + import net.minecraft.world.item.Item; 23 + import net.minecraft.world.item.crafting.Recipe; 24 + import net.minecraft.world.item.crafting.RecipeSerializer; 25 + import org.jetbrains.annotations.Nullable; 26 + 27 + import java.util.function.Consumer; 28 + 29 + import static net.lerariemann.infinity.registry.core.ModItems.F4; 30 + 31 + public class F4RechargingRecipeBuilder implements RecipeBuilder { 32 + 33 + F4RechargingRecipeBuilder() {} 34 + 35 + @Override 36 + public RecipeBuilder group(@Nullable String groupName) { 37 + return null; 38 + } 39 + 40 + @Override 41 + public Item getResult() { 42 + return F4.get(); 43 + } 44 + 45 + //? if >1.21.2 { 46 + public void save(RecipeOutput recipeOutput, ResourceKey<Recipe<?>> id) { 47 + F4RechargingRecipe recipe = new F4RechargingRecipe(CraftingBookCategory.MISC); 48 + recipeOutput.accept(id, recipe, null); 49 + } 50 + //?} else if >1.21 { 51 + /*public void save(RecipeOutput recipeOutput, ResourceLocation id) { 52 + F4RechargingRecipe recipe = new F4RechargingRecipe(CraftingBookCategory.MISC); 53 + recipeOutput.accept(id, recipe, null); 54 + } 55 + *///?} 56 + 57 + //? >1.21 { 58 + 59 + @Override 60 + public RecipeBuilder unlockedBy(String name, Criterion<?> criterion) { 61 + return null; 62 + } 63 + //?} else { 64 + /*@Override 65 + public RecipeBuilder unlockedBy(String criterionName, CriterionTriggerInstance criterionTrigger) { 66 + return null; 67 + } 68 + 69 + @Override 70 + public void save(Consumer<FinishedRecipe> finishedRecipeConsumer, ResourceLocation recipeId) { 71 + finishedRecipeConsumer.accept(new CombiningRecipeResult()); 72 + } 73 + 74 + private static class CombiningRecipeResult implements FinishedRecipe { 75 + @Override 76 + public void serializeRecipeData(JsonObject json) { 77 + json.addProperty("category", "misc"); 78 + } 79 + 80 + @Override 81 + public ResourceLocation getId() { 82 + return InfinityMethods.getId("f4_recharging"); 83 + } 84 + 85 + @Override 86 + public RecipeSerializer<?> getType() { 87 + return ModItemFunctions.F4_RECHARGING.get(); 88 + } 89 + 90 + @Override 91 + public @Nullable JsonObject serializeAdvancement() { 92 + return null; 93 + } 94 + 95 + @Override 96 + public @Nullable ResourceLocation getAdvancementId() { 97 + return null; 98 + } 99 + } 100 + *///?} 101 + 102 + }
+305
src/main/java/net/lerariemann/infinity/data/recipe/InfinityRecipeProvider.java
···
··· 1 + package net.lerariemann.infinity.data.recipe; 2 + 3 + //? fabric { 4 + 5 + import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; 6 + import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; 7 + import net.lerariemann.infinity.item.function.CollisionCraftingRecipe; 8 + import net.lerariemann.infinity.registry.core.ModItems; 9 + import net.lerariemann.infinity.registry.var.ModTags; 10 + import net.minecraft.core.HolderLookup; 11 + import net.minecraft.core.registries.BuiltInRegistries; 12 + import net.minecraft.data.recipes.*; 13 + import net.minecraft.tags.ItemTags; 14 + import net.minecraft.tags.TagKey; 15 + import net.minecraft.world.item.Item; 16 + import net.minecraft.world.item.ItemStack; 17 + import net.minecraft.world.item.crafting.Ingredient; 18 + import net.minecraft.world.level.ItemLike; 19 + import java.util.Locale; 20 + import java.util.concurrent.CompletableFuture; 21 + import java.util.function.Consumer; 22 + import java.util.function.Supplier; 23 + 24 + import static net.lerariemann.infinity.registry.core.ModItems.*; 25 + import static net.minecraft.data.recipes.RecipeCategory.BUILDING_BLOCKS; 26 + import static net.minecraft.data.recipes.RecipeCategory.MISC; 27 + import static net.minecraft.world.item.Items.*; 28 + 29 + public class InfinityRecipeProvider extends FabricRecipeProvider { 30 + public InfinityRecipeProvider(FabricDataOutput output, CompletableFuture<HolderLookup.Provider> registriesFuture) { 31 + super(output 32 + //? if >1.21 { 33 + , registriesFuture 34 + //?} 35 + ); 36 + } 37 + 38 + 39 + //? if >1.21.6 { 40 + @Override 41 + protected RecipeProvider createRecipeProvider(HolderLookup.Provider registryLookup, RecipeOutput exporter) { 42 + return new RecipeProvider(registryLookup, exporter) { 43 + 44 + @Override 45 + public void buildRecipes() { 46 + 47 + //?} else if >1.21 { 48 + 49 + /*@Override 50 + public void buildRecipes(RecipeOutput output) { 51 + 52 + *///?} else { 53 + /*@Override 54 + public void buildRecipes(Consumer<net.minecraft.data.recipes.FinishedRecipe> output) { 55 + *///?} 56 + 57 + 58 + // start recipes 59 + 60 + shaped(RecipeCategory.REDSTONE, ALTAR_ITEM.get()) 61 + .pattern("SSS") 62 + .pattern(" B ") 63 + .pattern(" S ") 64 + .define('S', STONE_SLAB) 65 + .define('B', BOOK_BOX_ITEM.get()) 66 + // Create an advancement that gives you the recipe 67 + .unlockedBy(getHasName(BOOK_BOX_ITEM.get()), has(BOOK_BOX_ITEM.get())) 68 + .save(output); 69 + 70 + shaped(BUILDING_BLOCKS, ANT_ITEM.get()) 71 + .pattern("WBW") 72 + .pattern("BMB") 73 + .pattern("WBW") 74 + .define('M', STAR_OF_LANG.get()) 75 + .define('W', WHITE_CONCRETE) 76 + .define('B', BLACK_CONCRETE) 77 + // Create an advancement that gives you the recipe 78 + .unlockedBy(getHasName(STAR_OF_LANG.get()), has(STAR_OF_LANG.get())) 79 + .save(output); 80 + 81 + shaped(BUILDING_BLOCKS, ANT_ITEM.get()) 82 + .pattern("WBW") 83 + .pattern("B B") 84 + .pattern("WBW") 85 + .define('W', WHITE_MATTER.get()) 86 + .define('B', BLACK_MATTER.get()) 87 + .unlockedBy(getHasName(WHITE_MATTER.get()), has(WHITE_MATTER.get())) 88 + .save(output, "infinity:ant1"); 89 + 90 + shaped(MISC, COSMIC_ALTAR_ITEM.get()) 91 + .pattern("LAL") 92 + .pattern("ASA") 93 + .pattern("LAL") 94 + .define('L', LODESTONE) 95 + .define('A', ALTAR_ITEM.get()) 96 + .define('S', IRIDESCENT_STAR.get()) 97 + // Create an advancement that gives you the recipe 98 + .unlockedBy(getHasName(IRIDESCENT_STAR.get()), has(IRIDESCENT_STAR.get())) 99 + .save(output); 100 + 101 + shaped(BUILDING_BLOCKS, CURSOR_ITEM.get(), 8) 102 + .pattern("BLB") 103 + .pattern("LSL") 104 + .pattern("BLB") 105 + .define('S', STAR_OF_LANG.get()) 106 + .define('L', LIME_CONCRETE) 107 + .define('B', BLACK_CONCRETE) 108 + // Create an advancement that gives you the recipe 109 + .unlockedBy(getHasName(STAR_OF_LANG.get()), has(STAR_OF_LANG.get())) 110 + .save(output); 111 + 112 + shaped(MISC, F4.get()) 113 + .pattern("OOO") 114 + .pattern("OSO") 115 + .pattern("OOO") 116 + .define('O', OBSIDIAN) 117 + .define('S', IRIDESCENT_STAR.get()) 118 + // Create an advancement that gives you the recipe 119 + .unlockedBy(getHasName(IRIDESCENT_STAR.get()), has(IRIDESCENT_STAR.get())) 120 + .save(output); 121 + 122 + shaped(MISC, FOOTPRINT.get(), 8) 123 + .pattern("PPP") 124 + .pattern("P P") 125 + .pattern("PPP") 126 + .define('P', LIGHT_GRAY_STAINED_GLASS_PANE) 127 + // Create an advancement that gives you the recipe 128 + .unlockedBy(getHasName(LIGHT_GRAY_STAINED_GLASS_PANE), has(LIGHT_GRAY_STAINED_GLASS_PANE)) 129 + .save(output); 130 + 131 + 132 + shaped(MISC, HOME_ITEM.get()) 133 + .pattern("GGG") 134 + .pattern("GSG") 135 + .pattern("GGG") 136 + .define('S', STAR_OF_LANG.get()) 137 + .define('G', GRASS_BLOCK) 138 + // Create an advancement that gives you the recipe 139 + .unlockedBy(getHasName(STAR_OF_LANG.get()), has(STAR_OF_LANG.get())) 140 + .save(output); 141 + 142 + shaped(BUILDING_BLOCKS, NETHERITE_SLAB_ITEM.get(), 6) 143 + .pattern("###") 144 + .define('#', NETHERITE_BLOCK) 145 + // Create an advancement that gives you the recipe 146 + .unlockedBy(getHasName(NETHERITE_BLOCK), has(NETHERITE_BLOCK)) 147 + .save(output); 148 + 149 + shaped(BUILDING_BLOCKS, NETHERITE_STAIRS_ITEM.get(), 4) 150 + .pattern("# ") 151 + .pattern("## ") 152 + .pattern("###") 153 + .define('#', NETHERITE_BLOCK) 154 + // Create an advancement that gives you the recipe 155 + .unlockedBy(getHasName(NETHERITE_BLOCK), has(NETHERITE_BLOCK)) 156 + .save(output); 157 + 158 + stonecutterResultFromBase(output, BUILDING_BLOCKS, NETHERITE_BLOCK, NETHERITE_STAIRS_ITEM.get()); 159 + stonecutterResultFromBase(output, BUILDING_BLOCKS, NETHERITE_BLOCK, NETHERITE_SLAB_ITEM.get(), 2); 160 + 161 + 162 + shaped(MISC, BLACK_MATTER.get()) 163 + .pattern("BBB") 164 + .pattern("B B") 165 + .pattern("BBB") 166 + .define('B', BLACK_CONCRETE) 167 + // Create an advancement that gives you the recipe 168 + .unlockedBy(getHasName(BLACK_CONCRETE), has(BLACK_CONCRETE)) 169 + .save(output); 170 + 171 + shaped(MISC, WHITE_MATTER.get()) 172 + .pattern("BBB") 173 + .pattern("B B") 174 + .pattern("BBB") 175 + .define('B', WHITE_CONCRETE) 176 + // Create an advancement that gives you the recipe 177 + .unlockedBy(getHasName(WHITE_CONCRETE), has(WHITE_CONCRETE)) 178 + .save(output); 179 + 180 + shaped(BUILDING_BLOCKS, IRIDESCENT_CARPET.get(), 3) 181 + .pattern("BB") 182 + .define('B', IRIDESCENT_WOOL.get()) 183 + // Create an advancement that gives you the recipe 184 + .unlockedBy(getHasName(IRIDESCENT_WOOL.get()), has(IRIDESCENT_WOOL.get())) 185 + .save(output, "infinity:iridescent_carpet_from_wool"); 186 + 187 + portal(LECTERN, ALTAR_ITEM.get()).save(output); 188 + portal(GLASS_BOTTLE, BIOME_BOTTLE_ITEM.get()).save(output); 189 + portal(BOOKSHELF, BOOK_BOX_ITEM.get()).save(output); 190 + portal(ItemTags.WOOL, CHROMATIC_WOOL).save(output, "infinity:chromatic_wool"); 191 + portal(F4, F4, "recipe_info.portal.infinity.attuned").save(output); 192 + portal(CHROMATIC_POTION, IRIDESCENT_POTION, "").save(output, "infinity:iridescence_bottle_from_portal"); 193 + iridescence(CHROMATIC_WOOL, IRIDESCENT_WOOL).save(output, "infinity:iridescent_wool"); 194 + iridescence(CHROMATIC_CARPET, IRIDESCENT_CARPET).save(output, "infinity:iridescent_carpet"); 195 + iridescence(STAR_OF_LANG, IRIDESCENT_STAR).save(output, "infinity:iridescent_star"); 196 + portal(ItemTags.WOOL_CARPETS, CHROMATIC_CARPET, "recipe_info.portal.infinity.color").save(output); 197 + portal(ModTags.MATTER, CHROMATIC_MATTER).save(output, "infinity:chromatic_matter"); 198 + iridescence(CHROMATIC_MATTER, CHROMATIC_MATTER, "recipe_info.iridescence.infinity.chromatic_matter").save(output); 199 + portal(AMETHYST_SHARD, TRANSFINITE_KEY.get(), "recipe_info.portal.infinity.attuned").save(output, "infinity:key_from_portal"); 200 + iridescence(TRANSFINITE_KEY, TRANSFINITE_KEY, "recipe_info.iridescence.infinity.key").save(output, "infinity:key_from_iridescence"); 201 + portal(TNT, TIME_BOMB_ITEM.get()).save(output, "infinity:timebomb_from_portal"); 202 + color(ItemTags.WOOL, CHROMATIC_WOOL).save(output, "infinity:chromatic_coloring_wool"); 203 + color(ItemTags.WOOL_CARPETS, CHROMATIC_CARPET).save(output, "infinity:chromatic_coloring_carpet"); 204 + new BiomeBottleCombiningRecipeBuilder().save(output, "infinity:biome_bottle_combining"); 205 + new ChromaCarpetRecipeBuilder().save(output, "infinity:chromatic_carpet_from_wool"); 206 + new F4RechargingRecipeBuilder().save(output, "infinity:f4_recharging"); 207 + 208 + // end recipes 209 + } 210 + 211 + private RecipeBuilder color(TagKey<Item> input, Supplier<? extends Item> output) { 212 + 213 + //? if >1.21.2 { 214 + return new ChromaticColoringRecipeBuilder(tag(input), output.get()); 215 + //?} else { 216 + /*return new ChromaticColoringRecipeBuilder(Ingredient.of(input), output.get()); 217 + *///?} 218 + } 219 + private RecipeBuilder portal(TagKey<Item> input, Supplier<? extends Item> output) { 220 + //? if >1.21.2 { 221 + return portal(tag(input), output.get()); 222 + //?} else { 223 + /*return portal(Ingredient.of(input), output.get()); 224 + *///?} 225 + } 226 + 227 + private RecipeBuilder portal(TagKey<Item> input, Supplier<? extends Item> output, String lore) { 228 + //? if >1.21.2 { 229 + return collision(CollisionCraftingRecipe.Type.PORTAL, tag(input), output.get(), lore); 230 + //?} else { 231 + /*return collision(CollisionCraftingRecipe.Type.PORTAL, Ingredient.of(input), output.get(), lore); 232 + *///?} 233 + } 234 + 235 + 236 + private CollisionRecipeBuilder collision(CollisionCraftingRecipe.Type type, Ingredient input, ItemLike output, String lore) { 237 + return new CollisionRecipeBuilder(type, input, output, lore); 238 + } 239 + private CollisionRecipeBuilder collision(CollisionCraftingRecipe.Type type, ItemLike input, ItemLike output, String lore) { 240 + return collision(type, Ingredient.of(input), output, lore); 241 + } 242 + 243 + private CollisionRecipeBuilder collision(CollisionCraftingRecipe.Type type, ItemLike input, ItemLike output) { 244 + return collision(type, input, output, ""); 245 + } 246 + 247 + private CollisionRecipeBuilder portal(ItemLike input, ItemLike output) { 248 + return collision(CollisionCraftingRecipe.Type.PORTAL, input, output); 249 + } 250 + private CollisionRecipeBuilder portal(Ingredient input, ItemLike output) { 251 + return collision(CollisionCraftingRecipe.Type.PORTAL, input, output, ""); 252 + } 253 + 254 + private CollisionRecipeBuilder portal(ItemLike input, ItemLike output, String lore) { 255 + return collision(CollisionCraftingRecipe.Type.PORTAL, input, output, lore); 256 + } 257 + 258 + private RecipeBuilder portal(Ingredient input, Item output, String lore) { 259 + return collision(CollisionCraftingRecipe.Type.PORTAL, input, output, lore); 260 + } 261 + 262 + private CollisionRecipeBuilder iridescence(ItemLike input, ItemLike output) { 263 + return collision(CollisionCraftingRecipe.Type.IRIDESCENCE, input, output); 264 + } 265 + 266 + private CollisionRecipeBuilder iridescence(ItemLike input, ItemLike output, String lore) { 267 + return collision(CollisionCraftingRecipe.Type.IRIDESCENCE, input, output, lore); 268 + } 269 + 270 + private RecipeBuilder portal(Supplier<? extends Item> input, Supplier<? extends Item> output, String lore) { 271 + return portal(input.get(), output.get(), lore); 272 + } 273 + 274 + private CollisionRecipeBuilder iridescence(Supplier<? extends Item> input, Supplier<? extends Item> output, String lore) { 275 + return iridescence(input.get(), output.get(), lore); 276 + } 277 + 278 + private CollisionRecipeBuilder iridescence(Supplier<? extends Item> input, Supplier<? extends Item> output) { 279 + return iridescence(input.get(), output.get()); 280 + } 281 + 282 + //? if <1.21.6 { 283 + /*private ShapedRecipeBuilder shaped(RecipeCategory recipeCategory, Item item) { 284 + return ShapedRecipeBuilder.shaped(recipeCategory, item); 285 + } 286 + private ShapedRecipeBuilder shaped(RecipeCategory recipeCategory, Item item, int i) { 287 + return ShapedRecipeBuilder.shaped(recipeCategory, item, i); 288 + } 289 + *///?} else { 290 + private void stonecutterResultFromBase(RecipeOutput output, RecipeCategory recipeCategory, Item item1, Item item) { 291 + stonecutterResultFromBase(recipeCategory, item1, item); 292 + } 293 + private void stonecutterResultFromBase(RecipeOutput output, RecipeCategory recipeCategory, Item item1, Item item, int i) { 294 + stonecutterResultFromBase(recipeCategory, item1, item, i); 295 + } 296 + }; 297 + } 298 + //?} 299 + 300 + @Override 301 + public String getName() { 302 + return "infinity"; 303 + } 304 + } 305 + //?}
+76
src/main/java/net/lerariemann/infinity/data/tags/InfinityBlockTagProvider.java
···
··· 1 + package net.lerariemann.infinity.data.tags; 2 + 3 + //? fabric { 4 + 5 + import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; 6 + import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; 7 + import net.lerariemann.infinity.registry.core.ModBlocks; 8 + import net.lerariemann.infinity.registry.var.ModTags; 9 + import net.lerariemann.infinity.util.VersionMethods; 10 + import net.minecraft.core.HolderLookup; 11 + import net.minecraft.core.registries.Registries; 12 + import net.minecraft.tags.BlockTags; 13 + import net.minecraft.tags.TagKey; 14 + import net.minecraft.world.level.block.Block; 15 + 16 + import java.util.concurrent.CompletableFuture; 17 + 18 + public class InfinityBlockTagProvider extends FabricTagProvider.BlockTagProvider { 19 + public InfinityBlockTagProvider(FabricDataOutput output, CompletableFuture<HolderLookup.Provider> registriesFuture) { 20 + super(output, registriesFuture); 21 + } 22 + 23 + @Override 24 + protected void addTags(HolderLookup.Provider provider) { 25 + valueLookupBuilder(ModTags.IRIDESCENT_BLOCKS).add( 26 + ModBlocks.IRIDESCENT_WOOL.get(), 27 + ModBlocks.IRIDESCENT_CARPET.get(), 28 + ModBlocks.IRIDESCENCE.get(), 29 + ModBlocks.COSMIC_ALTAR.get() 30 + ); 31 + valueLookupBuilder(BlockTags.WOOL).add( 32 + ModBlocks.IRIDESCENT_WOOL.get(), 33 + ModBlocks.CHROMATIC_WOOL.get() 34 + ); 35 + valueLookupBuilder(BlockTags.WOOL_CARPETS).add( 36 + ModBlocks.IRIDESCENT_CARPET.get(), 37 + ModBlocks.CHROMATIC_CARPET.get() 38 + ); 39 + valueLookupBuilder(BlockTags.MINEABLE_WITH_AXE).add( 40 + ModBlocks.BOOK_BOX.get() 41 + ); 42 + valueLookupBuilder(BlockTags.MINEABLE_WITH_PICKAXE).add( 43 + ModBlocks.ALTAR.get(), 44 + ModBlocks.CURSOR.get(), 45 + ModBlocks.NETHERITE_SLAB.get(), 46 + ModBlocks.NETHERITE_STAIRS.get(), 47 + ModBlocks.BIOME_BOTTLE.get(), 48 + ModBlocks.ANT.get(), 49 + ModBlocks.COSMIC_ALTAR.get() 50 + ); 51 + valueLookupBuilder(BlockTags.PORTALS).add( 52 + ModBlocks.PORTAL.get() 53 + ); 54 + valueLookupBuilder(BlockTags.SLABS).add( 55 + ModBlocks.NETHERITE_SLAB.get() 56 + ); 57 + valueLookupBuilder(BlockTags.STAIRS).add( 58 + ModBlocks.NETHERITE_STAIRS.get() 59 + ); 60 + } 61 + 62 + //? <1.21.2 { 63 + /*private FabricTagProvider<Block>.FabricTagBuilder valueLookupBuilder(TagKey<Block> buckets) { 64 + return getOrCreateTagBuilder(buckets); 65 + } 66 + *///?} 67 + 68 + private TagKey<Block> convention(String id) { 69 + return TagKey.create(Registries.BLOCK, VersionMethods.id("c", id)); 70 + } 71 + 72 + private TagKey<Block> infinity(String id) { 73 + return TagKey.create(Registries.BLOCK, VersionMethods.id("infinity", id)); 74 + } 75 + } 76 + //?}
+51
src/main/java/net/lerariemann/infinity/data/tags/InfinityEntityTagProvider.java
···
··· 1 + package net.lerariemann.infinity.data.tags; 2 + 3 + //? fabric { 4 + 5 + import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; 6 + import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; 7 + import net.lerariemann.infinity.registry.core.ModEntities; 8 + import net.lerariemann.infinity.util.VersionMethods; 9 + import net.minecraft.core.HolderLookup; 10 + import net.minecraft.core.registries.Registries; 11 + import net.minecraft.tags.EntityTypeTags; 12 + import net.minecraft.tags.TagKey; 13 + import net.minecraft.world.entity.EntityType; 14 + 15 + import java.util.concurrent.CompletableFuture; 16 + 17 + public class InfinityEntityTagProvider extends FabricTagProvider.EntityTypeTagProvider { 18 + public InfinityEntityTagProvider(FabricDataOutput output, CompletableFuture<HolderLookup.Provider> registriesFuture) { 19 + super(output, registriesFuture); 20 + } 21 + 22 + @Override 23 + protected void addTags(HolderLookup.Provider provider) { 24 + //? if >1.21 { 25 + valueLookupBuilder(EntityTypeTags.ARTHROPOD).add( 26 + ModEntities.ANT.get() 27 + ); 28 + //?} 29 + valueLookupBuilder(EntityTypeTags.SKELETONS).add( 30 + ModEntities.CHAOS_SKELETON.get() 31 + ); 32 + valueLookupBuilder(EntityTypeTags.FROG_FOOD).add( 33 + ModEntities.CHAOS_SLIME.get() 34 + ); 35 + } 36 + 37 + //? <1.21.2 { 38 + /*private FabricTagProvider<EntityType<?>>.FabricTagBuilder valueLookupBuilder(TagKey<EntityType<?>> buckets) { 39 + return getOrCreateTagBuilder(buckets); 40 + } 41 + *///?} 42 + 43 + private TagKey<EntityType<?>> convention(String id) { 44 + return TagKey.create(Registries.ENTITY_TYPE, VersionMethods.id("c", id)); 45 + } 46 + 47 + private TagKey<EntityType<?>> infinity(String id) { 48 + return TagKey.create(Registries.ENTITY_TYPE, VersionMethods.id("infinity", id)); 49 + } 50 + } 51 + //?}
+44
src/main/java/net/lerariemann/infinity/data/tags/InfinityFluidTagProvider.java
···
··· 1 + package net.lerariemann.infinity.data.tags; 2 + 3 + //? fabric { 4 + 5 + import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; 6 + import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; 7 + import net.lerariemann.infinity.util.VersionMethods; 8 + import net.lerariemann.infinity.util.platform.fabric.ModFluidsFabric; 9 + import net.minecraft.core.HolderLookup; 10 + import net.minecraft.core.registries.Registries; 11 + import net.minecraft.tags.FluidTags; 12 + import net.minecraft.tags.TagKey; 13 + import net.minecraft.world.level.material.Fluid; 14 + 15 + import java.util.concurrent.CompletableFuture; 16 + 17 + public class InfinityFluidTagProvider extends FabricTagProvider.FluidTagProvider { 18 + public InfinityFluidTagProvider(FabricDataOutput output, CompletableFuture<HolderLookup.Provider> registriesFuture) { 19 + super(output, registriesFuture); 20 + } 21 + 22 + @Override 23 + protected void addTags(HolderLookup.Provider provider) { 24 + valueLookupBuilder(FluidTags.WATER).add( 25 + ModFluidsFabric.IRIDESCENCE_FLOWING.get(), 26 + ModFluidsFabric.IRIDESCENCE_STILL.get() 27 + ); 28 + } 29 + 30 + //? <1.21.2 { 31 + /*private FabricTagProvider<Fluid>.FabricTagBuilder valueLookupBuilder(TagKey<Fluid> buckets) { 32 + return getOrCreateTagBuilder(buckets); 33 + } 34 + *///?} 35 + 36 + private TagKey<Fluid> convention(String id) { 37 + return TagKey.create(Registries.FLUID, VersionMethods.id("c", id)); 38 + } 39 + 40 + private TagKey<Fluid> infinity(String id) { 41 + return TagKey.create(Registries.FLUID, VersionMethods.id("infinity", id)); 42 + } 43 + } 44 + //?}
+68
src/main/java/net/lerariemann/infinity/data/tags/InfinityItemTagProvider.java
···
··· 1 + package net.lerariemann.infinity.data.tags; 2 + 3 + //? fabric { 4 + 5 + import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; 6 + import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; 7 + import net.lerariemann.infinity.registry.core.ModItems; 8 + import net.lerariemann.infinity.registry.var.ModTags; 9 + import net.lerariemann.infinity.util.VersionMethods; 10 + import net.minecraft.core.HolderLookup; 11 + import net.minecraft.core.registries.Registries; 12 + import net.minecraft.tags.ItemTags;import net.minecraft.tags.TagKey; 13 + import net.minecraft.world.item.Item; 14 + 15 + import java.util.concurrent.CompletableFuture; 16 + 17 + public class InfinityItemTagProvider extends FabricTagProvider.ItemTagProvider { 18 + public InfinityItemTagProvider(FabricDataOutput output, CompletableFuture<HolderLookup.Provider> registriesFuture) { 19 + super(output, registriesFuture); 20 + } 21 + 22 + @Override 23 + protected void addTags(HolderLookup.Provider provider) { 24 + valueLookupBuilder(convention("buckets")).add(ModItems.IRIDESCENCE_BUCKET.get()); 25 + valueLookupBuilder(ModTags.IRIDESCENT_ITEMS).add( 26 + ModItems.IRIDESCENT_WOOL.get(), 27 + ModItems.IRIDESCENT_CARPET.get(), 28 + ModItems.IRIDESCENCE_BUCKET.get(), 29 + ModItems.IRIDESCENT_STAR.get(), 30 + ModItems.IRIDESCENT_POTION.get(), 31 + ModItems.CHROMATIC_POTION.get(), 32 + ModItems.COSMIC_ALTAR_ITEM.get() 33 + ); 34 + valueLookupBuilder(ModTags.MATTER).add( 35 + ModItems.BLACK_MATTER.get(), 36 + ModItems.CHROMATIC_MATTER.get(), 37 + ModItems.WHITE_MATTER.get() 38 + ); 39 + valueLookupBuilder(ItemTags.WOOL).add( 40 + ModItems.IRIDESCENT_WOOL.get(), 41 + ModItems.CHROMATIC_WOOL.get() 42 + ); 43 + //? <1.21 { 44 + /*valueLookupBuilder(ItemTags.MUSIC_DISCS).add( 45 + ModItems.DISC.get() 46 + ); 47 + *///?} 48 + valueLookupBuilder(ItemTags.WOOL_CARPETS).add( 49 + ModItems.IRIDESCENT_CARPET.get(), 50 + ModItems.CHROMATIC_CARPET.get() 51 + ); 52 + } 53 + 54 + //? <1.21.2 { 55 + /*private FabricTagProvider<Item>.FabricTagBuilder valueLookupBuilder(TagKey<Item> buckets) { 56 + return getOrCreateTagBuilder(buckets); 57 + } 58 + *///?} 59 + 60 + private TagKey<Item> convention(String id) { 61 + return TagKey.create(Registries.ITEM, VersionMethods.id("c", id)); 62 + } 63 + 64 + private TagKey<Item> infinity(String id) { 65 + return TagKey.create(Registries.ITEM, VersionMethods.id("infinity", id)); 66 + } 67 + } 68 + //?}
+3 -10
src/main/java/net/lerariemann/infinity/dimensions/RandomDimension.java
··· 8 import net.lerariemann.infinity.util.core.ConfigType; 9 import net.lerariemann.infinity.util.core.NbtUtils; 10 import net.lerariemann.infinity.util.core.RandomProvider; 11 import net.minecraft.core.Registry; 12 import net.minecraft.core.registries.Registries; 13 import net.minecraft.nbt.*; ··· 127 if (!isEasterDim) (new DimensionData(this)).save(); 128 (new RandomInfinityOptions(this, isEasterDim)).save(); 129 CommonIO.write(data, getStoragePath() + "/dimension", getName() + ".json"); 130 - if (!(Paths.get(getRootPath() + "/pack.mcmeta")).toFile().exists()) CommonIO.write(packMcmeta(), getRootPath(), "pack.mcmeta"); 131 } 132 133 String getDefaultBlock(String fallback) { ··· 173 174 boolean hasCeiling() { 175 return ((type_alike.equals("minecraft:nether")) || (type_alike.equals("minecraft:caves")) || (type_alike.equals("infinity:tangled"))); 176 - } 177 - 178 - CompoundTag packMcmeta() { 179 - CompoundTag res = new CompoundTag(); 180 - CompoundTag pack = new CompoundTag(); 181 - pack.putInt("pack_format", 34); 182 - pack.putString("description", "Dimension #" + numericId); 183 - res.put("pack", pack); 184 - return res; 185 } 186 187 CompoundTag randomDimensionGenerator() {
··· 8 import net.lerariemann.infinity.util.core.ConfigType; 9 import net.lerariemann.infinity.util.core.NbtUtils; 10 import net.lerariemann.infinity.util.core.RandomProvider; 11 + import net.lerariemann.infinity.util.platform.InfinityPlatform; 12 import net.minecraft.core.Registry; 13 import net.minecraft.core.registries.Registries; 14 import net.minecraft.nbt.*; ··· 128 if (!isEasterDim) (new DimensionData(this)).save(); 129 (new RandomInfinityOptions(this, isEasterDim)).save(); 130 CommonIO.write(data, getStoragePath() + "/dimension", getName() + ".json"); 131 + if (!(Paths.get(getRootPath() + "/pack.mcmeta")).toFile().exists()) 132 + CommonIO.write(InfinityPlatform.dataPackMcmeta("Dimension #" + numericId), getRootPath(), "pack.mcmeta"); 133 } 134 135 String getDefaultBlock(String fallback) { ··· 175 176 boolean hasCeiling() { 177 return ((type_alike.equals("minecraft:nether")) || (type_alike.equals("minecraft:caves")) || (type_alike.equals("infinity:tangled"))); 178 } 179 180 CompoundTag randomDimensionGenerator() {
+3 -3
src/main/java/net/lerariemann/infinity/entity/client/ChaosSlimeRenderer.java
··· 17 import net.minecraft.util.Mth; 18 import org.jetbrains.annotations.NotNull; 19 20 - public class ChaosSlimeRenderer extends MobRenderer 21 //? if >1.21.2 { 22 - <ChaosSlime, TintedRenderState.Slime, SlimeModel> 23 //?} else { 24 - /*<ChaosSlime, SlimeModel<ChaosSlime>> 25 *///?} 26 { 27 public static final ResourceLocation TEXTURE = InfinityMethods.getId("textures/entity/slime.png");
··· 17 import net.minecraft.util.Mth; 18 import org.jetbrains.annotations.NotNull; 19 20 + public class ChaosSlimeRenderer 21 //? if >1.21.2 { 22 + extends MobRenderer<ChaosSlime, TintedRenderState.Slime, SlimeModel> 23 //?} else { 24 + /*extends MobRenderer<ChaosSlime, SlimeModel<ChaosSlime>> 25 *///?} 26 { 27 public static final ResourceLocation TEXTURE = InfinityMethods.getId("textures/entity/slime.png");
+6 -6
src/main/java/net/lerariemann/infinity/entity/client/DimensionalSlimeCoreRenderer.java
··· 18 import net.minecraft.core.BlockPos; 19 import net.minecraft.world.level.block.state.BlockState; 20 //? if >1.21.6 && neoforge { 21 - import net.neoforged.neoforge.client.RenderTypeHelper; 22 - //?} 23 24 public class DimensionalSlimeCoreRenderer extends 25 ··· 100 *///?} else if >1.21.6 { 101 ModelBlockRenderer.renderModel(matrices.last(), vertexConsumers.getBuffer( 102 //? if neoforge { 103 - RenderTypeHelper.getMovingBlockRenderType(ItemBlockRenderTypes.getChunkRenderType(coreState))), 104 - //?} else { 105 - /*ItemBlockRenderTypes.getMovingBlockRenderType(coreState)), 106 - *///?} 107 coreModel,1.0f, 1.0f, 1.0f, light, overlay); 108 //?} else { 109 /*this.blockRenderManager.getModelRenderer().renderModel(matrices.last(), vertexConsumers.getBuffer(ItemBlockRenderTypes.getChunkRenderType(coreState)), coreState, coreModel, 1.0f, 1.0f, 1.0f, light, overlay);
··· 18 import net.minecraft.core.BlockPos; 19 import net.minecraft.world.level.block.state.BlockState; 20 //? if >1.21.6 && neoforge { 21 + /*import net.neoforged.neoforge.client.RenderTypeHelper; 22 + *///?} 23 24 public class DimensionalSlimeCoreRenderer extends 25 ··· 100 *///?} else if >1.21.6 { 101 ModelBlockRenderer.renderModel(matrices.last(), vertexConsumers.getBuffer( 102 //? if neoforge { 103 + /*RenderTypeHelper.getMovingBlockRenderType(ItemBlockRenderTypes.getChunkRenderType(coreState))), 104 + *///?} else { 105 + ItemBlockRenderTypes.getMovingBlockRenderType(coreState)), 106 + //?} 107 coreModel,1.0f, 1.0f, 1.0f, light, overlay); 108 //?} else { 109 /*this.blockRenderManager.getModelRenderer().renderModel(matrices.last(), vertexConsumers.getBuffer(ItemBlockRenderTypes.getChunkRenderType(coreState)), coreState, coreModel, 1.0f, 1.0f, 1.0f, light, overlay);
+18 -17
src/main/java/net/lerariemann/infinity/entity/custom/ChaosCreeper.java
··· 2 3 import net.lerariemann.infinity.InfinityMod; 4 import net.lerariemann.infinity.block.custom.BiomeBottleBlock; 5 import net.lerariemann.infinity.registry.core.ModComponentTypes; 6 import net.lerariemann.infinity.registry.core.ModEntities; 7 import net.lerariemann.infinity.registry.core.ModItems; ··· 15 import net.minecraft.core.component.DataComponents; 16 import net.minecraft.world.item.EitherHolder; 17 import net.minecraft.world.item.JukeboxPlayable; 18 - //?} 19 //? if >1.21.2 { 20 import net.minecraft.world.entity.EntitySpawnReason; 21 //?} else { 22 - /*import net.minecraft.world.entity.MobSpawnType; 23 *///?} 24 import net.minecraft.core.registries.Registries; 25 import net.minecraft.nbt.CompoundTag; ··· 54 import org.jetbrains.annotations.Nullable; 55 56 //? if neoforge { 57 - import javax.annotation.ParametersAreNonnullByDefault; 58 59 60 - //?} 61 62 @MethodsReturnNonnullByDefault 63 //? if neoforge { 64 - @ParametersAreNonnullByDefault 65 - //?} 66 public class ChaosCreeper extends Creeper implements TintableEntity { 67 public static EntityDataAccessor<Integer> color = SynchedEntityData.defineId(ChaosCreeper.class, EntityDataSerializers.INT); 68 public static EntityDataAccessor<Float> range = SynchedEntityData.defineId(ChaosCreeper.class, EntityDataSerializers.FLOAT); ··· 239 return super.mobInteract(player, hand); 240 } 241 242 - //? if >1.21 { 243 @Override 244 protected void dropCustomDeathLoot(ServerLevel world, DamageSource source, boolean causedByPlayer) { 245 if (source.getEntity() != null && source.getEntity().getType().is(EntityTypeTags.SKELETONS)) { 246 - ItemStack stack = ModItems.DISC.get().getDefaultInstance(); 247 - ResourceLocation song = VersionMethods.id(InfinityMod.provider.randomName(world.random, ConfigType.JUKEBOXES)); 248 - stack.applyComponents(DataComponentMap.builder() 249 - .set(DataComponents.JUKEBOX_PLAYABLE, new JukeboxPlayable(new EitherHolder<>( 250 - ResourceKey.create(Registries.JUKEBOX_SONG, song)) 251 - //? if <1.21.2 252 - /*, true*/ 253 - )) 254 - .set(ModComponentTypes.COLOR.get(), (int)InfinityMethods.getNumericFromId(song)).build()); 255 this.spawnAtLocation( 256 //? if >1.21.2 257 (ServerLevel) level(), 258 stack); 259 } 260 } 261 - //?} 262 }
··· 2 3 import net.lerariemann.infinity.InfinityMod; 4 import net.lerariemann.infinity.block.custom.BiomeBottleBlock; 5 + import net.lerariemann.infinity.item.DiscItem; 6 import net.lerariemann.infinity.registry.core.ModComponentTypes; 7 import net.lerariemann.infinity.registry.core.ModEntities; 8 import net.lerariemann.infinity.registry.core.ModItems; ··· 16 import net.minecraft.core.component.DataComponents; 17 import net.minecraft.world.item.EitherHolder; 18 import net.minecraft.world.item.JukeboxPlayable; 19 + //?} else { 20 + /*import net.minecraft.world.entity.monster.AbstractSkeleton; 21 + *///?} 22 //? if >1.21.2 { 23 import net.minecraft.world.entity.EntitySpawnReason; 24 //?} else { 25 + /*import net.minecraft.world.entity.Entity; 26 + import net.minecraft.world.entity.MobSpawnType; 27 *///?} 28 import net.minecraft.core.registries.Registries; 29 import net.minecraft.nbt.CompoundTag; ··· 58 import org.jetbrains.annotations.Nullable; 59 60 //? if neoforge { 61 + /*import javax.annotation.ParametersAreNonnullByDefault; 62 63 64 + *///?} 65 66 @MethodsReturnNonnullByDefault 67 //? if neoforge { 68 + /*@ParametersAreNonnullByDefault 69 + *///?} 70 public class ChaosCreeper extends Creeper implements TintableEntity { 71 public static EntityDataAccessor<Integer> color = SynchedEntityData.defineId(ChaosCreeper.class, EntityDataSerializers.INT); 72 public static EntityDataAccessor<Float> range = SynchedEntityData.defineId(ChaosCreeper.class, EntityDataSerializers.FLOAT); ··· 243 return super.mobInteract(player, hand); 244 } 245 246 @Override 247 + //? if >1.21 { 248 protected void dropCustomDeathLoot(ServerLevel world, DamageSource source, boolean causedByPlayer) { 249 + super.dropCustomDeathLoot(world, source, causedByPlayer); 250 if (source.getEntity() != null && source.getEntity().getType().is(EntityTypeTags.SKELETONS)) { 251 + //?} else { 252 + /*protected void dropCustomDeathLoot(DamageSource source, int looting, boolean recentlyHit) { 253 + super.dropCustomDeathLoot(source, looting, recentlyHit); 254 + if (source.getEntity() instanceof AbstractSkeleton && getServer() != null) { 255 + *///?} 256 + ItemStack stack = DiscItem.getRandom(getServer()); 257 this.spawnAtLocation( 258 //? if >1.21.2 259 (ServerLevel) level(), 260 stack); 261 } 262 } 263 }
+4 -4
src/main/java/net/lerariemann/infinity/entity/custom/ChaosPawn.java
··· 44 import org.jetbrains.annotations.Nullable; 45 46 //? if neoforge { 47 - import javax.annotation.ParametersAreNonnullByDefault; 48 - //?} 49 import java.util.*; 50 import java.util.function.Supplier; 51 52 //? if neoforge { 53 - @MethodsReturnNonnullByDefault 54 @ParametersAreNonnullByDefault 55 - //?} 56 public class ChaosPawn extends AbstractChessFigure { 57 58 public static final EntityDataAccessor<CompoundTag> colors = SynchedEntityData.defineId(ChaosPawn.class, EntityDataSerializers.COMPOUND_TAG);
··· 44 import org.jetbrains.annotations.Nullable; 45 46 //? if neoforge { 47 + /*import javax.annotation.ParametersAreNonnullByDefault; 48 + *///?} 49 import java.util.*; 50 import java.util.function.Supplier; 51 52 //? if neoforge { 53 + /*@MethodsReturnNonnullByDefault 54 @ParametersAreNonnullByDefault 55 + *///?} 56 public class ChaosPawn extends AbstractChessFigure { 57 58 public static final EntityDataAccessor<CompoundTag> colors = SynchedEntityData.defineId(ChaosPawn.class, EntityDataSerializers.COMPOUND_TAG);
+4 -4
src/main/java/net/lerariemann/infinity/entity/custom/ChaosSkeleton.java
··· 51 import org.jetbrains.annotations.Nullable; 52 53 //? if neoforge { 54 - import javax.annotation.ParametersAreNonnullByDefault; 55 - //?} 56 import java.util.*; 57 58 59 60 @MethodsReturnNonnullByDefault 61 //? if neoforge { 62 - @ParametersAreNonnullByDefault 63 - //?} 64 public class ChaosSkeleton extends Skeleton implements TintableEntity { 65 private static final EntityDataAccessor<String> effect = SynchedEntityData.defineId(ChaosSkeleton.class, EntityDataSerializers.STRING); 66 private static final EntityDataAccessor<Integer> color = SynchedEntityData.defineId(ChaosSkeleton.class, EntityDataSerializers.INT);
··· 51 import org.jetbrains.annotations.Nullable; 52 53 //? if neoforge { 54 + /*import javax.annotation.ParametersAreNonnullByDefault; 55 + *///?} 56 import java.util.*; 57 58 59 60 @MethodsReturnNonnullByDefault 61 //? if neoforge { 62 + /*@ParametersAreNonnullByDefault 63 + *///?} 64 public class ChaosSkeleton extends Skeleton implements TintableEntity { 65 private static final EntityDataAccessor<String> effect = SynchedEntityData.defineId(ChaosSkeleton.class, EntityDataSerializers.STRING); 66 private static final EntityDataAccessor<Integer> color = SynchedEntityData.defineId(ChaosSkeleton.class, EntityDataSerializers.INT);
+4 -4
src/main/java/net/lerariemann/infinity/entity/custom/ChaosSlime.java
··· 46 import org.jetbrains.annotations.Nullable; 47 48 //? if neoforge { 49 - import javax.annotation.ParametersAreNonnullByDefault; 50 - //?} 51 import java.util.Optional; 52 import java.util.Random; 53 import java.util.function.BiConsumer; ··· 55 56 @MethodsReturnNonnullByDefault 57 //? if neoforge { 58 - @ParametersAreNonnullByDefault 59 - //?} 60 public class ChaosSlime extends Slime implements TintableEntity { 61 public static final EntityDataAccessor<BlockState> core = SynchedEntityData.defineId(ChaosSlime.class, EntityDataSerializers.BLOCK_STATE); 62 public static final EntityDataAccessor<Integer> color = SynchedEntityData.defineId(ChaosSlime.class, EntityDataSerializers.INT);
··· 46 import org.jetbrains.annotations.Nullable; 47 48 //? if neoforge { 49 + /*import javax.annotation.ParametersAreNonnullByDefault; 50 + *///?} 51 import java.util.Optional; 52 import java.util.Random; 53 import java.util.function.BiConsumer; ··· 55 56 @MethodsReturnNonnullByDefault 57 //? if neoforge { 58 + /*@ParametersAreNonnullByDefault 59 + *///?} 60 public class ChaosSlime extends Slime implements TintableEntity { 61 public static final EntityDataAccessor<BlockState> core = SynchedEntityData.defineId(ChaosSlime.class, EntityDataSerializers.BLOCK_STATE); 62 public static final EntityDataAccessor<Integer> color = SynchedEntityData.defineId(ChaosSlime.class, EntityDataSerializers.INT);
+58
src/main/java/net/lerariemann/infinity/features/NotesHouseFeature.java
···
··· 1 + package net.lerariemann.infinity.features; 2 + 3 + import com.mojang.serialization.Codec; 4 + import com.mojang.serialization.codecs.RecordCodecBuilder; 5 + import net.lerariemann.infinity.util.InfinityMethods; 6 + import net.minecraft.core.BlockPos; 7 + import net.minecraft.core.Direction; 8 + import net.minecraft.util.RandomSource; 9 + import net.minecraft.world.level.WorldGenLevel; 10 + import net.minecraft.world.level.block.Blocks; 11 + import net.minecraft.world.level.block.DoorBlock; 12 + import net.minecraft.world.level.block.NoteBlock; 13 + import net.minecraft.world.level.block.piston.PistonBaseBlock; 14 + import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; 15 + import net.minecraft.world.level.levelgen.feature.Feature; 16 + import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; 17 + import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; 18 + 19 + public class NotesHouseFeature extends Feature<NotesHouseFeature.Config> { 20 + public NotesHouseFeature(Codec<Config> codec) { 21 + super(codec); 22 + } 23 + 24 + @Override 25 + public boolean place(FeaturePlaceContext<Config> context) { 26 + RandomSource random = context.random(); 27 + WorldGenLevel level = context.level(); 28 + BlockPos origin = context.origin(); 29 + int r = context.config().radius; 30 + for (int i = -r; i <= r; i++) for (int j = -r; j <= r; j++) { 31 + BlockPos local = origin.offset(i, 0, j); 32 + if (!Blocks.IRON_DOOR.defaultBlockState().canSurvive(level, local)) continue; 33 + boolean open = random.nextBoolean(); 34 + Direction dir = InfinityMethods.getRandomHorizontalDirection(random); 35 + setBlock(level, local, Blocks.IRON_DOOR.defaultBlockState() 36 + .setValue(DoorBlock.FACING, dir) 37 + .setValue(DoorBlock.OPEN, open) 38 + .setValue(DoorBlock.HALF, DoubleBlockHalf.LOWER)); 39 + setBlock(level, local.above(), Blocks.IRON_DOOR.defaultBlockState() 40 + .setValue(DoorBlock.FACING, dir) 41 + .setValue(DoorBlock.OPEN, open) 42 + .setValue(DoorBlock.HALF, DoubleBlockHalf.UPPER)); 43 + setBlock(level, local.above(2), Blocks.STICKY_PISTON.defaultBlockState() 44 + .setValue(PistonBaseBlock.FACING, Direction.UP) 45 + .setValue(PistonBaseBlock.EXTENDED, false)); 46 + setBlock(level, local.above(3), Blocks.NOTE_BLOCK.defaultBlockState() 47 + .setValue(NoteBlock.INSTRUMENT, InfinityMethods.getRandomInstrument()) 48 + .setValue(NoteBlock.NOTE, random.nextInt(24))); 49 + } 50 + return true; 51 + } 52 + 53 + public record Config(int radius) implements FeatureConfiguration { 54 + public static final Codec<NotesHouseFeature.Config> CODEC = RecordCodecBuilder.create(instance -> instance.group( 55 + (Codec.INT.fieldOf("radius")).forGetter(a -> a.radius)).apply( 56 + instance, NotesHouseFeature.Config::new)); 57 + } 58 + }
+37
src/main/java/net/lerariemann/infinity/features/NotesJukeboxFeature.java
···
··· 1 + package net.lerariemann.infinity.features; 2 + 3 + import com.mojang.serialization.Codec; 4 + import net.lerariemann.infinity.item.DiscItem; 5 + import net.minecraft.core.BlockPos; 6 + import net.minecraft.core.Direction; 7 + import net.minecraft.world.level.WorldGenLevel; 8 + import net.minecraft.world.level.block.Blocks; 9 + import net.minecraft.world.level.block.HopperBlock; 10 + import net.minecraft.world.level.levelgen.feature.Feature; 11 + import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; 12 + import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; 13 + import net.lerariemann.infinity.util.InfinityMethods; 14 + import net.minecraft.world.level.block.entity.HopperBlockEntity; 15 + import net.minecraft.util.RandomSource; 16 + import net.minecraft.world.item.ItemStack; 17 + 18 + public class NotesJukeboxFeature extends Feature<NoneFeatureConfiguration> { 19 + public NotesJukeboxFeature(Codec<NoneFeatureConfiguration> codec) { 20 + super(codec); 21 + } 22 + 23 + @Override 24 + public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) { 25 + WorldGenLevel level = context.level(); 26 + BlockPos origin = context.origin().below(); 27 + setBlock(level, origin, Blocks.JUKEBOX.defaultBlockState()); 28 + RandomSource random = context.random(); 29 + Direction dir = InfinityMethods.getRandomHorizontalDirection(random); 30 + setBlock(level, origin.relative(dir), Blocks.HOPPER.defaultBlockState().setValue(HopperBlock.FACING, dir.getOpposite())); 31 + if (level.getBlockEntity(origin.relative(dir)) instanceof HopperBlockEntity hpbe) { 32 + ItemStack stack = DiscItem.getRandom(context.level().getServer()); 33 + hpbe.setItem(0, stack); 34 + } 35 + return true; 36 + } 37 + }
+10 -10
src/main/java/net/lerariemann/infinity/iridescence/Iridescence.java
··· 3 import dev.architectury.registry.registries.RegistrySupplier; 4 import net.lerariemann.infinity.InfinityMod; 5 import net.lerariemann.infinity.registry.core.ModEntities; 6 - import net.lerariemann.infinity.registry.var.ModPayloads; 7 import net.lerariemann.infinity.registry.core.ModStatusEffects; 8 import net.lerariemann.infinity.registry.var.ModCriteria; 9 import net.lerariemann.infinity.registry.var.ModStats; 10 import net.lerariemann.infinity.registry.var.ModTags; ··· 30 import net.minecraft.sounds.SoundEvents; 31 import net.minecraft.world.effect.MobEffectInstance; 32 import net.minecraft.world.entity.*; 33 - import net.minecraft.world.entity.ai.targeting.TargetingConditions; 34 import net.minecraft.world.entity.animal.AbstractFish; 35 import net.minecraft.world.entity.monster.Slime; 36 import net.minecraft.world.entity.player.Player; ··· 46 import net.minecraft.world.phys.Vec3; 47 import org.jetbrains.annotations.Nullable; 48 //? neoforge { 49 - import net.neoforged.neoforge.event.EventHooks; 50 - //?} 51 52 import java.nio.file.Files; 53 import java.nio.file.Path; ··· 59 import static net.minecraft.world.entity.EntitySpawnReason.CONVERSION; 60 //?} else { 61 /*import static net.minecraft.world.entity.MobSpawnType.CONVERSION; 62 *///?} 63 64 public interface Iridescence { ··· 208 } 209 210 static void loadShader(ServerPlayer player) { 211 - ModPayloads.sendShaderPayload(player, player. 212 //? if >1.21.2 { 213 level() 214 //?} else { ··· 217 , true); 218 } 219 static void unloadShader(ServerPlayer player) { 220 - ModPayloads.sendShaderPayload(player, player. 221 //? if >1.21.2 { 222 level() 223 //?} else { ··· 331 else if (currEntity.level() instanceof ServerLevel w) 332 333 //? fabric || forge { 334 - /*newEntity.finalizeSpawn( 335 - *///?} 336 //? neoforge { 337 - EventHooks.finalizeMobSpawn(newEntity, 338 - //?} 339 w, w.getCurrentDifficultyAt(currEntity.blockPosition()), CONVERSION, null 340 //? if <1.21 { 341 /*, null
··· 3 import dev.architectury.registry.registries.RegistrySupplier; 4 import net.lerariemann.infinity.InfinityMod; 5 import net.lerariemann.infinity.registry.core.ModEntities; 6 import net.lerariemann.infinity.registry.core.ModStatusEffects; 7 + import net.lerariemann.infinity.registry.payload.s2c.ShaderS2CPayload; 8 import net.lerariemann.infinity.registry.var.ModCriteria; 9 import net.lerariemann.infinity.registry.var.ModStats; 10 import net.lerariemann.infinity.registry.var.ModTags; ··· 30 import net.minecraft.sounds.SoundEvents; 31 import net.minecraft.world.effect.MobEffectInstance; 32 import net.minecraft.world.entity.*; 33 import net.minecraft.world.entity.animal.AbstractFish; 34 import net.minecraft.world.entity.monster.Slime; 35 import net.minecraft.world.entity.player.Player; ··· 45 import net.minecraft.world.phys.Vec3; 46 import org.jetbrains.annotations.Nullable; 47 //? neoforge { 48 + /*import net.neoforged.neoforge.event.EventHooks; 49 + *///?} 50 51 import java.nio.file.Files; 52 import java.nio.file.Path; ··· 58 import static net.minecraft.world.entity.EntitySpawnReason.CONVERSION; 59 //?} else { 60 /*import static net.minecraft.world.entity.MobSpawnType.CONVERSION; 61 + import net.minecraft.world.entity.ai.targeting.TargetingConditions; 62 *///?} 63 64 public interface Iridescence { ··· 208 } 209 210 static void loadShader(ServerPlayer player) { 211 + ShaderS2CPayload.sendTo(player, player. 212 //? if >1.21.2 { 213 level() 214 //?} else { ··· 217 , true); 218 } 219 static void unloadShader(ServerPlayer player) { 220 + ShaderS2CPayload.sendTo(player, player. 221 //? if >1.21.2 { 222 level() 223 //?} else { ··· 331 else if (currEntity.level() instanceof ServerLevel w) 332 333 //? fabric || forge { 334 + newEntity.finalizeSpawn( 335 + //?} 336 //? neoforge { 337 + /*EventHooks.finalizeMobSpawn(newEntity, 338 + *///?} 339 w, w.getCurrentDifficultyAt(currEntity.blockPosition()), CONVERSION, null 340 //? if <1.21 { 341 /*, null
+179
src/main/java/net/lerariemann/infinity/item/DiscItem.java
···
··· 1 + package net.lerariemann.infinity.item; 2 + 3 + //? if <1.21 { 4 + /*import net.lerariemann.infinity.access.MinecraftServerAccess; 5 + import net.minecraft.ChatFormatting; 6 + import net.minecraft.core.BlockPos; 7 + import net.minecraft.nbt.CompoundTag; 8 + import net.minecraft.network.chat.Component; 9 + import net.minecraft.sounds.SoundEvents; 10 + import net.minecraft.stats.Stats; 11 + import net.minecraft.world.InteractionResult; 12 + import net.minecraft.world.entity.player.Player; 13 + import net.minecraft.world.item.context.UseOnContext; 14 + import net.minecraft.world.level.Level; 15 + import net.minecraft.world.level.block.Blocks; 16 + import net.minecraft.world.level.block.JukeboxBlock; 17 + import net.minecraft.world.level.block.entity.BlockEntity; 18 + import net.minecraft.world.level.block.entity.JukeboxBlockEntity; 19 + import net.minecraft.world.level.block.state.BlockState; 20 + import net.minecraft.world.level.gameevent.GameEvent; 21 + import org.jetbrains.annotations.NotNull; 22 + *///?} else { 23 + import net.lerariemann.infinity.InfinityMod; 24 + import net.lerariemann.infinity.util.core.ConfigType; 25 + import net.minecraft.ChatFormatting; 26 + import net.minecraft.core.component.DataComponentMap; 27 + import net.minecraft.core.component.DataComponents; 28 + import net.minecraft.core.registries.Registries; 29 + import net.minecraft.network.chat.Component; 30 + import net.minecraft.network.chat.MutableComponent; 31 + import net.minecraft.resources.ResourceKey; 32 + import net.minecraft.resources.ResourceLocation; 33 + //?} 34 + import net.lerariemann.infinity.registry.core.ModComponentTypes; 35 + import net.lerariemann.infinity.registry.core.ModItems; 36 + import net.lerariemann.infinity.util.InfinityMethods; 37 + import net.lerariemann.infinity.util.VersionMethods; 38 + import net.minecraft.server.MinecraftServer; 39 + import net.minecraft.world.level.Level; 40 + import net.minecraft.world.InteractionHand; 41 + import net.minecraft.world.InteractionResult; 42 + import net.minecraft.world.item.*; 43 + //? if <1.21.5 { 44 + /*import net.minecraft.world.InteractionResultHolder; 45 + import java.util.List; 46 + *///?} else { 47 + import net.minecraft.world.item.component.TooltipDisplay; 48 + //?} 49 + import net.minecraft.world.entity.player.Player; 50 + 51 + import java.util.function.Consumer; 52 + 53 + public class DiscItem 54 + //? if <1.21 { 55 + /*extends RecordItem 56 + *///?} else { 57 + extends Item 58 + //?} 59 + { 60 + public static String emptySubtitle = "subtitles.music.missing"; 61 + //? if <1.21 { 62 + 63 + /*public static int defaultDuration = 185; 64 + 65 + public DiscItem(Properties builder) { 66 + super(15, SoundEvents.MUSIC_DISC_CAT, builder, 185); 67 + } 68 + 69 + public static ItemStack getRandom(MinecraftServer server) { 70 + MinecraftServerAccess acc = (MinecraftServerAccess)server; 71 + ItemStack res = ModItems.DISC.get().getDefaultInstance(); 72 + String id = acc.infinity$getRandomJukeboxId(); 73 + CompoundTag t = res.getOrCreateTag(); 74 + t.putString("sound_id", id); 75 + t.putString("sound_sub", acc.infinity$getJukeboxSubtitle(id)); 76 + t.putInt("sound_duration", acc.infinity$getJukeboxDuration(id)); 77 + t.putInt(ModComponentTypes.COLOR, (int)InfinityMethods.getDimensionSeed(id)); 78 + res.setTag(t); 79 + return res; 80 + } 81 + 82 + @Override 83 + public void appendHoverText(@NotNull ItemStack stack, Level level, List<Component> tooltip, TooltipFlag flag) { 84 + tooltip.add(Component.translatable(VersionMethods.getOrDefaultString(stack, "sound_sub", emptySubtitle)).withStyle(ChatFormatting.GRAY)); 85 + } 86 + 87 + /^* our discs are stackable which mojang did not foresee ^/ 88 + @Override 89 + public InteractionResult useOn(UseOnContext context) { 90 + Level level = context.getLevel(); 91 + BlockPos blockpos = context.getClickedPos(); 92 + BlockState blockstate = level.getBlockState(blockpos); 93 + if (blockstate.is(Blocks.JUKEBOX) && !(Boolean)blockstate.getValue(JukeboxBlock.HAS_RECORD)) { 94 + ItemStack itemstack = context.getItemInHand(); 95 + if (isBlank(itemstack)) return InteractionResult.PASS; 96 + if (!level.isClientSide) { 97 + Player player = context.getPlayer(); 98 + BlockEntity blockentity = level.getBlockEntity(blockpos); 99 + if (blockentity instanceof JukeboxBlockEntity) { 100 + JukeboxBlockEntity jukeboxblockentity = (JukeboxBlockEntity)blockentity; 101 + jukeboxblockentity.setFirstItem(itemstack.copyWithCount(1)); 102 + level.gameEvent(GameEvent.BLOCK_CHANGE, blockpos, GameEvent.Context.of(player, blockstate)); 103 + } 104 + 105 + itemstack.shrink(1); 106 + if (player != null) { 107 + player.awardStat(Stats.PLAY_RECORD); 108 + } 109 + } 110 + return InteractionResult.sidedSuccess(level.isClientSide); 111 + } else { 112 + return InteractionResult.PASS; 113 + } 114 + } 115 + *///?} else { 116 + public DiscItem(Properties properties) { 117 + super(properties); 118 + } 119 + 120 + @Override 121 + public void appendHoverText(ItemStack stack, TooltipContext context, 122 + //? if >1.21.2 { 123 + TooltipDisplay tooltipDisplay, Consumer<Component> tooltipAdder 124 + //?} else { 125 + /*List<Component> tooltip 126 + *///?} 127 + , TooltipFlag type) { 128 + //? if >1.21.2 { 129 + super.appendHoverText(stack, context, tooltipDisplay, tooltipAdder, type); 130 + //?} else { 131 + /*super.appendHoverText(stack, context, tooltip, type); 132 + Consumer<Component> tooltipAdder = tooltip::add; 133 + *///?} 134 + if (isBlank(stack)) { 135 + MutableComponent mutableText = Component.translatable(emptySubtitle).withStyle(ChatFormatting.GRAY); 136 + tooltipAdder.accept(mutableText); 137 + } 138 + } 139 + 140 + public static ItemStack getRandom(MinecraftServer server) { 141 + ItemStack stack = ModItems.DISC.get().getDefaultInstance(); 142 + ResourceLocation song = VersionMethods.id(InfinityMod.provider.randomName(InfinityMod.random, ConfigType.JUKEBOXES)); 143 + stack.applyComponents(DataComponentMap.builder() 144 + .set(DataComponents.JUKEBOX_PLAYABLE, new JukeboxPlayable(new EitherHolder<>( 145 + ResourceKey.create(Registries.JUKEBOX_SONG, song)) 146 + //? if <1.21.2 147 + /*, true*/ 148 + )) 149 + .set(ModComponentTypes.COLOR.get(), (int) InfinityMethods.getNumericFromId(song)).build()); 150 + return stack; 151 + } 152 + //?} 153 + public static boolean isBlank(ItemStack st) { 154 + //? if <1.21 { 155 + /*return !st.getOrCreateTag().contains("sound_id"); 156 + *///?} else { 157 + return !st.getComponents().has(DataComponents.JUKEBOX_PLAYABLE); 158 + //?} 159 + } 160 + 161 + @Override 162 + public 163 + //? if <1.21.5 { 164 + /*InteractionResultHolder<ItemStack> 165 + *///?} else { 166 + InteractionResult 167 + //?} 168 + use(Level world, Player player, InteractionHand hand) { 169 + ItemStack st = player.getItemInHand(hand); 170 + if (isBlank(st)) { 171 + player.setItemInHand(hand, st.copyWithCount(st.getCount() - 1)); 172 + if (!world.isClientSide()) { 173 + player.getInventory().add(getRandom(world.getServer())); 174 + } 175 + return VersionMethods.success(player.getItemInHand(hand)); 176 + } 177 + return VersionMethods.pass(st); 178 + } 179 + }
+4 -4
src/main/java/net/lerariemann/infinity/item/F4Item.java
··· 37 import net.minecraft.world.level.block.state.properties.BlockStateProperties; 38 import org.jetbrains.annotations.Nullable; 39 //? if neoforge { 40 - import javax.annotation.ParametersAreNonnullByDefault; 41 - //?} 42 import java.util.*; 43 import java.util.function.Consumer; 44 45 //? if neoforge { 46 - @ParametersAreNonnullByDefault 47 - //?} 48 @MethodsReturnNonnullByDefault 49 public class F4Item extends Item implements PortalDataHolder.Destinable { 50 static final BlockState OBSIDIAN = Blocks.OBSIDIAN.defaultBlockState();
··· 37 import net.minecraft.world.level.block.state.properties.BlockStateProperties; 38 import org.jetbrains.annotations.Nullable; 39 //? if neoforge { 40 + /*import javax.annotation.ParametersAreNonnullByDefault; 41 + *///?} 42 import java.util.*; 43 import java.util.function.Consumer; 44 45 //? if neoforge { 46 + /*@ParametersAreNonnullByDefault 47 + *///?} 48 @MethodsReturnNonnullByDefault 49 public class F4Item extends Item implements PortalDataHolder.Destinable { 50 static final BlockState OBSIDIAN = Blocks.OBSIDIAN.defaultBlockState();
+4 -4
src/main/java/net/lerariemann/infinity/item/StarOfLangItem.java
··· 11 } 12 13 //? if >1.21.2 && neoforge { 14 - @Override 15 public ItemStack getCraftingRemainder(ItemStack itemStack) { 16 return new ItemStack(ModItems.STAR_OF_LANG.get()); 17 } 18 - //?} 19 20 //? if neoforge && <1.21.2 { 21 /*@Override ··· 30 *///?} 31 32 //? if fabric { 33 - /*@Override 34 public ItemStack getRecipeRemainder(ItemStack stack) { 35 return ModItems.STAR_OF_LANG.get().getDefaultInstance(); 36 } 37 - *///?} 38 39 40 }
··· 11 } 12 13 //? if >1.21.2 && neoforge { 14 + /*@Override 15 public ItemStack getCraftingRemainder(ItemStack itemStack) { 16 return new ItemStack(ModItems.STAR_OF_LANG.get()); 17 } 18 + *///?} 19 20 //? if neoforge && <1.21.2 { 21 /*@Override ··· 30 *///?} 31 32 //? if fabric { 33 + @Override 34 public ItemStack getRecipeRemainder(ItemStack stack) { 35 return ModItems.STAR_OF_LANG.get().getDefaultInstance(); 36 } 37 + //?} 38 39 40 }
+4 -4
src/main/java/net/lerariemann/infinity/item/TransfiniteKeyItem.java
··· 30 import org.jetbrains.annotations.NotNull; 31 32 //? if neoforge { 33 - import javax.annotation.ParametersAreNonnullByDefault; 34 - //?} 35 import java.util.List; 36 import java.util.Objects; 37 import java.util.Optional; 38 import java.util.function.Consumer; 39 40 //? if neoforge { 41 - @ParametersAreNonnullByDefault 42 - //?} 43 public class TransfiniteKeyItem extends Item implements PortalDataHolder.Destinable { 44 public TransfiniteKeyItem(Properties settings) { 45 super(settings);
··· 30 import org.jetbrains.annotations.NotNull; 31 32 //? if neoforge { 33 + /*import javax.annotation.ParametersAreNonnullByDefault; 34 + *///?} 35 import java.util.List; 36 import java.util.Objects; 37 import java.util.Optional; 38 import java.util.function.Consumer; 39 40 //? if neoforge { 41 + /*@ParametersAreNonnullByDefault 42 + *///?} 43 public class TransfiniteKeyItem extends Item implements PortalDataHolder.Destinable { 44 public TransfiniteKeyItem(Properties settings) { 45 super(settings);
+3 -3
src/main/java/net/lerariemann/infinity/item/function/CollisionCraftingRecipe.java
··· 27 *///?} 28 import net.minecraft.world.level.Level; 29 30 - public abstract class CollisionCraftingRecipe implements Recipe 31 //? if >1.21 { 32 - <SingleRecipeInput> 33 //?} else { 34 - /*<ContainerSingleItem> 35 *///?} 36 { 37 //? if =1.20.1 {
··· 27 *///?} 28 import net.minecraft.world.level.Level; 29 30 + public abstract class CollisionCraftingRecipe 31 //? if >1.21 { 32 + implements Recipe<SingleRecipeInput> 33 //?} else { 34 + /*implements Recipe<ContainerSingleItem> 35 *///?} 36 { 37 //? if =1.20.1 {
+4 -4
src/main/java/net/lerariemann/infinity/mixin/InfinityMixinPlugin.java
··· 1 package net.lerariemann.infinity.mixin; 2 3 //? if fabric { 4 - /*import net.fabricmc.loader.api.FabricLoader; 5 - *///?} 6 import org.objectweb.asm.tree.ClassNode; 7 import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; 8 import org.spongepowered.asm.mixin.extensibility.IMixinInfo; ··· 23 @Override 24 public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { 25 //? if fabric { 26 - /*if (mixinClassName.contains("net.lerariemann.infinity.mixin.mavity") && (FabricLoader.getInstance().isModLoaded("gravity_changer_q") || FabricLoader.getInstance().isModLoaded("gravity_changer"))){ 27 return false; 28 } 29 - *///?} 30 return true; 31 } 32
··· 1 package net.lerariemann.infinity.mixin; 2 3 //? if fabric { 4 + import net.fabricmc.loader.api.FabricLoader; 5 + //?} 6 import org.objectweb.asm.tree.ClassNode; 7 import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; 8 import org.spongepowered.asm.mixin.extensibility.IMixinInfo; ··· 23 @Override 24 public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { 25 //? if fabric { 26 + if (mixinClassName.contains("net.lerariemann.infinity.mixin.mavity") && (FabricLoader.getInstance().isModLoaded("gravity_changer_q") || FabricLoader.getInstance().isModLoaded("gravity_changer"))){ 27 return false; 28 } 29 + //?} 30 return true; 31 } 32
+1 -1
src/main/java/net/lerariemann/infinity/mixin/core/AbstractFireBlockMixin.java
··· 12 public class AbstractFireBlockMixin { 13 /* Allows to light portals in infdims. */ 14 @Inject(method = "inPortalDimension(Lnet/minecraft/world/level/Level;)Z", at = @At("RETURN"), cancellable = true) 15 - private static void injected(Level world, CallbackInfoReturnable<Boolean> cir) { 16 cir.setReturnValue(cir.getReturnValue() || InfinityMethods.isInfinity(world)); 17 } 18 }
··· 12 public class AbstractFireBlockMixin { 13 /* Allows to light portals in infdims. */ 14 @Inject(method = "inPortalDimension(Lnet/minecraft/world/level/Level;)Z", at = @At("RETURN"), cancellable = true) 15 + private static void lightPortalsInInfDims(Level world, CallbackInfoReturnable<Boolean> cir) { 16 cir.setReturnValue(cir.getReturnValue() || InfinityMethods.isInfinity(world)); 17 } 18 }
+72 -29
src/main/java/net/lerariemann/infinity/mixin/core/MinecraftServerMixin.java
··· 6 /*import net.lerariemann.infinity.compat.GravityChangerCompat; 7 *///?} 8 import net.lerariemann.infinity.compat.ModCompat; 9 import net.lerariemann.infinity.util.platform.InfinityPlatform; 10 import net.lerariemann.infinity.access.MinecraftServerAccess; 11 import net.lerariemann.infinity.util.config.ConfigManager; ··· 15 import net.minecraft.server.MinecraftServer; 16 //? if >1.21 { 17 import net.minecraft.server.ServerInfo; 18 import net.minecraft.world.level.chunk.storage.ChunkIOErrorReporter; 19 - //?} 20 import net.minecraft.server.TickTask; 21 import net.minecraft.server.level.ServerLevel; 22 //? if <1.21.9 { ··· 26 import net.minecraft.util.thread.ReentrantBlockableEventLoop; 27 import net.minecraft.world.RandomSequences; 28 import net.minecraft.world.level.CustomSpawner; 29 - import net.minecraft.world.level.GameRules; 30 import net.minecraft.world.level.Level; 31 import net.minecraft.world.level.biome.BiomeManager; 32 import net.minecraft.world.level.border.BorderChangeListener; 33 import net.minecraft.world.level.dimension.LevelStem; 34 import net.minecraft.world.level.storage.LevelStorageSource; 35 import net.minecraft.world.level.storage.ServerLevelData; 36 import net.minecraft.world.level.storage.WorldData; ··· 45 46 import java.io.IOException; 47 import java.nio.file.Files; 48 import java.util.HashMap; 49 import java.util.List; 50 import java.util.Map; 51 import java.util.concurrent.Executor; 52 53 @Mixin(MinecraftServer.class) 54 public abstract class MinecraftServerMixin extends ReentrantBlockableEventLoop<TickTask> implements ··· 77 return null; 78 } 79 80 - @Shadow 81 - //? if >1.21.2 { 82 - public 83 - //?} else { 84 - /*protected 85 - *///?} 86 - TickTask wrapRunnable(Runnable runnable) { 87 - return null; 88 - } 89 90 - @Shadow public abstract RegistryAccess.Frozen registryAccess(); 91 92 @Unique 93 public Map<ResourceKey<Level>, ServerLevel> infinity$worldsToAdd; ··· 100 infinity$needsInvocation = !Files.exists(InfinityMod.invocationLock); 101 InfinityMod.LOGGER.info("Invocation {}", infinity$needsInvocation ? "needed..." : "not needed"); 102 if (!infinity$needsInvocation) infinity$setDimensionProvider(); 103 } 104 @Override 105 public boolean infinity$needsInvocation() {return infinity$needsInvocation;} ··· 120 InfinityMod.updateProvider((MinecraftServer)(Object)this); 121 } 122 123 - /* Ensure newly created dimensions are accessible, will tick, etc. */ 124 @Override 125 public void infinity$addWorld(ResourceKey<Level> key, LevelStem options) { 126 ServerLevelData serverWorldProperties = worldData.overworldData(); ··· 149 /*getLevel(Level.OVERWORLD).getWorldBorder().addListener(new BorderChangeListener.DelegateBorderChangeListener(world.getWorldBorder())); 150 *///?} 151 infinity$worldsToAdd.put(key, world); 152 - //? if >1.21.2 { 153 - doRunTask 154 - //?} else { 155 - /*tell 156 - *///?} 157 - (wrapRunnable(() -> { 158 - levels.put(key, world); 159 infinity$worldsToAdd.clear(); 160 - //? if <1.21.2 && fabric { 161 - /*if (ModCompat.GRAVITY_CHANGER) 162 - GravityChangerCompat.changeMavity(world); 163 - *///?} 164 - InfinityPlatform.INSTANCE.onWorldLoad(this, world); 165 - })); 166 } 167 168 @Override ··· 170 return (infinity$worldsToAdd.containsKey(key)); 171 } 172 173 - /* Makes weather properly work in infdims. */ 174 //? if >1.21.9 { 175 /*@Redirect(method="createLevels", at=@At(value="NEW", target="(Lnet/minecraft/server/MinecraftServer;Ljava/util/concurrent/Executor;Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess;Lnet/minecraft/world/level/storage/ServerLevelData;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;ZJLjava/util/List;ZLnet/minecraft/world/RandomSequences;)Lnet/minecraft/server/level/ServerLevel;")) 176 *///?} else { 177 @Redirect(method="createLevels", at=@At(value="NEW", target="(Lnet/minecraft/server/MinecraftServer;Ljava/util/concurrent/Executor;Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess;Lnet/minecraft/world/level/storage/ServerLevelData;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;Lnet/minecraft/server/level/progress/ChunkProgressListener;ZJLjava/util/List;ZLnet/minecraft/world/RandomSequences;)Lnet/minecraft/server/level/ServerLevel;")) 178 //?} 179 - 180 - public ServerLevel create(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey<Level> worldKey, LevelStem dimensionOptions, 181 //? if <1.21.9 182 ChunkProgressListener worldGenerationProgressListener, 183 boolean debugWorld, long seed, List<CustomSpawner> spawners, boolean shouldTickTime, RandomSequences randomSequencesState) { ··· 187 , worldGenerationProgressListener 188 , debugWorld, seed, spawners, shouldTickTime, randomSequencesState); 189 } 190 }
··· 6 /*import net.lerariemann.infinity.compat.GravityChangerCompat; 7 *///?} 8 import net.lerariemann.infinity.compat.ModCompat; 9 + import net.lerariemann.infinity.util.core.CommonIO; 10 import net.lerariemann.infinity.util.platform.InfinityPlatform; 11 import net.lerariemann.infinity.access.MinecraftServerAccess; 12 import net.lerariemann.infinity.util.config.ConfigManager; ··· 16 import net.minecraft.server.MinecraftServer; 17 //? if >1.21 { 18 import net.minecraft.server.ServerInfo; 19 + import net.minecraft.world.level.GameRules; 20 import net.minecraft.world.level.chunk.storage.ChunkIOErrorReporter; 21 + //?} else { 22 + /*import net.lerariemann.infinity.item.DiscItem; 23 + import net.minecraft.nbt.CompoundTag; 24 + import com.mojang.datafixers.util.Pair; 25 + *///?} 26 import net.minecraft.server.TickTask; 27 import net.minecraft.server.level.ServerLevel; 28 //? if <1.21.9 { ··· 32 import net.minecraft.util.thread.ReentrantBlockableEventLoop; 33 import net.minecraft.world.RandomSequences; 34 import net.minecraft.world.level.CustomSpawner; 35 import net.minecraft.world.level.Level; 36 import net.minecraft.world.level.biome.BiomeManager; 37 import net.minecraft.world.level.border.BorderChangeListener; 38 import net.minecraft.world.level.dimension.LevelStem; 39 + import net.minecraft.world.level.storage.LevelResource; 40 import net.minecraft.world.level.storage.LevelStorageSource; 41 import net.minecraft.world.level.storage.ServerLevelData; 42 import net.minecraft.world.level.storage.WorldData; ··· 51 52 import java.io.IOException; 53 import java.nio.file.Files; 54 + import java.nio.file.Path; 55 import java.util.HashMap; 56 import java.util.List; 57 import java.util.Map; 58 import java.util.concurrent.Executor; 59 + import java.util.function.BooleanSupplier; 60 61 @Mixin(MinecraftServer.class) 62 public abstract class MinecraftServerMixin extends ReentrantBlockableEventLoop<TickTask> implements ··· 85 return null; 86 } 87 88 + @Shadow public abstract RegistryAccess.Frozen registryAccess(); 89 90 + @Shadow public abstract Path getWorldPath(LevelResource levelResource); 91 92 @Unique 93 public Map<ResourceKey<Level>, ServerLevel> infinity$worldsToAdd; ··· 100 infinity$needsInvocation = !Files.exists(InfinityMod.invocationLock); 101 InfinityMod.LOGGER.info("Invocation {}", infinity$needsInvocation ? "needed..." : "not needed"); 102 if (!infinity$needsInvocation) infinity$setDimensionProvider(); 103 + //? if <1.21 { 104 + /*Path jukeboxesPath = getWorldPath(LevelResource.DATAPACK_DIR).resolve("server_sound_pack_data.json"); 105 + if (Files.exists(jukeboxesPath)) { 106 + infinity$setJukeboxDataMap(CommonIO.read(jukeboxesPath)); 107 + } 108 + else InfinityMod.LOGGER.info("Jukeboxes not found"); 109 + *///?} 110 } 111 @Override 112 public boolean infinity$needsInvocation() {return infinity$needsInvocation;} ··· 127 InfinityMod.updateProvider((MinecraftServer)(Object)this); 128 } 129 130 + /** Creates the body of the newly added dimension and schedules it to be loaded 131 + * (ensuring it will be accessible, tick, etc.) */ 132 @Override 133 public void infinity$addWorld(ResourceKey<Level> key, LevelStem options) { 134 ServerLevelData serverWorldProperties = worldData.overworldData(); ··· 157 /*getLevel(Level.OVERWORLD).getWorldBorder().addListener(new BorderChangeListener.DelegateBorderChangeListener(world.getWorldBorder())); 158 *///?} 159 infinity$worldsToAdd.put(key, world); 160 + } 161 + 162 + /** Loads the scheduled dimensions. */ 163 + @Inject(method="tickChildren", at=@At("TAIL")) 164 + void loadDimensions(BooleanSupplier hasTimeLeft, CallbackInfo ci) { 165 + if (!infinity$worldsToAdd.isEmpty()) { 166 + for (ResourceKey<Level> key: infinity$worldsToAdd.keySet()) { 167 + ServerLevel world = infinity$worldsToAdd.get(key); 168 + levels.put(key, world); 169 + //? if <1.21.2 && fabric { 170 + /*if (ModCompat.GRAVITY_CHANGER) 171 + GravityChangerCompat.changeMavity(world); 172 + *///?} 173 + InfinityPlatform.INSTANCE.onWorldLoad(this, world); 174 + } 175 infinity$worldsToAdd.clear(); 176 + } 177 } 178 179 @Override ··· 181 return (infinity$worldsToAdd.containsKey(key)); 182 } 183 184 + /** Makes weather properly work in infdims. */ 185 //? if >1.21.9 { 186 /*@Redirect(method="createLevels", at=@At(value="NEW", target="(Lnet/minecraft/server/MinecraftServer;Ljava/util/concurrent/Executor;Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess;Lnet/minecraft/world/level/storage/ServerLevelData;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;ZJLjava/util/List;ZLnet/minecraft/world/RandomSequences;)Lnet/minecraft/server/level/ServerLevel;")) 187 *///?} else { 188 @Redirect(method="createLevels", at=@At(value="NEW", target="(Lnet/minecraft/server/MinecraftServer;Ljava/util/concurrent/Executor;Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess;Lnet/minecraft/world/level/storage/ServerLevelData;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;Lnet/minecraft/server/level/progress/ChunkProgressListener;ZJLjava/util/List;ZLnet/minecraft/world/RandomSequences;)Lnet/minecraft/server/level/ServerLevel;")) 189 //?} 190 + public ServerLevel fixWeatherCreation(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey<Level> worldKey, LevelStem dimensionOptions, 191 //? if <1.21.9 192 ChunkProgressListener worldGenerationProgressListener, 193 boolean debugWorld, long seed, List<CustomSpawner> spawners, boolean shouldTickTime, RandomSequences randomSequencesState) { ··· 197 , worldGenerationProgressListener 198 , debugWorld, seed, spawners, shouldTickTime, randomSequencesState); 199 } 200 + 201 + //? if <1.21 { 202 + /*@Unique Map<String, Pair<String, Integer>> subtitleDurationMap = new HashMap<>(); 203 + 204 + public void infinity$setJukeboxDataMap(CompoundTag data) { 205 + subtitleDurationMap.clear(); 206 + int i = 0; 207 + for (String key : data.getAllKeys()) { 208 + CompoundTag jukebox = data.getCompound(key); 209 + subtitleDurationMap.put(jukebox.getString("sound_id"), Pair.of(jukebox.getString("sound_sub"), jukebox.getInt("sound_duration"))); 210 + i++; 211 + } 212 + InfinityMod.LOGGER.info("Loaded {} jukeboxes", i); 213 + } 214 + public boolean infinity$hasJukeboxes() { 215 + return !subtitleDurationMap.isEmpty(); 216 + } 217 + public String infinity$getRandomJukeboxId() { 218 + if (subtitleDurationMap.isEmpty()) return "empty"; 219 + List<String> lst = subtitleDurationMap.keySet().stream().toList(); 220 + return lst.get(InfinityMod.random.nextInt(lst.size())); 221 + } 222 + public String infinity$getJukeboxSubtitle(String id) { 223 + var v = subtitleDurationMap.get(id); 224 + if (v != null) return v.getFirst(); 225 + return DiscItem.emptySubtitle; 226 + } 227 + public int infinity$getJukeboxDuration(String id) { 228 + var v = subtitleDurationMap.get(id); 229 + if (v != null) return v.getSecond(); 230 + return DiscItem.defaultDuration; 231 + } 232 + *///?} 233 }
+4 -4
src/main/java/net/lerariemann/infinity/mixin/core/NetherPortalBlockMixin.java
··· 35 /* The root hook for "throw a book in the portal" logic. */ 36 @Inject(at = @At("HEAD"), method = "entityInside") 37 //? if >1.21.9 { 38 - /*private void injected(BlockState state, Level world, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean bl, CallbackInfo ci) { 39 *///?} else if >1.21.5 { 40 - private void injected(BlockState state, Level world, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, CallbackInfo ci) { 41 //?} else { 42 - /*private void injected(BlockState state, Level world, BlockPos pos, Entity entity, CallbackInfo info) { 43 *///?} 44 if (world instanceof ServerLevel w && entity instanceof ItemEntity e) { 45 PortalCreator.tryCreatePortalFromItem(w, pos, e); ··· 49 /* Allows infinity portals to consider themselves valid block configurations. */ 50 @Redirect(method="updateShape", 51 at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;is(Lnet/minecraft/world/level/block/Block;)Z")) 52 - private boolean injected(BlockState neighborState, Block block) { 53 return (neighborState.getBlock() instanceof NetherPortalBlock); 54 } 55
··· 35 /* The root hook for "throw a book in the portal" logic. */ 36 @Inject(at = @At("HEAD"), method = "entityInside") 37 //? if >1.21.9 { 38 + /*private void throwBookInPortal(BlockState state, Level world, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean bl, CallbackInfo ci) { 39 *///?} else if >1.21.5 { 40 + private void throwBookInPortal(BlockState state, Level world, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, CallbackInfo ci) { 41 //?} else { 42 + /*private void throwBookInPortal(BlockState state, Level world, BlockPos pos, Entity entity, CallbackInfo info) { 43 *///?} 44 if (world instanceof ServerLevel w && entity instanceof ItemEntity e) { 45 PortalCreator.tryCreatePortalFromItem(w, pos, e); ··· 49 /* Allows infinity portals to consider themselves valid block configurations. */ 50 @Redirect(method="updateShape", 51 at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;is(Lnet/minecraft/world/level/block/Block;)Z")) 52 + private boolean infinityPortalsAreValid(BlockState neighborState, Block block) { 53 return (neighborState.getBlock() instanceof NetherPortalBlock); 54 } 55
+1 -1
src/main/java/net/lerariemann/infinity/mixin/core/NetherPortalMixin.java
··· 12 public class NetherPortalMixin { 13 /* Allows infinity portals to consider themselves valid block configurations. */ 14 @Inject(method = "isEmpty(Lnet/minecraft/world/level/block/state/BlockState;)Z", at = @At("RETURN"), cancellable = true) 15 - private static void injected(BlockState state, CallbackInfoReturnable<Boolean> cir) { 16 cir.setReturnValue(cir.getReturnValue() || state.is(ModBlocks.PORTAL.get())); 17 } 18 }
··· 12 public class NetherPortalMixin { 13 /* Allows infinity portals to consider themselves valid block configurations. */ 14 @Inject(method = "isEmpty(Lnet/minecraft/world/level/block/state/BlockState;)Z", at = @At("RETURN"), cancellable = true) 15 + private static void infinityPortalsAreValid(BlockState state, CallbackInfoReturnable<Boolean> cir) { 16 cir.setReturnValue(cir.getReturnValue() || state.is(ModBlocks.PORTAL.get())); 17 } 18 }
+1 -1
src/main/java/net/lerariemann/infinity/mixin/core/PlayerMixin.java
··· 16 public class PlayerMixin { 17 //? if <1.21 { 18 /*@Inject(method = "findRespawnPositionAndUseSpawnBlock", at = @At("HEAD"), cancellable = true) 19 - private static void inj(ServerLevel serverLevel, BlockPos blockPos, float f, boolean bl, boolean bl2, CallbackInfoReturnable<Optional<Vec3>> cir) { 20 if (InfinityMethods.isTimebombed(serverLevel)) cir.setReturnValue(Optional.empty()); 21 } 22 *///?}
··· 16 public class PlayerMixin { 17 //? if <1.21 { 18 /*@Inject(method = "findRespawnPositionAndUseSpawnBlock", at = @At("HEAD"), cancellable = true) 19 + private static void doNotRespawnInTimebombedDimension(ServerLevel serverLevel, BlockPos blockPos, float f, boolean bl, boolean bl2, CallbackInfoReturnable<Optional<Vec3>> cir) { 20 if (InfinityMethods.isTimebombed(serverLevel)) cir.setReturnValue(Optional.empty()); 21 } 22 *///?}
+14 -15
src/main/java/net/lerariemann/infinity/mixin/core/ServerPlayerEntityMixin.java
··· 4 import net.lerariemann.infinity.access.Timebombable; 5 import net.lerariemann.infinity.access.ServerPlayerEntityAccess; 6 import net.lerariemann.infinity.options.InfinityOptions; 7 import net.lerariemann.infinity.util.teleport.WarpLogic; 8 import net.minecraft.core.BlockPos; 9 import net.minecraft.resources.ResourceLocation; ··· 13 import net.minecraft.world.entity.player.Player; 14 import net.minecraft.world.level.GameType; 15 import net.minecraft.world.level.Level; 16 - import net.lerariemann.infinity.registry.var.ModPayloads; 17 import org.spongepowered.asm.mixin.Mixin; 18 import org.spongepowered.asm.mixin.Shadow; 19 import org.spongepowered.asm.mixin.Unique; ··· 21 import org.spongepowered.asm.mixin.injection.Inject; 22 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 23 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 24 - //? if >1.21 { 25 26 import net.lerariemann.infinity.util.InfinityMethods; 27 import net.minecraft.world.entity.Entity; 28 - import net.minecraft.world.phys.Vec3; 29 - import org.jetbrains.annotations.Nullable; 30 //? if >1.21.3 { 31 import net.minecraft.world.level.portal.TeleportTransition; 32 //?} else if >1.21 { 33 - /*import net.minecraft.world.level.portal.DimensionTransition; 34 *///?} else { 35 /*import net.minecraft.world.level.portal.PortalInfo; 36 - *///?} 37 - //?} else { 38 - /*import net.minecraft.server.network.ServerGamePacketListenerImpl; 39 import net.minecraft.world.effect.MobEffectInstance; 40 import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; 41 import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; 42 *///?} 43 44 import java.util.Optional; 45 - import java.util.Set; 46 47 @Mixin(ServerPlayer.class) 48 public abstract class ServerPlayerEntityMixin extends Player implements ServerPlayerEntityAccess { ··· 77 78 @Inject(method="findRespawnAndUseSpawnBlock", at = @At("HEAD"), cancellable = true) 79 //? if >1.21.2 { 80 - private static void noRespawningInTimebombedDimensions(ServerLevel world, ServerPlayer.RespawnConfig respawnConfig, boolean useCharge, CallbackInfoReturnable<Optional<ServerPlayer.RespawnPosAngle>> cir) { 81 //?} else { 82 - /*private static void noRespawningInTimebombedDimensions(ServerLevel world, BlockPos pos, float angle, boolean forced, boolean alive, CallbackInfoReturnable<Optional<Vec3>> cir) { 83 *///?} 84 - if (InfinityMethods.isTimebombed(world)) cir.setReturnValue(Optional.empty()); 85 } 86 87 //? if >1.21.2 { ··· 110 lastSentFood = -1; 111 *///?} 112 ServerPlayer player = (ServerPlayer)(Object)this; 113 - ModPayloads.sendShaderPayload(player, targetWorld); 114 - ModPayloads.sendStarsPayload(player); 115 } 116 117 @Inject(method = "tick", at = @At("TAIL")) ··· 129 @Inject(method = "setGameMode", at = @At("RETURN")) 130 private void injected4(GameType gameMode, CallbackInfoReturnable<Boolean> cir) { 131 if (cir.getReturnValue()) { 132 - ModPayloads.sendShaderPayload((ServerPlayer)(Object)this); 133 } 134 } 135
··· 4 import net.lerariemann.infinity.access.Timebombable; 5 import net.lerariemann.infinity.access.ServerPlayerEntityAccess; 6 import net.lerariemann.infinity.options.InfinityOptions; 7 + import net.lerariemann.infinity.registry.payload.s2c.ShaderS2CPayload; 8 + import net.lerariemann.infinity.registry.payload.s2c.StarsS2CPayload; 9 import net.lerariemann.infinity.util.teleport.WarpLogic; 10 import net.minecraft.core.BlockPos; 11 import net.minecraft.resources.ResourceLocation; ··· 15 import net.minecraft.world.entity.player.Player; 16 import net.minecraft.world.level.GameType; 17 import net.minecraft.world.level.Level; 18 import org.spongepowered.asm.mixin.Mixin; 19 import org.spongepowered.asm.mixin.Shadow; 20 import org.spongepowered.asm.mixin.Unique; ··· 22 import org.spongepowered.asm.mixin.injection.Inject; 23 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 24 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 25 + //? if <1.21.2 { 26 + /*import net.minecraft.world.phys.Vec3; 27 + *///?} 28 29 import net.lerariemann.infinity.util.InfinityMethods; 30 import net.minecraft.world.entity.Entity; 31 //? if >1.21.3 { 32 import net.minecraft.world.level.portal.TeleportTransition; 33 //?} else if >1.21 { 34 + /*import org.jetbrains.annotations.Nullable; 35 + import net.minecraft.world.level.portal.DimensionTransition; 36 *///?} else { 37 /*import net.minecraft.world.level.portal.PortalInfo; 38 + import net.minecraft.server.network.ServerGamePacketListenerImpl; 39 import net.minecraft.world.effect.MobEffectInstance; 40 import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; 41 import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; 42 *///?} 43 44 import java.util.Optional; 45 46 @Mixin(ServerPlayer.class) 47 public abstract class ServerPlayerEntityMixin extends Player implements ServerPlayerEntityAccess { ··· 76 77 @Inject(method="findRespawnAndUseSpawnBlock", at = @At("HEAD"), cancellable = true) 78 //? if >1.21.2 { 79 + private static void noRespawningInTimebombedDimensions(ServerLevel level, ServerPlayer.RespawnConfig respawnConfig, boolean useCharge, CallbackInfoReturnable<Optional<ServerPlayer.RespawnPosAngle>> cir) { 80 //?} else { 81 + /*private static void noRespawningInTimebombedDimensions(ServerLevel level, BlockPos pos, float angle, boolean forced, boolean alive, CallbackInfoReturnable<Optional<Vec3>> cir) { 82 *///?} 83 + if (InfinityMethods.isTimebombed(level)) cir.setReturnValue(Optional.empty()); 84 } 85 86 //? if >1.21.2 { ··· 109 lastSentFood = -1; 110 *///?} 111 ServerPlayer player = (ServerPlayer)(Object)this; 112 + ShaderS2CPayload.sendTo(player, targetWorld); 113 + StarsS2CPayload.sendTo(player); 114 } 115 116 @Inject(method = "tick", at = @At("TAIL")) ··· 128 @Inject(method = "setGameMode", at = @At("RETURN")) 129 private void injected4(GameType gameMode, CallbackInfoReturnable<Boolean> cir) { 130 if (cir.getReturnValue()) { 131 + ShaderS2CPayload.sendTo((ServerPlayer)(Object)this); 132 } 133 } 134
+1 -1
src/main/java/net/lerariemann/infinity/mixin/fixes/ColllisionShapeMixin.java
··· 18 public class ColllisionShapeMixin { 19 @Inject(method = "getCollisionShape(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/shapes/CollisionContext;)Lnet/minecraft/world/phys/shapes/VoxelShape;", 20 at = @At("RETURN"), cancellable = true) 21 - private void inj(BlockGetter world, BlockPos pos, CollisionContext context, CallbackInfoReturnable<VoxelShape> cir) { 22 //? if >1.21.3 { 23 try { 24 //?}
··· 18 public class ColllisionShapeMixin { 19 @Inject(method = "getCollisionShape(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/shapes/CollisionContext;)Lnet/minecraft/world/phys/shapes/VoxelShape;", 20 at = @At("RETURN"), cancellable = true) 21 + private void antsStandOnWater(BlockGetter world, BlockPos pos, CollisionContext context, CallbackInfoReturnable<VoxelShape> cir) { 22 //? if >1.21.3 { 23 try { 24 //?}
+3 -3
src/main/java/net/lerariemann/infinity/mixin/fixes/EntityMixin.java
··· 67 68 /* (Neo)forge-exclusive mixins working around its code (which causes mobs to be unable to swim in iridescence) */ 69 @Inject(method="updateFluidHeightAndDoFluidPushing", at = @At(value = "RETURN"), cancellable = true) 70 - void inj(TagKey<Fluid> tag, double speed, CallbackInfoReturnable<Boolean> cir) { 71 if (tag.equals(FluidTags.WATER)) 72 if (InfinityPlatform.INSTANCE.acidTest((Entity)(Object)this, false)) 73 cir.setReturnValue(true); 74 } 75 76 @Inject(method = "isEyeInFluid", at = @At("RETURN"), cancellable = true) 77 - void inj(TagKey<Fluid> fluidTag, CallbackInfoReturnable<Boolean> cir) { 78 if (fluidTag.equals(FluidTags.WATER)) 79 if (InfinityPlatform.INSTANCE.acidTest((Entity)(Object)this, true)) 80 cir.setReturnValue(true); 81 } 82 83 @Inject(method = "getFluidHeight", at = @At("RETURN"), cancellable = true) 84 - void inj2(TagKey<Fluid> fluid, CallbackInfoReturnable<Double> cir) { 85 if (fluid.equals(FluidTags.WATER)) 86 cir.setReturnValue(Math.max(cir.getReturnValue(), InfinityPlatform.INSTANCE.acidHeightTest((Entity)(Object)this))); 87 }
··· 67 68 /* (Neo)forge-exclusive mixins working around its code (which causes mobs to be unable to swim in iridescence) */ 69 @Inject(method="updateFluidHeightAndDoFluidPushing", at = @At(value = "RETURN"), cancellable = true) 70 + void neoMobsSwim(TagKey<Fluid> tag, double speed, CallbackInfoReturnable<Boolean> cir) { 71 if (tag.equals(FluidTags.WATER)) 72 if (InfinityPlatform.INSTANCE.acidTest((Entity)(Object)this, false)) 73 cir.setReturnValue(true); 74 } 75 76 @Inject(method = "isEyeInFluid", at = @At("RETURN"), cancellable = true) 77 + void neoMobsSwim2(TagKey<Fluid> fluidTag, CallbackInfoReturnable<Boolean> cir) { 78 if (fluidTag.equals(FluidTags.WATER)) 79 if (InfinityPlatform.INSTANCE.acidTest((Entity)(Object)this, true)) 80 cir.setReturnValue(true); 81 } 82 83 @Inject(method = "getFluidHeight", at = @At("RETURN"), cancellable = true) 84 + void neoMobsSwim3(TagKey<Fluid> fluid, CallbackInfoReturnable<Double> cir) { 85 if (fluid.equals(FluidTags.WATER)) 86 cir.setReturnValue(Math.max(cir.getReturnValue(), InfinityPlatform.INSTANCE.acidHeightTest((Entity)(Object)this))); 87 }
+2 -2
src/main/java/net/lerariemann/infinity/mixin/fixes/PointOfInterestStorageMixin.java
··· 50 /* There's null-unsafe inner-minecraft code that can crash if we don't do this */ 51 //? if >1.21.9 { 52 /*@Inject(method = "add", at = @At("HEAD"), cancellable = true) 53 - void inj(BlockPos pos, Holder<PoiType> type, CallbackInfoReturnable<PoiRecord> cir) { 54 if (levelHeightAccessor.isOutsideBuildHeight(pos.getY())) cir.cancel(); 55 } 56 *///?} else { 57 @Inject(method = "add", at = @At("HEAD"), cancellable = true) 58 - void inj(BlockPos pos, Holder<PoiType> type, CallbackInfo ci) { 59 if (levelHeightAccessor.isOutsideBuildHeight(pos.getY())) ci.cancel(); 60 } 61 //?}
··· 50 /* There's null-unsafe inner-minecraft code that can crash if we don't do this */ 51 //? if >1.21.9 { 52 /*@Inject(method = "add", at = @At("HEAD"), cancellable = true) 53 + void makePoiNullSafe(BlockPos pos, Holder<PoiType> type, CallbackInfoReturnable<PoiRecord> cir) { 54 if (levelHeightAccessor.isOutsideBuildHeight(pos.getY())) cir.cancel(); 55 } 56 *///?} else { 57 @Inject(method = "add", at = @At("HEAD"), cancellable = true) 58 + void makePoiNullSafe(BlockPos pos, Holder<PoiType> type, CallbackInfo ci) { 59 if (levelHeightAccessor.isOutsideBuildHeight(pos.getY())) ci.cancel(); 60 } 61 //?}
+1 -1
src/main/java/net/lerariemann/infinity/mixin/iridescence/FluidBlockMixin.java
··· 14 @Mixin(LiquidBlock.class) 15 public class FluidBlockMixin { 16 @ModifyArg(method = "shouldSpreadLiquid", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;getFluidState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/material/FluidState;", ordinal = 0)) 17 - BlockPos inj(BlockPos original, @Local(argsOnly = true) Level world, @Local(argsOnly = true) BlockPos pos) { 18 FluidState st = world.getFluidState(original); 19 if (Iridescence.isIridescence(st) && !world.getFluidState(pos).isSource()) { 20 world.setBlockAndUpdate(pos, Iridescence.getRandomColorBlock(world, "glazed_terracotta").defaultBlockState());
··· 14 @Mixin(LiquidBlock.class) 15 public class FluidBlockMixin { 16 @ModifyArg(method = "shouldSpreadLiquid", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;getFluidState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/material/FluidState;", ordinal = 0)) 17 + BlockPos shouldSpreadIridesence(BlockPos original, @Local(argsOnly = true) Level world, @Local(argsOnly = true) BlockPos pos) { 18 FluidState st = world.getFluidState(original); 19 if (Iridescence.isIridescence(st) && !world.getFluidState(pos).isSource()) { 20 world.setBlockAndUpdate(pos, Iridescence.getRandomColorBlock(world, "glazed_terracotta").defaultBlockState());
+4 -4
src/main/java/net/lerariemann/infinity/mixin/iridescence/PostPassMixin.java
··· 55 *///?} 56 57 //? neoforge && >1.21.2 { 58 - @Inject(method = "lambda$addToFrame$5", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderPass;setVertexBuffer(ILcom/mojang/blaze3d/buffers/GpuBuffer;)V")) 59 private void inj(ResourceHandle resourcehandle, GpuBufferSlice projectionMatrixBuffer, Map targets, CallbackInfo ci, @Local RenderPass renderPass) { 60 if (infinity$is) IridescentUniform.trySet(renderPass); 61 } 62 - //?} else fabric && >1.21.2 { 63 - /*@Inject(method = "method_67884", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderPass;setVertexBuffer(ILcom/mojang/blaze3d/buffers/GpuBuffer;)V")) 64 private void inj(ResourceHandle resourcehandle, GpuBufferSlice projectionMatrixBuffer, Map targets, CallbackInfo ci, @Local RenderPass renderPass) { 65 if (infinity$is) IridescentUniform.trySet(renderPass); 66 } 67 - *///?} 68 }
··· 55 *///?} 56 57 //? neoforge && >1.21.2 { 58 + /*@Inject(method = "lambda$addToFrame$5", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderPass;setVertexBuffer(ILcom/mojang/blaze3d/buffers/GpuBuffer;)V")) 59 private void inj(ResourceHandle resourcehandle, GpuBufferSlice projectionMatrixBuffer, Map targets, CallbackInfo ci, @Local RenderPass renderPass) { 60 if (infinity$is) IridescentUniform.trySet(renderPass); 61 } 62 + *///?} else fabric && >1.21.2 { 63 + @Inject(method = "method_67884", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderPass;setVertexBuffer(ILcom/mojang/blaze3d/buffers/GpuBuffer;)V")) 64 private void inj(ResourceHandle resourcehandle, GpuBufferSlice projectionMatrixBuffer, Map targets, CallbackInfo ci, @Local RenderPass renderPass) { 65 if (infinity$is) IridescentUniform.trySet(renderPass); 66 } 67 + //?} 68 }
+1 -1
src/main/java/net/lerariemann/infinity/mixin/mavity/EntityMixin.java
··· 17 18 //? if >1.21 { 19 @Inject(method = "getGravity", at = @At("RETURN"), cancellable = true) 20 - private void injected(CallbackInfoReturnable<Double> cir) { 21 cir.setReturnValue(cir.getReturnValue() * getMavity(level)); 22 } 23 //?}
··· 17 18 //? if >1.21 { 19 @Inject(method = "getGravity", at = @At("RETURN"), cancellable = true) 20 + private void mavity(CallbackInfoReturnable<Double> cir) { 21 cir.setReturnValue(cir.getReturnValue() * getMavity(level)); 22 } 23 //?}
+2 -2
src/main/java/net/lerariemann/infinity/mixin/mavity/LivingEntityMixin.java
··· 21 22 //? if <1.21 { 23 /*@ModifyArg(method = "calculateFallDamage", at = @At(value="INVOKE", target="Lnet/minecraft/util/Mth;ceil(F)I")) 24 - float injected(float value) { 25 return (float)getMavity(this.level()) * value; 26 } 27 28 @ModifyConstant(method = "travel", constant = @Constant(doubleValue = 0.08)) 29 - double inj2(double value) { 30 return value*getMavity(this.level()); 31 } 32 *///?}
··· 21 22 //? if <1.21 { 23 /*@ModifyArg(method = "calculateFallDamage", at = @At(value="INVOKE", target="Lnet/minecraft/util/Mth;ceil(F)I")) 24 + float mavity(float value) { 25 return (float)getMavity(this.level()) * value; 26 } 27 28 @ModifyConstant(method = "travel", constant = @Constant(doubleValue = 0.08)) 29 + double mavity2(double value) { 30 return value*getMavity(this.level()); 31 } 32 *///?}
+1 -1
src/main/java/net/lerariemann/infinity/mixin/mavity/SeveralEntitiesMixin.java
··· 24 25 //? if <1.21 { 26 /*@ModifyArg(method = "tick", at = @At(value="INVOKE", target="Lnet/minecraft/world/phys/Vec3;add(DDD)Lnet/minecraft/world/phys/Vec3;"), index = 1) 27 - double injected(double x) { 28 return getMavity(this.level()) * x; 29 } 30 *///?}
··· 24 25 //? if <1.21 { 26 /*@ModifyArg(method = "tick", at = @At(value="INVOKE", target="Lnet/minecraft/world/phys/Vec3;add(DDD)Lnet/minecraft/world/phys/Vec3;"), index = 1) 27 + double mavity(double x) { 28 return getMavity(this.level()) * x; 29 } 30 *///?}
+2 -2
src/main/java/net/lerariemann/infinity/mixin/mobs/LivingEntityMixin.java
··· 39 40 //? if >1.21.2 { 41 @Inject(method = "onEffectsRemoved", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;refreshDirtyAttributes()V")) 42 - void inj(Collection<MobEffectInstance> effects, CallbackInfo ci) { 43 effects.forEach(effect-> { 44 if (VersionMethods.unholdEffect(effect.getEffect()) instanceof ModStatusEffects.SpecialEffect eff) { 45 eff.onRemoved((LivingEntity)(Object)this); ··· 52 /*@Inject(method = "onEffectRemoved", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;getAttributes()Lnet/minecraft/world/entity/ai/attributes/AttributeMap;")) 53 *///?} 54 //? if <1.21.2 { 55 - /*void inj(MobEffectInstance effect, CallbackInfo ci) { 56 if (VersionMethods.unholdEffect(effect.getEffect()) instanceof ModStatusEffects.SpecialEffect eff) { 57 eff.onRemoved((LivingEntity)(Object)this); 58 }
··· 39 40 //? if >1.21.2 { 41 @Inject(method = "onEffectsRemoved", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;refreshDirtyAttributes()V")) 42 + void removeSpecialEffects(Collection<MobEffectInstance> effects, CallbackInfo ci) { 43 effects.forEach(effect-> { 44 if (VersionMethods.unholdEffect(effect.getEffect()) instanceof ModStatusEffects.SpecialEffect eff) { 45 eff.onRemoved((LivingEntity)(Object)this); ··· 52 /*@Inject(method = "onEffectRemoved", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;getAttributes()Lnet/minecraft/world/entity/ai/attributes/AttributeMap;")) 53 *///?} 54 //? if <1.21.2 { 55 + /*void removeSpecialEffects(MobEffectInstance effect, CallbackInfo ci) { 56 if (VersionMethods.unholdEffect(effect.getEffect()) instanceof ModStatusEffects.SpecialEffect eff) { 57 eff.onRemoved((LivingEntity)(Object)this); 58 }
+1 -1
src/main/java/net/lerariemann/infinity/mixin/mobs/SheepEntityMixin.java
··· 78 //?} else { 79 /*@Inject(method = "finalizeSpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/animal/Sheep;setColor(Lnet/minecraft/world/item/DyeColor;)V", shift = At.Shift.AFTER)) 80 *///?} 81 - private void injected(ServerLevelAccessor world, DifficultyInstance difficulty, 82 //? if >1.21.2 { 83 net.minecraft.world.entity.EntitySpawnReason 84 //?} else {
··· 78 //?} else { 79 /*@Inject(method = "finalizeSpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/animal/Sheep;setColor(Lnet/minecraft/world/item/DyeColor;)V", shift = At.Shift.AFTER)) 80 *///?} 81 + private void customWool(ServerLevelAccessor world, DifficultyInstance difficulty, 82 //? if >1.21.2 { 83 net.minecraft.world.entity.EntitySpawnReason 84 //?} else {
+4 -4
src/main/java/net/lerariemann/infinity/mixin/mobs/SlimeEntityMixin.java
··· 14 public class SlimeEntityMixin { 15 /* Allows chaos slimes to correctly inherit their additional data when split. */ 16 //? if >1.21.2 && fabric { 17 - /*@Inject(method = "method_63653", at = @At(value = "RETURN")) 18 private void chaosSlimesSplit(int i, float f, float g, Slime instance, CallbackInfo ci) { 19 Slime e = ((Slime)(Object)(this)); 20 if (e instanceof ChaosSlime slime_mom) { ··· 23 slime_son.setColor(slime_mom.getEntityData().get(color)); 24 } 25 } 26 - *///?} else if >1.21.2 { 27 - @Inject(method = "lambda$remove$1", at = @At(value = "RETURN")) 28 private void chaosSlimesSplit(int i, float f, float g, Slime instance, CallbackInfo ci) { 29 Slime e = ((Slime)(Object)(this)); 30 if (e instanceof ChaosSlime slime_mom) { ··· 33 slime_son.setColor(slime_mom.getEntityData().get(color)); 34 } 35 } 36 - //?} else { 37 /*@Redirect(method = "remove(Lnet/minecraft/world/entity/Entity$RemovalReason;)V", at = @At(value = "INVOKE", 38 target = "Lnet/minecraft/world/entity/monster/Slime;setNoAi(Z)V")) 39 private void chaosSlimesSplit(Slime instance, boolean b) {
··· 14 public class SlimeEntityMixin { 15 /* Allows chaos slimes to correctly inherit their additional data when split. */ 16 //? if >1.21.2 && fabric { 17 + @Inject(method = "method_63653", at = @At(value = "RETURN")) 18 private void chaosSlimesSplit(int i, float f, float g, Slime instance, CallbackInfo ci) { 19 Slime e = ((Slime)(Object)(this)); 20 if (e instanceof ChaosSlime slime_mom) { ··· 23 slime_son.setColor(slime_mom.getEntityData().get(color)); 24 } 25 } 26 + //?} else if >1.21.2 { 27 + /*@Inject(method = "lambda$remove$1", at = @At(value = "RETURN")) 28 private void chaosSlimesSplit(int i, float f, float g, Slime instance, CallbackInfo ci) { 29 Slime e = ((Slime)(Object)(this)); 30 if (e instanceof ChaosSlime slime_mom) { ··· 33 slime_son.setColor(slime_mom.getEntityData().get(color)); 34 } 35 } 36 + *///?} else { 37 /*@Redirect(method = "remove(Lnet/minecraft/world/entity/Entity$RemovalReason;)V", at = @At(value = "INVOKE", 38 target = "Lnet/minecraft/world/entity/monster/Slime;setNoAi(Z)V")) 39 private void chaosSlimesSplit(Slime instance, boolean b) {
+1 -1
src/main/java/net/lerariemann/infinity/mixin/options/ClientWorldMixin.java
··· 35 *///?} 36 37 @Inject(method = "<init>", at = @At("TAIL")) 38 - private void injected(ClientPacketListener connection, ClientLevel.ClientLevelData levelData, ResourceKey dimension, Holder dimensionTypeRegistration, int viewDistance, int simulationDistance, 39 //? if >1.21.2 { 40 LevelRenderer levelRenderer, boolean isDebug, long biomeZoomSeed, int seaLevel, CallbackInfo ci) { 41 //?} else {
··· 35 *///?} 36 37 @Inject(method = "<init>", at = @At("TAIL")) 38 + private void setClientInfinityOptions(ClientPacketListener connection, ClientLevel.ClientLevelData levelData, ResourceKey dimension, Holder dimensionTypeRegistration, int viewDistance, int simulationDistance, 39 //? if >1.21.2 { 40 LevelRenderer levelRenderer, boolean isDebug, long biomeZoomSeed, int seaLevel, CallbackInfo ci) { 41 //?} else {
+1 -1
src/main/java/net/lerariemann/infinity/mixin/options/DimensionTypeMixin.java
··· 14 public InfinityOptions infinity$options; 15 16 @ModifyArg(method = "timeOfDay", at = @At(value="INVOKE", target="Lnet/minecraft/util/Mth;frac(D)D"), index = 0) 17 - private double injected(double value) { 18 try { 19 double timescale = infinity$getOptions().getTimeScale(); 20 return timescale*(value + 0.25) - 0.25;
··· 14 public InfinityOptions infinity$options; 15 16 @ModifyArg(method = "timeOfDay", at = @At(value="INVOKE", target="Lnet/minecraft/util/Mth;frac(D)D"), index = 0) 17 + private double customTimeOfDay(double value) { 18 try { 19 double timescale = infinity$getOptions().getTimeScale(); 20 return timescale*(value + 0.25) - 0.25;
+1 -1
src/main/java/net/lerariemann/infinity/mixin/options/FogRendererMixin.java
··· 24 public class FogRendererMixin { 25 @ModifyArg(method = "setupColor", at = @At(value = "INVOKE", target = "Lorg/joml/Vector3f;dot(Lorg/joml/Vector3fc;)F")) 26 *///?} 27 - private static Vector3fc inj(Vector3fc v, @Local(argsOnly = true, ordinal = 0) float partialTicks, @Local(argsOnly = true) ClientLevel level) { 28 float solarTilt = InfinityOptions.ofClient().getSolarTilt(); 29 if (solarTilt != -90.0F) { 30 boolean isSunset = Mth.sin(level.getSunAngle(partialTicks)) > 0.0F;
··· 24 public class FogRendererMixin { 25 @ModifyArg(method = "setupColor", at = @At(value = "INVOKE", target = "Lorg/joml/Vector3f;dot(Lorg/joml/Vector3fc;)F")) 26 *///?} 27 + private static Vector3fc customFog(Vector3fc v, @Local(argsOnly = true, ordinal = 0) float partialTicks, @Local(argsOnly = true) ClientLevel level) { 28 float solarTilt = InfinityOptions.ofClient().getSolarTilt(); 29 if (solarTilt != -90.0F) { 30 boolean isSunset = Mth.sin(level.getSunAngle(partialTicks)) > 0.0F;
+1 -1
src/main/java/net/lerariemann/infinity/mixin/options/MinecraftClientMixin.java
··· 25 public InfinityOptions infinity$options; 26 27 @Inject(method = "<init>", at = @At("TAIL")) 28 - private void injected(GameConfig args, CallbackInfo ci) { 29 infinity$options = InfinityOptions.empty(); 30 } 31
··· 25 public InfinityOptions infinity$options; 26 27 @Inject(method = "<init>", at = @At("TAIL")) 28 + private void resetOptions(GameConfig args, CallbackInfo ci) { 29 infinity$options = InfinityOptions.empty(); 30 } 31
+56
src/main/java/net/lerariemann/infinity/mixin/options/NoteBlockMixin.java
···
··· 1 + package net.lerariemann.infinity.mixin.options; 2 + 3 + import net.lerariemann.infinity.options.InfinityOptions; 4 + import net.minecraft.core.BlockPos; 5 + import net.minecraft.server.level.ServerLevel; 6 + import net.minecraft.world.entity.Entity; 7 + import net.minecraft.world.level.Level; 8 + import net.minecraft.world.level.block.Block; 9 + import net.minecraft.world.level.block.NoteBlock; 10 + import net.minecraft.world.level.block.state.BlockState; 11 + //? if >1.21.2 { 12 + import net.minecraft.world.level.redstone.Orientation; 13 + import net.minecraft.world.level.LevelReader; 14 + //?} 15 + import net.minecraft.world.level.LevelAccessor; 16 + import org.jetbrains.annotations.Nullable; 17 + import org.spongepowered.asm.mixin.Mixin; 18 + import org.spongepowered.asm.mixin.Shadow; 19 + import org.spongepowered.asm.mixin.injection.At; 20 + import org.spongepowered.asm.mixin.injection.Inject; 21 + import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 22 + import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 23 + 24 + @Mixin(NoteBlock.class) 25 + public abstract class NoteBlockMixin { 26 + @Shadow protected abstract void playNote(@Nullable Entity entity, BlockState state, Level level, BlockPos pos); 27 + 28 + @Inject(method = "neighborChanged", at = @At("HEAD"), cancellable = true) 29 + //? if >1.21.2 { 30 + void inj(BlockState state, Level level, BlockPos pos, Block neighborBlock, Orientation orientation, boolean movedByPiston, CallbackInfo ci) { 31 + //?} else { 32 + /*void inj(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving, CallbackInfo ci) { 33 + *///?} 34 + if (InfinityOptions.access(level).isHaunted()) { 35 + boolean bl = level.hasNeighborSignal(pos); 36 + if (bl != state.getValue(NoteBlock.POWERED)) { 37 + if (bl) { 38 + playNote(null, state, level, pos); 39 + } 40 + level.setBlock(pos, state.setValue(NoteBlock.POWERED, bl), 18, 0); 41 + } 42 + ci.cancel(); 43 + } 44 + } 45 + 46 + @Inject(method = "setInstrument", at = @At("HEAD"), cancellable = true) 47 + //? if >1.21.2 { 48 + void inj(LevelReader level, BlockPos pos, BlockState state, CallbackInfoReturnable<BlockState> cir) { 49 + //?} else { 50 + /*void inj(LevelAccessor level, BlockPos pos, BlockState state, CallbackInfoReturnable<BlockState> cir) { 51 + *///?} 52 + if (level instanceof ServerLevel world && InfinityOptions.access(world).isHaunted()) { 53 + cir.setReturnValue(state); 54 + } 55 + } 56 + }
+26 -12
src/main/java/net/lerariemann/infinity/mixin/options/PlayerManagerMixin.java
··· 3 import com.llamalad7.mixinextras.sugar.Local; 4 import net.lerariemann.infinity.InfinityMod; 5 import net.lerariemann.infinity.access.MinecraftServerAccess; 6 import net.lerariemann.infinity.util.config.ConfigGenInvocation; 7 import net.lerariemann.infinity.util.core.CommonIO; 8 import net.lerariemann.infinity.util.core.RandomProvider; 9 import net.lerariemann.infinity.util.teleport.WarpLogic; 10 - import net.lerariemann.infinity.registry.var.ModPayloads; 11 import net.minecraft.core.LayeredRegistryAccess; 12 import net.minecraft.network.Connection; 13 import net.minecraft.server.MinecraftServer; 14 import net.minecraft.server.RegistryLayer; ··· 49 @Inject(method="placeNewPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;overworld()Lnet/minecraft/server/level/ServerLevel;")) 50 //?} 51 //? if >1.21 { 52 - void inj(Connection connection, ServerPlayer player, CommonListenerCookie clientData, CallbackInfo ci) { 53 //?} else { 54 /*void inj(Connection connection, ServerPlayer player, CallbackInfo ci) { 55 *///?} ··· 58 59 @Inject(method="placeNewPlayer", at = @At(value = "TAIL")) 60 //? if >1.21 { 61 - void inj2(Connection connection, ServerPlayer player, CommonListenerCookie clientData, CallbackInfo ci) { 62 //?} else { 63 /*void inj2(Connection connection, ServerPlayer player, CallbackInfo ci) { 64 *///?} ··· 72 @Inject(method = "placeNewPlayer", at = @At(value="INVOKE", 73 target = "Lnet/minecraft/server/players/PlayerList;sendPlayerPermissionLevel(Lnet/minecraft/server/level/ServerPlayer;)V")) 74 //? if >1.21 { 75 - private void injected(Connection connection, ServerPlayer player, CommonListenerCookie clientData, CallbackInfo ci, @Local(ordinal=0) ServerLevel serverWorld2) { 76 //?} else { 77 /*private void injected(Connection connection, ServerPlayer player, CallbackInfo ci, @Local(ordinal=0) ServerLevel serverWorld2) { 78 *///?} 79 if (serverWorld2 == null) return; 80 - ModPayloads.sendShaderPayload(player, serverWorld2); 81 - ModPayloads.sendStarsPayload(player); 82 MinecraftServerAccess acc = ((MinecraftServerAccess)(serverWorld2.getServer())); 83 if (acc.infinity$needsInvocation()) { 84 ConfigGenInvocation.invokeOn(player); 85 } 86 - InfinityMod.LOGGER.info("Sending sound pack to client"); 87 - if (RandomProvider.rule("useSoundSyncPackets")) new ModPayloads.SoundPackS2CPayload(CommonIO.read( 88 - player.level().getServer().getWorldPath(LevelResource.DATAPACK_DIR).resolve("client_sound_pack_data.json"))).send(player); 89 } 90 91 @Inject(method="sendLevelInfo", at = @At("TAIL")) 92 - private void injected2(ServerPlayer player, ServerLevel world, CallbackInfo ci) { 93 - ModPayloads.sendShaderPayload(player, world); 94 - ModPayloads.sendStarsPayload(player); 95 } 96 }
··· 3 import com.llamalad7.mixinextras.sugar.Local; 4 import net.lerariemann.infinity.InfinityMod; 5 import net.lerariemann.infinity.access.MinecraftServerAccess; 6 + import net.lerariemann.infinity.registry.payload.s2c.ShaderS2CPayload; 7 + import net.lerariemann.infinity.registry.payload.s2c.SoundPackS2CPayload; 8 + import net.lerariemann.infinity.registry.payload.s2c.StarsS2CPayload; 9 import net.lerariemann.infinity.util.config.ConfigGenInvocation; 10 import net.lerariemann.infinity.util.core.CommonIO; 11 import net.lerariemann.infinity.util.core.RandomProvider; 12 import net.lerariemann.infinity.util.teleport.WarpLogic; 13 import net.minecraft.core.LayeredRegistryAccess; 14 + //? if <1.21 { 15 + /*import net.minecraft.nbt.CompoundTag; 16 + *///?} 17 import net.minecraft.network.Connection; 18 import net.minecraft.server.MinecraftServer; 19 import net.minecraft.server.RegistryLayer; ··· 54 @Inject(method="placeNewPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;overworld()Lnet/minecraft/server/level/ServerLevel;")) 55 //?} 56 //? if >1.21 { 57 + void checkNeedsTpOut(Connection connection, ServerPlayer player, CommonListenerCookie clientData, CallbackInfo ci) { 58 //?} else { 59 /*void inj(Connection connection, ServerPlayer player, CallbackInfo ci) { 60 *///?} ··· 63 64 @Inject(method="placeNewPlayer", at = @At(value = "TAIL")) 65 //? if >1.21 { 66 + void tpOut(Connection connection, ServerPlayer player, CommonListenerCookie clientData, CallbackInfo ci) { 67 //?} else { 68 /*void inj2(Connection connection, ServerPlayer player, CallbackInfo ci) { 69 *///?} ··· 77 @Inject(method = "placeNewPlayer", at = @At(value="INVOKE", 78 target = "Lnet/minecraft/server/players/PlayerList;sendPlayerPermissionLevel(Lnet/minecraft/server/level/ServerPlayer;)V")) 79 //? if >1.21 { 80 + private void updatePlayer(Connection connection, ServerPlayer player, CommonListenerCookie clientData, CallbackInfo ci, @Local(ordinal=0) ServerLevel serverWorld2) { 81 //?} else { 82 /*private void injected(Connection connection, ServerPlayer player, CallbackInfo ci, @Local(ordinal=0) ServerLevel serverWorld2) { 83 *///?} 84 if (serverWorld2 == null) return; 85 + ShaderS2CPayload.sendTo(player, serverWorld2); 86 + StarsS2CPayload.sendTo(player); 87 MinecraftServerAccess acc = ((MinecraftServerAccess)(serverWorld2.getServer())); 88 if (acc.infinity$needsInvocation()) { 89 ConfigGenInvocation.invokeOn(player); 90 } 91 + if (RandomProvider.rule("useSoundSyncPackets")) { 92 + //? if <1.21 { 93 + /*if (!acc.infinity$hasJukeboxes()) { 94 + new SoundPackS2CPayload(new CompoundTag()).send(player); 95 + InfinityMod.LOGGER.info("Requesting sound pack from client"); 96 + return; 97 + } 98 + *///?} 99 + InfinityMod.LOGGER.info("Sending sound pack to client"); 100 + new SoundPackS2CPayload(CommonIO.read( 101 + player.level().getServer().getWorldPath(LevelResource.DATAPACK_DIR).resolve("client_sound_pack_data.json"))).send(player); 102 + } 103 } 104 105 @Inject(method="sendLevelInfo", at = @At("TAIL")) 106 + private void sendInfinityLevelInfo(ServerPlayer player, ServerLevel world, CallbackInfo ci) { 107 + ShaderS2CPayload.sendTo(player, world); 108 + StarsS2CPayload.sendTo(player); 109 } 110 }
+39 -14
src/main/java/net/lerariemann/infinity/mixin/options/ServerWorldMixin.java
··· 2 3 import com.llamalad7.mixinextras.injector.ModifyExpressionValue; 4 import com.llamalad7.mixinextras.sugar.Local; 5 import net.lerariemann.infinity.access.InfinityOptionsAccess; 6 import net.lerariemann.infinity.access.Timebombable; 7 import net.lerariemann.infinity.options.InfinityOptions; 8 - import net.lerariemann.infinity.registry.core.ModBlocks; 9 import net.lerariemann.infinity.util.InfinityMethods; 10 import net.minecraft.core.BlockPos; 11 import net.minecraft.core.Holder; 12 import net.minecraft.core.RegistryAccess; 13 import net.minecraft.resources.ResourceKey; ··· 16 //? if <1.21.9 { 17 import net.minecraft.server.level.progress.ChunkProgressListener; 18 //?} 19 - import net.minecraft.util.profiling.ProfilerFiller; 20 import net.minecraft.world.RandomSequences; 21 import net.minecraft.world.level.CustomSpawner; 22 import net.minecraft.world.level.Level; 23 import net.minecraft.world.level.WorldGenLevel; 24 import net.minecraft.world.level.block.state.BlockState; 25 - import net.minecraft.world.level.block.state.properties.BlockStateProperties; 26 import net.minecraft.world.level.chunk.LevelChunk; 27 import net.minecraft.world.level.chunk.LevelChunkSection; 28 import net.minecraft.world.level.dimension.DimensionType; ··· 32 import net.minecraft.world.level.storage.ServerLevelData; 33 import net.minecraft.world.level.storage.WritableLevelData; 34 import org.spongepowered.asm.mixin.Mixin; 35 import org.spongepowered.asm.mixin.Unique; 36 import org.spongepowered.asm.mixin.injection.At; 37 import org.spongepowered.asm.mixin.injection.Inject; ··· 40 import java.util.List; 41 import java.util.concurrent.Executor; 42 import java.util.function.BooleanSupplier; 43 - import java.util.function.Supplier; 44 45 @Mixin(ServerLevel.class) 46 - public abstract class ServerWorldMixin extends Level implements WorldGenLevel, InfinityOptionsAccess, Timebombable { 47 @Unique 48 public InfinityOptions infinity$options; 49 @Unique ··· 62 63 @Inject(method = "<init>", at = @At("TAIL")) 64 //? if >1.21.9 { 65 - /*private void injected(MinecraftServer server, Executor dispatcher, LevelStorageSource.LevelStorageAccess storageSource, ServerLevelData levelData, ResourceKey<Level> worldKey, LevelStem levelStem, boolean isDebug, long biomeZoomSeed, List customSpawners, boolean tickTime, RandomSequences randomSequences, CallbackInfo ci) { 66 *///?} else { 67 - private void injected(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey<Level> worldKey, LevelStem dimensionOptions, ChunkProgressListener worldGenerationProgressListener, boolean debugWorld, long seed, List<CustomSpawner> spawners, boolean shouldTickTime, RandomSequences randomSequencesState, CallbackInfo ci) { 68 //?} 69 infinity$options = InfinityOptions.generate(server, worldKey.location()); 70 DimensionType t = dimensionType(); ··· 73 } 74 75 @Inject(method = "tick", at = @At("TAIL")) 76 - private void injected2(BooleanSupplier shouldKeepTicking, CallbackInfo ci) { 77 if (InfinityMethods.isInfinity(dimension()) && infinity$timebombProgress > 0) infinity$timebombProgress++; 78 } 79 ··· 92 93 @Inject(method = "tickChunk", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/material/FluidState;isRandomlyTicking()Z")) 94 void inj(LevelChunk chunk, int randomTickSpeed, CallbackInfo ci, @Local BlockState bs, @Local BlockPos blockPos2, @Local FluidState fs) { 95 - if (infinity$options.isHaunted() && random.nextInt(200) < (int)(Math.floor(getMoonBrightness() * 4))) { 96 - if (bs.isAir()) { 97 - setBlockAndUpdate(blockPos2, ModBlocks.HAUNTED_AIR.get().defaultBlockState()); 98 - } 99 - else if (bs.hasProperty(BlockStateProperties.NOTE)) { 100 - setBlockAndUpdate(blockPos2, bs.setValue(BlockStateProperties.NOTE, random.nextInt(24))); 101 } 102 } 103 } 104 105 @Override
··· 2 3 import com.llamalad7.mixinextras.injector.ModifyExpressionValue; 4 import com.llamalad7.mixinextras.sugar.Local; 5 + import net.lerariemann.infinity.InfinityMod; 6 import net.lerariemann.infinity.access.InfinityOptionsAccess; 7 import net.lerariemann.infinity.access.Timebombable; 8 import net.lerariemann.infinity.options.InfinityOptions; 9 import net.lerariemann.infinity.util.InfinityMethods; 10 import net.minecraft.core.BlockPos; 11 + import net.minecraft.core.Direction; 12 import net.minecraft.core.Holder; 13 import net.minecraft.core.RegistryAccess; 14 import net.minecraft.resources.ResourceKey; ··· 17 //? if <1.21.9 { 18 import net.minecraft.server.level.progress.ChunkProgressListener; 19 //?} 20 + //? if <1.21.2 21 + /*import net.minecraft.util.profiling.ProfilerFiller;*/ 22 + import java.util.function.Supplier; 23 + 24 + import net.minecraft.util.Mth; 25 import net.minecraft.world.RandomSequences; 26 import net.minecraft.world.level.CustomSpawner; 27 import net.minecraft.world.level.Level; 28 + import net.minecraft.world.level.SignalGetter; 29 import net.minecraft.world.level.WorldGenLevel; 30 + import net.minecraft.world.level.block.Block; 31 import net.minecraft.world.level.block.state.BlockState; 32 import net.minecraft.world.level.chunk.LevelChunk; 33 import net.minecraft.world.level.chunk.LevelChunkSection; 34 import net.minecraft.world.level.dimension.DimensionType; ··· 38 import net.minecraft.world.level.storage.ServerLevelData; 39 import net.minecraft.world.level.storage.WritableLevelData; 40 import org.spongepowered.asm.mixin.Mixin; 41 + import org.spongepowered.asm.mixin.Shadow; 42 import org.spongepowered.asm.mixin.Unique; 43 import org.spongepowered.asm.mixin.injection.At; 44 import org.spongepowered.asm.mixin.injection.Inject; ··· 47 import java.util.List; 48 import java.util.concurrent.Executor; 49 import java.util.function.BooleanSupplier; 50 51 @Mixin(ServerLevel.class) 52 + public abstract class ServerWorldMixin extends Level implements WorldGenLevel, InfinityOptionsAccess, Timebombable, SignalGetter { 53 + @Shadow public abstract void updateNeighborsAt(BlockPos pos, Block block); 54 + 55 @Unique 56 public InfinityOptions infinity$options; 57 @Unique ··· 70 71 @Inject(method = "<init>", at = @At("TAIL")) 72 //? if >1.21.9 { 73 + /*private void timebomb(MinecraftServer server, Executor dispatcher, LevelStorageSource.LevelStorageAccess storageSource, ServerLevelData levelData, ResourceKey<Level> worldKey, LevelStem levelStem, boolean isDebug, long biomeZoomSeed, List customSpawners, boolean tickTime, RandomSequences randomSequences, CallbackInfo ci) { 74 *///?} else { 75 + private void timebomb(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey<Level> worldKey, LevelStem dimensionOptions, ChunkProgressListener worldGenerationProgressListener, boolean debugWorld, long seed, List<CustomSpawner> spawners, boolean shouldTickTime, RandomSequences randomSequencesState, CallbackInfo ci) { 76 //?} 77 infinity$options = InfinityOptions.generate(server, worldKey.location()); 78 DimensionType t = dimensionType(); ··· 81 } 82 83 @Inject(method = "tick", at = @At("TAIL")) 84 + private void addTimebombProgress(BooleanSupplier shouldKeepTicking, CallbackInfo ci) { 85 if (InfinityMethods.isInfinity(dimension()) && infinity$timebombProgress > 0) infinity$timebombProgress++; 86 } 87 ··· 100 101 @Inject(method = "tickChunk", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/material/FluidState;isRandomlyTicking()Z")) 102 void inj(LevelChunk chunk, int randomTickSpeed, CallbackInfo ci, @Local BlockState bs, @Local BlockPos blockPos2, @Local FluidState fs) { 103 + if (infinity$options.isHaunted() && random.nextInt(50) < (int)(Math.floor(getMoonBrightness() * 4))) { 104 + Direction direction = Direction.values()[InfinityMod.random.nextInt(6)]; 105 + //? if <1.21.2 { 106 + /*neighborUpdater.neighborChanged(blockPos2.relative(direction), bs.getBlock(), blockPos2); 107 + *///?} else { 108 + neighborUpdater.neighborChanged(blockPos2.relative(direction), bs.getBlock(), null); 109 + //?} 110 + } 111 + } 112 + 113 + @Override 114 + public int getSignal(BlockPos pos, Direction direction) { 115 + if (infinity$options.isHaunted()) { 116 + BlockPos p = pos.relative(direction, 1319); 117 + long L = Mth.getSeed(p.getX(), p.getY(), p.getZ()); 118 + double d = (L & 0xFFFL) / (double)0xFFFL; 119 + d += ((long)(getGameTime() * getMoonBrightness()) & 0xFFFL) / (double)0xFFFL; //pseudorandom on x y z, periodic on t 120 + d = d - Math.floor(d); 121 + if (d > 0.5f && d < 0.6f) { 122 + return Mth.clamp((int)((d - 0.5f)*160f), 0, 15); 123 } 124 } 125 + BlockState blockState = this.getBlockState(pos); 126 + int i = blockState.getSignal(this, pos, direction); 127 + return blockState.isRedstoneConductor(this, pos) ? Math.max(i, this.getDirectSignalTo(pos)) : i; 128 } 129 130 @Override
+1 -1
src/main/java/net/lerariemann/infinity/mixin/options/SoundSystemMixin.java
··· 9 @Mixin(SoundEngine.class) 10 public class SoundSystemMixin { 11 @ModifyExpressionValue(method = "calculatePitch", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/sounds/SoundInstance;getPitch()F")) 12 - float inj(float original) { 13 InfinityOptions options = InfinityOptions.ofClient(); 14 return (!options.isEmpty()) ? options.getSoundPitch().apply(original) : original; 15 }
··· 9 @Mixin(SoundEngine.class) 10 public class SoundSystemMixin { 11 @ModifyExpressionValue(method = "calculatePitch", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/sounds/SoundInstance;getPitch()F")) 12 + float customPitch(float original) { 13 InfinityOptions options = InfinityOptions.ofClient(); 14 return (!options.isEmpty()) ? options.getSoundPitch().apply(original) : original; 15 }
+48 -15
src/main/java/net/lerariemann/infinity/mixin/options/WorldRendererMixin.java
··· 6 import org.spongepowered.asm.mixin.injection.ModifyConstant; 7 import net.lerariemann.infinity.util.InfinityMethods; 8 *///?} else { 9 - 10 import com.mojang.blaze3d.buffers.GpuBufferSlice; 11 import com.mojang.blaze3d.framegraph.FrameGraphBuilder; 12 import com.mojang.blaze3d.framegraph.FramePass; ··· 24 import net.minecraft.client.Camera; 25 //? if >1.21 { 26 import net.minecraft.client.renderer.*; 27 - //?} 28 import net.minecraft.client.Minecraft; 29 import net.minecraft.client.multiplayer.ClientLevel; 30 //? if >1.21.2 && neoforge { 31 - import net.neoforged.neoforge.client.IRenderableSection; 32 import net.neoforged.neoforge.client.event.RenderLevelStageEvent; 33 import net.neoforged.neoforge.common.NeoForge; 34 - //?} 35 import net.minecraft.client.renderer.LevelRenderer; 36 import org.joml.Matrix4f; 37 import org.spongepowered.asm.mixin.Final; ··· 41 import org.spongepowered.asm.mixin.injection.At; 42 import org.spongepowered.asm.mixin.injection.Inject; 43 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 44 45 @Mixin(LevelRenderer.class) 46 public abstract class WorldRendererMixin implements WorldRendererAccess { ··· 132 @Shadow @Final private RenderBuffers renderBuffers; 133 //?} 134 //? if >1.21.2 && neoforge { 135 - @Shadow public abstract Frustum getFrustum(); 136 @Shadow public abstract Iterable<? extends IRenderableSection> getRenderableSections(); 137 - //?} 138 //? if >1.21.2 { 139 @Unique SkyRenderer infinity$sky; 140 @Inject(method = "<init>", at = @At("TAIL")) 141 - void inj(Minecraft minecraft, EntityRenderDispatcher entityRenderDispatcher, BlockEntityRenderDispatcher blockEntityRenderDispatcher, RenderBuffers renderBuffers, CallbackInfo ci) { 142 if (this.level != null) infinity$sky = new SkyRenderer(infinity$options(), this.level); 143 } 144 //?} 145 //? if >1.21.2 && neoforge { 146 - @Inject(method = "addSkyPass(Lcom/mojang/blaze3d/framegraph/FrameGraphBuilder;Lnet/minecraft/client/Camera;FLcom/mojang/blaze3d/buffers/GpuBufferSlice;Lorg/joml/Matrix4f;)V", at = @At("HEAD"), cancellable = true) 147 void inj(FrameGraphBuilder frameGraphBuilder, Camera camera, float partialTick, GpuBufferSlice shaderFog, Matrix4f modelViewMatrix, CallbackInfo ci) { 148 - //?} 149 //? if >1.21.2 && fabric { 150 - /*@Inject(method = "Lnet/minecraft/client/renderer/LevelRenderer;addSkyPass(Lcom/mojang/blaze3d/framegraph/FrameGraphBuilder;Lnet/minecraft/client/Camera;FLcom/mojang/blaze3d/buffers/GpuBufferSlice;)V", at = @At("HEAD"), cancellable = true) 151 void inj(FrameGraphBuilder frameGraphBuilder, Camera camera, float partialTick, GpuBufferSlice shaderFog, CallbackInfo ci) { 152 - *///?} 153 //? if >1.21.2 { 154 155 InfinityOptions options = infinity$options(); ··· 167 //?} 168 //? if >1.21.2 && neoforge { 169 170 - if (!this.level.effects().renderSky(this.level, ticks, partialTick, modelViewMatrix, camera, 171 () -> RenderSystem.setShaderFog(shaderFog))) { 172 - //?} 173 //? if >1.21.2 { 174 175 RenderSystem.setShaderFog(shaderFog); ··· 177 //?} 178 //? if >1.21.2 && neoforge { 179 180 - Profiler.get().push("neoforge_render_after_sky"); 181 NeoForge.EVENT_BUS.post(new RenderLevelStageEvent.AfterSky(this.level, (LevelRenderer)(Object)this, (PoseStack)null, modelViewMatrix, this.ticks, this.minecraft.getDeltaTracker(), camera, this.getFrustum(), this.getRenderableSections())); 182 Profiler.get().pop(); 183 } 184 - //?} 185 //? if >1.21.2 { 186 187 }); ··· 191 } 192 } 193 //?} 194 }
··· 6 import org.spongepowered.asm.mixin.injection.ModifyConstant; 7 import net.lerariemann.infinity.util.InfinityMethods; 8 *///?} else { 9 import com.mojang.blaze3d.buffers.GpuBufferSlice; 10 import com.mojang.blaze3d.framegraph.FrameGraphBuilder; 11 import com.mojang.blaze3d.framegraph.FramePass; ··· 23 import net.minecraft.client.Camera; 24 //? if >1.21 { 25 import net.minecraft.client.renderer.*; 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 import net.minecraft.client.Minecraft; 37 import net.minecraft.client.multiplayer.ClientLevel; 38 //? if >1.21.2 && neoforge { 39 + /*import net.neoforged.neoforge.client.IRenderableSection; 40 import net.neoforged.neoforge.client.event.RenderLevelStageEvent; 41 import net.neoforged.neoforge.common.NeoForge; 42 + *///?} 43 import net.minecraft.client.renderer.LevelRenderer; 44 import org.joml.Matrix4f; 45 import org.spongepowered.asm.mixin.Final; ··· 49 import org.spongepowered.asm.mixin.injection.At; 50 import org.spongepowered.asm.mixin.injection.Inject; 51 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 52 + 53 + import java.util.Map; 54 55 @Mixin(LevelRenderer.class) 56 public abstract class WorldRendererMixin implements WorldRendererAccess { ··· 142 @Shadow @Final private RenderBuffers renderBuffers; 143 //?} 144 //? if >1.21.2 && neoforge { 145 + /*@Shadow public abstract Frustum getFrustum(); 146 @Shadow public abstract Iterable<? extends IRenderableSection> getRenderableSections(); 147 + *///?} 148 //? if >1.21.2 { 149 @Unique SkyRenderer infinity$sky; 150 @Inject(method = "<init>", at = @At("TAIL")) 151 + void customSky(Minecraft minecraft, EntityRenderDispatcher entityRenderDispatcher, BlockEntityRenderDispatcher blockEntityRenderDispatcher, RenderBuffers renderBuffers, CallbackInfo ci) { 152 if (this.level != null) infinity$sky = new SkyRenderer(infinity$options(), this.level); 153 } 154 //?} 155 //? if >1.21.2 && neoforge { 156 + /*@Inject(method = "addSkyPass(Lcom/mojang/blaze3d/framegraph/FrameGraphBuilder;Lnet/minecraft/client/Camera;FLcom/mojang/blaze3d/buffers/GpuBufferSlice;Lorg/joml/Matrix4f;)V", at = @At("HEAD"), cancellable = true) 157 void inj(FrameGraphBuilder frameGraphBuilder, Camera camera, float partialTick, GpuBufferSlice shaderFog, Matrix4f modelViewMatrix, CallbackInfo ci) { 158 + *///?} 159 //? if >1.21.2 && fabric { 160 + @Inject(method = "Lnet/minecraft/client/renderer/LevelRenderer;addSkyPass(Lcom/mojang/blaze3d/framegraph/FrameGraphBuilder;Lnet/minecraft/client/Camera;FLcom/mojang/blaze3d/buffers/GpuBufferSlice;)V", at = @At("HEAD"), cancellable = true) 161 void inj(FrameGraphBuilder frameGraphBuilder, Camera camera, float partialTick, GpuBufferSlice shaderFog, CallbackInfo ci) { 162 + //?} 163 //? if >1.21.2 { 164 165 InfinityOptions options = infinity$options(); ··· 177 //?} 178 //? if >1.21.2 && neoforge { 179 180 + /*if (!this.level.effects().renderSky(this.level, ticks, partialTick, modelViewMatrix, camera, 181 () -> RenderSystem.setShaderFog(shaderFog))) { 182 + *///?} 183 //? if >1.21.2 { 184 185 RenderSystem.setShaderFog(shaderFog); ··· 187 //?} 188 //? if >1.21.2 && neoforge { 189 190 + /*Profiler.get().push("neoforge_render_after_sky"); 191 NeoForge.EVENT_BUS.post(new RenderLevelStageEvent.AfterSky(this.level, (LevelRenderer)(Object)this, (PoseStack)null, modelViewMatrix, this.ticks, this.minecraft.getDeltaTracker(), camera, this.getFrustum(), this.getRenderableSections())); 192 Profiler.get().pop(); 193 } 194 + *///?} 195 //? if >1.21.2 { 196 197 }); ··· 201 } 202 } 203 //?} 204 + 205 + //jukeboxes begin 206 + //? if <1.21 { 207 + /*@Shadow @Final private Map<BlockPos, SoundInstance> playingRecords; 208 + @Shadow protected abstract void notifyNearbyEntities(Level level, BlockPos pos, boolean playing); 209 + 210 + public void infinity$playMusic(BlockPos pos, SoundEvent sound, String desc) { 211 + SoundInstance soundinstance = playingRecords.get(pos); 212 + if (soundinstance != null) { 213 + this.minecraft.getSoundManager().stop(soundinstance); 214 + this.playingRecords.remove(pos); 215 + } 216 + 217 + if (sound != null) { 218 + this.minecraft.gui.setNowPlaying(Component.translatable(desc)); 219 + SoundInstance simplesoundinstance = SimpleSoundInstance.forRecord(sound, Vec3.atCenterOf(pos)); 220 + this.playingRecords.put(pos, simplesoundinstance); 221 + this.minecraft.getSoundManager().play(simplesoundinstance); 222 + } 223 + 224 + this.notifyNearbyEntities(this.level, pos, sound != null); 225 + }; 226 + *///?} 227 }
+3 -1
src/main/java/net/lerariemann/infinity/mixin/qol/CoralBlockBlockMixin.java
··· 14 @Inject(method = "scanForWater(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z", 15 at = @At("HEAD"), cancellable = true) 16 private void noCoralDecay(BlockGetter world, BlockPos pos, CallbackInfoReturnable<Boolean> cir) { 17 - if (InfinityMethods.isBiomeInfinity(world, pos)) cir.setReturnValue(true); 18 } 19 }
··· 14 @Inject(method = "scanForWater(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z", 15 at = @At("HEAD"), cancellable = true) 16 private void noCoralDecay(BlockGetter world, BlockPos pos, CallbackInfoReturnable<Boolean> cir) { 17 + try { 18 + if (InfinityMethods.isBiomeInfinity(world, pos)) cir.setReturnValue(true); 19 + } catch (IllegalStateException ignored) {} 20 } 21 }
+4 -2
src/main/java/net/lerariemann/infinity/mixin/qol/CoralParentBlockMixin.java
··· 15 public class CoralParentBlockMixin { 16 @Inject(method = "scanForWater(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z", 17 at = @At("HEAD"), cancellable = true) 18 - private static void inj(BlockState state, BlockGetter world, BlockPos pos, CallbackInfoReturnable<Boolean> cir) { 19 - if (InfinityMethods.isBiomeInfinity(world, pos)) cir.setReturnValue(true); 20 } 21 }
··· 15 public class CoralParentBlockMixin { 16 @Inject(method = "scanForWater(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z", 17 at = @At("HEAD"), cancellable = true) 18 + private static void noParentCoralDecay(BlockState state, BlockGetter world, BlockPos pos, CallbackInfoReturnable<Boolean> cir) { 19 + try { 20 + if (InfinityMethods.isBiomeInfinity(world, pos)) cir.setReturnValue(true); 21 + } catch (IllegalStateException ignored) {} 22 } 23 }
+1 -1
src/main/java/net/lerariemann/infinity/mixin/qol/EnderDragonEntityMixin.java
··· 20 /* Don't destroy blocks in infdims */ 21 @Inject(method = "checkWalls", at = @At(value = "HEAD", 22 target = "Lnet/minecraft/world/level/GameRules;getBoolean(Lnet/minecraft/world/level/GameRules$Key;)Z"), cancellable = true) 23 - void inj( 24 //? if >1.21.3 { 25 ServerLevel level, 26 //?}
··· 20 /* Don't destroy blocks in infdims */ 21 @Inject(method = "checkWalls", at = @At(value = "HEAD", 22 target = "Lnet/minecraft/world/level/GameRules;getBoolean(Lnet/minecraft/world/level/GameRules$Key;)Z"), cancellable = true) 23 + void safeDragons( 24 //? if >1.21.3 { 25 ServerLevel level, 26 //?}
+83
src/main/java/net/lerariemann/infinity/mixin/qol/JukeboxBlockEntityMixin.java
···
··· 1 + package net.lerariemann.infinity.mixin.qol; 2 + 3 + //? if <1.21 { 4 + /*import net.lerariemann.infinity.InfinityMod; 5 + import net.lerariemann.infinity.item.DiscItem; 6 + import net.lerariemann.infinity.registry.core.ModItems; 7 + import net.lerariemann.infinity.registry.payload.s2c.PlayJukeboxS2CPayload; 8 + import net.lerariemann.infinity.util.VersionMethods; 9 + import net.minecraft.server.level.ServerLevel; 10 + import net.minecraft.server.level.ServerPlayer; 11 + import net.minecraft.server.players.PlayerList; 12 + import net.minecraft.world.item.ItemStack; 13 + import net.minecraft.world.item.RecordItem; 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 + import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 19 + *///?} 20 + import net.minecraft.core.BlockPos; 21 + import net.minecraft.world.level.block.entity.BlockEntityType; 22 + import net.minecraft.world.level.block.state.BlockState; 23 + import net.minecraft.world.level.block.entity.BlockEntity; 24 + import net.minecraft.world.level.block.entity.JukeboxBlockEntity; 25 + import net.minecraft.world.ticks.ContainerSingleItem; 26 + import org.spongepowered.asm.mixin.Mixin; 27 + 28 + @Mixin(JukeboxBlockEntity.class) 29 + public abstract class JukeboxBlockEntityMixin extends BlockEntity implements ContainerSingleItem { 30 + public JukeboxBlockEntityMixin(BlockEntityType<?> type, BlockPos pos, BlockState blockState) { 31 + super(type, pos, blockState); 32 + } 33 + 34 + //? if <1.21 { 35 + /*@Shadow private long recordStartedTick; 36 + 37 + @Shadow private long tickCount; 38 + 39 + @Shadow private boolean isPlaying; 40 + 41 + @Inject(method = "startPlaying", at = @At("HEAD"), cancellable = true) 42 + void inj(CallbackInfo ci) { 43 + ItemStack disc = getFirstItem(); 44 + if (!disc.is(ModItems.DISC.get())) return; 45 + if (DiscItem.isBlank(disc)) { 46 + ci.cancel(); 47 + return; 48 + } 49 + String soundEffect = VersionMethods.getOrDefaultString(disc, "sound_id", "empty"); 50 + InfinityMod.LOGGER.info("Started playing {}", soundEffect); 51 + recordStartedTick = tickCount; 52 + isPlaying = true; 53 + this.level.updateNeighborsAt(this.getBlockPos(), this.getBlockState().getBlock()); 54 + if (level instanceof ServerLevel level1) { 55 + PlayJukeboxS2CPayload payload = 56 + new PlayJukeboxS2CPayload(getBlockPos(), soundEffect, 57 + VersionMethods.getOrDefaultString(disc, "sound_sub", "empty")); 58 + PlayerList L = level1.getServer().getPlayerList(); 59 + for(int i = 0; i < L.getPlayers().size(); ++i) { 60 + ServerPlayer serverPlayer = L.getPlayers().get(i); 61 + if (serverPlayer.level().dimension() == level1.dimension()) { 62 + if (this.getBlockPos().closerToCenterThan(serverPlayer.position(), 64.0)) { 63 + payload.send(serverPlayer); 64 + InfinityMod.LOGGER.info("Payload sent"); 65 + } 66 + } 67 + } 68 + } 69 + this.setChanged(); 70 + ci.cancel(); 71 + } 72 + 73 + @Inject(method = "shouldRecordStopPlaying", at = @At("HEAD"), cancellable = true) 74 + void inj(RecordItem _record, CallbackInfoReturnable<Boolean> cir) { 75 + if (_record == ModItems.DISC.get()) { 76 + boolean res = this.tickCount >= this.recordStartedTick + 77 + VersionMethods.getOrDefaultInt(getFirstItem(), "sound_duration", DiscItem.defaultDuration) 78 + + 1L; 79 + cir.setReturnValue(res); 80 + } 81 + } 82 + *///?} 83 + }
+1 -1
src/main/java/net/lerariemann/infinity/mixin/qol/KeyboardMixin.java
··· 11 public class KeyboardMixin { 12 /* disable f4 being a hardcoded toggle postprocessing shaders key, as the mod makes it rebindable */ 13 @WrapOperation(method="keyPress", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GameRenderer;togglePostEffect()V")) 14 - void inj(GameRenderer instance, Operation<Void> original) { 15 } 16 }
··· 11 public class KeyboardMixin { 12 /* disable f4 being a hardcoded toggle postprocessing shaders key, as the mod makes it rebindable */ 13 @WrapOperation(method="keyPress", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GameRenderer;togglePostEffect()V")) 14 + void disableF4(GameRenderer instance, Operation<Void> original) { 15 } 16 }
+1 -1
src/main/java/net/lerariemann/infinity/mixin/qol/LavaFluidMixin.java
··· 34 35 @ModifyExpressionValue(method = "spreadTo", at = @At(value = "INVOKE", 36 target = "Lnet/minecraft/world/level/block/Block;defaultBlockState()Lnet/minecraft/world/level/block/state/BlockState;")) 37 - BlockState inj(BlockState original, @Local(argsOnly = true) LevelAccessor w, @Local(argsOnly = true) BlockPos p) { 38 if (w.getBlockState(p).is(ModBlocks.IRIDESCENCE.get())) { 39 return Iridescence.getRandomColorBlock(w, "glazed_terracotta").defaultBlockState(); 40 }
··· 34 35 @ModifyExpressionValue(method = "spreadTo", at = @At(value = "INVOKE", 36 target = "Lnet/minecraft/world/level/block/Block;defaultBlockState()Lnet/minecraft/world/level/block/state/BlockState;")) 37 + BlockState customCobbleGen(BlockState original, @Local(argsOnly = true) LevelAccessor w, @Local(argsOnly = true) BlockPos p) { 38 if (w.getBlockState(p).is(ModBlocks.IRIDESCENCE.get())) { 39 return Iridescence.getRandomColorBlock(w, "glazed_terracotta").defaultBlockState(); 40 }
-3
src/main/java/net/lerariemann/infinity/options/InfinityOptions.java
··· 160 } 161 162 //moons 163 - public boolean isMoonCustom() { 164 - return data.contains("lunar_texture"); 165 - } 166 public int getNumMoons() { 167 return data.contains("moons") ? NbtUtils.getList(data,"moons", Tag.TAG_COMPOUND).size() : 1; 168 }
··· 160 } 161 162 //moons 163 public int getNumMoons() { 164 return data.contains("moons") ? NbtUtils.getList(data,"moons", Tag.TAG_COMPOUND).size() : 1; 165 }
+7 -6
src/main/java/net/lerariemann/infinity/options/PortalColorApplier.java
··· 11 import net.minecraft.server.MinecraftServer; 12 import java.awt.Color; 13 import java.util.Random; 14 15 - public interface PortalColorApplier { 16 static PortalColorApplier of(ResourceLocation id, MinecraftServer server) { 17 return of(id, InfinityOptions.readData(server, id)); 18 } ··· 39 }; 40 } 41 42 - int apply(BlockPos pos); 43 44 record Simple(int value) implements PortalColorApplier { 45 @Override 46 - public int apply(BlockPos pos) { 47 return value; 48 } 49 } 50 51 record Checker(ListTag values) implements PortalColorApplier { 52 @Override 53 - public int apply(BlockPos pos) { 54 int mod = InfinityMethods.properMod(pos.getX() + pos.getY() + pos.getZ(), values.size()); 55 return NbtUtils.getInt(values, mod); 56 } ··· 59 enum RandomColor implements PortalColorApplier { 60 INSTANCE; 61 @Override 62 - public int apply(BlockPos pos) { 63 return (new Random(pos.hashCode())).nextInt(); 64 } 65 } ··· 72 } 73 74 @Override 75 - public int apply(BlockPos pos) { 76 float hue = (pos.getX() + pos.getY() + pos.getZ()) / detail; 77 return Color.HSBtoRGB(hue - (int)hue, saturation, brightness) & 0xFFFFFF; 78 }
··· 11 import net.minecraft.server.MinecraftServer; 12 import java.awt.Color; 13 import java.util.Random; 14 + import java.util.function.Function; 15 16 + public interface PortalColorApplier extends Function<BlockPos, Integer> { 17 static PortalColorApplier of(ResourceLocation id, MinecraftServer server) { 18 return of(id, InfinityOptions.readData(server, id)); 19 } ··· 40 }; 41 } 42 43 + Integer apply(BlockPos pos); 44 45 record Simple(int value) implements PortalColorApplier { 46 @Override 47 + public Integer apply(BlockPos pos) { 48 return value; 49 } 50 } 51 52 record Checker(ListTag values) implements PortalColorApplier { 53 @Override 54 + public Integer apply(BlockPos pos) { 55 int mod = InfinityMethods.properMod(pos.getX() + pos.getY() + pos.getZ(), values.size()); 56 return NbtUtils.getInt(values, mod); 57 } ··· 60 enum RandomColor implements PortalColorApplier { 61 INSTANCE; 62 @Override 63 + public Integer apply(BlockPos pos) { 64 return (new Random(pos.hashCode())).nextInt(); 65 } 66 } ··· 73 } 74 75 @Override 76 + public Integer apply(BlockPos pos) { 77 float hue = (pos.getX() + pos.getY() + pos.getZ()) / detail; 78 return Color.HSBtoRGB(hue - (int)hue, saturation, brightness) & 0xFFFFFF; 79 }
+4 -1
src/main/java/net/lerariemann/infinity/options/SkyRenderer.java
··· 244 } 245 public void renderMoon(Matrix4f matrix4f2, ResourceLocation texture, float k, float y, Vector3f tint) { 246 float t, q, p, o; 247 - if (!options.isMoonCustom()) { 248 int moon_phase = world.getMoonPhase(); 249 int s = moon_phase % 4; 250 int m = moon_phase / 4 % 2; ··· 258 p = o = 0.0f; 259 } 260 renderMoon(matrix4f2, texture, k, y, tint, t, q, p, o); 261 } 262 public void renderMoon(Matrix4f matrix4f2, ResourceLocation texture, float k, float y, Vector3f tint, float t, float q, float p, float o) { 263 RenderSystem.setShader(GameRenderer::getPositionTexShader);
··· 244 } 245 public void renderMoon(Matrix4f matrix4f2, ResourceLocation texture, float k, float y, Vector3f tint) { 246 float t, q, p, o; 247 + if (isMoonNormal(texture)) { 248 int moon_phase = world.getMoonPhase(); 249 int s = moon_phase % 4; 250 int m = moon_phase / 4 % 2; ··· 258 p = o = 0.0f; 259 } 260 renderMoon(matrix4f2, texture, k, y, tint, t, q, p, o); 261 + } 262 + boolean isMoonNormal(ResourceLocation texture) { 263 + return texture.getPath().equals("textures/environment/moon_phases.png"); 264 } 265 public void renderMoon(Matrix4f matrix4f2, ResourceLocation texture, float k, float y, Vector3f tint, float t, float q, float p, float o) { 266 RenderSystem.setShader(GameRenderer::getPositionTexShader);
+19 -19
src/main/java/net/lerariemann/infinity/registry/core/ModBlockEntities.java
··· 4 import dev.architectury.registry.registries.DeferredRegister; 5 import dev.architectury.registry.registries.RegistrySupplier; 6 //? if fabric && >1.21.2 { 7 - /*import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityType; 8 import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; 9 - *///?} 10 import net.lerariemann.infinity.InfinityMod; 11 import net.lerariemann.infinity.block.custom.RailHelper; 12 import net.lerariemann.infinity.block.entity.*; ··· 31 create(InfinityPortalBlockEntity::new, 32 ModBlocks.PORTAL.get()) 33 //? if fabric || <1.21.2 34 - /*.build(type("neither_portal"))*/ 35 ); 36 public static final RegistrySupplier<BlockEntityType<CosmicAltarBlockEntity>> COSMIC_ALTAR = 37 BLOCK_ENTITY_TYPES.register("cosmic_altar", () -> 38 create(CosmicAltarBlockEntity::new, 39 ModBlocks.COSMIC_ALTAR.get()) 40 //? if fabric || <1.21.2 41 - /*.build(type("cosmic_altar"))*/ 42 ); 43 public static final RegistrySupplier<BlockEntityType<BiomeBottleBlockEntity>> BIOME_BOTTLE = 44 BLOCK_ENTITY_TYPES.register("biome_bottle", () -> 45 create(BiomeBottleBlockEntity::new, 46 ModBlocks.BIOME_BOTTLE.get()) 47 //? if fabric || <1.21.2 48 - /*.build(type("biome_bottle"))*/ 49 ); 50 public static final RegistrySupplier<BlockEntityType<ChromaticBlockEntity>> CHROMATIC = 51 BLOCK_ENTITY_TYPES.register("chromatic", () -> ··· 53 ModBlocks.CHROMATIC_WOOL.get(), 54 ModBlocks.CHROMATIC_CARPET.get()) 55 //? if fabric || <1.21.2 56 - /*.build(type("chromatic"))*/ 57 ); 58 public static final RegistrySupplier<BlockEntityType<RailHelper.RHBEntity>> RAIL_HELPER = 59 BLOCK_ENTITY_TYPES.register("rail_helper_block_entity", () -> 60 create(RailHelper.RHBEntity::new, 61 ModBlocks.RAIL_HELPER.get()) 62 //? if fabric || <1.21.2 63 - /*.build(type("rail_helper_block_entity"))*/ 64 ); 65 66 public static <T extends BlockEntity> 67 //? if >1.21.2 && fabric { 68 - /*FabricBlockEntityTypeBuilder 69 - *///?} else if >1.21.2 { 70 - BlockEntityType 71 - //?} else { 72 /*BlockEntityType.Builder 73 *///?} 74 <T> 75 create( 76 //? if >1.21.2 && fabric { 77 - /*FabricBlockEntityTypeBuilder.Factory 78 - *///?} else if >1.21.2 { 79 - BlockEntityType.BlockEntitySupplier 80 - //?} else { 81 /*BlockEntityType.BlockEntitySupplier 82 *///?} 83 <? extends T> factory, Block... blocks) { 84 //? if >1.21.2 && fabric { 85 - /*return FabricBlockEntityTypeBuilder.create(factory, blocks); 86 - *///?} else if >1.21.2 { 87 - return new BlockEntityType<>(factory, blocks); 88 - //?} else { 89 /*return BlockEntityType.Builder.of(factory, blocks); 90 *///?} 91 }
··· 4 import dev.architectury.registry.registries.DeferredRegister; 5 import dev.architectury.registry.registries.RegistrySupplier; 6 //? if fabric && >1.21.2 { 7 + import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityType; 8 import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; 9 + //?} 10 import net.lerariemann.infinity.InfinityMod; 11 import net.lerariemann.infinity.block.custom.RailHelper; 12 import net.lerariemann.infinity.block.entity.*; ··· 31 create(InfinityPortalBlockEntity::new, 32 ModBlocks.PORTAL.get()) 33 //? if fabric || <1.21.2 34 + .build(type("neither_portal")) 35 ); 36 public static final RegistrySupplier<BlockEntityType<CosmicAltarBlockEntity>> COSMIC_ALTAR = 37 BLOCK_ENTITY_TYPES.register("cosmic_altar", () -> 38 create(CosmicAltarBlockEntity::new, 39 ModBlocks.COSMIC_ALTAR.get()) 40 //? if fabric || <1.21.2 41 + .build(type("cosmic_altar")) 42 ); 43 public static final RegistrySupplier<BlockEntityType<BiomeBottleBlockEntity>> BIOME_BOTTLE = 44 BLOCK_ENTITY_TYPES.register("biome_bottle", () -> 45 create(BiomeBottleBlockEntity::new, 46 ModBlocks.BIOME_BOTTLE.get()) 47 //? if fabric || <1.21.2 48 + .build(type("biome_bottle")) 49 ); 50 public static final RegistrySupplier<BlockEntityType<ChromaticBlockEntity>> CHROMATIC = 51 BLOCK_ENTITY_TYPES.register("chromatic", () -> ··· 53 ModBlocks.CHROMATIC_WOOL.get(), 54 ModBlocks.CHROMATIC_CARPET.get()) 55 //? if fabric || <1.21.2 56 + .build(type("chromatic")) 57 ); 58 public static final RegistrySupplier<BlockEntityType<RailHelper.RHBEntity>> RAIL_HELPER = 59 BLOCK_ENTITY_TYPES.register("rail_helper_block_entity", () -> 60 create(RailHelper.RHBEntity::new, 61 ModBlocks.RAIL_HELPER.get()) 62 //? if fabric || <1.21.2 63 + .build(type("rail_helper_block_entity")) 64 ); 65 66 public static <T extends BlockEntity> 67 //? if >1.21.2 && fabric { 68 + FabricBlockEntityTypeBuilder 69 + //?} else if >1.21.2 { 70 + /*BlockEntityType 71 + *///?} else { 72 /*BlockEntityType.Builder 73 *///?} 74 <T> 75 create( 76 //? if >1.21.2 && fabric { 77 + FabricBlockEntityTypeBuilder.Factory 78 + //?} else if >1.21.2 { 79 + /*BlockEntityType.BlockEntitySupplier 80 + *///?} else { 81 /*BlockEntityType.BlockEntitySupplier 82 *///?} 83 <? extends T> factory, Block... blocks) { 84 //? if >1.21.2 && fabric { 85 + return FabricBlockEntityTypeBuilder.create(factory, blocks); 86 + //?} else if >1.21.2 { 87 + /*return new BlockEntityType<>(factory, blocks); 88 + *///?} else { 89 /*return BlockEntityType.Builder.of(factory, blocks); 90 *///?} 91 }
-4
src/main/java/net/lerariemann/infinity/registry/core/ModBlocks.java
··· 60 IridescentKelpBlock::new, (VersionMethods.copyBlockProperties(Blocks.KELP).mapColor(MapColor.COLOR_MAGENTA))); 61 public static final RegistrySupplier<IridescentKelpBlock.Plant> IRIDESCENT_KELP_PLANT = register("iridescent_kelp_plant", 62 IridescentKelpBlock.Plant::new, (VersionMethods.copyBlockProperties(Blocks.KELP).mapColor(MapColor.COLOR_MAGENTA))); 63 - public static final RegistrySupplier<Block> NOTES_BLOCK = register("notes_block", 64 - NotesBlock::new, (VersionMethods.copyBlockProperties(Blocks.NOTE_BLOCK).randomTicks())); 65 - public static final RegistrySupplier<Block> HAUNTED_AIR = BLOCKS.register("haunted_air", 66 - ()-> new HauntedBlock(Blocks.AIR)); 67 public static final RegistrySupplier<RailHelper> RAIL_HELPER = register("rail_helper", 68 RailHelper::new, (BlockBehaviour.Properties.of().strength(-1.0F, 3600000.8F).mapColor(MapColor.NONE) 69 .noLootTable().noOcclusion().isValidSpawn((state, getter, pos, type)-> false).pushReaction(PushReaction.BLOCK)
··· 60 IridescentKelpBlock::new, (VersionMethods.copyBlockProperties(Blocks.KELP).mapColor(MapColor.COLOR_MAGENTA))); 61 public static final RegistrySupplier<IridescentKelpBlock.Plant> IRIDESCENT_KELP_PLANT = register("iridescent_kelp_plant", 62 IridescentKelpBlock.Plant::new, (VersionMethods.copyBlockProperties(Blocks.KELP).mapColor(MapColor.COLOR_MAGENTA))); 63 public static final RegistrySupplier<RailHelper> RAIL_HELPER = register("rail_helper", 64 RailHelper::new, (BlockBehaviour.Properties.of().strength(-1.0F, 3600000.8F).mapColor(MapColor.NONE) 65 .noLootTable().noOcclusion().isValidSpawn((state, getter, pos, type)-> false).pushReaction(PushReaction.BLOCK)
+16 -16
src/main/java/net/lerariemann/infinity/registry/core/ModEntities.java
··· 33 import static net.minecraftforge.event.entity.SpawnPlacementRegisterEvent.Operation.REPLACE; 34 *///?} 35 //? if neoforge { 36 - import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; 37 import static net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent.Operation.REPLACE; 38 - //?} 39 40 import java.util.Optional; 41 ··· 142 *///?} 143 location, Heightmap.Types heightmapType, SpawnPlacements.SpawnPredicate<T> predicate, 144 //? if neoforge { 145 - RegisterSpawnPlacementsEvent event 146 - //?} else if forge { 147 /*SpawnPlacementRegisterEvent event 148 *///?} else { 149 - /*Object event 150 - *///?} 151 ) { 152 //? if fabric { 153 - /*if (!SpawnPlacements.DATA_BY_TYPE.containsKey(type)) 154 SpawnPlacements.register(type, location, heightmapType, predicate); 155 - *///?} else { 156 - event.register(type, location, heightmapType, predicate, REPLACE); 157 - //?} 158 } 159 160 public static void registerSpawnRestrictions( 161 //? if neoforge { 162 - RegisterSpawnPlacementsEvent event 163 - //?} else if forge { 164 /*SpawnPlacementRegisterEvent event 165 *///?} 166 ) { 167 //? if fabric { 168 - /*Object event = null; 169 SpawnPlacements.register(CHAOS_SLIME.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ChaosSlime::canSpawn); 170 SpawnPlacements.register(CHAOS_SKELETON.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChaosMonsterSpawn); 171 SpawnPlacements.register(CHAOS_CREEPER.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChaosMonsterSpawn); 172 SpawnPlacements.register(CHAOS_PAWN.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn); 173 SpawnPlacements.register(ANT.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn); 174 SpawnPlacements.register(BISHOP.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn); 175 - *///?} else { 176 - event.register(CHAOS_SLIME.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ChaosSlime::canSpawn, REPLACE); 177 event.register(CHAOS_SKELETON.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChaosMonsterSpawn, REPLACE); 178 event.register(CHAOS_CREEPER.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChaosMonsterSpawn, REPLACE); 179 event.register(CHAOS_PAWN.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn, REPLACE); 180 event.register(ANT.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn, REPLACE); 181 event.register(BISHOP.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn, REPLACE); 182 - //?} 183 184 registerSafe(EntityType.SNIFFER, ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, event); 185 registerSafe(EntityType.CAMEL, ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, event);
··· 33 import static net.minecraftforge.event.entity.SpawnPlacementRegisterEvent.Operation.REPLACE; 34 *///?} 35 //? if neoforge { 36 + /*import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; 37 import static net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent.Operation.REPLACE; 38 + *///?} 39 40 import java.util.Optional; 41 ··· 142 *///?} 143 location, Heightmap.Types heightmapType, SpawnPlacements.SpawnPredicate<T> predicate, 144 //? if neoforge { 145 + /*RegisterSpawnPlacementsEvent event 146 + *///?} else if forge { 147 /*SpawnPlacementRegisterEvent event 148 *///?} else { 149 + Object event 150 + //?} 151 ) { 152 //? if fabric { 153 + if (!SpawnPlacements.DATA_BY_TYPE.containsKey(type)) 154 SpawnPlacements.register(type, location, heightmapType, predicate); 155 + //?} else { 156 + /*event.register(type, location, heightmapType, predicate, REPLACE); 157 + *///?} 158 } 159 160 public static void registerSpawnRestrictions( 161 //? if neoforge { 162 + /*RegisterSpawnPlacementsEvent event 163 + *///?} else if forge { 164 /*SpawnPlacementRegisterEvent event 165 *///?} 166 ) { 167 //? if fabric { 168 + Object event = null; 169 SpawnPlacements.register(CHAOS_SLIME.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ChaosSlime::canSpawn); 170 SpawnPlacements.register(CHAOS_SKELETON.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChaosMonsterSpawn); 171 SpawnPlacements.register(CHAOS_CREEPER.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChaosMonsterSpawn); 172 SpawnPlacements.register(CHAOS_PAWN.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn); 173 SpawnPlacements.register(ANT.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn); 174 SpawnPlacements.register(BISHOP.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn); 175 + //?} else { 176 + /*event.register(CHAOS_SLIME.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ChaosSlime::canSpawn, REPLACE); 177 event.register(CHAOS_SKELETON.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChaosMonsterSpawn, REPLACE); 178 event.register(CHAOS_CREEPER.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChaosMonsterSpawn, REPLACE); 179 event.register(CHAOS_PAWN.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn, REPLACE); 180 event.register(ANT.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn, REPLACE); 181 event.register(BISHOP.get(), ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ModEntities::canChessFigureSpawn, REPLACE); 182 + *///?} 183 184 registerSafe(EntityType.SNIFFER, ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, event); 185 registerSafe(EntityType.CAMEL, ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, event);
+5
src/main/java/net/lerariemann/infinity/registry/core/ModFeatures.java
··· 10 import net.minecraft.world.level.levelgen.feature.Feature; 11 import net.minecraft.world.level.levelgen.feature.configurations.BlockStateConfiguration; 12 import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; 13 import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType; 14 15 import static net.lerariemann.infinity.InfinityMod.MOD_ID; ··· 26 public static RegistrySupplier<RandomCubeFeature> RANDOM_CUBE; 27 public static RegistrySupplier<RandomShapeFeature> RANDOM_STAR; 28 public static RegistrySupplier<TextFeature> RANDOM_TEXT; 29 public static RegistrySupplier<RandomPortalSetupper> PORTAL_SETUPPER; 30 public static RegistrySupplier<TrunkPlacerType<WonkyTrunkPlacer>> WONKY_TRUNK; 31 ··· 46 RANDOM_CUBE = register("random_cube", new RandomCubeFeature(RandomCubeFeature.Config.CODEC)); 47 RANDOM_STAR = register("random_shape", new RandomShapeFeature(RandomShapeFeature.Config.CODEC)); 48 RANDOM_TEXT = register("random_text", new TextFeature(TextFeature.Config.CODEC)); 49 PORTAL_SETUPPER = register("portal_setupper", new RandomPortalSetupper((RandomPortalSetupper.Config.CODEC))); 50 RANDOM_BONUS_CHEST = register("bonus_chest", new RandomBonusChestFeature(RandomBonusChestFeature.Config.CODEC)); 51 RANDOM_END_GATEWAY = register("end_gateway", new RandomEndGatewayFeature(RandomEndGatewayFeature.Config.CODEC));
··· 10 import net.minecraft.world.level.levelgen.feature.Feature; 11 import net.minecraft.world.level.levelgen.feature.configurations.BlockStateConfiguration; 12 import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; 13 + import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; 14 import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType; 15 16 import static net.lerariemann.infinity.InfinityMod.MOD_ID; ··· 27 public static RegistrySupplier<RandomCubeFeature> RANDOM_CUBE; 28 public static RegistrySupplier<RandomShapeFeature> RANDOM_STAR; 29 public static RegistrySupplier<TextFeature> RANDOM_TEXT; 30 + public static RegistrySupplier<NotesHouseFeature> MADHOUSE; 31 + public static RegistrySupplier<NotesJukeboxFeature> JUKEBOX; 32 public static RegistrySupplier<RandomPortalSetupper> PORTAL_SETUPPER; 33 public static RegistrySupplier<TrunkPlacerType<WonkyTrunkPlacer>> WONKY_TRUNK; 34 ··· 49 RANDOM_CUBE = register("random_cube", new RandomCubeFeature(RandomCubeFeature.Config.CODEC)); 50 RANDOM_STAR = register("random_shape", new RandomShapeFeature(RandomShapeFeature.Config.CODEC)); 51 RANDOM_TEXT = register("random_text", new TextFeature(TextFeature.Config.CODEC)); 52 + MADHOUSE = register("madhouse", new NotesHouseFeature(NotesHouseFeature.Config.CODEC)); 53 + JUKEBOX = register("jukebox", new NotesJukeboxFeature(NoneFeatureConfiguration.CODEC)); 54 PORTAL_SETUPPER = register("portal_setupper", new RandomPortalSetupper((RandomPortalSetupper.Config.CODEC))); 55 RANDOM_BONUS_CHEST = register("bonus_chest", new RandomBonusChestFeature(RandomBonusChestFeature.Config.CODEC)); 56 RANDOM_END_GATEWAY = register("end_gateway", new RandomEndGatewayFeature(RandomEndGatewayFeature.Config.CODEC));
+1 -3
src/main/java/net/lerariemann/infinity/registry/core/ModItems.java
··· 67 registerBlockItemAfter(ModBlocks.NETHERITE_SLAB, CreativeModeTabs.BUILDING_BLOCKS, Items.NETHERITE_BLOCK, BlockItem::new); 68 public static final RegistrySupplier<Item> NETHERITE_STAIRS_ITEM = 69 registerBlockItemAfter(ModBlocks.NETHERITE_STAIRS, CreativeModeTabs.BUILDING_BLOCKS, Items.NETHERITE_BLOCK, BlockItem::new); 70 - public static final RegistrySupplier<Item> NOTES_BLOCK_ITEM = 71 - registerBlockItemAfter(ModBlocks.NOTES_BLOCK, CreativeModeTabs.FUNCTIONAL_BLOCKS, Items.NOTE_BLOCK, BlockItem::new); 72 public static final RegistrySupplier<Item> TIME_BOMB_ITEM = 73 registerBlockItemAfter(ModBlocks.TIME_BOMB, CreativeModeTabs.FUNCTIONAL_BLOCKS, VAULT, BlockItem::new); 74 public static final RegistrySupplier<Item> IRIDESCENT_WOOL = ··· 141 registerItemAfter("f4", Items.WRITABLE_BOOK, F4Item::new, 142 new Item.Properties().rarity(Rarity.UNCOMMON)); 143 public static final RegistrySupplier<Item> DISC = 144 - registerItemAfter("disc", Items.MUSIC_DISC_PIGSTEP, Item::new, 145 new Item.Properties().rarity(Rarity.RARE)); 146 public static final RegistrySupplier<Item> IRIDESCENT_POTION = 147 registerItemAfter("iridescent_potion", Items.HONEY_BOTTLE, settings ->
··· 67 registerBlockItemAfter(ModBlocks.NETHERITE_SLAB, CreativeModeTabs.BUILDING_BLOCKS, Items.NETHERITE_BLOCK, BlockItem::new); 68 public static final RegistrySupplier<Item> NETHERITE_STAIRS_ITEM = 69 registerBlockItemAfter(ModBlocks.NETHERITE_STAIRS, CreativeModeTabs.BUILDING_BLOCKS, Items.NETHERITE_BLOCK, BlockItem::new); 70 public static final RegistrySupplier<Item> TIME_BOMB_ITEM = 71 registerBlockItemAfter(ModBlocks.TIME_BOMB, CreativeModeTabs.FUNCTIONAL_BLOCKS, VAULT, BlockItem::new); 72 public static final RegistrySupplier<Item> IRIDESCENT_WOOL = ··· 139 registerItemAfter("f4", Items.WRITABLE_BOOK, F4Item::new, 140 new Item.Properties().rarity(Rarity.UNCOMMON)); 141 public static final RegistrySupplier<Item> DISC = 142 + registerItemAfter("disc", Items.MUSIC_DISC_PIGSTEP, DiscItem::new, 143 new Item.Properties().rarity(Rarity.RARE)); 144 public static final RegistrySupplier<Item> IRIDESCENT_POTION = 145 registerItemAfter("iridescent_potion", Items.HONEY_BOTTLE, settings ->
+2 -2
src/main/java/net/lerariemann/infinity/registry/core/ModStatusEffects.java
··· 31 32 public static void registerModEffectsFabric() { 33 //? if fabric { 34 - /*IRIDESCENT_EFFECT = (Registry.registerForHolder(BuiltInRegistries.MOB_EFFECT, InfinityMethods.getId("iridescence"), 35 new IridescentEffect(MobEffectCategory.NEUTRAL, 0xFF66FF))); 36 IRIDESCENT_SETUP = (Registry.registerForHolder(BuiltInRegistries.MOB_EFFECT, InfinityMethods.getId("iridescent_setup"), 37 new IridescentEffect.Setup(MobEffectCategory.NEUTRAL, 0xFF00FF))); ··· 39 new IridescentCooldownEffect(MobEffectCategory.NEUTRAL, 0x884488))); 40 AFTERGLOW = (Registry.registerForHolder(BuiltInRegistries.MOB_EFFECT, InfinityMethods.getId("afterglow"), 41 getAfterglowInstanceForReg())); 42 - *///?} 43 } 44 45 public static MobEffect getAfterglowInstanceForReg() {
··· 31 32 public static void registerModEffectsFabric() { 33 //? if fabric { 34 + IRIDESCENT_EFFECT = (Registry.registerForHolder(BuiltInRegistries.MOB_EFFECT, InfinityMethods.getId("iridescence"), 35 new IridescentEffect(MobEffectCategory.NEUTRAL, 0xFF66FF))); 36 IRIDESCENT_SETUP = (Registry.registerForHolder(BuiltInRegistries.MOB_EFFECT, InfinityMethods.getId("iridescent_setup"), 37 new IridescentEffect.Setup(MobEffectCategory.NEUTRAL, 0xFF00FF))); ··· 39 new IridescentCooldownEffect(MobEffectCategory.NEUTRAL, 0x884488))); 40 AFTERGLOW = (Registry.registerForHolder(BuiltInRegistries.MOB_EFFECT, InfinityMethods.getId("afterglow"), 41 getAfterglowInstanceForReg())); 42 + //?} 43 } 44 45 public static MobEffect getAfterglowInstanceForReg() {
+41
src/main/java/net/lerariemann/infinity/registry/payload/FriendlyPacket.java
···
··· 1 + package net.lerariemann.infinity.registry.payload; 2 + 3 + 4 + //? if >1.21 { 5 + import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 6 + //?} else { 7 + /*import net.fabricmc.fabric.api.networking.v1.FabricPacket; 8 + *///?} 9 + import net.lerariemann.infinity.util.platform.InfinityPlatform; 10 + import net.minecraft.client.Minecraft; 11 + import net.minecraft.server.level.ServerPlayer; 12 + 13 + public interface FriendlyPacket extends 14 + //? if >1.21 { 15 + CustomPacketPayload { 16 + //?} else { 17 + /*FabricPacket { 18 + *///?} 19 + interface S2C extends FriendlyPacket { 20 + void receive(Minecraft client); 21 + 22 + default void send(ServerPlayer player) { 23 + InfinityPlatform.INSTANCE.sendS2CPayload(player, this); 24 + } 25 + // neoforge doesn't provide the client context 26 + //? if neoforge { 27 + /*default void receive() { 28 + receive(Minecraft.getInstance()); 29 + } 30 + *///?} 31 + } 32 + 33 + interface C2S extends FriendlyPacket { 34 + void receive(ServerPlayer player); 35 + 36 + default void send() { 37 + InfinityPlatform.INSTANCE.sendC2SPayload(this); 38 + } 39 + } 40 + } 41 +
+134
src/main/java/net/lerariemann/infinity/registry/payload/ModPayloads.java
···
··· 1 + package net.lerariemann.infinity.registry.payload; 2 + 3 + import net.lerariemann.infinity.registry.payload.c2s.*; 4 + import net.lerariemann.infinity.registry.payload.s2c.*; 5 + 6 + //? if <1.21 || fabric { 7 + import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; 8 + import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 9 + import net.minecraft.client.Minecraft; 10 + //?} 11 + //? if >1.21 && fabric { 12 + import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; 13 + //?} 14 + //? neoforge { 15 + /*import net.minecraft.server.level.ServerPlayer; 16 + import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; 17 + import net.neoforged.neoforge.network.handling.IPayloadContext; 18 + import net.neoforged.neoforge.network.registration.PayloadRegistrar; 19 + *///?} 20 + 21 + public class ModPayloads { 22 + public static String oldShader = ""; 23 + 24 + public static void registerC2SPacketsReceivers() { 25 + //? if >1.21 { 26 + net.lerariemann.infinity.util.platform.InfinityPlatform.INSTANCE.registerPayloadsServer(); 27 + //?} else { 28 + /*ServerPlayNetworking.registerGlobalReceiver(F4UpdateC2SPayload.type, F4UpdateC2SPayload::receive); 29 + ServerPlayNetworking.registerGlobalReceiver(F4DeployC2SPayload.type, F4DeployC2SPayload::receive); 30 + ServerPlayNetworking.registerGlobalReceiver(JukeboxesC2SPayload.type, JukeboxesC2SPayload::receive); 31 + *///?} 32 + } 33 + 34 + public static void registerS2CPacketsReceivers() { 35 + //? if >1.21 { 36 + net.lerariemann.infinity.util.platform.InfinityPlatform.INSTANCE.registerPayloadsClient(); 37 + //?} else { 38 + /*ClientPlayNetworking.registerGlobalReceiver(WorldAddS2CPayload.sid, WorldAddS2CPayload::receive); 39 + ClientPlayNetworking.registerGlobalReceiver(BiomeAddS2CPayload.sid, BiomeAddS2CPayload::receive); 40 + ClientPlayNetworking.registerGlobalReceiver(ShaderS2CPayload.sid, ShaderS2CPayload::receive); 41 + ClientPlayNetworking.registerGlobalReceiver(StarsS2CPayload.sid, StarsS2CPayload::receive); 42 + ClientPlayNetworking.registerGlobalReceiver(SoundPackS2CPayload.sid, SoundPackS2CPayload::receive); 43 + ClientPlayNetworking.registerGlobalReceiver(PlayJukeboxS2CPayload.sid, PlayJukeboxS2CPayload::receive); 44 + *///?} 45 + } 46 + 47 + //? if >1.21 && fabric { 48 + public static Minecraft client(Object context) { 49 + ClientPlayNetworking.Context clientContext = (ClientPlayNetworking.Context) context; 50 + return clientContext.client(); 51 + } 52 + 53 + public static void registerFabricServerside() { 54 + PayloadTypeRegistry.playS2C().register(WorldAddS2CPayload.ID, WorldAddS2CPayload.CODEC); 55 + PayloadTypeRegistry.playS2C().register(BiomeAddS2CPayload.ID, BiomeAddS2CPayload.CODEC); 56 + PayloadTypeRegistry.playS2C().register(ShaderS2CPayload.ID, ShaderS2CPayload.CODEC); 57 + PayloadTypeRegistry.playS2C().register(StarsS2CPayload.ID, StarsS2CPayload.CODEC); 58 + PayloadTypeRegistry.playS2C().register(SoundPackS2CPayload.ID, SoundPackS2CPayload.CODEC); 59 + 60 + PayloadTypeRegistry.playC2S().register(F4UpdateC2SPayload.ID, F4UpdateC2SPayload.CODEC); 61 + PayloadTypeRegistry.playC2S().register(F4DeployC2SPayload.ID, F4DeployC2SPayload.CODEC); 62 + PayloadTypeRegistry.playC2S().register(JukeboxesC2SPayload.ID, JukeboxesC2SPayload.CODEC); 63 + 64 + ServerPlayNetworking.registerGlobalReceiver(F4UpdateC2SPayload.ID, (payload, context) -> 65 + payload.receive(context.player())); 66 + ServerPlayNetworking.registerGlobalReceiver(F4DeployC2SPayload.ID, (payload, context) -> 67 + payload.receive(context.player())); 68 + ServerPlayNetworking.registerGlobalReceiver(JukeboxesC2SPayload.ID, (payload, context) -> 69 + payload.receive(context.player())); 70 + } 71 + 72 + public static void registerFabricClientside() { 73 + ClientPlayNetworking.registerGlobalReceiver(WorldAddS2CPayload.ID, (payload, context) -> 74 + payload.receive(client(context))); 75 + ClientPlayNetworking.registerGlobalReceiver(BiomeAddS2CPayload.ID, (payload, context) -> 76 + payload.receive(client(context))); 77 + ClientPlayNetworking.registerGlobalReceiver(ShaderS2CPayload.ID, (payload, context) -> 78 + payload.receive(client(context))); 79 + ClientPlayNetworking.registerGlobalReceiver(StarsS2CPayload.ID, (payload, context) -> 80 + payload.receive(client(context))); 81 + ClientPlayNetworking.registerGlobalReceiver(SoundPackS2CPayload.ID, (payload, context) -> 82 + payload.receive(client(context))); 83 + } 84 + //?} 85 + //? neoforge { 86 + /*public static ServerPlayer getPlayer(IPayloadContext context) { 87 + return ((ServerPlayer)context.player()); 88 + } 89 + 90 + public static void registerNeoforge(final RegisterPayloadHandlersEvent event) { 91 + final PayloadRegistrar registrar = event.registrar("1"); 92 + registrar.playToServer( 93 + F4UpdateC2SPayload.ID, 94 + F4UpdateC2SPayload.CODEC, 95 + (payload, context) -> payload.receive(getPlayer(context)) 96 + ); 97 + registrar.playToServer( 98 + F4DeployC2SPayload.ID, 99 + F4DeployC2SPayload.CODEC, 100 + (payload, context) -> payload.receive(getPlayer(context)) 101 + ); 102 + registrar.playToServer( 103 + JukeboxesC2SPayload.ID, 104 + JukeboxesC2SPayload.CODEC, 105 + (payload, context) -> payload.receive(getPlayer(context)) 106 + ); 107 + registrar.playToClient( 108 + WorldAddS2CPayload.ID, 109 + WorldAddS2CPayload.CODEC, 110 + (payload, context) -> payload.receive() 111 + ); 112 + registrar.playToClient( 113 + BiomeAddS2CPayload.ID, 114 + BiomeAddS2CPayload.CODEC, 115 + (payload, context) -> payload.receive() 116 + ); 117 + registrar.playToClient( 118 + ShaderS2CPayload.ID, 119 + ShaderS2CPayload.CODEC, 120 + (payload, context) -> payload.receive() 121 + ); 122 + registrar.playToClient( 123 + StarsS2CPayload.ID, 124 + StarsS2CPayload.CODEC, 125 + (payload, context) -> payload.receive() 126 + ); 127 + registrar.playToClient( 128 + SoundPackS2CPayload.ID, 129 + SoundPackS2CPayload.CODEC, 130 + (payload, context) -> payload.receive() 131 + ); 132 + } 133 + *///?} 134 + }
+57
src/main/java/net/lerariemann/infinity/registry/payload/c2s/F4DeployC2SPayload.java
···
··· 1 + package net.lerariemann.infinity.registry.payload.c2s; 2 + //? if >1.21 { 3 + import net.minecraft.network.RegistryFriendlyByteBuf; 4 + import net.minecraft.network.codec.StreamCodec; 5 + import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 6 + import org.jetbrains.annotations.NotNull; 7 + //?} else { 8 + /*import net.minecraft.network.FriendlyByteBuf; 9 + import net.fabricmc.fabric.api.networking.v1.PacketSender; 10 + import net.fabricmc.fabric.api.networking.v1.PacketType; 11 + *///?} 12 + import net.lerariemann.infinity.item.F4Item; 13 + import net.lerariemann.infinity.registry.core.ModItems; 14 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 15 + import net.lerariemann.infinity.util.VersionMethods; 16 + import net.minecraft.resources.ResourceLocation; 17 + import net.minecraft.server.level.ServerPlayer; 18 + import net.minecraft.world.InteractionHand; 19 + import net.minecraft.world.item.ItemStack; 20 + 21 + import static net.lerariemann.infinity.util.InfinityMethods.getId; 22 + 23 + public record F4DeployC2SPayload() implements FriendlyPacket.C2S { 24 + public static ResourceLocation sid = getId("deploy_f4"); 25 + public static final F4DeployC2SPayload INSTANCE = new F4DeployC2SPayload(); 26 + //? if >1.21 { 27 + 28 + public static final Type<F4DeployC2SPayload> ID = new Type<>(sid); 29 + public static final StreamCodec<RegistryFriendlyByteBuf, F4DeployC2SPayload> CODEC = StreamCodec.unit(INSTANCE); 30 + @Override 31 + public @NotNull Type<? extends CustomPacketPayload> type() { 32 + return ID; 33 + } 34 + //?} else { 35 + /*@Override 36 + public void write(FriendlyByteBuf buf) { 37 + } 38 + public static PacketType<F4DeployC2SPayload> type = PacketType.create(sid, buf -> INSTANCE); 39 + @Override 40 + public PacketType<?> getType() { 41 + return type; 42 + } 43 + public static void receive(F4DeployC2SPayload packet, ServerPlayer player, PacketSender responseSender) { 44 + packet.receive(player); 45 + } 46 + *///?} 47 + @Override 48 + public void receive(ServerPlayer player) { 49 + ItemStack st = player.getItemInHand(InteractionHand.MAIN_HAND); 50 + if (st.is(ModItems.F4.get())) { 51 + var result = F4Item.deploy(player.level(), player, InteractionHand.MAIN_HAND); 52 + var resultItem = VersionMethods.getInteractionHolderResult(result); 53 + if (resultItem != null) 54 + player.setItemInHand(InteractionHand.MAIN_HAND, resultItem); 55 + } 56 + } 57 + }
+75
src/main/java/net/lerariemann/infinity/registry/payload/c2s/F4UpdateC2SPayload.java
···
··· 1 + package net.lerariemann.infinity.registry.payload.c2s; 2 + 3 + //? if >1.21 { 4 + import net.minecraft.core.component.DataComponentMap; 5 + import net.minecraft.network.RegistryFriendlyByteBuf; 6 + import net.minecraft.network.codec.ByteBufCodecs; 7 + import net.minecraft.network.codec.StreamCodec; 8 + import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 9 + import net.lerariemann.infinity.util.InfinityMethods; 10 + import org.jetbrains.annotations.NotNull; 11 + //?} else { 12 + /*import net.minecraft.nbt.CompoundTag; 13 + import net.minecraft.network.FriendlyByteBuf; 14 + import net.fabricmc.fabric.api.networking.v1.PacketSender; 15 + import net.fabricmc.fabric.api.networking.v1.PacketType; 16 + *///?} 17 + import net.lerariemann.infinity.registry.core.ModComponentTypes; 18 + import net.lerariemann.infinity.registry.core.ModItems; 19 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 20 + import net.minecraft.resources.ResourceLocation; 21 + import net.minecraft.server.level.ServerPlayer; 22 + import net.minecraft.world.item.ItemStack; 23 + 24 + import static net.lerariemann.infinity.util.InfinityMethods.getId; 25 + 26 + public record F4UpdateC2SPayload(int slot, int width, int height) implements FriendlyPacket.C2S { 27 + public static ResourceLocation sid = getId("update_f4"); 28 + //? if >1.21 { 29 + public static final Type<F4UpdateC2SPayload> ID = new Type<>(InfinityMethods.getId("receive_f4")); 30 + public static final StreamCodec<RegistryFriendlyByteBuf, F4UpdateC2SPayload> CODEC = StreamCodec.composite( 31 + ByteBufCodecs.VAR_INT, F4UpdateC2SPayload::slot, 32 + ByteBufCodecs.VAR_INT, F4UpdateC2SPayload::width, 33 + ByteBufCodecs.VAR_INT, F4UpdateC2SPayload::height, 34 + F4UpdateC2SPayload::new); 35 + @Override 36 + public @NotNull Type<? extends CustomPacketPayload> type() { 37 + return ID; 38 + } 39 + //?} else { 40 + /*@Override 41 + public void write(FriendlyByteBuf buf) { 42 + buf.writeInt(slot); 43 + buf.writeInt(width); 44 + buf.writeInt(height); 45 + } 46 + public static PacketType<F4UpdateC2SPayload> type = 47 + PacketType.create(sid, buf -> new F4UpdateC2SPayload(buf.readInt(), buf.readInt(), buf.readInt())); 48 + @Override 49 + public PacketType<?> getType() { 50 + return type; 51 + } 52 + public static void receive(F4UpdateC2SPayload packet, ServerPlayer player, PacketSender responseSender) { 53 + packet.receive(player); 54 + } 55 + *///?} 56 + public void receive(ServerPlayer player) { 57 + ItemStack st = player.getInventory().getItem(slot); 58 + if (st.is(ModItems.F4.get())) { 59 + ItemStack newStack = st.copy(); 60 + //? if >1.21 { 61 + newStack.applyComponents(DataComponentMap.builder() 62 + .set(ModComponentTypes.SIZE_X.get(), Math.clamp(width, 1, 21)) 63 + .set(ModComponentTypes.SIZE_Y.get(), Math.clamp(height, 1, 21)) 64 + .build()); 65 + //?} else { 66 + /*CompoundTag nbt = st.getTag(); 67 + if (nbt == null) nbt = new CompoundTag(); 68 + nbt.putInt(ModComponentTypes.SIZE_X, width); 69 + nbt.putInt(ModComponentTypes.SIZE_Y, height); 70 + newStack.setTag(nbt); 71 + *///?} 72 + player.getInventory().setItem(slot, newStack); 73 + } 74 + } 75 + }
+53
src/main/java/net/lerariemann/infinity/registry/payload/c2s/JukeboxesC2SPayload.java
···
··· 1 + package net.lerariemann.infinity.registry.payload.c2s; 2 + 3 + //? if >1.21 { 4 + import net.minecraft.network.RegistryFriendlyByteBuf; 5 + import net.minecraft.network.codec.ByteBufCodecs; 6 + import net.minecraft.network.codec.StreamCodec; 7 + import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 8 + import net.lerariemann.infinity.util.InfinityMethods; 9 + import org.jetbrains.annotations.NotNull; 10 + //?} else { 11 + /*import net.minecraft.network.FriendlyByteBuf; 12 + import net.fabricmc.fabric.api.networking.v1.PacketSender; 13 + import net.fabricmc.fabric.api.networking.v1.PacketType; 14 + *///?} 15 + import net.minecraft.nbt.CompoundTag; 16 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 17 + import net.lerariemann.infinity.util.config.SoundScanner; 18 + import net.minecraft.resources.ResourceLocation; 19 + import net.minecraft.server.level.ServerPlayer; 20 + 21 + import static net.lerariemann.infinity.util.InfinityMethods.getId; 22 + 23 + public record JukeboxesC2SPayload(CompoundTag data) implements FriendlyPacket.C2S { 24 + public static ResourceLocation sid = getId("upload_jukeboxes"); 25 + //? if >1.21 { 26 + 27 + public static final Type<JukeboxesC2SPayload> ID = new Type<>(InfinityMethods.getId("upload_jukeboxes")); 28 + public static final StreamCodec<RegistryFriendlyByteBuf, JukeboxesC2SPayload> CODEC = StreamCodec.composite( 29 + ByteBufCodecs.COMPOUND_TAG, JukeboxesC2SPayload::data, JukeboxesC2SPayload::new); 30 + @Override 31 + public @NotNull Type<? extends CustomPacketPayload> type() { 32 + return ID; 33 + } 34 + //?} else { 35 + /*@Override 36 + public void write(FriendlyByteBuf buf) { 37 + buf.writeNbt(data); 38 + } 39 + public static PacketType<JukeboxesC2SPayload> type = 40 + PacketType.create(sid, buf -> new JukeboxesC2SPayload(buf.readNbt())); 41 + @Override 42 + public PacketType<?> getType() { 43 + return type; 44 + } 45 + public static void receive(JukeboxesC2SPayload packet, ServerPlayer player, PacketSender responseSender) { 46 + packet.receive(player); 47 + } 48 + *///?} 49 + @Override 50 + public void receive(ServerPlayer player) { 51 + SoundScanner.unpackUploadedJukeboxes(player.level().getServer(), data); 52 + } 53 + }
+55
src/main/java/net/lerariemann/infinity/registry/payload/s2c/BiomeAddS2CPayload.java
···
··· 1 + package net.lerariemann.infinity.registry.payload.s2c; 2 + 3 + //? if >1.21 { 4 + import org.jetbrains.annotations.NotNull; 5 + import net.minecraft.network.RegistryFriendlyByteBuf; 6 + import net.minecraft.network.codec.ByteBufCodecs; 7 + import net.minecraft.network.codec.StreamCodec; 8 + import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 9 + //?} else { 10 + /*import net.minecraft.network.FriendlyByteBuf; 11 + import net.minecraft.client.multiplayer.ClientPacketListener; 12 + import net.fabricmc.fabric.api.networking.v1.PacketSender; 13 + import net.fabricmc.fabric.api.networking.v1.PacketType; 14 + *///?} 15 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 16 + import net.lerariemann.infinity.util.loading.DimensionGrabber; 17 + import net.minecraft.client.Minecraft; 18 + import net.minecraft.core.registries.Registries; 19 + import net.minecraft.nbt.CompoundTag; 20 + import net.minecraft.resources.ResourceLocation; 21 + import net.minecraft.world.level.biome.Biome; 22 + 23 + import static net.lerariemann.infinity.util.InfinityMethods.getId; 24 + 25 + public record BiomeAddS2CPayload(ResourceLocation id, CompoundTag data) implements FriendlyPacket.S2C { 26 + public static ResourceLocation sid = getId("add_biome"); 27 + //? if >1.21 { 28 + public static final Type<BiomeAddS2CPayload> ID = new Type<>(sid); 29 + public static final StreamCodec<RegistryFriendlyByteBuf, BiomeAddS2CPayload> CODEC = StreamCodec.composite( 30 + ResourceLocation.STREAM_CODEC, BiomeAddS2CPayload::id, 31 + ByteBufCodecs.COMPOUND_TAG, BiomeAddS2CPayload::data, 32 + BiomeAddS2CPayload::new); 33 + @Override 34 + public @NotNull Type<? extends CustomPacketPayload> type() { 35 + return ID; 36 + } 37 + //?} else { 38 + /*public void write(FriendlyByteBuf buf) { 39 + buf.writeResourceLocation(id); 40 + buf.writeNbt(data); 41 + } 42 + public static PacketType<BiomeAddS2CPayload> type = 43 + PacketType.create(sid, buf -> new BiomeAddS2CPayload(buf.readResourceLocation(), buf.readNbt())); 44 + @Override 45 + public PacketType<?> getType() { 46 + return type; 47 + } 48 + public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { 49 + type.read(buf).receive(client); 50 + } 51 + *///?} 52 + public void receive(Minecraft client) { 53 + client.execute(() -> DimensionGrabber.grabObjectForClient(client, Biome.DIRECT_CODEC, Registries.BIOME, id, data)); 54 + } 55 + }
+41
src/main/java/net/lerariemann/infinity/registry/payload/s2c/PlayJukeboxS2CPayload.java
···
··· 1 + package net.lerariemann.infinity.registry.payload.s2c; 2 + 3 + //? if <1.21 { 4 + /*import net.lerariemann.infinity.access.WorldRendererAccess; 5 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 6 + import net.lerariemann.infinity.util.InfinityMethods; 7 + import net.minecraft.client.Minecraft; 8 + import net.minecraft.core.BlockPos; 9 + import net.minecraft.network.FriendlyByteBuf; 10 + import net.minecraft.client.multiplayer.ClientPacketListener; 11 + import net.fabricmc.fabric.api.networking.v1.PacketSender; 12 + import net.fabricmc.fabric.api.networking.v1.PacketType; 13 + import net.minecraft.resources.ResourceLocation; 14 + import net.minecraft.sounds.SoundEvent; 15 + 16 + import static net.lerariemann.infinity.util.InfinityMethods.getId; 17 + 18 + public record PlayJukeboxS2CPayload(BlockPos pos, String soundEvent, String caption) implements FriendlyPacket.S2C { 19 + public static ResourceLocation sid = getId("play_jukebox"); 20 + @Override 21 + public void write(FriendlyByteBuf buf) { 22 + buf.writeBlockPos(pos); 23 + buf.writeUtf(soundEvent); 24 + buf.writeUtf(caption); 25 + } 26 + public static PacketType<PlayJukeboxS2CPayload> type = 27 + PacketType.create(sid, buf -> new PlayJukeboxS2CPayload(buf.readBlockPos(), buf.readUtf(), buf.readUtf())); 28 + @Override 29 + public PacketType<?> getType() { 30 + return type; 31 + } 32 + public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { 33 + type.read(buf).receive(client); 34 + } 35 + @Override 36 + public void receive(Minecraft client) { 37 + ((WorldRendererAccess)client.levelRenderer).infinity$playMusic( 38 + pos, SoundEvent.createVariableRangeEvent(InfinityMethods.getId(soundEvent)), caption); 39 + } 40 + } 41 + *///?}
+80
src/main/java/net/lerariemann/infinity/registry/payload/s2c/ShaderS2CPayload.java
···
··· 1 + package net.lerariemann.infinity.registry.payload.s2c; 2 + 3 + 4 + //? if >1.21 { 5 + import org.jetbrains.annotations.NotNull; 6 + import net.minecraft.network.RegistryFriendlyByteBuf; 7 + import net.minecraft.network.codec.ByteBufCodecs; 8 + import net.minecraft.network.codec.StreamCodec; 9 + import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 10 + //?} else { 11 + /*import net.minecraft.network.FriendlyByteBuf; 12 + import net.minecraft.client.multiplayer.ClientPacketListener; 13 + import net.fabricmc.fabric.api.networking.v1.PacketSender; 14 + import net.fabricmc.fabric.api.networking.v1.PacketType; 15 + *///?} 16 + import net.lerariemann.infinity.access.InfinityOptionsAccess; 17 + import net.lerariemann.infinity.iridescence.Iridescence; 18 + import net.lerariemann.infinity.options.InfinityOptions; 19 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 20 + import net.lerariemann.infinity.util.loading.ShaderLoader; 21 + import net.minecraft.client.Minecraft; 22 + import net.minecraft.nbt.CompoundTag; 23 + import net.minecraft.resources.ResourceLocation; 24 + import net.minecraft.server.level.ServerLevel; 25 + import net.minecraft.server.level.ServerPlayer; 26 + 27 + import static net.lerariemann.infinity.util.InfinityMethods.getId; 28 + 29 + public record ShaderS2CPayload(boolean iridescence, CompoundTag data) implements FriendlyPacket.S2C { 30 + public static ResourceLocation sid = getId("reload_shader"); 31 + //? if >1.21 { 32 + 33 + public static final Type<ShaderS2CPayload> ID = new Type<>(sid); 34 + public static final StreamCodec<RegistryFriendlyByteBuf, ShaderS2CPayload> CODEC = StreamCodec.composite( 35 + ByteBufCodecs.BOOL, ShaderS2CPayload::iridescence, 36 + ByteBufCodecs.COMPOUND_TAG, ShaderS2CPayload::data, 37 + ShaderS2CPayload::new); 38 + @Override 39 + public @NotNull Type<? extends CustomPacketPayload> type() { 40 + return ID; 41 + } 42 + //?} else { 43 + /*public void write(FriendlyByteBuf buf) { 44 + buf.writeBoolean(iridescence); 45 + buf.writeNbt(data); 46 + } 47 + public static PacketType<ShaderS2CPayload> type = 48 + PacketType.create(sid, buf -> new ShaderS2CPayload(buf.readBoolean(), buf.readNbt())); 49 + @Override 50 + public PacketType<?> getType() { 51 + return type; 52 + } 53 + public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { 54 + type.read(buf).receive(client); 55 + } 56 + *///?} 57 + @Override 58 + public void receive(Minecraft client) { 59 + InfinityOptions options = new InfinityOptions(data); 60 + ((InfinityOptionsAccess)client).infinity$setOptions(options); 61 + client.execute(() -> ShaderLoader.reloadShaders(client, options.getShader(), iridescence)); 62 + } 63 + 64 + public static void sendTo(ServerPlayer player) { 65 + sendTo(player, 66 + //? if >1.21.2 { 67 + player.level() 68 + //?} else { 69 + /*player.serverLevel() 70 + *///?} 71 + , Iridescence.shouldApplyShader(player)); 72 + } 73 + public static void sendTo(ServerPlayer player, ServerLevel world) { 74 + sendTo(player, world, Iridescence.shouldApplyShader(player)); 75 + } 76 + public static void sendTo(ServerPlayer player, ServerLevel world, boolean iridescence) { 77 + new ShaderS2CPayload(iridescence, 78 + world == null ? new CompoundTag() : InfinityOptions.access(world).data()).send(player); 79 + } 80 + }
+53
src/main/java/net/lerariemann/infinity/registry/payload/s2c/SoundPackS2CPayload.java
···
··· 1 + package net.lerariemann.infinity.registry.payload.s2c; 2 + 3 + //? if >1.21 { 4 + import org.jetbrains.annotations.NotNull; 5 + import net.minecraft.network.RegistryFriendlyByteBuf; 6 + import net.minecraft.network.codec.ByteBufCodecs; 7 + import net.minecraft.network.codec.StreamCodec; 8 + import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 9 + //?} else { 10 + /*import net.minecraft.network.FriendlyByteBuf; 11 + import net.minecraft.client.multiplayer.ClientPacketListener; 12 + import net.fabricmc.fabric.api.networking.v1.PacketSender; 13 + import net.fabricmc.fabric.api.networking.v1.PacketType; 14 + *///?} 15 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 16 + import net.lerariemann.infinity.util.config.SoundScanner; 17 + import net.minecraft.client.Minecraft; 18 + import net.minecraft.nbt.CompoundTag; 19 + import net.minecraft.resources.ResourceLocation; 20 + 21 + import static net.lerariemann.infinity.util.InfinityMethods.getId; 22 + 23 + public record SoundPackS2CPayload(CompoundTag songIds) implements FriendlyPacket.S2C { 24 + public static ResourceLocation sid = getId("download_sound_pack"); 25 + //? if >1.21 { 26 + 27 + public static final Type<SoundPackS2CPayload> ID = new Type<>(sid); 28 + public static final StreamCodec<RegistryFriendlyByteBuf, SoundPackS2CPayload> CODEC = StreamCodec.composite( 29 + ByteBufCodecs.COMPOUND_TAG, SoundPackS2CPayload::songIds, SoundPackS2CPayload::new); 30 + @Override 31 + public @NotNull Type<? extends CustomPacketPayload> type() { 32 + return ID; 33 + } 34 + //?} else { 35 + /*@Override 36 + public void write(FriendlyByteBuf buf) { 37 + buf.writeNbt(songIds); 38 + } 39 + public static PacketType<SoundPackS2CPayload> type = 40 + PacketType.create(sid, buf -> new SoundPackS2CPayload(buf.readNbt())); 41 + @Override 42 + public PacketType<?> getType() { 43 + return type; 44 + } 45 + public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { 46 + type.read(buf).receive(client); 47 + } 48 + *///?} 49 + @Override 50 + public void receive(Minecraft client) { 51 + SoundScanner.unpackDownloadedPack(songIds, client); 52 + } 53 + }
+55
src/main/java/net/lerariemann/infinity/registry/payload/s2c/StarsS2CPayload.java
···
··· 1 + package net.lerariemann.infinity.registry.payload.s2c; 2 + 3 + //? if >1.21 { 4 + import org.jetbrains.annotations.NotNull; 5 + import net.minecraft.network.RegistryFriendlyByteBuf; 6 + import net.minecraft.network.codec.StreamCodec; 7 + import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 8 + //?} else { 9 + /*import net.minecraft.network.FriendlyByteBuf; 10 + import net.minecraft.client.multiplayer.ClientPacketListener; 11 + import net.fabricmc.fabric.api.networking.v1.PacketSender; 12 + import net.fabricmc.fabric.api.networking.v1.PacketType; 13 + *///?} 14 + import net.lerariemann.infinity.access.WorldRendererAccess; 15 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 16 + import net.minecraft.client.Minecraft; 17 + import net.minecraft.resources.ResourceLocation; 18 + import net.minecraft.server.level.ServerPlayer; 19 + 20 + import static net.lerariemann.infinity.util.InfinityMethods.getId; 21 + 22 + public record StarsS2CPayload() implements FriendlyPacket.S2C { 23 + public static ResourceLocation sid = getId("reload_stars"); 24 + public static final StarsS2CPayload INSTANCE = new StarsS2CPayload(); 25 + //? if >1.21 { 26 + 27 + public static final Type<StarsS2CPayload> ID = new Type<>(sid); 28 + public static final StreamCodec<RegistryFriendlyByteBuf, StarsS2CPayload> CODEC = StreamCodec.unit(INSTANCE); 29 + @Override 30 + public @NotNull Type<? extends CustomPacketPayload> type() { 31 + return ID; 32 + } 33 + //?} else { 34 + /*@Override 35 + public void write(FriendlyByteBuf buf) { 36 + } 37 + public static PacketType<StarsS2CPayload> type = 38 + PacketType.create(sid, buf -> INSTANCE); 39 + @Override 40 + public PacketType<?> getType() { 41 + return type; 42 + } 43 + public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { 44 + type.read(buf).receive(client); 45 + } 46 + *///?} 47 + @Override 48 + public void receive(Minecraft client) { 49 + client.execute(() -> ((WorldRendererAccess)(client.levelRenderer)).infinity$setNeedsStars(true)); 50 + } 51 + 52 + public static void sendTo(ServerPlayer player) { 53 + StarsS2CPayload.INSTANCE.send(player); 54 + } 55 + }
+56
src/main/java/net/lerariemann/infinity/registry/payload/s2c/WorldAddS2CPayload.java
···
··· 1 + package net.lerariemann.infinity.registry.payload.s2c; 2 + 3 + 4 + //? if >1.21 { 5 + import org.jetbrains.annotations.NotNull; 6 + import net.minecraft.network.RegistryFriendlyByteBuf; 7 + import net.minecraft.network.codec.ByteBufCodecs; 8 + import net.minecraft.network.codec.StreamCodec; 9 + import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 10 + //?} else { 11 + /*import net.minecraft.network.FriendlyByteBuf; 12 + import net.minecraft.client.multiplayer.ClientPacketListener; 13 + import net.fabricmc.fabric.api.networking.v1.PacketSender; 14 + import net.fabricmc.fabric.api.networking.v1.PacketType; 15 + *///?} 16 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 17 + import net.lerariemann.infinity.util.loading.DimensionGrabber; 18 + import net.minecraft.client.Minecraft; 19 + import net.minecraft.core.registries.Registries; 20 + import net.minecraft.nbt.CompoundTag; 21 + import net.minecraft.resources.ResourceLocation; 22 + import net.minecraft.world.level.dimension.DimensionType; 23 + 24 + import static net.lerariemann.infinity.util.InfinityMethods.getId; 25 + 26 + public record WorldAddS2CPayload(ResourceLocation id, CompoundTag data) implements FriendlyPacket.S2C { 27 + public static ResourceLocation sid = getId("add_world"); 28 + //? if >1.21 { 29 + public static final Type<WorldAddS2CPayload> ID = new Type<>(sid); 30 + public static final StreamCodec<RegistryFriendlyByteBuf, WorldAddS2CPayload> CODEC = StreamCodec.composite( 31 + ResourceLocation.STREAM_CODEC, WorldAddS2CPayload::id, 32 + ByteBufCodecs.COMPOUND_TAG, WorldAddS2CPayload::data, 33 + WorldAddS2CPayload::new); 34 + @Override 35 + public @NotNull Type<? extends CustomPacketPayload> type() { 36 + return ID; 37 + } 38 + //?} else { 39 + /*public void write(FriendlyByteBuf buf) { 40 + buf.writeResourceLocation(id); 41 + buf.writeNbt(data); 42 + } 43 + public static PacketType<WorldAddS2CPayload> type = 44 + PacketType.create(sid, buf -> new WorldAddS2CPayload(buf.readResourceLocation(), buf.readNbt())); 45 + @Override 46 + public PacketType<?> getType() { 47 + return type; 48 + } 49 + public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { 50 + type.read(buf).receive(client); 51 + } 52 + *///?} 53 + public void receive(Minecraft client) { 54 + client.execute(() -> DimensionGrabber.grabObjectForClient(client, DimensionType.DIRECT_CODEC, Registries.DIMENSION_TYPE, id, data)); 55 + } 56 + }
+78 -33
src/main/java/net/lerariemann/infinity/registry/var/ModCommands.java
··· 2 3 import com.mojang.brigadier.arguments.IntegerArgumentType; 4 import com.mojang.brigadier.arguments.StringArgumentType; 5 import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; 6 import dev.architectury.event.events.common.CommandRegistrationEvent; 7 import net.lerariemann.infinity.compat.ModCompat; 8 import net.lerariemann.infinity.util.InfinityMethods; 9 - import net.lerariemann.infinity.util.platform.InfinityPlatform; 10 import net.lerariemann.infinity.util.teleport.WarpLogic; 11 import net.minecraft.commands.Commands; 12 import net.minecraft.commands.arguments.DimensionArgument; 13 import net.minecraft.network.chat.Component; 14 import net.minecraft.resources.ResourceLocation; 15 import java.util.Random; 16 17 import static net.minecraft.commands.Commands.argument; ··· 43 CommandRegistrationEvent.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal(warp) 44 .requires(source -> source.hasPermission(2)) 45 .then( 46 - Commands.literal("random").executes((context -> { 47 - final long text = InfinityMethods.getRandomSeed(new Random()); 48 - WarpLogic.requestWarpById(context, text); 49 - return 1; 50 - })) 51 - ) 52 - .then( 53 - Commands.literal("existing").then( 54 - argument("existing", DimensionArgument.dimension()).executes(context -> { 55 - final ResourceLocation identifier = context.getArgument("existing", ResourceLocation.class); 56 - WarpLogic.requestWarpToExisting(context, identifier); 57 - return 1; 58 - }) 59 - ) 60 - ) 61 - .then( 62 - Commands.literal("id").then( 63 - argument("id", IntegerArgumentType.integer()) 64 - .executes(context -> { 65 - final int value = IntegerArgumentType.getInteger(context, "id"); 66 - WarpLogic.requestWarpById(context, value); 67 - return 1; 68 - }) 69 - ) 70 - ) 71 - .then( 72 - argument("text", StringArgumentType.string()) 73 - .executes(context -> { 74 - final String text = StringArgumentType.getString( context, "text"); 75 - WarpLogic.requestWarpByText(context, text); 76 - return 1; 77 - }) 78 ) 79 )); 80 CommandRegistrationEvent.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("respawn") 81 .requires(source -> source.hasPermission(2)).executes(context -> { ··· 83 return 1; 84 }))); 85 } 86 }
··· 2 3 import com.mojang.brigadier.arguments.IntegerArgumentType; 4 import com.mojang.brigadier.arguments.StringArgumentType; 5 + import com.mojang.brigadier.builder.LiteralArgumentBuilder; 6 + import com.mojang.brigadier.builder.RequiredArgumentBuilder; 7 + import com.mojang.brigadier.context.CommandContext; 8 + import com.mojang.brigadier.exceptions.CommandSyntaxException; 9 import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; 10 import dev.architectury.event.events.common.CommandRegistrationEvent; 11 import net.lerariemann.infinity.compat.ModCompat; 12 import net.lerariemann.infinity.util.InfinityMethods; 13 import net.lerariemann.infinity.util.teleport.WarpLogic; 14 + import net.minecraft.commands.CommandSourceStack; 15 import net.minecraft.commands.Commands; 16 import net.minecraft.commands.arguments.DimensionArgument; 17 + import net.minecraft.commands.arguments.EntityArgument; 18 import net.minecraft.network.chat.Component; 19 import net.minecraft.resources.ResourceLocation; 20 + import net.minecraft.server.level.ServerPlayer; 21 + 22 + import java.util.Collection; 23 + import java.util.Collections; 24 import java.util.Random; 25 26 import static net.minecraft.commands.Commands.argument; ··· 52 CommandRegistrationEvent.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal(warp) 53 .requires(source -> source.hasPermission(2)) 54 .then( 55 + Commands.argument("targets", EntityArgument.players()) 56 + .then(randomArgument(true)) 57 + .then(existingArgument(true)) 58 + .then(idArgument(true)) 59 + .then(textArgument(true)) 60 ) 61 + .then(randomArgument(false)) 62 + .then(existingArgument(false)) 63 + .then(idArgument(false)) 64 + .then(textArgument(false)) 65 )); 66 CommandRegistrationEvent.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(literal("respawn") 67 .requires(source -> source.hasPermission(2)).executes(context -> { ··· 69 return 1; 70 }))); 71 } 72 + 73 + private static RequiredArgumentBuilder<CommandSourceStack, String> textArgument(boolean b) { 74 + return argument("text", StringArgumentType.string()) 75 + .executes(context -> { 76 + final String text = StringArgumentType.getString(context, "text"); 77 + WarpLogic.requestWarpByText(context, players(b, context), text); 78 + return 1; 79 + }); 80 + } 81 + 82 + private static LiteralArgumentBuilder<CommandSourceStack> idArgument(boolean b) { 83 + return Commands.literal("id").then( 84 + argument("id", IntegerArgumentType.integer()) 85 + .executes(context -> { 86 + final int value = IntegerArgumentType.getInteger(context, "id"); 87 + WarpLogic.requestWarpById(players(b, context), value); 88 + return 1; 89 + }) 90 + ); 91 + } 92 + 93 + private static LiteralArgumentBuilder<CommandSourceStack> existingArgument(boolean b) { 94 + return Commands.literal("existing").then( 95 + argument("existing", DimensionArgument.dimension()).executes(context -> { 96 + final ResourceLocation identifier = context.getArgument("existing", ResourceLocation.class); 97 + WarpLogic.requestWarpToExisting(context, players(b, context), identifier); 98 + return 1; 99 + }) 100 + ); 101 + } 102 + 103 + private static LiteralArgumentBuilder<CommandSourceStack> randomArgument(boolean b) { 104 + return Commands.literal("random").executes((context -> { 105 + final long text = InfinityMethods.getRandomSeed(new Random()); 106 + Collection<ServerPlayer> players = players(b, context); 107 + WarpLogic.requestWarpById(players, text); 108 + return 1; 109 + })); 110 + } 111 + 112 + private static Collection<ServerPlayer> players(boolean hasPlayerArgument, CommandContext<CommandSourceStack> context) { 113 + if (hasPlayerArgument) { 114 + return players(context); 115 + } else { 116 + return player(context); 117 + } 118 + } 119 + 120 + private static Collection<ServerPlayer> player(CommandContext<CommandSourceStack> context) { 121 + return Collections.singleton(context.getSource().getPlayer()); 122 + } 123 + 124 + private static Collection<ServerPlayer> players(CommandContext<CommandSourceStack> context) { 125 + try { 126 + return EntityArgument.getPlayers(context, "targets"); 127 + } catch (CommandSyntaxException e) { 128 + return Collections.singleton(context.getSource().getPlayer()); 129 + } 130 + } 131 }
+22 -23
src/main/java/net/lerariemann/infinity/registry/var/ModItemGroups.java
··· 14 import net.minecraft.world.item.CreativeModeTabs; 15 import net.minecraft.world.item.Item; 16 //? if neoforge { 17 - import net.neoforged.bus.api.SubscribeEvent; 18 import net.neoforged.fml.common.EventBusSubscriber; 19 import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; 20 @EventBusSubscriber 21 - //?} else if forge { 22 /*import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; 23 import net.minecraftforge.eventbus.api.SubscribeEvent; 24 import net.minecraftforge.fml.common.Mod; 25 @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) 26 *///?} else { 27 - /*import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroupEntries; 28 - *///?} 29 30 public class ModItemGroups { 31 32 public static void addAfter( 33 //? forge || neoforge { 34 - BuildCreativeModeTabContentsEvent 35 - //?} else { 36 - /*FabricItemGroupEntries 37 - *///?} 38 event, Item itemBefore, Item itemAfter) { 39 //? if neoforge { 40 - event.insertAfter(itemBefore.getDefaultInstance(), itemAfter.getDefaultInstance(), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); 41 - //?} else if fabric { 42 - /*event.addAfter(itemBefore, itemAfter); 43 - *///?} else { 44 /*event.accept(itemAfter.getDefaultInstance(), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); 45 *///?} 46 } 47 public static void addAfter( 48 //? forge || neoforge { 49 - BuildCreativeModeTabContentsEvent 50 - //?} else { 51 - /*FabricItemGroupEntries 52 - *///?} 53 event, Item itemBefore) { 54 event.accept(itemBefore); 55 } 56 57 //MyItemsClass.MY_ITEM is a Supplier<? extends Item>, MyBlocksClass.MY_BLOCK is a Supplier<? extends Block> 58 //? forge || neoforge { 59 - @SubscribeEvent 60 public static void buildContents(BuildCreativeModeTabContentsEvent event) { 61 buildContents(event.getTabKey(), event); 62 } 63 - //?} 64 65 public static void buildContents( 66 //? forge || neoforge { 67 - ResourceKey<CreativeModeTab> creativeModeTab, BuildCreativeModeTabContentsEvent 68 - //?} else { 69 - /*CreativeModeTab creativeModeTab, FabricItemGroupEntries 70 - *///?} 71 event) { 72 // Is this the tab we want to add to? 73 if (equals(creativeModeTab, CreativeModeTabs.BUILDING_BLOCKS)) { ··· 78 addAfter(event, LECTERN, ModItems.ALTAR_ITEM.get()); 79 addAfter(event, LODESTONE, ModItems.ANT_ITEM.get()); 80 addAfter(event, CHISELED_BOOKSHELF, ModItems.BOOK_BOX_ITEM.get()); 81 - addAfter(event, NOTE_BLOCK, ModItems.NOTES_BLOCK_ITEM.get()); 82 addAfter(event, VAULT, ModItems.TIME_BOMB_ITEM.get()); 83 } else if (equals(creativeModeTab, CreativeModeTabs.INGREDIENTS)) { 84 addAfter(event, DISC_FRAGMENT_5, ModItems.FOOTPRINT.get());
··· 14 import net.minecraft.world.item.CreativeModeTabs; 15 import net.minecraft.world.item.Item; 16 //? if neoforge { 17 + /*import net.neoforged.bus.api.SubscribeEvent; 18 import net.neoforged.fml.common.EventBusSubscriber; 19 import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; 20 @EventBusSubscriber 21 + *///?} else if forge { 22 /*import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; 23 import net.minecraftforge.eventbus.api.SubscribeEvent; 24 import net.minecraftforge.fml.common.Mod; 25 @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) 26 *///?} else { 27 + import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroupEntries; 28 + //?} 29 30 public class ModItemGroups { 31 32 public static void addAfter( 33 //? forge || neoforge { 34 + /*BuildCreativeModeTabContentsEvent 35 + *///?} else { 36 + FabricItemGroupEntries 37 + //?} 38 event, Item itemBefore, Item itemAfter) { 39 //? if neoforge { 40 + /*event.insertAfter(itemBefore.getDefaultInstance(), itemAfter.getDefaultInstance(), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); 41 + *///?} else if fabric { 42 + event.addAfter(itemBefore, itemAfter); 43 + //?} else { 44 /*event.accept(itemAfter.getDefaultInstance(), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); 45 *///?} 46 } 47 public static void addAfter( 48 //? forge || neoforge { 49 + /*BuildCreativeModeTabContentsEvent 50 + *///?} else { 51 + FabricItemGroupEntries 52 + //?} 53 event, Item itemBefore) { 54 event.accept(itemBefore); 55 } 56 57 //MyItemsClass.MY_ITEM is a Supplier<? extends Item>, MyBlocksClass.MY_BLOCK is a Supplier<? extends Block> 58 //? forge || neoforge { 59 + /*@SubscribeEvent 60 public static void buildContents(BuildCreativeModeTabContentsEvent event) { 61 buildContents(event.getTabKey(), event); 62 } 63 + *///?} 64 65 public static void buildContents( 66 //? forge || neoforge { 67 + /*ResourceKey<CreativeModeTab> creativeModeTab, BuildCreativeModeTabContentsEvent 68 + *///?} else { 69 + CreativeModeTab creativeModeTab, FabricItemGroupEntries 70 + //?} 71 event) { 72 // Is this the tab we want to add to? 73 if (equals(creativeModeTab, CreativeModeTabs.BUILDING_BLOCKS)) { ··· 78 addAfter(event, LECTERN, ModItems.ALTAR_ITEM.get()); 79 addAfter(event, LODESTONE, ModItems.ANT_ITEM.get()); 80 addAfter(event, CHISELED_BOOKSHELF, ModItems.BOOK_BOX_ITEM.get()); 81 addAfter(event, VAULT, ModItems.TIME_BOMB_ITEM.get()); 82 } else if (equals(creativeModeTab, CreativeModeTabs.INGREDIENTS)) { 83 addAfter(event, DISC_FRAGMENT_5, ModItems.FOOTPRINT.get());
+27 -4
src/main/java/net/lerariemann/infinity/registry/var/ModMaterialConditions.java
··· 4 import com.mojang.serialization.MapCodec; 5 import com.mojang.serialization.codecs.RecordCodecBuilder; 6 import dev.architectury.registry.registries.DeferredRegister; 7 import net.lerariemann.infinity.util.var.TextData; 8 import net.minecraft.MethodsReturnNonnullByDefault; 9 import net.minecraft.core.registries.Registries; 10 import net.minecraft.util.KeyDispatchDataCodec; 11 import net.minecraft.world.level.levelgen.SurfaceRules; 12 import net.lerariemann.infinity.mixin.core.MaterialRuleContextAccess; 13 14 import java.util.*; 15 16 import static net.lerariemann.infinity.InfinityMod.MOD_ID; 17 18 @MethodsReturnNonnullByDefault ··· 89 } 90 } 91 92 - public record TextCondition(int font_size, int char_spacing, int line_spacing, int max_width, String text, TextData data) implements SurfaceRules.ConditionSource 93 { 94 public static final KeyDispatchDataCodec<TextCondition> CODEC = KeyDispatchDataCodec.of(RecordCodecBuilder.mapCodec(instance -> instance.group( 95 (Codec.INT.fieldOf("font_size").orElse(1).forGetter(a -> a.font_size)), 96 (Codec.INT.fieldOf("char_spacing").orElse(1).forGetter(a -> a.char_spacing)), 97 (Codec.INT.fieldOf("line_spacing").orElse(1).forGetter(a -> a.line_spacing)), 98 (Codec.INT.fieldOf("max_width").orElse(Integer.MAX_VALUE).forGetter(a -> a.max_width)), 99 (Codec.STRING.fieldOf("text").forGetter(a -> a.text)) 100 - ).apply(instance, (font_size, char_spacing, line_spacing, max_width, text) -> 101 - new TextCondition(font_size, char_spacing, line_spacing, max_width, text, 102 - TextData.genData(char_spacing, max_width, text))))); 103 104 public int find(int x, int line_num) { 105 int char_num = Collections.binarySearch(data.offsetMap().get(line_num), x);
··· 4 import com.mojang.serialization.MapCodec; 5 import com.mojang.serialization.codecs.RecordCodecBuilder; 6 import dev.architectury.registry.registries.DeferredRegister; 7 + import net.lerariemann.infinity.InfinityMod; 8 + import net.lerariemann.infinity.util.core.CommonIO; 9 import net.lerariemann.infinity.util.var.TextData; 10 import net.minecraft.MethodsReturnNonnullByDefault; 11 import net.minecraft.core.registries.Registries; 12 import net.minecraft.util.KeyDispatchDataCodec; 13 import net.minecraft.world.level.levelgen.SurfaceRules; 14 import net.lerariemann.infinity.mixin.core.MaterialRuleContextAccess; 15 + import org.apache.commons.io.FileUtils; 16 17 + import java.io.File; 18 + import java.io.IOException; 19 + import java.nio.charset.StandardCharsets; 20 import java.util.*; 21 22 + import static net.lerariemann.infinity.InfinityMod.LOGGER; 23 import static net.lerariemann.infinity.InfinityMod.MOD_ID; 24 25 @MethodsReturnNonnullByDefault ··· 96 } 97 } 98 99 + public record TextCondition(int font_size, int char_spacing, int line_spacing, int max_width, boolean read_from_file, 100 + String text, TextData data) implements SurfaceRules.ConditionSource 101 { 102 public static final KeyDispatchDataCodec<TextCondition> CODEC = KeyDispatchDataCodec.of(RecordCodecBuilder.mapCodec(instance -> instance.group( 103 (Codec.INT.fieldOf("font_size").orElse(1).forGetter(a -> a.font_size)), 104 (Codec.INT.fieldOf("char_spacing").orElse(1).forGetter(a -> a.char_spacing)), 105 (Codec.INT.fieldOf("line_spacing").orElse(1).forGetter(a -> a.line_spacing)), 106 (Codec.INT.fieldOf("max_width").orElse(Integer.MAX_VALUE).forGetter(a -> a.max_width)), 107 + (Codec.BOOL.fieldOf("read_from_file").orElse(false).forGetter(a -> a.read_from_file)), 108 (Codec.STRING.fieldOf("text").forGetter(a -> a.text)) 109 + ).apply(instance, TextCondition::of))); 110 + 111 + static TextCondition of(int font_size, int char_spacing, int line_spacing, int max_width, boolean read_from_file, String text) { 112 + String txt = text; 113 + if (read_from_file) { 114 + File file = InfinityMod.configPath.resolve(text).toFile(); 115 + if (file.exists()) { 116 + try { 117 + txt = FileUtils.readFileToString(file, StandardCharsets.UTF_8); 118 + txt = txt.replace("\n", "$n"); 119 + } catch (IOException ignored) { 120 + } 121 + } 122 + } 123 + return new TextCondition(font_size, char_spacing, line_spacing, max_width, read_from_file, txt, 124 + TextData.genData(char_spacing, max_width, txt)); 125 + } 126 127 public int find(int x, int line_num) { 128 int char_num = Collections.binarySearch(data.offsetMap().get(line_num), x);
+52 -2
src/main/java/net/lerariemann/infinity/registry/var/ModMaterialRules.java
··· 4 import com.mojang.serialization.MapCodec; 5 import com.mojang.serialization.codecs.RecordCodecBuilder; 6 import dev.architectury.registry.registries.DeferredRegister; 7 import net.lerariemann.infinity.iridescence.Iridescence; 8 import net.lerariemann.infinity.registry.core.ModBlocks; 9 import net.lerariemann.infinity.util.InfinityMethods; ··· 18 import net.minecraft.util.Mth; 19 import net.minecraft.world.level.block.Blocks; 20 import net.minecraft.world.level.block.LadderBlock; 21 import net.minecraft.world.level.block.state.BlockState; 22 import net.minecraft.world.level.block.state.properties.BlockStateProperties; 23 import net.minecraft.world.level.block.state.properties.Half; 24 import net.minecraft.world.level.levelgen.SurfaceRules; 25 26 //? if neoforge 27 - import javax.annotation.ParametersAreNonnullByDefault; 28 29 import static net.lerariemann.infinity.InfinityMod.MOD_ID; 30 31 @MethodsReturnNonnullByDefault 32 //? if neoforge 33 - @ParametersAreNonnullByDefault 34 public class ModMaterialRules { 35 static int normalize(int x, int size) { 36 int a = Math.abs(x < 0 ? x+1 : x) % size; ··· 94 @Override 95 public SurfaceRules.SurfaceRule apply(SurfaceRules.Context materialRuleContext) { 96 return new RandomColoredBlock(str); 97 } 98 } 99 } ··· 412 public static void registerRules() { 413 register("chaos", RandomBlockMaterialRule.CODEC); 414 register("colored_chaos", RandomColoredBlock.Rule.CODEC); 415 register("library", Library.Rule.CODEC); 416 register("backrooms", Backrooms.Rule.CODEC); 417 register("nexus", Nexus.Rule.CODEC);
··· 4 import com.mojang.serialization.MapCodec; 5 import com.mojang.serialization.codecs.RecordCodecBuilder; 6 import dev.architectury.registry.registries.DeferredRegister; 7 + import net.lerariemann.infinity.InfinityMod; 8 import net.lerariemann.infinity.iridescence.Iridescence; 9 import net.lerariemann.infinity.registry.core.ModBlocks; 10 import net.lerariemann.infinity.util.InfinityMethods; ··· 19 import net.minecraft.util.Mth; 20 import net.minecraft.world.level.block.Blocks; 21 import net.minecraft.world.level.block.LadderBlock; 22 + import net.minecraft.world.level.block.NoteBlock; 23 + import net.minecraft.world.level.block.RedstoneLampBlock; 24 import net.minecraft.world.level.block.state.BlockState; 25 import net.minecraft.world.level.block.state.properties.BlockStateProperties; 26 import net.minecraft.world.level.block.state.properties.Half; 27 + import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; 28 import net.minecraft.world.level.levelgen.SurfaceRules; 29 + import org.jetbrains.annotations.Nullable; 30 31 //? if neoforge 32 + /*import javax.annotation.ParametersAreNonnullByDefault;*/ 33 34 import static net.lerariemann.infinity.InfinityMod.MOD_ID; 35 36 @MethodsReturnNonnullByDefault 37 //? if neoforge 38 + /*@ParametersAreNonnullByDefault*/ 39 public class ModMaterialRules { 40 static int normalize(int x, int size) { 41 int a = Math.abs(x < 0 ? x+1 : x) % size; ··· 99 @Override 100 public SurfaceRules.SurfaceRule apply(SurfaceRules.Context materialRuleContext) { 101 return new RandomColoredBlock(str); 102 + } 103 + } 104 + } 105 + 106 + public static class Notes implements SurfaceRules.SurfaceRule { 107 + @Override 108 + public @Nullable BlockState tryApply(int i, int j, int k) { 109 + NoteBlockInstrument instr = InfinityMethods.getRandomInstrument(); 110 + BlockState bs = Blocks.NOTE_BLOCK.defaultBlockState().setValue(NoteBlock.INSTRUMENT, instr); 111 + if (instr.isTunable()) bs = bs.setValue(NoteBlock.NOTE, InfinityMod.random.nextInt(24)); 112 + return bs; 113 + } 114 + 115 + enum Rule implements SurfaceRules.RuleSource { 116 + INSTANCE; 117 + static final KeyDispatchDataCodec<Rule> CODEC = KeyDispatchDataCodec.of(MapCodec.unit(INSTANCE)); 118 + @Override 119 + public KeyDispatchDataCodec<? extends SurfaceRules.RuleSource> codec() { 120 + return CODEC; 121 + } 122 + @Override 123 + public SurfaceRules.SurfaceRule apply(SurfaceRules.Context materialRuleContext) { 124 + return new Notes(); 125 + } 126 + } 127 + } 128 + 129 + public static class Lamps implements SurfaceRules.SurfaceRule { 130 + @Override 131 + public @Nullable BlockState tryApply(int i, int j, int k) { 132 + return Blocks.REDSTONE_LAMP.defaultBlockState().setValue(RedstoneLampBlock.LIT, InfinityMod.random.nextBoolean()); 133 + } 134 + 135 + enum Rule implements SurfaceRules.RuleSource { 136 + INSTANCE; 137 + static final KeyDispatchDataCodec<Rule> CODEC = KeyDispatchDataCodec.of(MapCodec.unit(INSTANCE)); 138 + @Override 139 + public KeyDispatchDataCodec<? extends SurfaceRules.RuleSource> codec() { 140 + return CODEC; 141 + } 142 + @Override 143 + public SurfaceRules.SurfaceRule apply(SurfaceRules.Context materialRuleContext) { 144 + return new Lamps(); 145 } 146 } 147 } ··· 460 public static void registerRules() { 461 register("chaos", RandomBlockMaterialRule.CODEC); 462 register("colored_chaos", RandomColoredBlock.Rule.CODEC); 463 + register("notes", Notes.Rule.CODEC); 464 + register("lamps", Lamps.Rule.CODEC); 465 register("library", Library.Rule.CODEC); 466 register("backrooms", Backrooms.Rule.CODEC); 467 register("nexus", Nexus.Rule.CODEC);
-400
src/main/java/net/lerariemann/infinity/registry/var/ModPayloads.java
··· 1 - package net.lerariemann.infinity.registry.var; 2 - 3 - import net.lerariemann.infinity.access.InfinityOptionsAccess; 4 - import net.lerariemann.infinity.access.WorldRendererAccess; 5 - import net.lerariemann.infinity.iridescence.Iridescence; 6 - import net.lerariemann.infinity.item.F4Item; 7 - import net.lerariemann.infinity.registry.core.ModComponentTypes; 8 - import net.lerariemann.infinity.registry.core.ModItems; 9 - import net.lerariemann.infinity.util.VersionMethods; 10 - import net.lerariemann.infinity.util.config.SoundScanner; 11 - import net.lerariemann.infinity.util.platform.InfinityPlatform; 12 - import net.lerariemann.infinity.util.loading.DimensionGrabber; 13 - import net.lerariemann.infinity.options.InfinityOptions; 14 - import net.lerariemann.infinity.util.loading.ShaderLoader; 15 - import net.minecraft.client.Minecraft; 16 - import net.minecraft.core.registries.Registries; 17 - import net.minecraft.nbt.CompoundTag; 18 - import net.minecraft.resources.ResourceLocation; 19 - import net.minecraft.server.level.ServerLevel; 20 - import net.minecraft.server.level.ServerPlayer; 21 - import net.minecraft.world.InteractionHand; 22 - import net.minecraft.world.item.ItemStack; 23 - import net.minecraft.world.level.biome.Biome; 24 - import net.minecraft.world.level.dimension.DimensionType; 25 - import static net.lerariemann.infinity.util.InfinityMethods.getId; 26 - 27 - 28 - //? if >1.21 { 29 - 30 - import net.lerariemann.infinity.util.InfinityMethods; 31 - import net.minecraft.world.level.dimension.DimensionType; 32 - import org.jetbrains.annotations.NotNull; 33 - import net.minecraft.core.component.DataComponentMap; 34 - import net.minecraft.network.RegistryFriendlyByteBuf; 35 - import net.minecraft.network.codec.ByteBufCodecs; 36 - import net.minecraft.network.codec.StreamCodec; 37 - import net.minecraft.network.protocol.common.custom.CustomPacketPayload; 38 - //?} else { 39 - /*import net.minecraft.network.FriendlyByteBuf; 40 - import net.minecraft.client.multiplayer.ClientPacketListener; 41 - import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; 42 - import net.fabricmc.fabric.api.networking.v1.FabricPacket; 43 - import net.fabricmc.fabric.api.networking.v1.PacketSender; 44 - import net.fabricmc.fabric.api.networking.v1.PacketType; 45 - import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 46 - *///?} 47 - 48 - import java.nio.file.Path; 49 - 50 - public class ModPayloads { 51 - public static String oldShader = ""; 52 - public interface FriendlyPacket extends 53 - //? if >1.21 { 54 - CustomPacketPayload { 55 - //?} else { 56 - /*FabricPacket { 57 - *///?} 58 - } 59 - 60 - public interface FriendlyPacketS2C extends FriendlyPacket { 61 - void receive(Minecraft client); 62 - 63 - default void send(ServerPlayer player) { 64 - InfinityPlatform.INSTANCE.sendS2CPayload(player, this); 65 - } 66 - } 67 - 68 - public interface FriendlyPacketC2S extends FriendlyPacket { 69 - void receive(ServerPlayer player); 70 - 71 - default void send() { 72 - InfinityPlatform.INSTANCE.sendC2SPayload(this); 73 - } 74 - } 75 - 76 - public record WorldAddS2CPayload(ResourceLocation id, CompoundTag data) implements FriendlyPacketS2C { 77 - static ResourceLocation sid = getId("add_world"); 78 - //? if >1.21 { 79 - 80 - public static final Type<WorldAddS2CPayload> ID = new Type<>(sid); 81 - public static final StreamCodec<RegistryFriendlyByteBuf, WorldAddS2CPayload> CODEC = StreamCodec.composite( 82 - ResourceLocation.STREAM_CODEC, WorldAddS2CPayload::id, 83 - ByteBufCodecs.COMPOUND_TAG, WorldAddS2CPayload::data, 84 - WorldAddS2CPayload::new); 85 - @Override 86 - public @NotNull Type<? extends CustomPacketPayload> type() { 87 - return ID; 88 - } 89 - //?} else { 90 - /*public void write(FriendlyByteBuf buf) { 91 - buf.writeResourceLocation(id); 92 - buf.writeNbt(data); 93 - } 94 - public static PacketType<WorldAddS2CPayload> type = 95 - PacketType.create(sid, buf -> new WorldAddS2CPayload(buf.readResourceLocation(), buf.readNbt())); 96 - @Override 97 - public PacketType<?> getType() { 98 - return type; 99 - } 100 - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { 101 - type.read(buf).receive(client); 102 - } 103 - *///?} 104 - public void receive(Minecraft client) { 105 - client.execute(() -> DimensionGrabber.grabObjectForClient(client, DimensionType.DIRECT_CODEC, Registries.DIMENSION_TYPE, id, data)); 106 - } 107 - } 108 - 109 - public record BiomeAddS2CPayload(ResourceLocation id, CompoundTag data) implements FriendlyPacketS2C { 110 - static ResourceLocation sid = getId("add_biome"); 111 - //? if >1.21 { 112 - 113 - public static final Type<BiomeAddS2CPayload> ID = new Type<>(sid); 114 - public static final StreamCodec<RegistryFriendlyByteBuf, BiomeAddS2CPayload> CODEC = StreamCodec.composite( 115 - ResourceLocation.STREAM_CODEC, BiomeAddS2CPayload::id, 116 - ByteBufCodecs.COMPOUND_TAG, BiomeAddS2CPayload::data, 117 - BiomeAddS2CPayload::new); 118 - @Override 119 - public @NotNull Type<? extends CustomPacketPayload> type() { 120 - return ID; 121 - } 122 - //?} else { 123 - /*public void write(FriendlyByteBuf buf) { 124 - buf.writeResourceLocation(id); 125 - buf.writeNbt(data); 126 - } 127 - public static PacketType<BiomeAddS2CPayload> type = 128 - PacketType.create(sid, buf -> new BiomeAddS2CPayload(buf.readResourceLocation(), buf.readNbt())); 129 - @Override 130 - public PacketType<?> getType() { 131 - return type; 132 - } 133 - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { 134 - type.read(buf).receive(client); 135 - } 136 - *///?} 137 - public void receive(Minecraft client) { 138 - client.execute(() -> DimensionGrabber.grabObjectForClient(client, Biome.DIRECT_CODEC, Registries.BIOME, id, data)); 139 - } 140 - } 141 - 142 - public record ShaderS2CPayload(boolean iridescence, CompoundTag data) implements FriendlyPacketS2C { 143 - static ResourceLocation sid = getId("reload_shader"); 144 - //? if >1.21 { 145 - 146 - public static final Type<ShaderS2CPayload> ID = new Type<>(sid); 147 - public static final StreamCodec<RegistryFriendlyByteBuf, ShaderS2CPayload> CODEC = StreamCodec.composite( 148 - ByteBufCodecs.BOOL, ShaderS2CPayload::iridescence, 149 - ByteBufCodecs.COMPOUND_TAG, ShaderS2CPayload::data, 150 - ShaderS2CPayload::new); 151 - @Override 152 - public @NotNull Type<? extends CustomPacketPayload> type() { 153 - return ID; 154 - } 155 - //?} else { 156 - /*public void write(FriendlyByteBuf buf) { 157 - buf.writeBoolean(iridescence); 158 - buf.writeNbt(data); 159 - } 160 - public static PacketType<ShaderS2CPayload> type = 161 - PacketType.create(sid, buf -> new ShaderS2CPayload(buf.readBoolean(), buf.readNbt())); 162 - @Override 163 - public PacketType<?> getType() { 164 - return type; 165 - } 166 - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { 167 - type.read(buf).receive(client); 168 - } 169 - *///?} 170 - @Override 171 - public void receive(Minecraft client) { 172 - InfinityOptions options = new InfinityOptions(data); 173 - ((InfinityOptionsAccess)client).infinity$setOptions(options); 174 - client.execute(() -> ShaderLoader.reloadShaders(client, options.getShader(), iridescence)); 175 - } 176 - } 177 - 178 - public record StarsS2CPayload() implements FriendlyPacketS2C { 179 - static ResourceLocation sid = getId("reload_stars"); 180 - public static final StarsS2CPayload INSTANCE = new StarsS2CPayload(); 181 - //? if >1.21 { 182 - 183 - public static final Type<StarsS2CPayload> ID = new Type<>(sid); 184 - public static final StreamCodec<RegistryFriendlyByteBuf, StarsS2CPayload> CODEC = StreamCodec.unit(INSTANCE); 185 - @Override 186 - public @NotNull Type<? extends CustomPacketPayload> type() { 187 - return ID; 188 - } 189 - //?} else { 190 - /*@Override 191 - public void write(FriendlyByteBuf buf) { 192 - } 193 - public static PacketType<StarsS2CPayload> type = 194 - PacketType.create(sid, buf -> INSTANCE); 195 - @Override 196 - public PacketType<?> getType() { 197 - return type; 198 - } 199 - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { 200 - type.read(buf).receive(client); 201 - } 202 - *///?} 203 - @Override 204 - public void receive(Minecraft client) { 205 - client.execute(() -> ((WorldRendererAccess)(client.levelRenderer)).infinity$setNeedsStars(true)); 206 - } 207 - } 208 - 209 - public record SoundPackS2CPayload(CompoundTag songIds) implements FriendlyPacketS2C { 210 - static ResourceLocation sid = getId("download_sound_pack"); 211 - //? if >1.21 { 212 - 213 - public static final Type<SoundPackS2CPayload> ID = new Type<>(sid); 214 - public static final StreamCodec<RegistryFriendlyByteBuf, SoundPackS2CPayload> CODEC = StreamCodec.composite( 215 - ByteBufCodecs.COMPOUND_TAG, SoundPackS2CPayload::songIds, SoundPackS2CPayload::new); 216 - @Override 217 - public @NotNull Type<? extends CustomPacketPayload> type() { 218 - return ID; 219 - } 220 - //?} else { 221 - /*@Override 222 - public void write(FriendlyByteBuf buf) { 223 - buf.writeNbt(songIds); 224 - } 225 - public static PacketType<SoundPackS2CPayload> type = 226 - PacketType.create(sid, buf -> new SoundPackS2CPayload(buf.readNbt())); 227 - @Override 228 - public PacketType<?> getType() { 229 - return type; 230 - } 231 - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { 232 - type.read(buf).receive(client); 233 - } 234 - *///?} 235 - @Override 236 - public void receive(Minecraft client) { 237 - SoundScanner.unpackDownloadedPack(songIds, client); 238 - } 239 - } 240 - 241 - public record F4DeployC2SPayload() implements FriendlyPacketC2S { 242 - static ResourceLocation sid = getId("deploy_f4"); 243 - public static final F4DeployC2SPayload INSTANCE = new F4DeployC2SPayload(); 244 - //? if >1.21 { 245 - 246 - public static final Type<F4DeployC2SPayload> ID = new Type<>(sid); 247 - public static final StreamCodec<RegistryFriendlyByteBuf, F4DeployC2SPayload> CODEC = StreamCodec.unit(INSTANCE); 248 - @Override 249 - public @NotNull Type<? extends CustomPacketPayload> type() { 250 - return ID; 251 - } 252 - //?} else { 253 - /*@Override 254 - public void write(FriendlyByteBuf buf) { 255 - } 256 - public static PacketType<F4DeployC2SPayload> type = PacketType.create(sid, buf -> INSTANCE); 257 - @Override 258 - public PacketType<?> getType() { 259 - return type; 260 - } 261 - public static void receive(F4DeployC2SPayload packet, ServerPlayer player, PacketSender responceSenser) { 262 - packet.receive(player); 263 - } 264 - *///?} 265 - @Override 266 - public void receive(ServerPlayer player) { 267 - ItemStack st = player.getItemInHand(InteractionHand.MAIN_HAND); 268 - if (st.is(ModItems.F4.get())) { 269 - var result = F4Item.deploy(player.level(), player, InteractionHand.MAIN_HAND); 270 - var resultItem = VersionMethods.getInteractionHolderResult(result); 271 - if (resultItem != null) 272 - player.setItemInHand(InteractionHand.MAIN_HAND, resultItem); 273 - } 274 - } 275 - } 276 - 277 - public record F4UpdateC2SPayload(int slot, int width, int height) implements FriendlyPacketC2S { 278 - static ResourceLocation sid = getId("update_f4"); 279 - //? if >1.21 { 280 - public static final Type<F4UpdateC2SPayload> ID = new Type<>(InfinityMethods.getId("receive_f4")); 281 - public static final StreamCodec<RegistryFriendlyByteBuf, F4UpdateC2SPayload> CODEC = StreamCodec.composite( 282 - ByteBufCodecs.VAR_INT, F4UpdateC2SPayload::slot, 283 - ByteBufCodecs.VAR_INT, F4UpdateC2SPayload::width, 284 - ByteBufCodecs.VAR_INT, F4UpdateC2SPayload::height, 285 - F4UpdateC2SPayload::new); 286 - @Override 287 - public @NotNull Type<? extends CustomPacketPayload> type() { 288 - return ID; 289 - } 290 - //?} else { 291 - /*@Override 292 - public void write(FriendlyByteBuf buf) { 293 - buf.writeInt(slot); 294 - buf.writeInt(width); 295 - buf.writeInt(height); 296 - } 297 - public static PacketType<F4UpdateC2SPayload> type = 298 - PacketType.create(sid, buf -> new F4UpdateC2SPayload(buf.readInt(), buf.readInt(), buf.readInt())); 299 - @Override 300 - public PacketType<?> getType() { 301 - return type; 302 - } 303 - public static void receive(F4UpdateC2SPayload packet, ServerPlayer player, PacketSender responceSenser) { 304 - packet.receive(player); 305 - } 306 - *///?} 307 - public void receive(ServerPlayer player) { 308 - ItemStack st = player.getInventory().getItem(slot); 309 - if (st.is(ModItems.F4.get())) { 310 - ItemStack newStack = st.copy(); 311 - //? if >1.21 { 312 - newStack.applyComponents(DataComponentMap.builder() 313 - .set(ModComponentTypes.SIZE_X.get(), Math.clamp(width, 1, 21)) 314 - .set(ModComponentTypes.SIZE_Y.get(), Math.clamp(height, 1, 21)) 315 - .build()); 316 - //?} else { 317 - /*CompoundTag nbt = st.getTag(); 318 - if (nbt == null) nbt = new CompoundTag(); 319 - nbt.putInt(ModComponentTypes.SIZE_X, width); 320 - nbt.putInt(ModComponentTypes.SIZE_Y, height); 321 - newStack.setTag(nbt); 322 - *///?} 323 - player.getInventory().setItem(slot, newStack); 324 - } 325 - } 326 - } 327 - 328 - public record JukeboxesC2SPayload(CompoundTag data) implements FriendlyPacketC2S { 329 - static ResourceLocation sid = getId("upload_jukeboxes"); 330 - //? if >1.21 { 331 - 332 - public static final Type<JukeboxesC2SPayload> ID = new Type<>(InfinityMethods.getId("upload_jukeboxes")); 333 - public static final StreamCodec<RegistryFriendlyByteBuf, JukeboxesC2SPayload> CODEC = StreamCodec.composite( 334 - ByteBufCodecs.COMPOUND_TAG, JukeboxesC2SPayload::data, JukeboxesC2SPayload::new); 335 - @Override 336 - public @NotNull Type<? extends CustomPacketPayload> type() { 337 - return ID; 338 - } 339 - //?} else { 340 - /*@Override 341 - public void write(FriendlyByteBuf buf) { 342 - buf.writeNbt(data); 343 - } 344 - public static PacketType<JukeboxesC2SPayload> type = 345 - PacketType.create(sid, buf -> new JukeboxesC2SPayload(buf.readNbt())); 346 - @Override 347 - public PacketType<?> getType() { 348 - return type; 349 - } 350 - public static void receive(JukeboxesC2SPayload packet, ServerPlayer player, PacketSender responceSenser) { 351 - packet.receive(player); 352 - } 353 - *///?} 354 - @Override 355 - public void receive(ServerPlayer player) { 356 - SoundScanner.unpackUploadedJukeboxes(player.level().getServer(), data); 357 - } 358 - } 359 - 360 - public static void registerC2SPacketsReceivers() { 361 - //? if >1.21 { 362 - net.lerariemann.infinity.util.platform.InfinityPlatform.INSTANCE.registerPayloadsServer(); 363 - //?} else { 364 - /*ServerPlayNetworking.registerGlobalReceiver(F4UpdateC2SPayload.type, F4UpdateC2SPayload::receive); 365 - ServerPlayNetworking.registerGlobalReceiver(F4DeployC2SPayload.type, F4DeployC2SPayload::receive); 366 - *///?} 367 - } 368 - 369 - public static void registerS2CPacketsReceivers() { 370 - //? if >1.21 { 371 - net.lerariemann.infinity.util.platform.InfinityPlatform.INSTANCE.registerPayloadsClient(); 372 - //?} else { 373 - /*ClientPlayNetworking.registerGlobalReceiver(WorldAddS2CPayload.sid, WorldAddS2CPayload::receive); 374 - ClientPlayNetworking.registerGlobalReceiver(BiomeAddS2CPayload.sid, BiomeAddS2CPayload::receive); 375 - ClientPlayNetworking.registerGlobalReceiver(ShaderS2CPayload.sid, ShaderS2CPayload::receive); 376 - ClientPlayNetworking.registerGlobalReceiver(StarsS2CPayload.sid, StarsS2CPayload::receive); 377 - ClientPlayNetworking.registerGlobalReceiver(SoundPackS2CPayload.sid, SoundPackS2CPayload::receive); 378 - *///?} 379 - } 380 - 381 - public static void sendShaderPayload(ServerPlayer player) { 382 - sendShaderPayload(player, 383 - //? if >1.21.2 { 384 - player.level() 385 - //?} else { 386 - /*player.serverLevel() 387 - *///?} 388 - , Iridescence.shouldApplyShader(player)); 389 - } 390 - public static void sendShaderPayload(ServerPlayer player, ServerLevel world) { 391 - sendShaderPayload(player, world, Iridescence.shouldApplyShader(player)); 392 - } 393 - public static void sendShaderPayload(ServerPlayer player, ServerLevel world, boolean iridescence) { 394 - new ShaderS2CPayload(iridescence, 395 - world == null ? new CompoundTag() : InfinityOptions.access(world).data()).send(player); 396 - } 397 - public static void sendStarsPayload(ServerPlayer player) { 398 - StarsS2CPayload.INSTANCE.send(player); 399 - } 400 - }
···
+4 -4
src/main/java/net/lerariemann/infinity/registry/var/ModPoi.java
··· 2 3 //? fabric { 4 5 - /*import net.fabricmc.fabric.api.object.builder.v1.world.poi.PointOfInterestHelper; 6 - *///?} 7 import com.google.common.collect.ImmutableSet; 8 import dev.architectury.registry.registries.DeferredRegister; 9 import dev.architectury.registry.registries.RegistrySupplier; ··· 38 39 public static void registerPoiFabric() { 40 //? fabric { 41 - /*PointOfInterestHelper.register(InfinityMethods.getId("neither_portal"), 0, 1, 42 ImmutableSet.copyOf(ModBlocks.PORTAL.get().getStateDefinition().getPossibleStates())); 43 - *///?} 44 } 45 }
··· 2 3 //? fabric { 4 5 + import net.fabricmc.fabric.api.object.builder.v1.world.poi.PointOfInterestHelper; 6 + //?} 7 import com.google.common.collect.ImmutableSet; 8 import dev.architectury.registry.registries.DeferredRegister; 9 import dev.architectury.registry.registries.RegistrySupplier; ··· 38 39 public static void registerPoiFabric() { 40 //? fabric { 41 + PointOfInterestHelper.register(InfinityMethods.getId("neither_portal"), 0, 1, 42 ImmutableSet.copyOf(ModBlocks.PORTAL.get().getStateDefinition().getPossibleStates())); 43 + //?} 44 } 45 }
+2 -2
src/main/java/net/lerariemann/infinity/registry/var/ModScreenHandlers.java
··· 21 public static void register() { 22 SCREEN_HANDLERS.register(); 23 //? if fabric { 24 - /*MenuScreens.register(F4.get(), F4Screen::new); 25 - *///?} 26 } 27 }
··· 21 public static void register() { 22 SCREEN_HANDLERS.register(); 23 //? if fabric { 24 + MenuScreens.register(F4.get(), F4Screen::new); 25 + //?} 26 } 27 }
+21 -5
src/main/java/net/lerariemann/infinity/util/InfinityMethods.java
··· 13 import net.lerariemann.infinity.util.platform.InfinityPlatform; 14 import net.minecraft.Util; 15 import net.minecraft.core.BlockPos; 16 import net.minecraft.core.Holder; 17 import net.minecraft.network.chat.Component; 18 import net.minecraft.network.chat.MutableComponent; ··· 27 import net.minecraft.world.level.biome.Biome; 28 import net.minecraft.world.level.block.entity.BlockEntity; 29 import net.minecraft.world.level.block.state.BlockState; 30 import net.minecraft.world.level.levelgen.LegacyRandomSource; 31 import net.minecraft.world.level.levelgen.synth.NormalNoise; 32 //? if <1.21 { ··· 39 40 import java.nio.charset.StandardCharsets; 41 import java.util.Arrays; 42 43 import static net.lerariemann.infinity.InfinityMod.MOD_ID; 44 ··· 87 //? if >1.21 { 88 return world.getBiome(pos).getRegisteredName().contains("infinity"); 89 //?} else { 90 - /*return world.registryAccess().registryOrThrow(Registries.BIOME).getKey(world.getBiome(pos).value()).getNamespace().contains("infinity"); 91 *///?} 92 } catch (IllegalStateException e) { 93 return false; ··· 105 return InfinityMethods.isBiomeInfinity(acc, pos); 106 } 107 //? if fabric { 108 - /*else return InfinityPlatform.INSTANCE.isFabric() 109 && world.hasBiomes() 110 && world.getBiomeFabric(pos) != null 111 && InfinityMethods.isBiomeInfinity(world.getBiomeFabric(pos)); 112 - *///?} else { 113 - return false; 114 - //?} 115 } 116 117 static int properMod(int a, int b) { ··· 260 if (name.contains("infinity:generated_")) 261 return Component.translatable("tooltip.infinity.key.generated") 262 .append(name.replace("infinity:generated_", "")); 263 if (name.equals(InfinityMethods.ofRandomDim)) 264 return Component.translatable("tooltip.infinity.key.randomise"); 265 // All other dimensions. ··· 323 } while (false); 324 325 return 1.0; 326 } 327 }
··· 13 import net.lerariemann.infinity.util.platform.InfinityPlatform; 14 import net.minecraft.Util; 15 import net.minecraft.core.BlockPos; 16 + import net.minecraft.core.Direction; 17 import net.minecraft.core.Holder; 18 import net.minecraft.network.chat.Component; 19 import net.minecraft.network.chat.MutableComponent; ··· 28 import net.minecraft.world.level.biome.Biome; 29 import net.minecraft.world.level.block.entity.BlockEntity; 30 import net.minecraft.world.level.block.state.BlockState; 31 + import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; 32 import net.minecraft.world.level.levelgen.LegacyRandomSource; 33 import net.minecraft.world.level.levelgen.synth.NormalNoise; 34 //? if <1.21 { ··· 41 42 import java.nio.charset.StandardCharsets; 43 import java.util.Arrays; 44 + import java.util.Objects; 45 46 import static net.lerariemann.infinity.InfinityMod.MOD_ID; 47 ··· 90 //? if >1.21 { 91 return world.getBiome(pos).getRegisteredName().contains("infinity"); 92 //?} else { 93 + /*return Objects.requireNonNullElse(world.registryAccess().registryOrThrow(Registries.BIOME).getKey(world.getBiome(pos).value()), VersionMethods.id("the_void")).getNamespace().contains("infinity"); 94 *///?} 95 } catch (IllegalStateException e) { 96 return false; ··· 108 return InfinityMethods.isBiomeInfinity(acc, pos); 109 } 110 //? if fabric { 111 + else return InfinityPlatform.INSTANCE.isFabric() 112 && world.hasBiomes() 113 && world.getBiomeFabric(pos) != null 114 && InfinityMethods.isBiomeInfinity(world.getBiomeFabric(pos)); 115 + //?} else { 116 + /*return false; 117 + *///?} 118 } 119 120 static int properMod(int a, int b) { ··· 263 if (name.contains("infinity:generated_")) 264 return Component.translatable("tooltip.infinity.key.generated") 265 .append(name.replace("infinity:generated_", "")); 266 + if (name.contains("footprint:")) 267 + return Component.translatable("tooltip.infinity.key.exit"); 268 if (name.equals(InfinityMethods.ofRandomDim)) 269 return Component.translatable("tooltip.infinity.key.randomise"); 270 // All other dimensions. ··· 328 } while (false); 329 330 return 1.0; 331 + } 332 + 333 + static NoteBlockInstrument getRandomInstrument() { 334 + NoteBlockInstrument[] instruments = NoteBlockInstrument.values(); 335 + return instruments[InfinityMod.random.nextInt(instruments.length-7)]; 336 + } 337 + 338 + static Direction getRandomHorizontalDirection(RandomSource random) { 339 + return Direction.fromAxisAndDirection( 340 + random.nextBoolean() ? Direction.Axis.X : Direction.Axis.Z, 341 + random.nextBoolean() ? Direction.AxisDirection.POSITIVE : Direction.AxisDirection.NEGATIVE); 342 } 343 }
-14
src/main/java/net/lerariemann/infinity/util/VersionMethods.java
··· 50 import java.util.Set; 51 52 public interface VersionMethods { 53 - boolean above21 = 54 - //? if >1.21 { 55 - true; 56 - //?} else { 57 - /*false; 58 - *///?} 59 - 60 - boolean above212 = 61 - //? if >1.21.2 { 62 - true; 63 - //?} else { 64 - /*false; 65 - *///?} 66 - 67 static void loadPP(Minecraft client, String sid) { 68 //? if >1.21.2 { 69 client.gameRenderer.setPostEffect(InfinityMethods.getId(sid));
··· 50 import java.util.Set; 51 52 public interface VersionMethods { 53 static void loadPP(Minecraft client, String sid) { 54 //? if >1.21.2 { 55 client.gameRenderer.setPostEffect(InfinityMethods.getId(sid));
+30 -5
src/main/java/net/lerariemann/infinity/util/config/Amendment.java
··· 6 import net.lerariemann.infinity.util.core.ConfigType; 7 import net.lerariemann.infinity.util.core.NbtUtils; 8 import net.lerariemann.infinity.util.platform.InfinityPlatform; 9 - import net.minecraft.core.registries.BuiltInRegistries; 10 import net.minecraft.core.registries.Registries; 11 import net.minecraft.nbt.CompoundTag; 12 import net.minecraft.nbt.StringTag; 13 import net.minecraft.nbt.Tag; 14 - import net.minecraft.resources.ResourceKey; 15 import net.minecraft.tags.TagKey; 16 import net.minecraft.world.level.block.Block; 17 ··· 20 21 public record Amendment(ConfigType area, ModSelector modSelector, Selector selector, Results results) { 22 public static Amendment of(CompoundTag data) { 23 String areaName = NbtUtils.getString(data, "area", ""); 24 ConfigType area = ConfigType.byName(areaName); 25 if (area == null) { ··· 32 if (mod.equals("all")) { 33 modSelector = new UniversalModSelector(); 34 } 35 else if (!InfinityPlatform.INSTANCE.isModLoaded(mod)) return null; 36 else modSelector = new MatchingModSelector(mod); 37 ··· 41 case "containing" -> new ContainingSelector(NbtUtils.getString(data, "containing")); 42 case "matching" -> new MatchingSelector(NbtUtils.getString(data, "matching")); 43 case "matching_block_tag" -> new MatchingBlockTagSelector(NbtUtils.getString(data, "matching_block_tag")); 44 - case "matching_any" -> new MatchingAnySelector(NbtUtils.getList(data, "matching_any", Tag.TAG_STRING) 45 - .stream().map(e->(StringTag)e).map(NbtUtils::getAsString).toList()); 46 default -> { 47 InfinityMod.LOGGER.warn("Unknown amendment selector type: {}", selectorType); 48 yield null; ··· 51 52 String resultType = NbtUtils.getString(data, "results", ""); 53 Results results = switch (resultType) { 54 - case "set_value" -> new SetValue(NbtUtils.getInt(data, "value")); 55 case "erase" -> new SetValue(0); 56 case "set_field" -> new SetField(NbtUtils.getString(data, "field_name"), data.get("field")); 57 default -> { ··· 62 63 if (selector == null || results == null) return null; 64 return new Amendment(area, modSelector, selector, results); 65 } 66 67 public static Map<ConfigType, List<Amendment>> getAmendmentList() { ··· 103 @Override 104 public boolean applies(String modId) { 105 return modId.equals(this.mod); 106 } 107 } 108
··· 6 import net.lerariemann.infinity.util.core.ConfigType; 7 import net.lerariemann.infinity.util.core.NbtUtils; 8 import net.lerariemann.infinity.util.platform.InfinityPlatform; 9 import net.minecraft.core.registries.Registries; 10 import net.minecraft.nbt.CompoundTag; 11 + import net.minecraft.nbt.ListTag; 12 import net.minecraft.nbt.StringTag; 13 import net.minecraft.nbt.Tag; 14 import net.minecraft.tags.TagKey; 15 import net.minecraft.world.level.block.Block; 16 ··· 19 20 public record Amendment(ConfigType area, ModSelector modSelector, Selector selector, Results results) { 21 public static Amendment of(CompoundTag data) { 22 + String prereqMod = NbtUtils.getString(data, "load_if_mod", ""); 23 + if (!prereqMod.isEmpty() && !InfinityPlatform.INSTANCE.isModLoaded(prereqMod)) return null; 24 + 25 String areaName = NbtUtils.getString(data, "area", ""); 26 ConfigType area = ConfigType.byName(areaName); 27 if (area == null) { ··· 34 if (mod.equals("all")) { 35 modSelector = new UniversalModSelector(); 36 } 37 + else if (mod.equals("any_of")) { 38 + modSelector = new MatchingAnyModSelector(listTransform(NbtUtils.getList(data, "mods", Tag.TAG_STRING))); 39 + } 40 + else if (mod.startsWith("!")) { 41 + String notMod = mod.substring(1); 42 + if (!InfinityPlatform.INSTANCE.isModLoaded(notMod)) modSelector = new UniversalModSelector(); 43 + else modSelector = new ExceptModSelector(notMod); 44 + } 45 else if (!InfinityPlatform.INSTANCE.isModLoaded(mod)) return null; 46 else modSelector = new MatchingModSelector(mod); 47 ··· 51 case "containing" -> new ContainingSelector(NbtUtils.getString(data, "containing")); 52 case "matching" -> new MatchingSelector(NbtUtils.getString(data, "matching")); 53 case "matching_block_tag" -> new MatchingBlockTagSelector(NbtUtils.getString(data, "matching_block_tag")); 54 + case "matching_any" -> new MatchingAnySelector(listTransform(NbtUtils.getList(data, "matching_any", Tag.TAG_STRING))); 55 default -> { 56 InfinityMod.LOGGER.warn("Unknown amendment selector type: {}", selectorType); 57 yield null; ··· 60 61 String resultType = NbtUtils.getString(data, "results", ""); 62 Results results = switch (resultType) { 63 + case "set_value" -> new SetValue(NbtUtils.getDouble(data, "value")); 64 case "erase" -> new SetValue(0); 65 case "set_field" -> new SetField(NbtUtils.getString(data, "field_name"), data.get("field")); 66 default -> { ··· 71 72 if (selector == null || results == null) return null; 73 return new Amendment(area, modSelector, selector, results); 74 + } 75 + 76 + public static List<String> listTransform(ListTag tag) { 77 + return tag.stream().map(e->(StringTag)e).map(NbtUtils::getAsString).toList(); 78 } 79 80 public static Map<ConfigType, List<Amendment>> getAmendmentList() { ··· 116 @Override 117 public boolean applies(String modId) { 118 return modId.equals(this.mod); 119 + } 120 + } 121 + public record MatchingAnyModSelector(List<String> mods) implements ModSelector { 122 + @Override 123 + public boolean applies(String modId) { 124 + return mods.contains(modId); 125 + } 126 + } 127 + public record ExceptModSelector(String mod) implements ModSelector { 128 + @Override 129 + public boolean applies(String modId) { 130 + return !modId.equals(this.mod); 131 } 132 } 133
+10 -9
src/main/java/net/lerariemann/infinity/util/config/ConfigGenerator.java
··· 48 import net.minecraft.world.level.levelgen.structure.StructureSpawnOverride; 49 import net.minecraft.world.level.material.FlowingFluid; 50 import net.minecraft.world.level.material.Fluid; 51 - import net.minecraft.world.level.storage.loot.LootDataType; 52 import net.minecraft.world.level.storage.loot.LootTable; 53 import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; 54 import java.util.*; ··· 115 .generate(ConfigType.LOOT_TABLES); 116 *///?} else { 117 /*DataCollection lootTables = new DataCollection.Logged(ConfigType.LOOT_TABLES, "loot tables"); 118 - server.getLootData().getKeys(LootDataType.TABLE).forEach((key)->{ 119 LootTable table = server.getLootData().getLootTable(key); 120 //? if >1.21 { 121 ResourceLocation type = LootContextParamSets.REGISTRY.inverse().get(table.getParamSet()); ··· 137 Registry<Fluid> r = BuiltInRegistries.FLUID; 138 Set<String> fluidBlockNames = new HashSet<>(); 139 r.registryKeySet().forEach(key -> { 140 - Fluid b = VersionMethods.getFromRegistry(BuiltInRegistries.FLUID, key); 141 - assert b!= null; 142 - String name = BuiltInRegistries.BLOCK.getKey(b.defaultFluidState().createLegacyBlock().getBlock()).toString(); 143 CompoundTag data = new CompoundTag(); 144 data.putString("fluidName", key.location().toString()); 145 - fluidBlockNames.add(name); 146 - Fluid f = VersionMethods.getFromRegistry(r, key.location()); 147 - if (f instanceof FlowingFluid fl && fl.equals(fl.getSource())) { 148 String modId = key.location().getNamespace(); 149 - fluidMap.add(modId, name, data); 150 } 151 }); 152 fluidMap.save();
··· 48 import net.minecraft.world.level.levelgen.structure.StructureSpawnOverride; 49 import net.minecraft.world.level.material.FlowingFluid; 50 import net.minecraft.world.level.material.Fluid; 51 import net.minecraft.world.level.storage.loot.LootTable; 52 import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; 53 import java.util.*; ··· 114 .generate(ConfigType.LOOT_TABLES); 115 *///?} else { 116 /*DataCollection lootTables = new DataCollection.Logged(ConfigType.LOOT_TABLES, "loot tables"); 117 + server.getLootData().getKeys(net.minecraft.world.level.storage.loot.LootDataType.TABLE).forEach((key)->{ 118 LootTable table = server.getLootData().getLootTable(key); 119 //? if >1.21 { 120 ResourceLocation type = LootContextParamSets.REGISTRY.inverse().get(table.getParamSet()); ··· 136 Registry<Fluid> r = BuiltInRegistries.FLUID; 137 Set<String> fluidBlockNames = new HashSet<>(); 138 r.registryKeySet().forEach(key -> { 139 + Fluid fluid = VersionMethods.getFromRegistry(BuiltInRegistries.FLUID, key); 140 + assert fluid != null; 141 + Block block = fluid.defaultFluidState().createLegacyBlock().getBlock(); 142 + String blockName = BuiltInRegistries.BLOCK.getKey(block).toString(); 143 CompoundTag data = new CompoundTag(); 144 data.putString("fluidName", key.location().toString()); 145 + fluidBlockNames.add(blockName); 146 + if (fluid instanceof FlowingFluid fl 147 + && fl.equals(fl.getSource()) 148 + && block.defaultBlockState().getFluidState().is(fl)) { 149 String modId = key.location().getNamespace(); 150 + fluidMap.add(modId, blockName, data); 151 } 152 }); 153 fluidMap.save();
+2 -1
src/main/java/net/lerariemann/infinity/util/config/ConfigManager.java
··· 79 static void unpackDefaultConfigs(Path path, String fromDirectory) { 80 try(Stream<Path> files = Files.walk(path)) { 81 if (!configPath.toFile().exists()) Files.createDirectories(configPath); 82 - files.filter(p -> p.toString().endsWith(".json")).forEach(p -> registerConfig(p, configPath, fromDirectory)); 83 Files.deleteIfExists(tempFile); //being a good method cleaning up after itself :3 84 } catch (IOException e) { 85 throw new RuntimeException(e);
··· 79 static void unpackDefaultConfigs(Path path, String fromDirectory) { 80 try(Stream<Path> files = Files.walk(path)) { 81 if (!configPath.toFile().exists()) Files.createDirectories(configPath); 82 + files.filter(p -> p.toString().endsWith(".json") || p.toString().endsWith(".txt")) 83 + .forEach(p -> registerConfig(p, configPath, fromDirectory)); 84 Files.deleteIfExists(tempFile); //being a good method cleaning up after itself :3 85 } catch (IOException e) { 86 throw new RuntimeException(e);
+19 -8
src/main/java/net/lerariemann/infinity/util/config/SoundScanner.java
··· 1 package net.lerariemann.infinity.util.config; 2 3 import net.lerariemann.infinity.mixin.SoundListMixin; 4 - import net.lerariemann.infinity.registry.var.ModPayloads; 5 import net.lerariemann.infinity.util.InfinityMethods; 6 import net.lerariemann.infinity.util.VersionMethods; 7 import net.lerariemann.infinity.util.core.CommonIO; ··· 21 import net.minecraft.core.registries.Registries; 22 import net.lerariemann.infinity.util.core.ConfigType; 23 import net.lerariemann.infinity.InfinityMod; 24 - import net.lerariemann.infinity.access.MinecraftServerAccess; 25 import net.lerariemann.infinity.util.loading.DimensionGrabber; 26 import java.nio.file.Path; 27 //?} ··· 42 /** Holds a map which allows to get the list of all sound IDs in existence and .ogg data for each. 43 * Seeded by {@link SoundListMixin} on client launch. */ 44 public static SoundScanner instance; 45 public static boolean isPreloaded() { 46 return instance != null; 47 } ··· 51 } 52 53 /** 54 - * <p>On player connect, the server sends a {@link ModPayloads.SoundPackS2CPayload} payload to the client. 55 * <p>If the server already contains data upon which the client should create its resource pack, it holds this data. 56 * <p>Otherwise, this payload is empty, and the server relies on the client to create it and send it back to the server for future use. */ 57 public static void unpackDownloadedPack(CompoundTag songIds, Minecraft cl) { 58 //the client unpacks a non-empty payload only when needed, meaning only if it doesn't have necessary files yet 59 if (!songIds.isEmpty() && !Files.exists(cl.getResourcePackDirectory().resolve("infinity/assets/infinity/sounds.json"))) { 60 cl.execute(() -> saveResourcePack(cl, NbtUtils.getList(songIds, "entries", Tag.TAG_STRING).stream() ··· 62 } 63 else if (isPreloaded()) { 64 cl.execute(() -> { 65 - CompoundTag jukeboxes = saveResourcePack(cl, getMatchingLoadedIds(), InfinityPlatform.version > 20); 66 CompoundTag res = new CompoundTag(); 67 ListTag songIdsList = new ListTag(); 68 getMatchingLoadedIds().forEach(id -> songIdsList.add(StringTag.valueOf(id.toString()))); 69 res.put("entries", songIdsList); 70 res.put("jukeboxes", jukeboxes); 71 - new ModPayloads.JukeboxesC2SPayload(res).send(); 72 }); 73 } 74 } ··· 111 return jukeboxes; 112 } 113 114 - /** Receiver for a C2S {@link ModPayloads.JukeboxesC2SPayload} payload, which holds data to send to clients in the future for them to 115 * generate custom sound resource packs, as well as jukebox song definitions corresponding to this data. */ 116 public static void unpackUploadedJukeboxes(MinecraftServer server, CompoundTag data) { 117 if (!RandomProvider.rule("useSoundSyncPackets")) return; 118 if (!data.contains("jukeboxes") || !data.contains("entries")) return; 119 - if (Files.exists(server.getWorldPath(LevelResource.DATAPACK_DIR).resolve("client_sound_pack_data.json"))) return; 120 121 //? if >1.21 { 122 CompoundTag allJukeboxes = NbtUtils.getCompound(data, "jukeboxes"); ··· 127 } 128 } 129 grabJukeboxes(server); 130 - //?} 131 132 data.remove("jukeboxes"); 133 CompoundTag packData = new CompoundTag(); ··· 191 192 private static @NotNull CompoundTag getJukeboxDef(String songID, String subtitleID, double length) { 193 CompoundTag jukebox_def = new CompoundTag(); 194 CompoundTag sound_event = new CompoundTag(); 195 sound_event.putString("sound_id", "infinity:" + songID); 196 jukebox_def.put("sound_event", sound_event); ··· 199 jukebox_def.put("description", description); 200 jukebox_def.putFloat("length_in_seconds", (float)length); 201 jukebox_def.putInt("comparator_output", 15); 202 return jukebox_def; 203 } 204 }
··· 1 package net.lerariemann.infinity.util.config; 2 3 + import net.lerariemann.infinity.access.MinecraftServerAccess; 4 import net.lerariemann.infinity.mixin.SoundListMixin; 5 + import net.lerariemann.infinity.registry.payload.c2s.JukeboxesC2SPayload; 6 import net.lerariemann.infinity.util.InfinityMethods; 7 import net.lerariemann.infinity.util.VersionMethods; 8 import net.lerariemann.infinity.util.core.CommonIO; ··· 22 import net.minecraft.core.registries.Registries; 23 import net.lerariemann.infinity.util.core.ConfigType; 24 import net.lerariemann.infinity.InfinityMod; 25 import net.lerariemann.infinity.util.loading.DimensionGrabber; 26 import java.nio.file.Path; 27 //?} ··· 42 /** Holds a map which allows to get the list of all sound IDs in existence and .ogg data for each. 43 * Seeded by {@link SoundListMixin} on client launch. */ 44 public static SoundScanner instance; 45 + public static final String lockFile = (InfinityPlatform.version > 20 ? "client" : "server") + "_sound_pack_data.json"; 46 public static boolean isPreloaded() { 47 return instance != null; 48 } ··· 52 } 53 54 /** 55 + * <p>On player connect, the server sends a {@link net.lerariemann.infinity.registry.payload.s2c.SoundPackS2CPayload} payload to the client. 56 * <p>If the server already contains data upon which the client should create its resource pack, it holds this data. 57 * <p>Otherwise, this payload is empty, and the server relies on the client to create it and send it back to the server for future use. */ 58 public static void unpackDownloadedPack(CompoundTag songIds, Minecraft cl) { 59 + 60 //the client unpacks a non-empty payload only when needed, meaning only if it doesn't have necessary files yet 61 if (!songIds.isEmpty() && !Files.exists(cl.getResourcePackDirectory().resolve("infinity/assets/infinity/sounds.json"))) { 62 cl.execute(() -> saveResourcePack(cl, NbtUtils.getList(songIds, "entries", Tag.TAG_STRING).stream() ··· 64 } 65 else if (isPreloaded()) { 66 cl.execute(() -> { 67 + CompoundTag jukeboxes = saveResourcePack(cl, getMatchingLoadedIds(), true); 68 CompoundTag res = new CompoundTag(); 69 ListTag songIdsList = new ListTag(); 70 getMatchingLoadedIds().forEach(id -> songIdsList.add(StringTag.valueOf(id.toString()))); 71 res.put("entries", songIdsList); 72 res.put("jukeboxes", jukeboxes); 73 + new JukeboxesC2SPayload(res).send(); 74 }); 75 } 76 } ··· 113 return jukeboxes; 114 } 115 116 + /** Receiver for a C2S {@link JukeboxesC2SPayload} payload, which holds data to send to clients in the future for them to 117 * generate custom sound resource packs, as well as jukebox song definitions corresponding to this data. */ 118 public static void unpackUploadedJukeboxes(MinecraftServer server, CompoundTag data) { 119 if (!RandomProvider.rule("useSoundSyncPackets")) return; 120 if (!data.contains("jukeboxes") || !data.contains("entries")) return; 121 + if (Files.exists(server.getWorldPath(LevelResource.DATAPACK_DIR).resolve(lockFile))) return; 122 123 //? if >1.21 { 124 CompoundTag allJukeboxes = NbtUtils.getCompound(data, "jukeboxes"); ··· 129 } 130 } 131 grabJukeboxes(server); 132 + //?} else { 133 + /*((MinecraftServerAccess)server).infinity$setJukeboxDataMap(data.getCompound("jukeboxes")); 134 + CommonIO.write(data.getCompound("jukeboxes"), server.getWorldPath(LevelResource.DATAPACK_DIR), "server_sound_pack_data.json"); 135 + *///?} 136 137 data.remove("jukeboxes"); 138 CompoundTag packData = new CompoundTag(); ··· 196 197 private static @NotNull CompoundTag getJukeboxDef(String songID, String subtitleID, double length) { 198 CompoundTag jukebox_def = new CompoundTag(); 199 + //? if >1.21 { 200 CompoundTag sound_event = new CompoundTag(); 201 sound_event.putString("sound_id", "infinity:" + songID); 202 jukebox_def.put("sound_event", sound_event); ··· 205 jukebox_def.put("description", description); 206 jukebox_def.putFloat("length_in_seconds", (float)length); 207 jukebox_def.putInt("comparator_output", 15); 208 + //?} else { 209 + /*jukebox_def.putString("sound_id", songID); 210 + jukebox_def.putString("sound_sub", subtitleID); 211 + jukebox_def.putInt("sound_duration", (int)(20*length)); 212 + *///?} 213 return jukebox_def; 214 } 215 }
+4 -10
src/main/java/net/lerariemann/infinity/util/core/CorePack.java
··· 25 // saveVersioned(); 26 saveTrees(); 27 saveEndOfTime(); 28 - if (!savingPath.resolve("pack.mcmeta").toFile().exists()) savePackMcmeta(); 29 } 30 31 void grab(MinecraftServer server) { ··· 35 savingPath.resolve("data/infinity/worldgen/biome")); 36 DimensionGrabber.readCategoryFromDisk(server, ConfiguredFeature.DIRECT_CODEC, Registries.CONFIGURED_FEATURE, 37 savingPath.resolve("data/infinity/worldgen/configured_feature")); 38 - } 39 - 40 - void savePackMcmeta() { 41 - CompoundTag res = new CompoundTag(); 42 - CompoundTag pack = new CompoundTag(); 43 - pack.putInt("pack_format", 34); 44 - pack.putString("description", "Common content providers for Infinite Dimensions"); 45 - res.put("pack", pack); 46 - CommonIO.write(res, savingPath, "pack.mcmeta"); 47 } 48 49 public static CompoundTag treePlacement(String tree, String block) {
··· 25 // saveVersioned(); 26 saveTrees(); 27 saveEndOfTime(); 28 + if (!savingPath.resolve("pack.mcmeta").toFile().exists()) { 29 + CompoundTag mcmeta = InfinityPlatform.dataPackMcmeta("Common content providers for Infinite Dimensions"); 30 + CommonIO.write(mcmeta, savingPath, "pack.mcmeta"); 31 + } 32 } 33 34 void grab(MinecraftServer server) { ··· 38 savingPath.resolve("data/infinity/worldgen/biome")); 39 DimensionGrabber.readCategoryFromDisk(server, ConfiguredFeature.DIRECT_CODEC, Registries.CONFIGURED_FEATURE, 40 savingPath.resolve("data/infinity/worldgen/configured_feature")); 41 } 42 43 public static CompoundTag treePlacement(String tree, String block) {
+1 -1
src/main/java/net/lerariemann/infinity/util/core/Easterizer.java
··· 52 } 53 }); 54 } catch (IOException e) { 55 - throw new RuntimeException(e); 56 } 57 } 58
··· 52 } 53 }); 54 } catch (IOException e) { 55 + InfinityMod.LOGGER.error("Error reading easterizer.json file!", e); 56 } 57 } 58
+4 -4
src/main/java/net/lerariemann/infinity/util/core/NbtUtils.java
··· 36 37 static Collection<String> keys(ValueInput tag) { 38 //? if neoforge { 39 - return tag.keySet(); 40 - //?} else { 41 - /*return tag.keys(); 42 - *///?} 43 } 44 static boolean compoundHasString(ValueInput tag, String dimension) { 45 return tag.getString(dimension).isPresent();
··· 36 37 static Collection<String> keys(ValueInput tag) { 38 //? if neoforge { 39 + /*return tag.keySet(); 40 + *///?} else { 41 + return tag.keys(); 42 + //?} 43 } 44 static boolean compoundHasString(ValueInput tag, String dimension) { 45 return tag.getString(dimension).isPresent();
+7
src/main/java/net/lerariemann/infinity/util/core/RandomProvider.java
··· 1 package net.lerariemann.infinity.util.core; 2 3 import net.lerariemann.infinity.InfinityMod; 4 import net.lerariemann.infinity.util.VersionMethods; 5 import net.lerariemann.infinity.util.var.ColorLogic; 6 import net.minecraft.core.Registry; 7 import net.minecraft.core.RegistryAccess; ··· 107 return ws.getElement(ws.getName(d), key.getConverter()); 108 } 109 return key.fromName(key.getDef()); 110 } 111 112 void registerAll() {
··· 1 package net.lerariemann.infinity.util.core; 2 3 import net.lerariemann.infinity.InfinityMod; 4 + import net.lerariemann.infinity.registry.var.ModMaterialRules; 5 import net.lerariemann.infinity.util.VersionMethods; 6 + import net.lerariemann.infinity.util.teleport.InfinityPortal; 7 import net.lerariemann.infinity.util.var.ColorLogic; 8 import net.minecraft.core.Registry; 9 import net.minecraft.core.RegistryAccess; ··· 109 return ws.getElement(ws.getName(d), key.getConverter()); 110 } 111 return key.fromName(key.getDef()); 112 + } 113 + 114 + public void updateDependencies() { 115 + ModMaterialRules.RandomBlockMaterialRule.setProvider(this); 116 + InfinityPortal.useFootprintsFlag = rule("useFootprints"); 117 } 118 119 void registerAll() {
+2 -1
src/main/java/net/lerariemann/infinity/util/loading/DimensionGrabber.java
··· 3 import com.mojang.serialization.Codec; 4 import net.lerariemann.infinity.access.RegistryAccess; 5 import net.lerariemann.infinity.dimensions.RandomDimension; 6 import net.lerariemann.infinity.util.VersionMethods; 7 import net.minecraft.client.Minecraft; 8 import net.minecraft.core.Registry; ··· 90 /** 91 * Inserts one object into one registry. Used on the client to insert individual dimension types and biomes when the server asks it to, since the client 92 * does not know or care about everything else a dimension datapack holds. 93 - * @see net.lerariemann.infinity.registry.var.ModPayloads 94 */ 95 public static <T> void grabObjectForClient(Minecraft client, Codec<T> codec, ResourceKey<Registry<T>> registryKey, 96 ResourceLocation id, CompoundTag data) {
··· 3 import com.mojang.serialization.Codec; 4 import net.lerariemann.infinity.access.RegistryAccess; 5 import net.lerariemann.infinity.dimensions.RandomDimension; 6 + import net.lerariemann.infinity.registry.payload.ModPayloads; 7 import net.lerariemann.infinity.util.VersionMethods; 8 import net.minecraft.client.Minecraft; 9 import net.minecraft.core.Registry; ··· 91 /** 92 * Inserts one object into one registry. Used on the client to insert individual dimension types and biomes when the server asks it to, since the client 93 * does not know or care about everything else a dimension datapack holds. 94 + * @see ModPayloads 95 */ 96 public static <T> void grabObjectForClient(Minecraft client, Codec<T> codec, ResourceKey<Registry<T>> registryKey, 97 ResourceLocation id, CompoundTag data) {
+5 -14
src/main/java/net/lerariemann/infinity/util/loading/ShaderLoader.java
··· 1 package net.lerariemann.infinity.util.loading; 2 3 import com.google.common.util.concurrent.AtomicDouble; 4 - import net.lerariemann.infinity.registry.var.ModPayloads; 5 import net.lerariemann.infinity.util.VersionMethods; 6 import net.lerariemann.infinity.util.core.CommonIO; 7 import net.minecraft.client.Minecraft; 8 import net.minecraft.nbt.CompoundTag; 9 import net.minecraft.server.packs.repository.PackRepository; ··· 19 String FILENAME = "current.json"; 20 AtomicInteger iridLevel = new AtomicInteger(-1); 21 AtomicDouble iridProgress = new AtomicDouble(0.0); 22 - String shaders = VersionMethods.above212 ? "post_effect" : "shaders"; 23 24 static Path shaderDir(Minecraft client) { 25 - return client.getResourcePackDirectory().resolve("infinity/assets/infinity/" + shaders); 26 } 27 28 static void reloadShaders(Minecraft client, CompoundTag worldShader, boolean isIridescenceShaderPresent) { ··· 43 static void reloadShaders(Minecraft client, boolean isWorldShaderPresent, boolean isIridescenceShaderPresent) { 44 if (client.player == null) return; 45 if (isIridescenceShaderPresent) { 46 - VersionMethods.loadPP(client, (VersionMethods.above212 ? "" : "post/") + "iridescence"); 47 return; 48 } 49 iridLevel.set(-1); ··· 70 Path resourcepackPath = client.getResourcePackDirectory().resolve("infinity"); 71 Files.createDirectories(shaderDir(client)); 72 if (!resourcepackPath.resolve("pack.mcmeta").toFile().exists()) 73 - CommonIO.write(packMcmeta(), resourcepackPath.toString(), "pack.mcmeta"); 74 m.reload(); 75 m.addPack("file/" + resourcepackPath.getFileName().toString()); 76 - } 77 - 78 - static CompoundTag packMcmeta() { 79 - CompoundTag res = new CompoundTag(); 80 - CompoundTag pack = new CompoundTag(); 81 - pack.putInt("pack_format", 34); 82 - pack.putString("description", "Shader container"); 83 - res.put("pack", pack); 84 - return res; 85 } 86 }
··· 1 package net.lerariemann.infinity.util.loading; 2 3 import com.google.common.util.concurrent.AtomicDouble; 4 + import net.lerariemann.infinity.registry.payload.ModPayloads; 5 import net.lerariemann.infinity.util.VersionMethods; 6 import net.lerariemann.infinity.util.core.CommonIO; 7 + import net.lerariemann.infinity.util.platform.InfinityPlatform; 8 import net.minecraft.client.Minecraft; 9 import net.minecraft.nbt.CompoundTag; 10 import net.minecraft.server.packs.repository.PackRepository; ··· 20 String FILENAME = "current.json"; 21 AtomicInteger iridLevel = new AtomicInteger(-1); 22 AtomicDouble iridProgress = new AtomicDouble(0.0); 23 24 static Path shaderDir(Minecraft client) { 25 + return client.getResourcePackDirectory().resolve("infinity/assets/infinity/" + (InfinityPlatform.version > 21 ? "post_effect" : "shaders")); 26 } 27 28 static void reloadShaders(Minecraft client, CompoundTag worldShader, boolean isIridescenceShaderPresent) { ··· 43 static void reloadShaders(Minecraft client, boolean isWorldShaderPresent, boolean isIridescenceShaderPresent) { 44 if (client.player == null) return; 45 if (isIridescenceShaderPresent) { 46 + VersionMethods.loadPP(client, (InfinityPlatform.version > 21 ? "" : "post/") + "iridescence"); 47 return; 48 } 49 iridLevel.set(-1); ··· 70 Path resourcepackPath = client.getResourcePackDirectory().resolve("infinity"); 71 Files.createDirectories(shaderDir(client)); 72 if (!resourcepackPath.resolve("pack.mcmeta").toFile().exists()) 73 + CommonIO.write(InfinityPlatform.resourcePackMcmeta("Shader container"), resourcepackPath.toString(), "pack.mcmeta"); 74 m.reload(); 75 m.addPack("file/" + resourcepackPath.getFileName().toString()); 76 } 77 }
+53 -20
src/main/java/net/lerariemann/infinity/util/platform/InfinityPlatform.java
··· 1 package net.lerariemann.infinity.util.platform; 2 3 //? fabric { 4 - /*import net.lerariemann.infinity.util.platform.fabric.FabricPlatformImpl; 5 - *///?} 6 - //? neoforge { 7 - import net.lerariemann.infinity.util.platform.neoforge.NeoForgePlatformImpl; 8 //?} 9 import dev.architectury.registry.registries.RegistrySupplier; 10 - import net.lerariemann.infinity.registry.var.ModPayloads; 11 //? if >1.21 { 12 import net.minecraft.core.component.DataComponentType; 13 import net.minecraft.server.MinecraftServer; 14 import net.minecraft.world.item.ItemStack; 15 import net.minecraft.world.item.enchantment.ItemEnchantments; 16 //?} 17 - import net.minecraft.resources.ResourceKey; 18 import net.minecraft.server.level.ServerLevel; 19 import net.minecraft.server.level.ServerPlayer; 20 import net.minecraft.tags.TagKey; 21 import net.minecraft.world.entity.Entity; 22 - import net.minecraft.world.item.CreativeModeTab; 23 import net.minecraft.world.item.Item; 24 import net.minecraft.world.level.block.Block; 25 import net.minecraft.world.level.block.LiquidBlock; 26 import net.minecraft.world.level.block.state.BlockState; 27 import net.minecraft.world.level.material.FlowingFluid; 28 //? forge { 29 /*import net.lerariemann.infinity.util.platform.forge.ForgePlatformImpl; 30 *///?} 31 32 import java.nio.file.Path; 33 34 public interface InfinityPlatform { 35 int version = 36 - //? if >1.21.6 { 37 - 22; 38 - //?} else if >1.21 { 39 - /*21; 40 - *///?} else { 41 - /*20; 42 - *///?} 43 44 //? fabric { 45 - /*InfinityPlatform INSTANCE = new FabricPlatformImpl(); 46 - *///?} 47 //? neoforge { 48 - InfinityPlatform INSTANCE = new NeoForgePlatformImpl(); 49 - //?} 50 //? forge { 51 /*InfinityPlatform INSTANCE = new ForgePlatformImpl(); 52 *///?} 53 54 boolean isModLoaded(String modid); 55 String loader(); 56 Path getConfigFolder(); 57 boolean isDevelopment(); 58 void registerPayloadsServer(); 59 void registerPayloadsClient(); 60 - void sendS2CPayload(ServerPlayer entity, ModPayloads.FriendlyPacket payload); 61 - void sendC2SPayload(ModPayloads.FriendlyPacket payload); 62 63 /** 64 * On NeoForge, this allows the world to be ticked.
··· 1 package net.lerariemann.infinity.util.platform; 2 3 //? fabric { 4 + import net.lerariemann.infinity.util.platform.fabric.FabricPlatformImpl; 5 //?} 6 + //? neoforge { 7 + /*import net.lerariemann.infinity.util.platform.neoforge.NeoForgePlatformImpl; 8 + *///?} 9 import dev.architectury.registry.registries.RegistrySupplier; 10 + import net.minecraft.nbt.CompoundTag; 11 //? if >1.21 { 12 import net.minecraft.core.component.DataComponentType; 13 import net.minecraft.server.MinecraftServer; 14 import net.minecraft.world.item.ItemStack; 15 import net.minecraft.world.item.enchantment.ItemEnchantments; 16 //?} 17 import net.minecraft.server.level.ServerLevel; 18 import net.minecraft.server.level.ServerPlayer; 19 import net.minecraft.tags.TagKey; 20 import net.minecraft.world.entity.Entity; 21 import net.minecraft.world.item.Item; 22 import net.minecraft.world.level.block.Block; 23 import net.minecraft.world.level.block.LiquidBlock; 24 import net.minecraft.world.level.block.state.BlockState; 25 import net.minecraft.world.level.material.FlowingFluid; 26 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 27 //? forge { 28 /*import net.lerariemann.infinity.util.platform.forge.ForgePlatformImpl; 29 *///?} 30 31 import java.nio.file.Path; 32 + import java.util.List; 33 34 public interface InfinityPlatform { 35 int version = 36 + //? if >1.21.6 { 37 + 22; 38 + //?} else if >1.21 { 39 + /*21; 40 + *///?} else { 41 + /*20; 42 + *///?} 43 + int dataMcmeta = 44 + //? if >1.21.6 { 45 + 81; 46 + //?} else if >1.21 { 47 + /*48; 48 + *///?} else { 49 + /*15; 50 + *///?} 51 + int resourcesMcmeta = 52 + //? if >1.21.6 { 53 + 64; 54 + //?} else if >1.21 { 55 + /*34; 56 + *///?} else { 57 + /*15; 58 + *///?} 59 + 60 + static CompoundTag dataPackMcmeta(String description) { 61 + return packMcmeta(description, dataMcmeta); 62 + } 63 + static CompoundTag resourcePackMcmeta(String description) { 64 + return packMcmeta(description, resourcesMcmeta); 65 + } 66 + 67 + static CompoundTag packMcmeta(String description, int version) { 68 + CompoundTag res = new CompoundTag(); 69 + CompoundTag pack = new CompoundTag(); 70 + pack.putInt("pack_format", version); 71 + pack.putString("description", description); 72 + res.put("pack", pack); 73 + return res; 74 + } 75 76 //? fabric { 77 + InfinityPlatform INSTANCE = new FabricPlatformImpl(); 78 + //?} 79 //? neoforge { 80 + /*InfinityPlatform INSTANCE = new NeoForgePlatformImpl(); 81 + *///?} 82 //? forge { 83 /*InfinityPlatform INSTANCE = new ForgePlatformImpl(); 84 *///?} 85 86 boolean isModLoaded(String modid); 87 + List<String> getModsLoaded(); 88 String loader(); 89 Path getConfigFolder(); 90 boolean isDevelopment(); 91 void registerPayloadsServer(); 92 void registerPayloadsClient(); 93 + void sendS2CPayload(ServerPlayer entity, FriendlyPacket payload); 94 + void sendC2SPayload(FriendlyPacket payload); 95 96 /** 97 * On NeoForge, this allows the world to be ticked.
+12 -12
src/main/java/net/lerariemann/infinity/util/platform/fabric/FabricClientEntrypoint.java
··· 1 package net.lerariemann.infinity.util.platform.fabric; 2 3 //? fabric { 4 - /*//? if >1.21.2 { 5 import net.fabricmc.fabric.api.client.rendering.v1.BlockRenderLayerMap; 6 import net.lerariemann.infinity.item.tint.InfinityTintSource; 7 import net.minecraft.client.color.item.ItemTintSources; 8 import net.minecraft.client.renderer.chunk.ChunkSectionLayer; 9 //?} else { 10 - /^import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; 11 import net.lerariemann.infinity.util.platform.InfinityPlatform; 12 import net.minecraft.client.renderer.RenderType; 13 - ^///?} 14 import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; 15 import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; 16 import net.fabricmc.fabric.api.transfer.v1.client.fluid.FluidVariantRendering; ··· 36 ModBlocks.CHROMATIC_WOOL.get(), 37 ModBlocks.CHROMATIC_CARPET.get()); 38 //? if <1.21.4 { 39 - /^ColorProviderRegistry.ITEM.register(InfinityMethods::getOverlayColorFromComponents, 40 ModItems.TRANSFINITE_KEY.get(), 41 ModItems.BIOME_BOTTLE_ITEM.get(), 42 ModItems.F4.get()); ··· 47 ModItems.PORTAL_ITEM.get()); 48 ColorProviderRegistry.ITEM.register(InfinityMethods::getDiscColorFromComponents, 49 ModItems.DISC.get()); 50 - ^///?} else { 51 ItemTintSources.ID_MAPPER.put(InfinityMethods.getId("color"), InfinityTintSource.MAP_CODEC); 52 //?} 53 ··· 55 //? if >1.21.2 { 56 BlockRenderLayerMap.putBlocks(ChunkSectionLayer.CUTOUT_MIPPED, 57 //?} else { 58 - /^BlockRenderLayerMap.INSTANCE.putBlocks(RenderType.cutoutMipped(), 59 - ^///?} 60 ModBlocks.BOOK_BOX.get(), 61 ModBlocks.IRIDESCENT_KELP.get(), 62 ModBlocks.IRIDESCENT_KELP_PLANT.get()); 63 //? if >1.21.2 { 64 BlockRenderLayerMap.putBlocks(ChunkSectionLayer.TRANSLUCENT, 65 //?} else { 66 - /^BlockRenderLayerMap.INSTANCE.putBlocks(RenderType.translucent(), 67 - ^///?} 68 ModBlocks.TIME_BOMB.get(), 69 ModBlocks.BIOME_BOTTLE.get(), 70 ModBlocks.CHROMATIC_WOOL.get(), ··· 72 //? if >1.21.2 { 73 BlockRenderLayerMap.putFluids(ChunkSectionLayer.TRANSLUCENT, 74 //?} else { 75 - /^BlockRenderLayerMap.INSTANCE.putFluids(RenderType.translucent(), 76 - ^///?} 77 InfinityPlatform.INSTANCE.getIridescenceStill().get(), 78 InfinityPlatform.INSTANCE.getIridescenceFlowing().get()); 79 ··· 90 FluidRenderHandlerRegistry.INSTANCE.register(InfinityPlatform.INSTANCE.getIridescenceFlowing().get(), new ModFluidsFabric.IridescenceRenderHandler()); 91 } 92 } 93 - *///?}
··· 1 package net.lerariemann.infinity.util.platform.fabric; 2 3 //? fabric { 4 + //? if >1.21.2 { 5 import net.fabricmc.fabric.api.client.rendering.v1.BlockRenderLayerMap; 6 import net.lerariemann.infinity.item.tint.InfinityTintSource; 7 import net.minecraft.client.color.item.ItemTintSources; 8 import net.minecraft.client.renderer.chunk.ChunkSectionLayer; 9 //?} else { 10 + /*import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; 11 import net.lerariemann.infinity.util.platform.InfinityPlatform; 12 import net.minecraft.client.renderer.RenderType; 13 + *///?} 14 import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; 15 import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; 16 import net.fabricmc.fabric.api.transfer.v1.client.fluid.FluidVariantRendering; ··· 36 ModBlocks.CHROMATIC_WOOL.get(), 37 ModBlocks.CHROMATIC_CARPET.get()); 38 //? if <1.21.4 { 39 + /*ColorProviderRegistry.ITEM.register(InfinityMethods::getOverlayColorFromComponents, 40 ModItems.TRANSFINITE_KEY.get(), 41 ModItems.BIOME_BOTTLE_ITEM.get(), 42 ModItems.F4.get()); ··· 47 ModItems.PORTAL_ITEM.get()); 48 ColorProviderRegistry.ITEM.register(InfinityMethods::getDiscColorFromComponents, 49 ModItems.DISC.get()); 50 + *///?} else { 51 ItemTintSources.ID_MAPPER.put(InfinityMethods.getId("color"), InfinityTintSource.MAP_CODEC); 52 //?} 53 ··· 55 //? if >1.21.2 { 56 BlockRenderLayerMap.putBlocks(ChunkSectionLayer.CUTOUT_MIPPED, 57 //?} else { 58 + /*BlockRenderLayerMap.INSTANCE.putBlocks(RenderType.cutoutMipped(), 59 + *///?} 60 ModBlocks.BOOK_BOX.get(), 61 ModBlocks.IRIDESCENT_KELP.get(), 62 ModBlocks.IRIDESCENT_KELP_PLANT.get()); 63 //? if >1.21.2 { 64 BlockRenderLayerMap.putBlocks(ChunkSectionLayer.TRANSLUCENT, 65 //?} else { 66 + /*BlockRenderLayerMap.INSTANCE.putBlocks(RenderType.translucent(), 67 + *///?} 68 ModBlocks.TIME_BOMB.get(), 69 ModBlocks.BIOME_BOTTLE.get(), 70 ModBlocks.CHROMATIC_WOOL.get(), ··· 72 //? if >1.21.2 { 73 BlockRenderLayerMap.putFluids(ChunkSectionLayer.TRANSLUCENT, 74 //?} else { 75 + /*BlockRenderLayerMap.INSTANCE.putFluids(RenderType.translucent(), 76 + *///?} 77 InfinityPlatform.INSTANCE.getIridescenceStill().get(), 78 InfinityPlatform.INSTANCE.getIridescenceFlowing().get()); 79 ··· 90 FluidRenderHandlerRegistry.INSTANCE.register(InfinityPlatform.INSTANCE.getIridescenceFlowing().get(), new ModFluidsFabric.IridescenceRenderHandler()); 91 } 92 } 93 + //?}
+2 -2
src/main/java/net/lerariemann/infinity/util/platform/fabric/FabricEntrypoint.java
··· 2 3 //? fabric { 4 5 - /*import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; 6 import net.fabricmc.fabric.api.resource.ResourceManagerHelper; 7 import net.fabricmc.fabric.api.resource.ResourcePackActivationType; 8 import net.fabricmc.loader.api.FabricLoader; ··· 45 ResourcePackActivationType.ALWAYS_ENABLED); 46 } 47 } 48 - *///?}
··· 2 3 //? fabric { 4 5 + import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; 6 import net.fabricmc.fabric.api.resource.ResourceManagerHelper; 7 import net.fabricmc.fabric.api.resource.ResourcePackActivationType; 8 import net.fabricmc.loader.api.FabricLoader; ··· 45 ResourcePackActivationType.ALWAYS_ENABLED); 46 } 47 } 48 + //?}
+40 -38
src/main/java/net/lerariemann/infinity/util/platform/fabric/FabricPlatformImpl.java
··· 1 package net.lerariemann.infinity.util.platform.fabric; 2 3 //? fabric { 4 - /*import dev.architectury.registry.registries.RegistrySupplier; 5 import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; 6 //? if >1.21 { 7 import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; 8 import net.fabricmc.fabric.api.tag.convention.v2.ConventionalBlockTags; 9 import net.minecraft.core.component.DataComponentType; 10 import net.minecraft.world.item.enchantment.ItemEnchantments; 11 //?} 12 //? if <1.21 { 13 - /^import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; 14 - ^///?} 15 - import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; 16 import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 17 import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; 18 import net.fabricmc.loader.api.FabricLoader; ··· 21 import net.lerariemann.infinity.iridescence.IridescenceLiquidBlock; 22 import net.lerariemann.infinity.registry.core.ModBlocks; 23 import net.lerariemann.infinity.registry.core.ModItems; 24 - import net.lerariemann.infinity.registry.var.ModPayloads; 25 import net.lerariemann.infinity.util.InfinityMethods; 26 import net.lerariemann.infinity.util.VersionMethods; 27 import net.lerariemann.infinity.util.platform.InfinityPlatform; 28 - import net.minecraft.core.registries.BuiltInRegistries; 29 import net.minecraft.core.registries.Registries; 30 - import net.minecraft.resources.ResourceKey; 31 import net.minecraft.server.MinecraftServer; 32 import net.minecraft.server.level.ServerLevel; 33 import net.minecraft.server.level.ServerPlayer; 34 import net.minecraft.tags.TagKey; 35 import net.minecraft.world.entity.Entity; 36 - import net.minecraft.world.item.CreativeModeTab; 37 import net.minecraft.world.item.Item; 38 import net.minecraft.world.item.ItemStack; 39 import net.minecraft.world.level.block.Block; ··· 44 import net.minecraft.world.level.material.MapColor; 45 46 import java.nio.file.Path; 47 - import java.util.function.Supplier; 48 49 public class FabricPlatformImpl implements InfinityPlatform { 50 ··· 54 } 55 56 @Override 57 public String loader() { 58 return "fabric"; 59 } ··· 71 @Override 72 public void registerPayloadsServer() { 73 //? if >1.21 74 - ModPayloadsFabric.registerPayloadsServer(); 75 } 76 @Override 77 public void registerPayloadsClient() { 78 //? if >1.21 79 - ModPayloadsFabric.registerPayloadsClient(); 80 } 81 - public void sendS2CPayload(ServerPlayer entity, ModPayloads.FriendlyPacket payload) { 82 ServerPlayNetworking.send(entity, payload); 83 } 84 - public void sendC2SPayload(ModPayloads.FriendlyPacket payload) { 85 ClientPlayNetworking.send(payload); 86 87 } 88 89 - /^* 90 * On NeoForge, this allows the world to be ticked. 91 * On Fabric, this invokes a server world event in Fabric API. 92 - ^/ 93 public void onWorldLoad(Object mixin, ServerLevel world) { 94 ServerWorldEvents.LOAD.invoker().onWorldLoad((MinecraftServer) mixin, world); 95 } 96 97 - /^* 98 * Check if a block is in the Black Dyed Conventional Tag. 99 - ^/ 100 public boolean isInBlack(BlockState state) { 101 //? if <1.21 { 102 - /^return BuiltInRegistries.BLOCK.getKey(state.getBlock()).getPath().contains("black_"); 103 - ^///?} else { 104 return state.is(ConventionalBlockTags.BLACK_DYED); 105 //?} 106 } 107 108 - /^* 109 * Check if a block is in the White Dyed Conventional Tag. 110 - ^/ 111 public boolean isInWhite(BlockState state) { 112 //? if <1.21 { 113 - /^return BuiltInRegistries.BLOCK.getKey(state.getBlock()).getPath().contains("white_"); 114 - ^///?} else { 115 return state.is(ConventionalBlockTags.WHITE_DYED); 116 //?} 117 } 118 119 - /^* 120 * Get the still variant of Iridescence fluid. 121 - ^/ 122 public RegistrySupplier<? extends FlowingFluid> getIridescenceStill() { 123 return ModFluidsFabric.IRIDESCENCE_STILL; 124 } 125 - /^* 126 * Get the flowing variant of Iridescence fluid. 127 - ^/ 128 public RegistrySupplier<? extends FlowingFluid> getIridescenceFlowing() { 129 return ModFluidsFabric.IRIDESCENCE_FLOWING; 130 } 131 132 - /^* 133 * Get the registry supplier for Iridescence fluid. 134 - ^/ 135 public RegistrySupplier<LiquidBlock> getIridBlockForReg() { 136 var properties = VersionMethods.copyBlockProperties(Blocks.WATER).mapColor(MapColor.COLOR_MAGENTA) 137 //? if >1.21.2 ··· 142 properties)); 143 } 144 145 - /^* 146 * Read from the config path inside the mod JAR. 147 - ^/ 148 @SuppressWarnings("for removal") 149 public Path getRootPathInJar(String path) { 150 ModContainer mc = FabricLoader.getInstance().getModContainer(InfinityMod.MOD_ID).orElse(null); ··· 152 return mc.getRootPaths().getFirst().resolve(path); 153 } 154 155 - /^* 156 * Create an Item Tag. 157 - ^/ 158 public TagKey<Item> createItemTag(String id) { 159 return TagKey.create(Registries.ITEM, InfinityMethods.getId(id)); 160 } ··· 162 return TagKey.create(Registries.BLOCK, InfinityMethods.getId(id)); 163 } 164 165 - /^* 166 * Register a Flammable nameToElement (how does Architectury API not have a helper for this) 167 - ^/ 168 public void registerFlammableBlock(RegistrySupplier<Block> block, int burn, int spread) { 169 FlammableBlockRegistry.getDefaultInstance().add(block.get(), burn, spread); 170 } 171 172 - /^* 173 * Neoforge-exclusive method of testing if a mob is located in iridescence as far as fluid types are concerned. 174 * Used only in mixins, to fix the neoforge loader stripping mobs of ability to swim in non-water fluids. 175 * On Fabric, returns false. 176 - ^/ 177 public boolean acidTest(Entity entity, boolean eyes) { 178 return false; 179 } ··· 203 return FabricLoader.getInstance().getGameDir(); 204 } 205 } 206 - */
··· 1 package net.lerariemann.infinity.util.platform.fabric; 2 3 //? fabric { 4 + import dev.architectury.registry.registries.RegistrySupplier; 5 import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; 6 //? if >1.21 { 7 import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; 8 import net.fabricmc.fabric.api.tag.convention.v2.ConventionalBlockTags; 9 + import net.lerariemann.infinity.registry.payload.ModPayloads; 10 import net.minecraft.core.component.DataComponentType; 11 import net.minecraft.world.item.enchantment.ItemEnchantments; 12 //?} 13 //? if <1.21 { 14 + /*import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; 15 + import net.minecraft.core.registries.BuiltInRegistries; 16 + *///?} 17 import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 18 import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; 19 import net.fabricmc.loader.api.FabricLoader; ··· 22 import net.lerariemann.infinity.iridescence.IridescenceLiquidBlock; 23 import net.lerariemann.infinity.registry.core.ModBlocks; 24 import net.lerariemann.infinity.registry.core.ModItems; 25 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 26 import net.lerariemann.infinity.util.InfinityMethods; 27 import net.lerariemann.infinity.util.VersionMethods; 28 import net.lerariemann.infinity.util.platform.InfinityPlatform; 29 import net.minecraft.core.registries.Registries; 30 import net.minecraft.server.MinecraftServer; 31 import net.minecraft.server.level.ServerLevel; 32 import net.minecraft.server.level.ServerPlayer; 33 import net.minecraft.tags.TagKey; 34 import net.minecraft.world.entity.Entity; 35 import net.minecraft.world.item.Item; 36 import net.minecraft.world.item.ItemStack; 37 import net.minecraft.world.level.block.Block; ··· 42 import net.minecraft.world.level.material.MapColor; 43 44 import java.nio.file.Path; 45 + import java.util.List; 46 47 public class FabricPlatformImpl implements InfinityPlatform { 48 ··· 52 } 53 54 @Override 55 + public List<String> getModsLoaded() { 56 + return FabricLoader.getInstance().getAllMods().stream().map(c -> c.getMetadata().getId()).toList(); 57 + } 58 + 59 + @Override 60 public String loader() { 61 return "fabric"; 62 } ··· 74 @Override 75 public void registerPayloadsServer() { 76 //? if >1.21 77 + ModPayloads.registerFabricServerside(); 78 } 79 @Override 80 public void registerPayloadsClient() { 81 //? if >1.21 82 + ModPayloads.registerFabricClientside(); 83 } 84 + public void sendS2CPayload(ServerPlayer entity, FriendlyPacket payload) { 85 ServerPlayNetworking.send(entity, payload); 86 } 87 + public void sendC2SPayload(FriendlyPacket payload) { 88 ClientPlayNetworking.send(payload); 89 90 } 91 92 + /** 93 * On NeoForge, this allows the world to be ticked. 94 * On Fabric, this invokes a server world event in Fabric API. 95 + */ 96 public void onWorldLoad(Object mixin, ServerLevel world) { 97 ServerWorldEvents.LOAD.invoker().onWorldLoad((MinecraftServer) mixin, world); 98 } 99 100 + /** 101 * Check if a block is in the Black Dyed Conventional Tag. 102 + */ 103 public boolean isInBlack(BlockState state) { 104 //? if <1.21 { 105 + /*return BuiltInRegistries.BLOCK.getKey(state.getBlock()).getPath().contains("black_"); 106 + *///?} else { 107 return state.is(ConventionalBlockTags.BLACK_DYED); 108 //?} 109 } 110 111 + /** 112 * Check if a block is in the White Dyed Conventional Tag. 113 + */ 114 public boolean isInWhite(BlockState state) { 115 //? if <1.21 { 116 + /*return BuiltInRegistries.BLOCK.getKey(state.getBlock()).getPath().contains("white_"); 117 + *///?} else { 118 return state.is(ConventionalBlockTags.WHITE_DYED); 119 //?} 120 } 121 122 + /** 123 * Get the still variant of Iridescence fluid. 124 + */ 125 public RegistrySupplier<? extends FlowingFluid> getIridescenceStill() { 126 return ModFluidsFabric.IRIDESCENCE_STILL; 127 } 128 + /** 129 * Get the flowing variant of Iridescence fluid. 130 + */ 131 public RegistrySupplier<? extends FlowingFluid> getIridescenceFlowing() { 132 return ModFluidsFabric.IRIDESCENCE_FLOWING; 133 } 134 135 + /** 136 * Get the registry supplier for Iridescence fluid. 137 + */ 138 public RegistrySupplier<LiquidBlock> getIridBlockForReg() { 139 var properties = VersionMethods.copyBlockProperties(Blocks.WATER).mapColor(MapColor.COLOR_MAGENTA) 140 //? if >1.21.2 ··· 145 properties)); 146 } 147 148 + /** 149 * Read from the config path inside the mod JAR. 150 + */ 151 @SuppressWarnings("for removal") 152 public Path getRootPathInJar(String path) { 153 ModContainer mc = FabricLoader.getInstance().getModContainer(InfinityMod.MOD_ID).orElse(null); ··· 155 return mc.getRootPaths().getFirst().resolve(path); 156 } 157 158 + /** 159 * Create an Item Tag. 160 + */ 161 public TagKey<Item> createItemTag(String id) { 162 return TagKey.create(Registries.ITEM, InfinityMethods.getId(id)); 163 } ··· 165 return TagKey.create(Registries.BLOCK, InfinityMethods.getId(id)); 166 } 167 168 + /** 169 * Register a Flammable nameToElement (how does Architectury API not have a helper for this) 170 + */ 171 public void registerFlammableBlock(RegistrySupplier<Block> block, int burn, int spread) { 172 FlammableBlockRegistry.getDefaultInstance().add(block.get(), burn, spread); 173 } 174 175 + /** 176 * Neoforge-exclusive method of testing if a mob is located in iridescence as far as fluid types are concerned. 177 * Used only in mixins, to fix the neoforge loader stripping mobs of ability to swim in non-water fluids. 178 * On Fabric, returns false. 179 + */ 180 public boolean acidTest(Entity entity, boolean eyes) { 181 return false; 182 } ··· 206 return FabricLoader.getInstance().getGameDir(); 207 } 208 }
+6 -6
src/main/java/net/lerariemann/infinity/util/platform/fabric/ModFluidsFabric.java
··· 1 package net.lerariemann.infinity.util.platform.fabric; 2 3 //? fabric { 4 - /*import dev.architectury.registry.registries.DeferredRegister; 5 import dev.architectury.registry.registries.RegistrySupplier; 6 import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; 7 import net.fabricmc.fabric.api.transfer.v1.client.fluid.FluidVariantRenderHandler; ··· 74 //? if >1.21.2 { 75 ServerLevel 76 //?} else { 77 - /^Level 78 - ^///?} 79 world) { 80 return Iridescence.isInfinite(world); 81 } ··· 170 @Override 171 public TextureAtlasSprite[] getFluidSprites(@Nullable BlockAndTintGetter view, @Nullable BlockPos pos, FluidState state) { 172 //? if >1.21.8 { 173 - /^TextureAtlas atlas = Minecraft.getInstance().getAtlasManager().getAtlasOrThrow(TextureAtlas.LOCATION_BLOCKS); 174 TextureAtlasSprite overlaySprite = atlas.getSprite(Iridescence.OVERLAY_TEXTURE); 175 TextureAtlasSprite[] sprites = new TextureAtlasSprite[3]; 176 sprites[0] = atlas.getSprite(Iridescence.TEXTURE); 177 sprites[1] = atlas.getSprite(Iridescence.FLOWING_TEXTURE); 178 sprites[2] = overlaySprite; 179 - ^///?} else { 180 Function<ResourceLocation, TextureAtlasSprite> atlas = Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS); 181 TextureAtlasSprite overlaySprite = atlas.apply(Iridescence.OVERLAY_TEXTURE); 182 TextureAtlasSprite[] sprites = new TextureAtlasSprite[overlaySprite == null ? 2 : 3]; ··· 193 } 194 } 195 } 196 - *///?}
··· 1 package net.lerariemann.infinity.util.platform.fabric; 2 3 //? fabric { 4 + import dev.architectury.registry.registries.DeferredRegister; 5 import dev.architectury.registry.registries.RegistrySupplier; 6 import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; 7 import net.fabricmc.fabric.api.transfer.v1.client.fluid.FluidVariantRenderHandler; ··· 74 //? if >1.21.2 { 75 ServerLevel 76 //?} else { 77 + /*Level 78 + *///?} 79 world) { 80 return Iridescence.isInfinite(world); 81 } ··· 170 @Override 171 public TextureAtlasSprite[] getFluidSprites(@Nullable BlockAndTintGetter view, @Nullable BlockPos pos, FluidState state) { 172 //? if >1.21.8 { 173 + /*TextureAtlas atlas = Minecraft.getInstance().getAtlasManager().getAtlasOrThrow(TextureAtlas.LOCATION_BLOCKS); 174 TextureAtlasSprite overlaySprite = atlas.getSprite(Iridescence.OVERLAY_TEXTURE); 175 TextureAtlasSprite[] sprites = new TextureAtlasSprite[3]; 176 sprites[0] = atlas.getSprite(Iridescence.TEXTURE); 177 sprites[1] = atlas.getSprite(Iridescence.FLOWING_TEXTURE); 178 sprites[2] = overlaySprite; 179 + *///?} else { 180 Function<ResourceLocation, TextureAtlasSprite> atlas = Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS); 181 TextureAtlasSprite overlaySprite = atlas.apply(Iridescence.OVERLAY_TEXTURE); 182 TextureAtlasSprite[] sprites = new TextureAtlasSprite[overlaySprite == null ? 2 : 3]; ··· 193 } 194 } 195 } 196 + //?}
-51
src/main/java/net/lerariemann/infinity/util/platform/fabric/ModPayloadsFabric.java
··· 1 - package net.lerariemann.infinity.util.platform.fabric; 2 - 3 - //? if >1.21 && fabric { 4 - /*import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; 5 - import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; 6 - import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 7 - import net.lerariemann.infinity.registry.var.ModPayloads; 8 - import net.lerariemann.infinity.util.config.SoundScanner; 9 - import net.minecraft.client.Minecraft; 10 - 11 - import static net.lerariemann.infinity.registry.var.ModPayloads.*; 12 - 13 - public class ModPayloadsFabric { 14 - public static Minecraft client(Object context) { 15 - ClientPlayNetworking.Context clientContext = (ClientPlayNetworking.Context) context; 16 - return clientContext.client(); 17 - } 18 - 19 - public static void registerPayloadsServer() { 20 - PayloadTypeRegistry.playS2C().register(WorldAddS2CPayload.ID, WorldAddS2CPayload.CODEC); 21 - PayloadTypeRegistry.playS2C().register(BiomeAddS2CPayload.ID, BiomeAddS2CPayload.CODEC); 22 - PayloadTypeRegistry.playS2C().register(ShaderS2CPayload.ID, ShaderS2CPayload.CODEC); 23 - PayloadTypeRegistry.playS2C().register(StarsS2CPayload.ID, StarsS2CPayload.CODEC); 24 - PayloadTypeRegistry.playS2C().register(SoundPackS2CPayload.ID, SoundPackS2CPayload.CODEC); 25 - 26 - PayloadTypeRegistry.playC2S().register(F4UpdateC2SPayload.ID, F4UpdateC2SPayload.CODEC); 27 - PayloadTypeRegistry.playC2S().register(F4DeployC2SPayload.ID, F4DeployC2SPayload.CODEC); 28 - PayloadTypeRegistry.playC2S().register(JukeboxesC2SPayload.ID, JukeboxesC2SPayload.CODEC); 29 - 30 - ServerPlayNetworking.registerGlobalReceiver(F4UpdateC2SPayload.ID, (payload, context) -> 31 - payload.receive(context.player())); 32 - ServerPlayNetworking.registerGlobalReceiver(F4DeployC2SPayload.ID, (payload, context) -> 33 - payload.receive(context.player())); 34 - ServerPlayNetworking.registerGlobalReceiver(JukeboxesC2SPayload.ID, (payload, context) -> 35 - SoundScanner.unpackUploadedJukeboxes(context.server(), payload.data())); 36 - } 37 - 38 - public static void registerPayloadsClient() { 39 - ClientPlayNetworking.registerGlobalReceiver(WorldAddS2CPayload.ID, (payload, context) -> 40 - payload.receive(client(context))); 41 - ClientPlayNetworking.registerGlobalReceiver(BiomeAddS2CPayload.ID, (payload, context) -> 42 - payload.receive(client(context))); 43 - ClientPlayNetworking.registerGlobalReceiver(ShaderS2CPayload.ID, (payload, context) -> 44 - payload.receive(client(context))); 45 - ClientPlayNetworking.registerGlobalReceiver(StarsS2CPayload.ID, (payload, context) -> 46 - payload.receive(client(context))); 47 - ClientPlayNetworking.registerGlobalReceiver(SoundPackS2CPayload.ID, (payload, context) -> 48 - SoundScanner.unpackDownloadedPack(payload.songIds(), client(context))); 49 - } 50 - } 51 - *///?}
···
+2 -2
src/main/java/net/lerariemann/infinity/util/platform/fabric/compat/ModConfigFactory.java
··· 1 package net.lerariemann.infinity.util.platform.fabric.compat; 2 3 //? fabric { 4 - /*import com.terraformersmc.modmenu.api.ConfigScreenFactory; 5 import net.lerariemann.infinity.compat.cloth.ClothConfigFactory; 6 import net.minecraft.client.gui.screens.Screen; 7 ··· 11 return ClothConfigFactory.create(parent); 12 } 13 } 14 - *///?}
··· 1 package net.lerariemann.infinity.util.platform.fabric.compat; 2 3 //? fabric { 4 + import com.terraformersmc.modmenu.api.ConfigScreenFactory; 5 import net.lerariemann.infinity.compat.cloth.ClothConfigFactory; 6 import net.minecraft.client.gui.screens.Screen; 7 ··· 11 return ClothConfigFactory.create(parent); 12 } 13 } 14 + //?}
+2 -2
src/main/java/net/lerariemann/infinity/util/platform/fabric/compat/ModMenuCompat.java
··· 1 package net.lerariemann.infinity.util.platform.fabric.compat; 2 3 //? fabric { 4 - /*import com.terraformersmc.modmenu.api.ConfigScreenFactory; 5 import com.terraformersmc.modmenu.api.ModMenuApi; 6 import net.lerariemann.infinity.compat.ModCompat; 7 import net.lerariemann.infinity.util.platform.InfinityPlatform; ··· 16 } 17 } 18 } 19 - *///?}
··· 1 package net.lerariemann.infinity.util.platform.fabric.compat; 2 3 //? fabric { 4 + import com.terraformersmc.modmenu.api.ConfigScreenFactory; 5 import com.terraformersmc.modmenu.api.ModMenuApi; 6 import net.lerariemann.infinity.compat.ModCompat; 7 import net.lerariemann.infinity.util.platform.InfinityPlatform; ··· 16 } 17 } 18 } 19 + //?}
+10 -6
src/main/java/net/lerariemann/infinity/util/platform/forge/ForgePlatformImpl.java
··· 5 import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; 6 import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 7 import net.lerariemann.infinity.registry.core.ModBlocks; 8 - import net.lerariemann.infinity.registry.var.ModPayloads; 9 import net.lerariemann.infinity.util.InfinityMethods; 10 import net.lerariemann.infinity.util.VersionMethods; 11 import net.lerariemann.infinity.util.platform.InfinityPlatform; 12 import net.minecraft.core.registries.BuiltInRegistries; 13 import net.minecraft.core.registries.Registries; 14 - import net.minecraft.resources.ResourceKey; 15 import net.minecraft.server.MinecraftServer; 16 import net.minecraft.server.level.ServerLevel; 17 import net.minecraft.server.level.ServerPlayer; 18 import net.minecraft.tags.TagKey; 19 import net.minecraft.world.entity.Entity; 20 import net.minecraft.world.entity.player.Player; 21 - import net.minecraft.world.item.CreativeModeTab; 22 import net.minecraft.world.item.Item; 23 - import net.minecraft.world.item.ItemStack; 24 import net.minecraft.world.level.block.Block; 25 import net.minecraft.world.level.block.Blocks; 26 import net.minecraft.world.level.block.FireBlock; ··· 34 import net.minecraftforge.fml.ModLoadingContext; 35 import net.minecraftforge.fml.loading.FMLEnvironment; 36 import net.minecraftforge.fml.loading.FMLPaths; 37 38 import java.nio.file.Path; 39 40 public class ForgePlatformImpl implements InfinityPlatform { 41 @Override ··· 44 } 45 46 @Override 47 public String loader() { 48 return "forge"; 49 } ··· 61 public void registerPayloadsServer() {}; 62 @Override 63 public void registerPayloadsClient() {}; 64 - public void sendS2CPayload(ServerPlayer entity, ModPayloads.FriendlyPacket payload) { 65 ServerPlayNetworking.send(entity, payload); 66 } 67 68 - public void sendC2SPayload(ModPayloads.FriendlyPacket payload) { 69 ClientPlayNetworking.send(payload); 70 } 71
··· 5 import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; 6 import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 7 import net.lerariemann.infinity.registry.core.ModBlocks; 8 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 9 import net.lerariemann.infinity.util.InfinityMethods; 10 import net.lerariemann.infinity.util.VersionMethods; 11 import net.lerariemann.infinity.util.platform.InfinityPlatform; 12 import net.minecraft.core.registries.BuiltInRegistries; 13 import net.minecraft.core.registries.Registries; 14 import net.minecraft.server.MinecraftServer; 15 import net.minecraft.server.level.ServerLevel; 16 import net.minecraft.server.level.ServerPlayer; 17 import net.minecraft.tags.TagKey; 18 import net.minecraft.world.entity.Entity; 19 import net.minecraft.world.entity.player.Player; 20 import net.minecraft.world.item.Item; 21 import net.minecraft.world.level.block.Block; 22 import net.minecraft.world.level.block.Blocks; 23 import net.minecraft.world.level.block.FireBlock; ··· 31 import net.minecraftforge.fml.ModLoadingContext; 32 import net.minecraftforge.fml.loading.FMLEnvironment; 33 import net.minecraftforge.fml.loading.FMLPaths; 34 + import net.minecraftforge.forgespi.language.IModInfo; 35 36 import java.nio.file.Path; 37 + import java.util.List; 38 39 public class ForgePlatformImpl implements InfinityPlatform { 40 @Override ··· 43 } 44 45 @Override 46 + public List<String> getModsLoaded() { 47 + return ModList.get().getMods().stream().map(IModInfo::getModId).toList(); 48 + } 49 + 50 + @Override 51 public String loader() { 52 return "forge"; 53 } ··· 65 public void registerPayloadsServer() {}; 66 @Override 67 public void registerPayloadsClient() {}; 68 + public void sendS2CPayload(ServerPlayer entity, FriendlyPacket payload) { 69 ServerPlayNetworking.send(entity, payload); 70 } 71 72 + public void sendC2SPayload(FriendlyPacket payload) { 73 ClientPlayNetworking.send(payload); 74 } 75
+2 -2
src/main/java/net/lerariemann/infinity/util/platform/neoforge/FluidTypes.java
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 - import net.lerariemann.infinity.InfinityMod; 5 import net.lerariemann.infinity.iridescence.Iridescence; 6 import net.minecraft.core.BlockPos; 7 import net.minecraft.sounds.SoundEvents; ··· 85 } 86 } 87 } 88 - //?}
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 + /*import net.lerariemann.infinity.InfinityMod; 5 import net.lerariemann.infinity.iridescence.Iridescence; 6 import net.minecraft.core.BlockPos; 7 import net.minecraft.sounds.SoundEvents; ··· 85 } 86 } 87 } 88 + *///?}
+13 -47
src/main/java/net/lerariemann/infinity/util/platform/neoforge/InfinityModNeoForgeClient.java
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 - import net.lerariemann.infinity.InfinityMod; 5 import net.lerariemann.infinity.InfinityModClient; 6 import net.lerariemann.infinity.compat.ModCompat; 7 - import net.lerariemann.infinity.registry.var.ModPayloads; 8 import net.lerariemann.infinity.registry.var.ModScreenHandlers; 9 import net.lerariemann.infinity.util.VersionMethods; 10 import net.lerariemann.infinity.util.config.SoundScanner; ··· 19 import net.minecraft.client.renderer.ItemBlockRenderTypes; 20 import net.minecraft.client.renderer.RenderType; 21 //? if >1.21.4 { 22 - import net.minecraft.client.renderer.chunk.ChunkSectionLayer; 23 import net.lerariemann.infinity.item.tint.InfinityTintSource; 24 25 - //?} 26 import net.minecraft.core.BlockPos; 27 import net.minecraft.resources.ResourceLocation; 28 import net.minecraft.world.level.BlockAndTintGetter; ··· 72 event.register(InfinityMethods::getBookBoxColor, ModBlocks.BOOK_BOX.get()); 73 } 74 //? if <1.21.4 { 75 - /*@SubscribeEvent 76 public static void registerItemColorHandlers(RegisterColorHandlersEvent.Item event) { 77 event.register(InfinityMethods::getOverlayColorFromComponents, 78 ModItems.TRANSFINITE_KEY.get(), ··· 86 event.register(InfinityMethods::getDiscColorFromComponents, 87 ModItems.DISC.get()); 88 } 89 - *///?} else { 90 - @SubscribeEvent 91 public static void registerItemColorHandlers(RegisterColorHandlersEvent.ItemTintSources event) { 92 event.register(InfinityMethods.getId("color"), InfinityTintSource.MAP_CODEC); 93 } 94 - //?} 95 @SubscribeEvent 96 public static void registerMenuScreens(RegisterMenuScreensEvent event) { 97 event.register(ModScreenHandlers.F4.get(), F4Screen::new); ··· 104 @SubscribeEvent 105 public static void registerFluidRenderLayers(FMLClientSetupEvent event) { 106 //? if >1.21.4 { 107 - ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceStill().get(), ChunkSectionLayer.TRANSLUCENT); 108 ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceFlowing().get(), ChunkSectionLayer.TRANSLUCENT); 109 - //?} else { 110 - /*ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceStill().get(), RenderType.translucent()); 111 ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceFlowing().get(), RenderType.translucent()); 112 - *///?} 113 } 114 115 @SubscribeEvent ··· 139 140 }, FluidTypes.IRIDESCENCE_TYPE.value()); 141 } 142 - 143 - public static Minecraft client() { 144 - return Minecraft.getInstance(); 145 - } 146 - 147 - @SubscribeEvent 148 - public static void registerClientPayloads(final RegisterPayloadHandlersEvent event) { 149 - final PayloadRegistrar registrar = event.registrar("1"); 150 - registrar.playToClient( 151 - ModPayloads.WorldAddS2CPayload.ID, 152 - ModPayloads.WorldAddS2CPayload.CODEC, 153 - (payload, context) -> payload.receive(client()) 154 - ); 155 - registrar.playToClient( 156 - ModPayloads.BiomeAddS2CPayload.ID, 157 - ModPayloads.BiomeAddS2CPayload.CODEC, 158 - (payload, context) -> payload.receive(client()) 159 - ); 160 - registrar.playToClient( 161 - ModPayloads.ShaderS2CPayload.ID, 162 - ModPayloads.ShaderS2CPayload.CODEC, 163 - (payload, context) -> payload.receive(client()) 164 - ); 165 - registrar.playToClient( 166 - ModPayloads.StarsS2CPayload.ID, 167 - ModPayloads.StarsS2CPayload.CODEC, 168 - (payload, context) -> payload.receive(client()) 169 - ); 170 - registrar.playToClient( 171 - ModPayloads.SoundPackS2CPayload.ID, 172 - ModPayloads.SoundPackS2CPayload.CODEC, 173 - (payload, context) -> SoundScanner.unpackDownloadedPack(payload.songIds(), client()) 174 - ); 175 - } 176 } 177 - //?}
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 + /*import net.lerariemann.infinity.InfinityMod; 5 import net.lerariemann.infinity.InfinityModClient; 6 import net.lerariemann.infinity.compat.ModCompat; 7 + import net.lerariemann.infinity.registry.payload.ModPayloads; 8 import net.lerariemann.infinity.registry.var.ModScreenHandlers; 9 import net.lerariemann.infinity.util.VersionMethods; 10 import net.lerariemann.infinity.util.config.SoundScanner; ··· 19 import net.minecraft.client.renderer.ItemBlockRenderTypes; 20 import net.minecraft.client.renderer.RenderType; 21 //? if >1.21.4 { 22 + /^import net.minecraft.client.renderer.chunk.ChunkSectionLayer; 23 import net.lerariemann.infinity.item.tint.InfinityTintSource; 24 25 + ^///?} 26 import net.minecraft.core.BlockPos; 27 import net.minecraft.resources.ResourceLocation; 28 import net.minecraft.world.level.BlockAndTintGetter; ··· 72 event.register(InfinityMethods::getBookBoxColor, ModBlocks.BOOK_BOX.get()); 73 } 74 //? if <1.21.4 { 75 + @SubscribeEvent 76 public static void registerItemColorHandlers(RegisterColorHandlersEvent.Item event) { 77 event.register(InfinityMethods::getOverlayColorFromComponents, 78 ModItems.TRANSFINITE_KEY.get(), ··· 86 event.register(InfinityMethods::getDiscColorFromComponents, 87 ModItems.DISC.get()); 88 } 89 + //?} else { 90 + /^@SubscribeEvent 91 public static void registerItemColorHandlers(RegisterColorHandlersEvent.ItemTintSources event) { 92 event.register(InfinityMethods.getId("color"), InfinityTintSource.MAP_CODEC); 93 } 94 + ^///?} 95 @SubscribeEvent 96 public static void registerMenuScreens(RegisterMenuScreensEvent event) { 97 event.register(ModScreenHandlers.F4.get(), F4Screen::new); ··· 104 @SubscribeEvent 105 public static void registerFluidRenderLayers(FMLClientSetupEvent event) { 106 //? if >1.21.4 { 107 + /^ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceStill().get(), ChunkSectionLayer.TRANSLUCENT); 108 ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceFlowing().get(), ChunkSectionLayer.TRANSLUCENT); 109 + ^///?} else { 110 + ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceStill().get(), RenderType.translucent()); 111 ItemBlockRenderTypes.setRenderLayer(InfinityPlatform.INSTANCE.getIridescenceFlowing().get(), RenderType.translucent()); 112 + //?} 113 } 114 115 @SubscribeEvent ··· 139 140 }, FluidTypes.IRIDESCENCE_TYPE.value()); 141 } 142 } 143 + *///?}
+11 -45
src/main/java/net/lerariemann/infinity/util/platform/neoforge/InfinityModNeoforge.java
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 - import net.lerariemann.infinity.InfinityMod; 5 //? if >1.21.4 { 6 - import net.lerariemann.infinity.compat.ModCompat; 7 import net.lerariemann.infinity.compat.rrv.RrvIntegration; 8 - //?} 9 - import net.lerariemann.infinity.compat.CreateCompat; 10 import net.lerariemann.infinity.registry.core.ModBlocks; 11 import net.lerariemann.infinity.registry.core.ModEntities; 12 import net.lerariemann.infinity.registry.core.ModItemFunctions; 13 - import net.lerariemann.infinity.registry.var.ModPayloads; 14 import net.lerariemann.infinity.registry.var.ModStats; 15 import net.lerariemann.infinity.util.InfinityMethods; 16 - import net.lerariemann.infinity.util.config.SoundScanner; 17 import net.lerariemann.infinity.util.platform.InfinityPlatform; 18 import net.minecraft.network.chat.Component; 19 - import net.minecraft.server.MinecraftServer; 20 - import net.minecraft.server.level.ServerPlayer; 21 import net.minecraft.server.packs.PackType; 22 import net.minecraft.server.packs.repository.Pack; 23 import net.minecraft.server.packs.repository.PackSource; ··· 30 import net.neoforged.neoforge.event.AddPackFindersEvent; 31 import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; 32 import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; 33 - import net.neoforged.neoforge.network.handling.IPayloadContext; 34 - import net.neoforged.neoforge.network.registration.PayloadRegistrar; 35 36 import static net.lerariemann.infinity.InfinityMod.MOD_ID; 37 ··· 46 ModFluidsNeoforge.registerModFluids(); 47 ModEffectsNeoforge.register(eventBus); 48 //? if <1.21.2 { 49 - /*if (InfinityPlatform.INSTANCE.isModLoaded("create")) 50 - CreateCompat.register(); 51 - *///?} 52 } 53 54 @SubscribeEvent ··· 83 ModItemFunctions.registerDispenserBehaviour(); 84 // this is less than ideal but i cannot figure out why the proper solution isn't working 85 //? if >1.21.4 { 86 - if (ModCompat.RRV) 87 RrvIntegration.initialize(); 88 - //?} 89 - } 90 - 91 - public static ServerPlayer getPlayer(IPayloadContext context) { 92 - return ((ServerPlayer)context.player()); 93 - } 94 - 95 - public static MinecraftServer getServerFromPlayer(IPayloadContext context) { 96 - ServerPlayer player = getPlayer(context); 97 - //? if >1.21.9 { 98 - /*return player.level().getServer(); 99 - *///?} else { 100 - return player.getServer(); 101 - //?} 102 } 103 104 @SubscribeEvent 105 public static void registerServerPayloads(final RegisterPayloadHandlersEvent event) { 106 - final PayloadRegistrar registrar = event.registrar("1"); 107 - registrar.playToServer( 108 - ModPayloads.F4UpdateC2SPayload.ID, 109 - ModPayloads.F4UpdateC2SPayload.CODEC, 110 - (payload, context) -> payload.receive(getPlayer(context)) 111 - ); 112 - registrar.playToServer( 113 - ModPayloads.F4DeployC2SPayload.ID, 114 - ModPayloads.F4DeployC2SPayload.CODEC, 115 - (payload, context) -> payload.receive(getPlayer(context)) 116 - ); 117 - registrar.playToServer( 118 - ModPayloads.JukeboxesC2SPayload.ID, 119 - ModPayloads.JukeboxesC2SPayload.CODEC, 120 - (payload, context) -> SoundScanner.unpackUploadedJukeboxes(getServerFromPlayer(context), payload.data()) 121 - ); 122 } 123 } 124 - //?}
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 + /*import net.lerariemann.infinity.InfinityMod; 5 //? if >1.21.4 { 6 + /^import net.lerariemann.infinity.compat.ModCompat; 7 import net.lerariemann.infinity.compat.rrv.RrvIntegration; 8 + ^///?} 9 import net.lerariemann.infinity.registry.core.ModBlocks; 10 import net.lerariemann.infinity.registry.core.ModEntities; 11 import net.lerariemann.infinity.registry.core.ModItemFunctions; 12 + import net.lerariemann.infinity.registry.payload.ModPayloads; 13 import net.lerariemann.infinity.registry.var.ModStats; 14 import net.lerariemann.infinity.util.InfinityMethods; 15 import net.lerariemann.infinity.util.platform.InfinityPlatform; 16 import net.minecraft.network.chat.Component; 17 import net.minecraft.server.packs.PackType; 18 import net.minecraft.server.packs.repository.Pack; 19 import net.minecraft.server.packs.repository.PackSource; ··· 26 import net.neoforged.neoforge.event.AddPackFindersEvent; 27 import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; 28 import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; 29 30 import static net.lerariemann.infinity.InfinityMod.MOD_ID; 31 ··· 40 ModFluidsNeoforge.registerModFluids(); 41 ModEffectsNeoforge.register(eventBus); 42 //? if <1.21.2 { 43 + if (InfinityPlatform.INSTANCE.isModLoaded("create")) 44 + net.lerariemann.infinity.compat.CreateCompat.register(); 45 + //?} 46 } 47 48 @SubscribeEvent ··· 77 ModItemFunctions.registerDispenserBehaviour(); 78 // this is less than ideal but i cannot figure out why the proper solution isn't working 79 //? if >1.21.4 { 80 + /^if (ModCompat.RRV) 81 RrvIntegration.initialize(); 82 + ^///?} 83 } 84 85 @SubscribeEvent 86 public static void registerServerPayloads(final RegisterPayloadHandlersEvent event) { 87 + ModPayloads.registerNeoforge(event); 88 } 89 } 90 + *///?}
+2 -2
src/main/java/net/lerariemann/infinity/util/platform/neoforge/IridescenceLiquidBlockNeoforge.java
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 - import net.lerariemann.infinity.iridescence.IridescenceLiquidBlock; 5 import net.minecraft.core.BlockPos; 6 import net.minecraft.world.entity.Mob; 7 import net.minecraft.world.level.BlockGetter; ··· 24 return PathType.WATER; 25 } 26 } 27 - //?}
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 + /*import net.lerariemann.infinity.iridescence.IridescenceLiquidBlock; 5 import net.minecraft.core.BlockPos; 6 import net.minecraft.world.entity.Mob; 7 import net.minecraft.world.level.BlockGetter; ··· 24 return PathType.WATER; 25 } 26 } 27 + *///?}
+2 -2
src/main/java/net/lerariemann/infinity/util/platform/neoforge/ModConfigFactory.java
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 - import net.lerariemann.infinity.compat.cloth.ClothConfigFactory; 5 import net.minecraft.client.gui.screens.Screen; 6 import net.neoforged.fml.ModContainer; 7 import net.neoforged.neoforge.client.gui.IConfigScreenFactory; ··· 14 return ClothConfigFactory.create(parent); 15 } 16 } 17 - //?}
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 + /*import net.lerariemann.infinity.compat.cloth.ClothConfigFactory; 5 import net.minecraft.client.gui.screens.Screen; 6 import net.neoforged.fml.ModContainer; 7 import net.neoforged.neoforge.client.gui.IConfigScreenFactory; ··· 14 return ClothConfigFactory.create(parent); 15 } 16 } 17 + *///?}
+2 -2
src/main/java/net/lerariemann/infinity/util/platform/neoforge/ModEffectsNeoforge.java
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 - import net.lerariemann.infinity.InfinityMod; 5 import net.lerariemann.infinity.iridescence.IridescentCooldownEffect; 6 import net.lerariemann.infinity.iridescence.IridescentEffect; 7 import net.lerariemann.infinity.registry.core.ModStatusEffects; ··· 26 EFFECTS.register(eventBus); 27 } 28 } 29 - //?}
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 + /*import net.lerariemann.infinity.InfinityMod; 5 import net.lerariemann.infinity.iridescence.IridescentCooldownEffect; 6 import net.lerariemann.infinity.iridescence.IridescentEffect; 7 import net.lerariemann.infinity.registry.core.ModStatusEffects; ··· 26 EFFECTS.register(eventBus); 27 } 28 } 29 + *///?}
+2 -2
src/main/java/net/lerariemann/infinity/util/platform/neoforge/ModFluidsNeoforge.java
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 - import dev.architectury.registry.registries.DeferredRegister; 5 import dev.architectury.registry.registries.RegistrySupplier; 6 import net.lerariemann.infinity.registry.core.ModBlocks; 7 import net.lerariemann.infinity.registry.core.ModItems; ··· 30 FLUIDS.register(); 31 } 32 } 33 - //?}
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 + /*import dev.architectury.registry.registries.DeferredRegister; 5 import dev.architectury.registry.registries.RegistrySupplier; 6 import net.lerariemann.infinity.registry.core.ModBlocks; 7 import net.lerariemann.infinity.registry.core.ModItems; ··· 30 FLUIDS.register(); 31 } 32 } 33 + *///?}
+47 -40
src/main/java/net/lerariemann/infinity/util/platform/neoforge/NeoForgePlatformImpl.java
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 - import dev.architectury.registry.registries.RegistrySupplier; 5 import net.lerariemann.infinity.registry.core.ModBlocks; 6 import net.lerariemann.infinity.registry.core.ModItems; 7 - import net.lerariemann.infinity.registry.var.ModPayloads; 8 import net.lerariemann.infinity.util.InfinityMethods; 9 import net.lerariemann.infinity.util.VersionMethods; 10 import net.lerariemann.infinity.util.platform.InfinityPlatform; ··· 35 import net.neoforged.fml.loading.FMLEnvironment; 36 import net.neoforged.fml.loading.FMLPaths; 37 //? if >1.21.4 { 38 - import net.neoforged.neoforge.client.network.ClientPacketDistributor; 39 - //?} 40 import net.neoforged.neoforge.common.NeoForge; 41 import net.neoforged.neoforge.common.Tags; 42 import net.neoforged.neoforge.event.level.LevelEvent; 43 import net.neoforged.neoforge.network.PacketDistributor; 44 45 import java.nio.file.Path; 46 import java.util.function.Supplier; 47 48 public class NeoForgePlatformImpl implements InfinityPlatform { ··· 50 public boolean isModLoaded(String modid) { 51 return ModList.get().isLoaded(modid); 52 } 53 54 @Override 55 public String loader() { ··· 64 @Override 65 public boolean isDevelopment() { 66 //? if >1.21.9 { 67 - /*return !FMLEnvironment.isProduction(); 68 - *///?} else { 69 return !FMLEnvironment.production; 70 //?} 71 ··· 76 public void registerPayloadsClient() {} 77 78 @Override 79 - public void sendS2CPayload(ServerPlayer entity, ModPayloads.FriendlyPacket payload) { 80 PacketDistributor.sendToPlayer(entity, payload); 81 } 82 83 @Override 84 - public void sendC2SPayload(ModPayloads.FriendlyPacket payload) { 85 //? <1.21.2 { 86 - /*PacketDistributor.sendToServer(payload); 87 - *///?} else { 88 - ClientPacketDistributor.sendToServer(payload); 89 - //?} 90 } 91 92 - /** 93 * On NeoForge, this allows the world to be ticked. 94 * On Fabric, this invokes a server world event in Fabric API. 95 - */ 96 @Override 97 public void onWorldLoad(Object mixin, ServerLevel world) { 98 MinecraftServer server = world.getServer(); ··· 101 NeoForge.EVENT_BUS.post(new LevelEvent.Load(world)); 102 } 103 104 - /** 105 * Check if a block is in the Black Dyed Conventional Tag. 106 - */ 107 @Override 108 public boolean isInBlack(BlockState state) { 109 return state.is(Tags.Blocks.DYED_BLACK); 110 } 111 112 - /** 113 * Check if a block is in the White Dyed Conventional Tag. 114 - */ 115 @Override 116 public boolean isInWhite(BlockState state) { 117 return state.is(Tags.Blocks.DYED_WHITE); 118 } 119 120 - /** 121 * Get the still variant of Iridescence fluid. 122 - */ 123 @Override 124 public RegistrySupplier<? extends FlowingFluid> getIridescenceStill() { 125 return ModFluidsNeoforge.IRIDESCENCE_STILL; 126 } 127 - /** 128 * Get the flowing variant of Iridescence fluid. 129 - */ 130 @Override 131 public RegistrySupplier<? extends FlowingFluid> getIridescenceFlowing() { 132 return ModFluidsNeoforge.IRIDESCENCE_FLOWING; 133 } 134 135 - /** 136 * Get the registry supplier for Iridescence fluid. 137 - */ 138 @Override 139 public RegistrySupplier<LiquidBlock> getIridBlockForReg() { 140 var properties = VersionMethods.copyBlockProperties(Blocks.WATER).mapColor(MapColor.COLOR_MAGENTA) 141 //? if >1.21.2 142 - .setId(ModBlocks.registryKey("iridescence")) 143 ; 144 return ModBlocks.BLOCKS.register("iridescence", () -> 145 new IridescenceLiquidBlockNeoforge(InfinityPlatform.INSTANCE.getIridescenceStill(), properties)); 146 } 147 148 - /** 149 * Read from the config path inside the mod JAR. 150 - */ 151 @Override 152 @SuppressWarnings("for removal") 153 public Path getRootPathInJar(String path) { 154 var file = ModLoadingContext.get().getActiveContainer().getModInfo().getOwningFile().getFile(); 155 // FIXME 1.21.10 - this does not work in production. standard paths do not work on neoforge 1.21.10, will either need to drop neo or make this even more platform specific 156 //? if >1.21.9 { 157 - /*var contents = file.getContents(); 158 Path returnPath = null; 159 for (Path contentRoot : contents.getContentRoots()) { 160 if (contentRoot.resolve(path).toFile().exists()) { ··· 162 } 163 } 164 return returnPath; 165 - *///?} else { 166 return file.findResource(path); 167 //?} 168 } 169 170 - /** 171 * Create an Item Tag. 172 - */ 173 @Override 174 public TagKey<Item> createItemTag(String id) { 175 return ItemTags.create(InfinityMethods.getId(id)); ··· 179 return BlockTags.create(InfinityMethods.getId(id)); 180 } 181 182 - /** 183 * Register a Flammable nameToElement (how does Architectury API not have a helper for this) 184 - */ 185 @Override 186 public void registerFlammableBlock(RegistrySupplier<Block> block, int burn, int spread) { 187 FireBlock fireblock = (FireBlock)Blocks.FIRE; 188 fireblock.setFlammable(block.get(), burn, spread); 189 } 190 191 - /** 192 * Neoforge-exclusive method of testing if a mob is located in iridescence as far as fluid types are concerned. 193 * Used only in mixins, to fix the neoforge loader stripping mobs of ability to swim in non-water fluids. 194 * On Fabric, returns false. 195 - */ 196 @Override 197 public boolean acidTest(Entity entity, boolean eyes) { 198 if (entity instanceof Player) return false; ··· 209 public Item.Properties deferredIntComponent(String id, RegistrySupplier<DataComponentType<Integer>> componentTypeSupplier, int i) { 210 return new Item.Properties().component(componentTypeSupplier, i) 211 //? if >1.21.4 212 - .setId(ModItems.registryKey(id)) 213 ; 214 } 215 @Override 216 public ItemEnchantments getEnchantments(ItemStack weapon, MinecraftServer s) { 217 return weapon.getAllEnchantments(s.registryAccess() 218 //? if >1.21.4 { 219 .lookupOrThrow(Registries.ENCHANTMENT)); 220 - //?} else { 221 - /*.lookupOrThrow(Registries.ENCHANTMENT)); 222 - *///?} 223 } 224 225 @Override ··· 232 return FMLPaths.GAMEDIR.get(); 233 } 234 } 235 - //?}
··· 1 package net.lerariemann.infinity.util.platform.neoforge; 2 3 //? neoforge { 4 + /*import dev.architectury.registry.registries.RegistrySupplier; 5 import net.lerariemann.infinity.registry.core.ModBlocks; 6 import net.lerariemann.infinity.registry.core.ModItems; 7 + import net.lerariemann.infinity.registry.payload.FriendlyPacket; 8 + import net.lerariemann.infinity.registry.payload.ModPayloads; 9 import net.lerariemann.infinity.util.InfinityMethods; 10 import net.lerariemann.infinity.util.VersionMethods; 11 import net.lerariemann.infinity.util.platform.InfinityPlatform; ··· 36 import net.neoforged.fml.loading.FMLEnvironment; 37 import net.neoforged.fml.loading.FMLPaths; 38 //? if >1.21.4 { 39 + /^import net.neoforged.neoforge.client.network.ClientPacketDistributor; 40 + ^///?} 41 import net.neoforged.neoforge.common.NeoForge; 42 import net.neoforged.neoforge.common.Tags; 43 import net.neoforged.neoforge.event.level.LevelEvent; 44 import net.neoforged.neoforge.network.PacketDistributor; 45 + import net.neoforged.neoforgespi.language.IModInfo; 46 47 import java.nio.file.Path; 48 + import java.util.List; 49 import java.util.function.Supplier; 50 51 public class NeoForgePlatformImpl implements InfinityPlatform { ··· 53 public boolean isModLoaded(String modid) { 54 return ModList.get().isLoaded(modid); 55 } 56 + @Override 57 + public List<String> getModsLoaded() { 58 + return ModList.get().getMods().stream().map(IModInfo::getModId).toList(); 59 + } 60 61 @Override 62 public String loader() { ··· 71 @Override 72 public boolean isDevelopment() { 73 //? if >1.21.9 { 74 + /^return !FMLEnvironment.isProduction(); 75 + ^///?} else { 76 return !FMLEnvironment.production; 77 //?} 78 ··· 83 public void registerPayloadsClient() {} 84 85 @Override 86 + public void sendS2CPayload(ServerPlayer entity, FriendlyPacket payload) { 87 PacketDistributor.sendToPlayer(entity, payload); 88 } 89 90 @Override 91 + public void sendC2SPayload(FriendlyPacket payload) { 92 //? <1.21.2 { 93 + PacketDistributor.sendToServer(payload); 94 + //?} else { 95 + /^ClientPacketDistributor.sendToServer(payload); 96 + ^///?} 97 } 98 99 + /^* 100 * On NeoForge, this allows the world to be ticked. 101 * On Fabric, this invokes a server world event in Fabric API. 102 + ^/ 103 @Override 104 public void onWorldLoad(Object mixin, ServerLevel world) { 105 MinecraftServer server = world.getServer(); ··· 108 NeoForge.EVENT_BUS.post(new LevelEvent.Load(world)); 109 } 110 111 + /^* 112 * Check if a block is in the Black Dyed Conventional Tag. 113 + ^/ 114 @Override 115 public boolean isInBlack(BlockState state) { 116 return state.is(Tags.Blocks.DYED_BLACK); 117 } 118 119 + /^* 120 * Check if a block is in the White Dyed Conventional Tag. 121 + ^/ 122 @Override 123 public boolean isInWhite(BlockState state) { 124 return state.is(Tags.Blocks.DYED_WHITE); 125 } 126 127 + /^* 128 * Get the still variant of Iridescence fluid. 129 + ^/ 130 @Override 131 public RegistrySupplier<? extends FlowingFluid> getIridescenceStill() { 132 return ModFluidsNeoforge.IRIDESCENCE_STILL; 133 } 134 + /^* 135 * Get the flowing variant of Iridescence fluid. 136 + ^/ 137 @Override 138 public RegistrySupplier<? extends FlowingFluid> getIridescenceFlowing() { 139 return ModFluidsNeoforge.IRIDESCENCE_FLOWING; 140 } 141 142 + /^* 143 * Get the registry supplier for Iridescence fluid. 144 + ^/ 145 @Override 146 public RegistrySupplier<LiquidBlock> getIridBlockForReg() { 147 var properties = VersionMethods.copyBlockProperties(Blocks.WATER).mapColor(MapColor.COLOR_MAGENTA) 148 //? if >1.21.2 149 + /^.setId(ModBlocks.registryKey("iridescence"))^/ 150 ; 151 return ModBlocks.BLOCKS.register("iridescence", () -> 152 new IridescenceLiquidBlockNeoforge(InfinityPlatform.INSTANCE.getIridescenceStill(), properties)); 153 } 154 155 + /^* 156 * Read from the config path inside the mod JAR. 157 + ^/ 158 @Override 159 @SuppressWarnings("for removal") 160 public Path getRootPathInJar(String path) { 161 var file = ModLoadingContext.get().getActiveContainer().getModInfo().getOwningFile().getFile(); 162 // FIXME 1.21.10 - this does not work in production. standard paths do not work on neoforge 1.21.10, will either need to drop neo or make this even more platform specific 163 //? if >1.21.9 { 164 + /^var contents = file.getContents(); 165 Path returnPath = null; 166 for (Path contentRoot : contents.getContentRoots()) { 167 if (contentRoot.resolve(path).toFile().exists()) { ··· 169 } 170 } 171 return returnPath; 172 + ^///?} else { 173 return file.findResource(path); 174 //?} 175 } 176 177 + /^* 178 * Create an Item Tag. 179 + ^/ 180 @Override 181 public TagKey<Item> createItemTag(String id) { 182 return ItemTags.create(InfinityMethods.getId(id)); ··· 186 return BlockTags.create(InfinityMethods.getId(id)); 187 } 188 189 + /^* 190 * Register a Flammable nameToElement (how does Architectury API not have a helper for this) 191 + ^/ 192 @Override 193 public void registerFlammableBlock(RegistrySupplier<Block> block, int burn, int spread) { 194 FireBlock fireblock = (FireBlock)Blocks.FIRE; 195 fireblock.setFlammable(block.get(), burn, spread); 196 } 197 198 + /^* 199 * Neoforge-exclusive method of testing if a mob is located in iridescence as far as fluid types are concerned. 200 * Used only in mixins, to fix the neoforge loader stripping mobs of ability to swim in non-water fluids. 201 * On Fabric, returns false. 202 + ^/ 203 @Override 204 public boolean acidTest(Entity entity, boolean eyes) { 205 if (entity instanceof Player) return false; ··· 216 public Item.Properties deferredIntComponent(String id, RegistrySupplier<DataComponentType<Integer>> componentTypeSupplier, int i) { 217 return new Item.Properties().component(componentTypeSupplier, i) 218 //? if >1.21.4 219 + /^.setId(ModItems.registryKey(id))^/ 220 ; 221 } 222 @Override 223 public ItemEnchantments getEnchantments(ItemStack weapon, MinecraftServer s) { 224 return weapon.getAllEnchantments(s.registryAccess() 225 //? if >1.21.4 { 226 + /^.lookupOrThrow(Registries.ENCHANTMENT)); 227 + ^///?} else { 228 .lookupOrThrow(Registries.ENCHANTMENT)); 229 + //?} 230 } 231 232 @Override ··· 239 return FMLPaths.GAMEDIR.get(); 240 } 241 } 242 + *///?}
+8 -6
src/main/java/net/lerariemann/infinity/util/screen/F4ScreenHandler.java
··· 3 import dev.architectury.registry.menu.ExtendedMenuProvider; 4 import net.lerariemann.infinity.item.F4Item; 5 import net.lerariemann.infinity.registry.core.ModComponentTypes; 6 - import net.lerariemann.infinity.registry.var.ModPayloads; 7 import net.lerariemann.infinity.registry.var.ModScreenHandlers; 8 import net.lerariemann.infinity.util.VersionMethods; 9 import net.minecraft.MethodsReturnNonnullByDefault; 10 import net.minecraft.client.player.LocalPlayer; 11 - import net.minecraft.nbt.CompoundTag; 12 import net.minecraft.network.FriendlyByteBuf; 13 import net.minecraft.network.chat.Component; 14 import net.minecraft.resources.ResourceLocation; 15 - import net.minecraft.util.Mth; 16 import net.minecraft.world.InteractionHand; 17 import net.minecraft.world.entity.player.Inventory; 18 import net.minecraft.world.entity.player.Player; ··· 27 import net.minecraft.core.component.DataComponentMap; 28 //?} 29 //? if neoforge { 30 - import javax.annotation.ParametersAreNonnullByDefault; 31 32 @ParametersAreNonnullByDefault 33 - //?} 34 @MethodsReturnNonnullByDefault 35 public class F4ScreenHandler extends AbstractContainerMenu { 36 public final Inventory playerInventory; ··· 77 playerInventory.setItem(slot, st); 78 super.removed(player); 79 if (player instanceof LocalPlayer) { 80 - new ModPayloads.F4UpdateC2SPayload(slot, width.get(), height.get()).send(); 81 } 82 } 83
··· 3 import dev.architectury.registry.menu.ExtendedMenuProvider; 4 import net.lerariemann.infinity.item.F4Item; 5 import net.lerariemann.infinity.registry.core.ModComponentTypes; 6 + import net.lerariemann.infinity.registry.payload.c2s.F4UpdateC2SPayload; 7 import net.lerariemann.infinity.registry.var.ModScreenHandlers; 8 import net.lerariemann.infinity.util.VersionMethods; 9 import net.minecraft.MethodsReturnNonnullByDefault; 10 import net.minecraft.client.player.LocalPlayer; 11 + //? if <1.21 { 12 + /*import net.minecraft.nbt.CompoundTag; 13 + import net.minecraft.util.Mth; 14 + *///?} 15 import net.minecraft.network.FriendlyByteBuf; 16 import net.minecraft.network.chat.Component; 17 import net.minecraft.resources.ResourceLocation; 18 import net.minecraft.world.InteractionHand; 19 import net.minecraft.world.entity.player.Inventory; 20 import net.minecraft.world.entity.player.Player; ··· 29 import net.minecraft.core.component.DataComponentMap; 30 //?} 31 //? if neoforge { 32 + /*import javax.annotation.ParametersAreNonnullByDefault; 33 34 @ParametersAreNonnullByDefault 35 + *///?} 36 @MethodsReturnNonnullByDefault 37 public class F4ScreenHandler extends AbstractContainerMenu { 38 public final Inventory playerInventory; ··· 79 playerInventory.setItem(slot, st); 80 super.removed(player); 81 if (player instanceof LocalPlayer) { 82 + new F4UpdateC2SPayload(slot, width.get(), height.get()).send(); 83 } 84 } 85
+41 -15
src/main/java/net/lerariemann/infinity/util/teleport/InfinityPortal.java
··· 10 import net.minecraft.core.Direction; 11 import net.minecraft.core.registries.Registries; 12 import net.minecraft.network.chat.Component; 13 - import net.minecraft.network.chat.MutableComponent; 14 import net.minecraft.resources.ResourceKey; 15 import net.minecraft.resources.ResourceLocation; 16 import net.minecraft.server.MinecraftServer; 17 import net.minecraft.server.level.ServerLevel; 18 import net.minecraft.server.level.ServerPlayer; 19 - import net.minecraft.server.level.TicketType; 20 import net.minecraft.world.entity.Entity; 21 import net.minecraft.world.entity.ai.village.poi.PoiManager; 22 import net.minecraft.world.entity.ai.village.poi.PoiRecord; 23 import net.minecraft.world.entity.ai.village.poi.PoiTypes; 24 - import net.minecraft.world.level.ChunkPos; 25 import net.minecraft.world.level.Level; 26 import net.minecraft.world.level.block.NetherPortalBlock; 27 import net.minecraft.world.level.block.state.BlockState; ··· 34 /*import net.minecraft.world.level.portal.DimensionTransition; 35 *///?} else { 36 /*import net.minecraft.world.level.portal.PortalInfo; 37 *///?} 38 - import net.minecraft.world.level.portal.PortalShape; 39 import org.jetbrains.annotations.Nullable; 40 41 import java.util.Comparator; ··· 51 @Nullable BlockUtil.FoundRectangle portalTo; 52 boolean unableToCreatePortalFlag = false; 53 boolean noSyncFlag = false; 54 55 public InfinityPortal(InfinityPortalBlockEntity ipbe, ServerLevel worldFrom, BlockPos startingPos) { 56 this.ipbe = ipbe; 57 this.worldFrom = worldFrom; 58 portalFrom = getRect(worldFrom, startingPos); 59 posFrom = lowerCenterPos(portalFrom, worldFrom); 60 worldTo = worldFrom.getServer().getLevel(ResourceKey.create(Registries.DIMENSION, ipbe.getDimension())); 61 tryUpdateOpenStatus(ipbe, worldFrom, startingPos, worldTo); 62 ··· 135 } 136 137 public boolean portalShouldWork() { 138 - return (InfinityMethods.dimExists(worldTo) //dimension exists and is not timebombed 139 && ipbe.isOpen() //the portal is not closed 140 && !worldTo.dimension().equals(worldFrom.dimension())); //the portal does not lead back to its own dimension 141 } 142 143 /** If teleportation failed for any reason, this sends the reason to the player. */ 144 public void sendErrors(ServerPlayer player) { 145 - if (worldTo != null) { 146 if (worldTo.dimension().equals(worldFrom.dimension())) 147 player.sendSystemMessage(Component.translatable("error.infinity.portal.matching_ends")); 148 else if (InfinityMethods.isTimebombed(worldTo)) ··· 203 return (worldTo.getBlockEntity(posTo) instanceof InfinityPortalBlockEntity ipbeTo 204 && ipbeTo.getDimension().toString().equals(worldFrom.dimension().location().toString())); 205 } 206 207 /** Filling in the blanks asserting the portal is correctly synced */ 208 private void scanExistingTarget() { ··· 259 .min(Comparator.comparingDouble(posTo -> posTo.distSqr(originOfTesting))); 260 if (portal.isPresent()) return portal; 261 262 - //If one wasn't found, find a nether portal instead and ensure it will not be overwritten 263 - portal = poiStorage.getInSquare(poiType -> 264 - poiType.is(PoiTypes.NETHER_PORTAL), 265 - originOfTesting, radiusOfTesting, PoiManager.Occupancy.ANY) 266 - .map(PoiRecord::getPos) 267 - .filter(wbTo::isWithinBounds) 268 - .min(Comparator.comparingDouble(posTo -> posTo.distSqr(originOfTesting))); 269 - noSyncFlag = portal.isPresent(); //if a nether portal indeed was found we do not wish to overwrite it 270 - 271 return portal; 272 } 273
··· 10 import net.minecraft.core.Direction; 11 import net.minecraft.core.registries.Registries; 12 import net.minecraft.network.chat.Component; 13 import net.minecraft.resources.ResourceKey; 14 import net.minecraft.resources.ResourceLocation; 15 import net.minecraft.server.MinecraftServer; 16 import net.minecraft.server.level.ServerLevel; 17 import net.minecraft.server.level.ServerPlayer; 18 import net.minecraft.world.entity.Entity; 19 import net.minecraft.world.entity.ai.village.poi.PoiManager; 20 import net.minecraft.world.entity.ai.village.poi.PoiRecord; 21 import net.minecraft.world.entity.ai.village.poi.PoiTypes; 22 import net.minecraft.world.level.Level; 23 import net.minecraft.world.level.block.NetherPortalBlock; 24 import net.minecraft.world.level.block.state.BlockState; ··· 31 /*import net.minecraft.world.level.portal.DimensionTransition; 32 *///?} else { 33 /*import net.minecraft.world.level.portal.PortalInfo; 34 + import net.minecraft.server.level.TicketType; 35 + import net.minecraft.world.level.portal.PortalShape; 36 + import net.minecraft.world.level.ChunkPos; 37 *///?} 38 import org.jetbrains.annotations.Nullable; 39 40 import java.util.Comparator; ··· 50 @Nullable BlockUtil.FoundRectangle portalTo; 51 boolean unableToCreatePortalFlag = false; 52 boolean noSyncFlag = false; 53 + boolean footprintFlag = false; 54 + public static boolean useFootprintsFlag = true; 55 56 public InfinityPortal(InfinityPortalBlockEntity ipbe, ServerLevel worldFrom, BlockPos startingPos) { 57 this.ipbe = ipbe; 58 this.worldFrom = worldFrom; 59 portalFrom = getRect(worldFrom, startingPos); 60 posFrom = lowerCenterPos(portalFrom, worldFrom); 61 + if (ipbe.isFootprint()) { 62 + footprintFlag = true; 63 + return; 64 + } 65 worldTo = worldFrom.getServer().getLevel(ResourceKey.create(Registries.DIMENSION, ipbe.getDimension())); 66 tryUpdateOpenStatus(ipbe, worldFrom, startingPos, worldTo); 67 ··· 140 } 141 142 public boolean portalShouldWork() { 143 + return (!footprintFlag //the portal is not exit only 144 + && InfinityMethods.dimExists(worldTo) //dimension exists and is not timebombed 145 && ipbe.isOpen() //the portal is not closed 146 && !worldTo.dimension().equals(worldFrom.dimension())); //the portal does not lead back to its own dimension 147 } 148 149 /** If teleportation failed for any reason, this sends the reason to the player. */ 150 public void sendErrors(ServerPlayer player) { 151 + if (footprintFlag) { 152 + player.sendSystemMessage(Component.translatable("error.infinity.portal.footprint")); 153 + } 154 + else if (worldTo != null) { 155 if (worldTo.dimension().equals(worldFrom.dimension())) 156 player.sendSystemMessage(Component.translatable("error.infinity.portal.matching_ends")); 157 else if (InfinityMethods.isTimebombed(worldTo)) ··· 212 return (worldTo.getBlockEntity(posTo) instanceof InfinityPortalBlockEntity ipbeTo 213 && ipbeTo.getDimension().toString().equals(worldFrom.dimension().location().toString())); 214 } 215 + /** Filter for footprint infinity portals. */ 216 + public static boolean isFootprint(ServerLevel worldTo, BlockPos posTo) { 217 + if (posTo == null || !InfinityMethods.dimExists(worldTo)) return false; 218 + return (worldTo.getBlockEntity(posTo) instanceof InfinityPortalBlockEntity ipbeTo 219 + && ipbeTo.isFootprint()); 220 + } 221 222 /** Filling in the blanks asserting the portal is correctly synced */ 223 private void scanExistingTarget() { ··· 274 .min(Comparator.comparingDouble(posTo -> posTo.distSqr(originOfTesting))); 275 if (portal.isPresent()) return portal; 276 277 + if (useFootprintsFlag) { 278 + //scan for footprint portals to absorb connection 279 + portal = poiStorage.getInSquare(poiType -> 280 + poiType.is(ModPoi.NEITHER_PORTAL_KEY), 281 + originOfTesting, radiusOfTesting, PoiManager.Occupancy.ANY) 282 + .map(PoiRecord::getPos) 283 + .filter(wbTo::isWithinBounds) 284 + .filter(pos -> isFootprint(worldTo, pos)) 285 + .min(Comparator.comparingDouble(posTo -> posTo.distSqr(originOfTesting))); 286 + } 287 + else { 288 + //if an infinity portal wasn't found, find a nether portal instead to absorb connection 289 + portal = poiStorage.getInSquare(poiType -> 290 + poiType.is(PoiTypes.NETHER_PORTAL), 291 + originOfTesting, radiusOfTesting, PoiManager.Occupancy.ANY) 292 + .map(PoiRecord::getPos) 293 + .filter(wbTo::isWithinBounds) 294 + .min(Comparator.comparingDouble(posTo -> posTo.distSqr(originOfTesting))); 295 + } 296 + noSyncFlag = portal.isPresent(); //if an absorbing exit portal was found we do not wish to overwrite it 297 return portal; 298 } 299
+26 -11
src/main/java/net/lerariemann/infinity/util/teleport/PortalCreator.java
··· 12 import net.lerariemann.infinity.block.entity.InfinityPortalBlockEntity; 13 import net.lerariemann.infinity.dimensions.RandomDimension; 14 import net.lerariemann.infinity.registry.core.ModItems; 15 import net.lerariemann.infinity.registry.var.ModSounds; 16 import net.lerariemann.infinity.util.InfinityMethods; 17 import net.lerariemann.infinity.util.core.CommonIO; 18 import net.lerariemann.infinity.util.core.NbtUtils; 19 import net.lerariemann.infinity.util.loading.DimensionGrabber; 20 import net.lerariemann.infinity.options.PortalColorApplier; 21 import net.lerariemann.infinity.registry.var.ModCriteria; 22 - import net.lerariemann.infinity.registry.var.ModPayloads; 23 import net.lerariemann.infinity.registry.var.ModStats; 24 - import net.lerariemann.infinity.util.platform.InfinityPlatform; 25 import net.minecraft.BlockUtil; 26 import net.minecraft.core.BlockPos; 27 import net.minecraft.core.Direction; ··· 29 import net.minecraft.core.component.DataComponents; 30 import net.minecraft.world.item.component.WritableBookContent; 31 import net.minecraft.world.item.component.WrittenBookContent; 32 - //?} 33 import net.minecraft.core.registries.Registries; 34 import net.minecraft.nbt.CompoundTag; 35 import net.minecraft.nbt.ListTag; ··· 47 import net.minecraft.world.entity.Entity; 48 import net.minecraft.world.entity.item.ItemEntity; 49 import net.minecraft.world.entity.player.Player; 50 - import net.minecraft.world.item.Item; 51 import net.minecraft.world.item.ItemStack; 52 - import net.minecraft.world.item.Items; 53 import net.minecraft.world.level.Level; 54 import net.minecraft.world.level.block.NetherPortalBlock; 55 import net.minecraft.world.level.block.entity.BlockEntity; ··· 60 import java.util.*; 61 import java.util.function.BiConsumer; 62 import java.util.function.Consumer; 63 64 import static net.lerariemann.infinity.InfinityMod.MOD_ID; 65 import static net.lerariemann.infinity.compat.ComputerCraftCompat.checkPrintedPage; ··· 74 ItemStack itemStack = entity.getItem(); 75 76 /* Check if the item provided is a transfinite key. */ 77 - if (entity.getItem().getItem().equals(ModItems.TRANSFINITE_KEY.get())) { 78 ResourceLocation key_dest = ModItems.TRANSFINITE_KEY.get().getDestinationParsed(itemStack, world); 79 boolean bl = modifyOnInitialCollision(key_dest, world, pos); 80 if (bl) entity.remove(Entity.RemovalReason.CHANGED_DIMENSION); 81 return; 82 } 83 ··· 279 280 static PortalModifierUnion forInitialSetupping(ServerLevel world, BlockPos pos, ResourceLocation id, boolean open) { 281 PortalColorApplier applier = PortalColorApplier.of(id, world.getServer()); 282 PortalModifierUnion union = new PortalModifierUnion() 283 .addSetupper(infPortalSetupper(world, pos)) 284 .addModifier(nbpe -> nbpe.setDimension(id)) 285 - .addModifier(npbe -> npbe.setColor(applier.apply(npbe.getBlockPos()))) 286 .addModifier(npbe -> npbe.setOpen(open)) 287 .addModifier(BlockEntity::setChanged); 288 //? if <1.21.2 || fabric { 289 - /*if (ModCompat.CREATE) { 290 union.addModifier(CreateCompat::tryModifyRails); 291 } 292 - *///?} 293 return union; 294 } 295 ··· 322 * Create and send S2C packets necessary for the client to process a freshly added dimension. 323 */ 324 static void sendNewWorld(ServerPlayer player, ResourceLocation id, RandomDimension d) { 325 - d.random_biomes.forEach(b -> new ModPayloads.BiomeAddS2CPayload(InfinityMethods.getId(b.name), b.data).send(player)); 326 - new ModPayloads.WorldAddS2CPayload(id, d.type != null ? d.type.data : new CompoundTag()).send(player); 327 } 328 329 /**
··· 12 import net.lerariemann.infinity.block.entity.InfinityPortalBlockEntity; 13 import net.lerariemann.infinity.dimensions.RandomDimension; 14 import net.lerariemann.infinity.registry.core.ModItems; 15 + import net.lerariemann.infinity.registry.payload.s2c.BiomeAddS2CPayload; 16 + import net.lerariemann.infinity.registry.payload.s2c.WorldAddS2CPayload; 17 import net.lerariemann.infinity.registry.var.ModSounds; 18 import net.lerariemann.infinity.util.InfinityMethods; 19 + import net.lerariemann.infinity.util.VersionMethods; 20 import net.lerariemann.infinity.util.core.CommonIO; 21 import net.lerariemann.infinity.util.core.NbtUtils; 22 import net.lerariemann.infinity.util.loading.DimensionGrabber; 23 import net.lerariemann.infinity.options.PortalColorApplier; 24 import net.lerariemann.infinity.registry.var.ModCriteria; 25 import net.lerariemann.infinity.registry.var.ModStats; 26 import net.minecraft.BlockUtil; 27 import net.minecraft.core.BlockPos; 28 import net.minecraft.core.Direction; ··· 30 import net.minecraft.core.component.DataComponents; 31 import net.minecraft.world.item.component.WritableBookContent; 32 import net.minecraft.world.item.component.WrittenBookContent; 33 + //?} else { 34 + /*import net.minecraft.world.item.Item; 35 + import net.minecraft.world.item.Items; 36 + *///?} 37 import net.minecraft.core.registries.Registries; 38 import net.minecraft.nbt.CompoundTag; 39 import net.minecraft.nbt.ListTag; ··· 51 import net.minecraft.world.entity.Entity; 52 import net.minecraft.world.entity.item.ItemEntity; 53 import net.minecraft.world.entity.player.Player; 54 import net.minecraft.world.item.ItemStack; 55 import net.minecraft.world.level.Level; 56 import net.minecraft.world.level.block.NetherPortalBlock; 57 import net.minecraft.world.level.block.entity.BlockEntity; ··· 62 import java.util.*; 63 import java.util.function.BiConsumer; 64 import java.util.function.Consumer; 65 + import java.util.function.Function; 66 67 import static net.lerariemann.infinity.InfinityMod.MOD_ID; 68 import static net.lerariemann.infinity.compat.ComputerCraftCompat.checkPrintedPage; ··· 77 ItemStack itemStack = entity.getItem(); 78 79 /* Check if the item provided is a transfinite key. */ 80 + if (itemStack.getItem().equals(ModItems.TRANSFINITE_KEY.get())) { 81 ResourceLocation key_dest = ModItems.TRANSFINITE_KEY.get().getDestinationParsed(itemStack, world); 82 boolean bl = modifyOnInitialCollision(key_dest, world, pos); 83 if (bl) entity.remove(Entity.RemovalReason.CHANGED_DIMENSION); 84 + return; 85 + } 86 + 87 + if (InfinityPortal.useFootprintsFlag && itemStack.getItem().equals(ModItems.FOOTPRINT.get())) { 88 + ResourceLocation key_dest = VersionMethods.id("footprint", "footprint"); 89 + modifyPortalRecursive(world, pos, forInitialSetupping(world, pos, key_dest, (p) -> 0x8F8F86, false)); 90 + entity.remove(Entity.RemovalReason.CHANGED_DIMENSION); 91 + playSound(world, pos, SoundEvents.UI_CARTOGRAPHY_TABLE_TAKE_RESULT); 92 return; 93 } 94 ··· 290 291 static PortalModifierUnion forInitialSetupping(ServerLevel world, BlockPos pos, ResourceLocation id, boolean open) { 292 PortalColorApplier applier = PortalColorApplier.of(id, world.getServer()); 293 + return forInitialSetupping(world, pos, id, applier, open); 294 + } 295 + static PortalModifierUnion forInitialSetupping(ServerLevel world, BlockPos pos, 296 + ResourceLocation id, Function<BlockPos, Integer> colorApplier, boolean open) { 297 PortalModifierUnion union = new PortalModifierUnion() 298 .addSetupper(infPortalSetupper(world, pos)) 299 .addModifier(nbpe -> nbpe.setDimension(id)) 300 + .addModifier(npbe -> npbe.setColor(colorApplier.apply(npbe.getBlockPos()))) 301 .addModifier(npbe -> npbe.setOpen(open)) 302 .addModifier(BlockEntity::setChanged); 303 //? if <1.21.2 || fabric { 304 + if (ModCompat.CREATE) { 305 union.addModifier(CreateCompat::tryModifyRails); 306 } 307 + //?} 308 return union; 309 } 310 ··· 337 * Create and send S2C packets necessary for the client to process a freshly added dimension. 338 */ 339 static void sendNewWorld(ServerPlayer player, ResourceLocation id, RandomDimension d) { 340 + d.random_biomes.forEach(b -> new BiomeAddS2CPayload(InfinityMethods.getId(b.name), b.data).send(player)); 341 + new WorldAddS2CPayload(id, d.type != null ? d.type.data : new CompoundTag()).send(player); 342 } 343 344 /**
+16 -8
src/main/java/net/lerariemann/infinity/util/teleport/WarpLogic.java
··· 18 import net.minecraft.server.level.ServerPlayer; 19 import net.minecraft.tags.FluidTags; 20 import net.minecraft.util.Mth; 21 - import net.minecraft.world.entity.player.Player; 22 import net.minecraft.world.level.BlockGetter; 23 import net.minecraft.world.level.Level; 24 import net.minecraft.world.level.block.Block; ··· 32 //?} else if >1.21 { 33 /*import net.minecraft.world.level.portal.DimensionTransition; 34 *///?} 35 - import net.minecraft.world.phys.Vec3; 36 import org.jetbrains.annotations.NotNull; 37 import org.jetbrains.annotations.Nullable; 38 39 import java.util.HashSet; 40 import java.util.Objects; 41 42 public interface WarpLogic { 43 /** 44 * Handles the /warp id command, converting the provided numeric ID to an Identifier. 45 */ 46 - static void requestWarpById(CommandContext<CommandSourceStack> context, long value) { 47 - requestWarp(context.getSource().getPlayer(), InfinityMethods.getDimId(value), true); 48 } 49 /** 50 * Handles the /warp existing command, warping the player to a specified dimension. This is the same as writing the input into a book. 51 */ 52 - static void requestWarpToExisting(CommandContext<CommandSourceStack> context, ResourceLocation value) throws CommandSyntaxException { 53 ServerLevel w = context.getSource().getServer().getLevel(ResourceKey.create(Registries.DIMENSION, value)); 54 if (w == null) 55 throw ModCommands.MALFORM_IDENTIFIER_EXCEPTION.create(value); 56 else if (InfinityMethods.isTimebombed(w)) 57 throw ModCommands.TIMEBOMBED_EXCEPTION.create(value); 58 - else requestWarp(context.getSource().getPlayer(), value, true); 59 } 60 /** 61 * Handles the /warp text command, warping the player to a specified dimension. This is the same as writing the input into a book. 62 */ 63 - static void requestWarpByText(CommandContext<CommandSourceStack> context, String value) { 64 value = InfinityMethods.dimTextPreprocess(value); 65 ResourceLocation id = InfinityMethods.dimTextToId(value); 66 - requestWarp(context.getSource().getPlayer(), id, true); 67 PortalCreator.recordIdTranslation(context.getSource().getServer(), id, value); 68 } 69 ··· 87 ((ServerPlayerEntityAccess)(player)).infinity$setWarpTimer(2, value); 88 } 89 else performWarp(player, value); 90 } 91 92 /**
··· 18 import net.minecraft.server.level.ServerPlayer; 19 import net.minecraft.tags.FluidTags; 20 import net.minecraft.util.Mth; 21 import net.minecraft.world.level.BlockGetter; 22 import net.minecraft.world.level.Level; 23 import net.minecraft.world.level.block.Block; ··· 31 //?} else if >1.21 { 32 /*import net.minecraft.world.level.portal.DimensionTransition; 33 *///?} 34 import org.jetbrains.annotations.NotNull; 35 import org.jetbrains.annotations.Nullable; 36 37 import java.util.HashSet; 38 + import java.util.Collection; 39 import java.util.Objects; 40 41 public interface WarpLogic { 42 /** 43 * Handles the /warp id command, converting the provided numeric ID to an Identifier. 44 */ 45 + static void requestWarpById(Collection<ServerPlayer> players, long value) { 46 + requestWarp(players, InfinityMethods.getDimId(value), true); 47 } 48 /** 49 * Handles the /warp existing command, warping the player to a specified dimension. This is the same as writing the input into a book. 50 */ 51 + static void requestWarpToExisting(CommandContext<CommandSourceStack> context, Collection<ServerPlayer> players, ResourceLocation value) throws CommandSyntaxException { 52 ServerLevel w = context.getSource().getServer().getLevel(ResourceKey.create(Registries.DIMENSION, value)); 53 if (w == null) 54 throw ModCommands.MALFORM_IDENTIFIER_EXCEPTION.create(value); 55 else if (InfinityMethods.isTimebombed(w)) 56 throw ModCommands.TIMEBOMBED_EXCEPTION.create(value); 57 + else requestWarp(players, value, true); 58 } 59 /** 60 * Handles the /warp text command, warping the player to a specified dimension. This is the same as writing the input into a book. 61 */ 62 + static void requestWarpByText(CommandContext<CommandSourceStack> context, Collection<ServerPlayer> players, String value) { 63 value = InfinityMethods.dimTextPreprocess(value); 64 ResourceLocation id = InfinityMethods.dimTextToId(value); 65 + requestWarp(players, id, true); 66 PortalCreator.recordIdTranslation(context.getSource().getServer(), id, value); 67 } 68 ··· 86 ((ServerPlayerEntityAccess)(player)).infinity$setWarpTimer(2, value); 87 } 88 else performWarp(player, value); 89 + } 90 + 91 + /** 92 + * Moves a collection of players to a specified existing dimension. 93 + */ 94 + static void requestWarp(Collection<ServerPlayer> players, ResourceLocation value, boolean increaseStats) { 95 + players.forEach(player -> { 96 + requestWarp(player, value, increaseStats); 97 + }); 98 } 99 100 /**
+10 -1
src/main/resources/assets/infinity/lang/en_us.json
··· 98 "error.infinity.portal.null": "This dimension does not exist. This is a bug, please contact Lera", 99 "error.infinity.portal.deleted": "This dimension ceased to exist. It can be restored after reloading the world", 100 "error.infinity.portal.closed": "This portal is closed; use a key (%s) to open it", 101 "error.infinity.portal.matching_ends": "This portal leads to itself", 102 "error.infinity.portal.cannot_create": "Unable to create an exit portal, likely target out of world border", 103 "error.infinity.portal.unexpected": "An unexpected teleportation error has occurred, please contact Lera", ··· 147 "stat.infinity.dimensions_opened_stat": "Unique dimensions discovered", 148 "stat.infinity.worlds_destroyed_stat": "Unique dimensions destroyed", 149 "stat.infinity.iridescence_stat": "Iridescent journeys had", 150 "subtitles.music.ivory.hope_instilled": "ivory - hope instilled", 151 "subtitles.music.ivory.challenger": "ivory - challenger", 152 "subtitles.music.c418.classic": "Classic Minecraft music by C418", ··· 155 "tag.item.infinity.matter": "Colored Matter", 156 "tooltip.infinity.key.randomise": "Dimension randomised", 157 "tooltip.infinity.key.generated": "Dimension #", 158 "tooltip.infinity.f4": "Portal to %s", 159 "tooltip.infinity.f4.charges": "Charges left: %s", 160 "config.infinity.title": "Infinite Dimensions", ··· 176 "config.infinity.amendments.area": "Area", 177 "config.infinity.amendments.area.description": "What part of Infinite Dimensions generation to affect. Options include blocks, fluids, trees, mobs, structures.", 178 "config.infinity.amendments.mod": "Mod Name", 179 - "config.infinity.amendments.mod.description": "What mod's namespace should be affected by this amendment. Set to \"minecraft\" to affect Minecraft itself, set to \"all\" to affect all mods.", 180 "config.infinity.amendments.selector": "Selector", 181 "config.infinity.amendments.selector.description": "This governs what content within the selected mod and area is affected by the amendment, \"all\" to amend an entire mod, \"matching\" to amend a single entry, \"matching_any\" to amend a list of entries, \"matching_block_tag\" amends a block tag, \"containing\" amends any entry with certain characters in its name. ", 182 "config.infinity.amendments.matching": "Matching", ··· 233 "config.infinity.gameRules.forceLowercase.description": "When true, all book text is converted to lowercase before hashing into numeric seed, therefore \"WORD\", \"Word\" and \"word\" will all lead to the same dimension.", 234 "config.infinity.gameRules.iridSafeMode": "Safe mode for iridescence", 235 "config.infinity.gameRules.iridSafeMode.description": "When true, the player cannot die on the iridescent journey", 236 "config.infinity.rootChances.features_rules.generate_vanilla_features.description": "This setting handles whether or not to try to generate vanilla, unmodified features alongside modded ones.", 237 "config.infinity.rootChances.features_rules.rotate_blocks.description": "This setting handles the percentage chance that a block is rotated inside a feature.", 238 "config.infinity.rootChances.features_rules.flood_geodes.description": "This setting handles the percentage chance a geode is flooded with a random fluid.",
··· 98 "error.infinity.portal.null": "This dimension does not exist. This is a bug, please contact Lera", 99 "error.infinity.portal.deleted": "This dimension ceased to exist. It can be restored after reloading the world", 100 "error.infinity.portal.closed": "This portal is closed; use a key (%s) to open it", 101 + "error.infinity.portal.footprint": "This portal is exit-only", 102 "error.infinity.portal.matching_ends": "This portal leads to itself", 103 "error.infinity.portal.cannot_create": "Unable to create an exit portal, likely target out of world border", 104 "error.infinity.portal.unexpected": "An unexpected teleportation error has occurred, please contact Lera", ··· 148 "stat.infinity.dimensions_opened_stat": "Unique dimensions discovered", 149 "stat.infinity.worlds_destroyed_stat": "Unique dimensions destroyed", 150 "stat.infinity.iridescence_stat": "Iridescent journeys had", 151 + "subtitles.music.missing": "Song not set", 152 "subtitles.music.ivory.hope_instilled": "ivory - hope instilled", 153 "subtitles.music.ivory.challenger": "ivory - challenger", 154 "subtitles.music.c418.classic": "Classic Minecraft music by C418", ··· 157 "tag.item.infinity.matter": "Colored Matter", 158 "tooltip.infinity.key.randomise": "Dimension randomised", 159 "tooltip.infinity.key.generated": "Dimension #", 160 + "tooltip.infinity.key.exit": "Exit only", 161 "tooltip.infinity.f4": "Portal to %s", 162 "tooltip.infinity.f4.charges": "Charges left: %s", 163 "config.infinity.title": "Infinite Dimensions", ··· 179 "config.infinity.amendments.area": "Area", 180 "config.infinity.amendments.area.description": "What part of Infinite Dimensions generation to affect. Options include blocks, fluids, trees, mobs, structures.", 181 "config.infinity.amendments.mod": "Mod Name", 182 + "config.infinity.amendments.mod.description": "What mod's namespace should be affected by this amendment. Set to \"minecraft\" to affect Minecraft itself, set to \"all\" to affect all mods, set to \"any_of\" to affect several mods at once.", 183 + "config.infinity.amendments.mods": "Mods", 184 + "config.infinity.amendments.mods.description": "List of mods to be affected", 185 + "config.infinity.amendments.load_if_mod": "Prerequisite mod", 186 + "config.infinity.amendments.load_if_mod.description": "Load the amendment only if this mod is present. You'd want to leave this blank most of the time.", 187 "config.infinity.amendments.selector": "Selector", 188 "config.infinity.amendments.selector.description": "This governs what content within the selected mod and area is affected by the amendment, \"all\" to amend an entire mod, \"matching\" to amend a single entry, \"matching_any\" to amend a list of entries, \"matching_block_tag\" amends a block tag, \"containing\" amends any entry with certain characters in its name. ", 189 "config.infinity.amendments.matching": "Matching", ··· 240 "config.infinity.gameRules.forceLowercase.description": "When true, all book text is converted to lowercase before hashing into numeric seed, therefore \"WORD\", \"Word\" and \"word\" will all lead to the same dimension.", 241 "config.infinity.gameRules.iridSafeMode": "Safe mode for iridescence", 242 "config.infinity.gameRules.iridSafeMode.description": "When true, the player cannot die on the iridescent journey", 243 + "config.infinity.gameRules.useFootprints": "Use footprints", 244 + "config.infinity.gameRules.useFootprints.description": "When true, footprints can be used on portals to make them into exit-only portals (to teleport to when no corresponding portal is present). When false, that role is delegated to vanilla nether portals.", 245 "config.infinity.rootChances.features_rules.generate_vanilla_features.description": "This setting handles whether or not to try to generate vanilla, unmodified features alongside modded ones.", 246 "config.infinity.rootChances.features_rules.rotate_blocks.description": "This setting handles the percentage chance that a block is rotated inside a feature.", 247 "config.infinity.rootChances.features_rules.flood_geodes.description": "This setting handles the percentage chance a geode is flooded with a random fluid.",
+12 -12
src/main/resources/assets/infinity/sounds.json
··· 14 "music.c418.classic": { 15 "subtitle": "subtitles.music.c418.classic", 16 "sounds": [ 17 - "music/game/minecraft", 18 - "music/game/clark", 19 - "music/game/sweden", 20 - "music/game/subwoofer_lullaby", 21 - "music/game/living_mice", 22 - "music/game/haggstrom", 23 - "music/game/danny", 24 - "music/game/key", 25 - "music/game/oxygene", 26 - "music/game/dry_hands", 27 - "music/game/wet_hands", 28 - "music/game/mice_on_venus" 29 ] 30 } 31 }
··· 14 "music.c418.classic": { 15 "subtitle": "subtitles.music.c418.classic", 16 "sounds": [ 17 + "minecraft:music/game/minecraft", 18 + "minecraft:music/game/clark", 19 + "minecraft:music/game/sweden", 20 + "minecraft:music/game/subwoofer_lullaby", 21 + "minecraft:music/game/living_mice", 22 + "minecraft:music/game/haggstrom", 23 + "minecraft:music/game/danny", 24 + "minecraft:music/game/key", 25 + "minecraft:music/game/oxygene", 26 + "minecraft:music/game/dry_hands", 27 + "minecraft:music/game/wet_hands", 28 + "minecraft:music/game/mice_on_venus" 29 ] 30 } 31 }
+2 -2
src/main/resources/config/22/easter/red.json
··· 22 { 23 "name": "RedMatrix", 24 "type": "vec3", 25 - "value": [ 0.7, 0.0, 0.0 ] 26 }, 27 { 28 "name": "GreenMatrix", ··· 32 { 33 "name": "BlueMatrix", 34 "type": "vec3", 35 - "value": [ 0.7, 0.7, 1.0 ] 36 } 37 ] 38 }
··· 22 { 23 "name": "RedMatrix", 24 "type": "vec3", 25 + "value": [ 1.0, 0.7, 0.7 ] 26 }, 27 { 28 "name": "GreenMatrix", ··· 32 { 33 "name": "BlueMatrix", 34 "type": "vec3", 35 + "value": [ 0.0, 0.0, 0.7 ] 36 } 37 ] 38 }
+56
src/main/resources/config/common/.util/credits.txt
···
··· 1 + Acknowledgements 2 + ---------------------- 3 + Mod by LeraRiemann, cassiancc 4 + 5 + Music by ivory rosewood 6 + 7 + Additional code by: 8 + * BasiqueEvangelist 9 + * unilock 10 + 11 + Alpha testers: 12 + * MamonaTheGreed 13 + * Mirakuzura 14 + * sweetbriar 15 + 16 + Golden bug catcher: 17 + * JustImagineIT 18 + 19 + Bug catchers: 20 + * ezioishere 21 + * MommysDebitCard 22 + * 0tvechau 23 + * purplenathaniel 24 + * bravely-beep 25 + * tylerb153 26 + * Lord_Drakostar 27 + * slomas04 28 + * Strike_GR 29 + * TVFLabs 30 + * krispyking24 31 + * wknowleskellett 32 + * CrownScorpion 33 + * CraftyZombie 34 + * Pookette 35 + * anhonestheart 36 + * hollow_egg 37 + * zontreck 38 + * erasemint 39 + * EssGeeEich 40 + * CryptidArtha 41 + * general-chat 42 + * FrostedGeulleisia 43 + * LamarTheGH 44 + * oceansodaz 45 + * Dorian4771(+43E3) 46 + * Awulfha 47 + * George'O Breath 48 + * Corb 49 + * aurorameow 50 + * Luukiimoj 51 + * icg_aneki 52 + * Cozy Glow 53 + * DimensionCloud 54 + ---------------------- 55 + infinity_version: 2006005 56 + May contain elephants
+1 -1
src/main/resources/config/common/.util/invocation.lock
··· 1 - infinity_version: 2005001 2 amendment_version: &0 3 Delete this file to regenerate modular configs automatically 4 (e.g. you may want to do this when adding new mods to the instance)
··· 1 + infinity_version: 2006004 2 amendment_version: &0 3 Delete this file to regenerate modular configs automatically 4 (e.g. you may want to do this when adding new mods to the instance)
+85 -10
src/main/resources/config/common/amendments.json
··· 1 { 2 - "amendment_version": 3, 3 "elements": [ 4 { 5 "area": "fluids", ··· 51 }, 52 { 53 "area": "structures", 54 - "mod": "alexscaves", 55 "selector": "all", 56 "results": "erase" 57 }, 58 { 59 "area": "structures", 60 - "mod": "aether", 61 "selector": "containing", 62 "containing": "dungeon", 63 - "results": "erase" 64 - }, 65 - { 66 - "area": "structures", 67 - "mod": "vampirism", 68 - "selector": "all", 69 "results": "erase" 70 }, 71 { ··· 83 "value": 0.1 84 }, 85 { 86 - "area": "structures", 87 "mod": "the_bumblezone", 88 "selector": "all", 89 "results": "erase" 90 } 91 ]
··· 1 { 2 + "amendment_version": 5, 3 "elements": [ 4 { 5 "area": "fluids", ··· 51 }, 52 { 53 "area": "structures", 54 + "mod": "any_of", 55 + "mods": [ 56 + "alexscaves", 57 + "vampirism" 58 + ], 59 "selector": "all", 60 "results": "erase" 61 }, 62 { 63 "area": "structures", 64 + "mod": "any_of", 65 + "mods": [ 66 + "aether", 67 + "deep_aether" 68 + ], 69 "selector": "containing", 70 "containing": "dungeon", 71 "results": "erase" 72 }, 73 { ··· 85 "value": 0.1 86 }, 87 { 88 + "area": "biomes", 89 "mod": "the_bumblezone", 90 "selector": "all", 91 + "results": "erase" 92 + }, 93 + { 94 + "area": "mobs", 95 + "mod": "cobblemon", 96 + "selector": "matching_any", 97 + "matching_any": [ 98 + "cobblemon:pokemon", 99 + "cobblemon:npc" 100 + ], 101 + "results": "erase" 102 + }, 103 + { 104 + "area": "blocks", 105 + "mod": "amendments", 106 + "selector": "matching_any", 107 + "matching_any": [ 108 + "amendments:carpet_slab", 109 + "amendments:carpet_stairs" 110 + ], 111 + "results": "erase" 112 + }, 113 + { 114 + "area": "particles", 115 + "mod": "the_bumblezone", 116 + "selector": "matching_any", 117 + "matching_any": [ 118 + "the_bumblezone:angry_particle", 119 + "the_bumblezone:curious_particle", 120 + "the_bumblezone:cursing_particle", 121 + "the_bumblezone:embarrassed_particle", 122 + "the_bumblezone:shock_particle" 123 + ], 124 + "results": "erase" 125 + }, 126 + { 127 + "area": "blocks", 128 + "mod": "cobblemon", 129 + "selector": "matching_any", 130 + "matching_any": [ 131 + "cobblemon:pc", 132 + "cobblemon:pasture", 133 + "cobblemon:restoration_tank" 134 + ], 135 + "results": "erase" 136 + }, 137 + { 138 + "area": "blocks", 139 + "mod": "mega_showdown", 140 + "selector": "matching", 141 + "matching": "mega_showdown:reassembly_unit", 142 + "results": "erase" 143 + }, 144 + { 145 + "area": "blocks", 146 + "mod": "simpletms", 147 + "selector": "matching", 148 + "matching": "simpletms:machine_tm", 149 + "results": "erase" 150 + }, 151 + { 152 + "area": "blocks", 153 + "mod": "vintageimprovements", 154 + "selector": "matching", 155 + "matching": "vintageimprovements:centrifuge_structure", 156 + "results": "erase" 157 + }, 158 + { 159 + "load_if_mod": "irons_spellbooks", 160 + "area": "mobs", 161 + "mod": "minecraft", 162 + "selector": "matching", 163 + "matching": "minecraft:wandering_trader", 164 "results": "erase" 165 } 166 ]
+3 -2
src/main/resources/config/common/easter/credits.json
··· 1 { 2 - "infinity_version": 2006004, 3 "options": { 4 "portal_color": 11894492 5 }, ··· 73 "then_run": { 74 "type": "minecraft:condition", 75 "if_true": { 76 - "text": "Acknowledgements$n----------------------$nMod by LeraRiemann, cassiancc$n$nMusic by ivory rosewood$n$nAdditional code by:$n* BasiqueEvangelist$n* unilock$n$nAlpha testers:$n* MamonaTheGreed$n* Mirakuzura$n* sweetbriar$n$nGolden bug catcher:$n* JustImagineIT$n$nBug catchers:$n* ezioishere$n* MommysDebitCard$n* 0tvechau$n* purplenathaniel$n* bravely-beep$n* tylerb153$n* Lord_Drakostar$n* slomas04$n* Strike_GR$n* TVFLabs$n* krispyking24$n* wknowleskellett$n* CrownScorpion$n* CraftyZombie$n* Pookette$n* anhonestheart$n* hollow_egg$n* zontreck$n* erasemint$n* EssGeeEich$n* CryptidArtha$n* general-chat$n* FrostedGeulleisia$n* LamarTheGH$n* oceansodaz$n* Dorian4771(+43E3)$n* Awulfha$n* George'O Breath$n* Corb$n* aurorameow$n* Luukiimoj$n* icg_aneki$n* Cozy Glow$n----------------------$nMay contain elephants", 77 "type": "infinity:text" 78 }, 79 "then_run": {
··· 1 { 2 + "infinity_version": 2006005, 3 "options": { 4 "portal_color": 11894492 5 }, ··· 73 "then_run": { 74 "type": "minecraft:condition", 75 "if_true": { 76 + "text": ".util/credits.txt", 77 + "read_from_file": true, 78 "type": "infinity:text" 79 }, 80 "then_run": {
+122 -12
src/main/resources/config/common/easter/notes.json
··· 1 { 2 - "infinity_version": 2004002, 3 "options": { 4 - "haunted": true 5 }, 6 "generator": { 7 - "type": "minecraft:flat", 8 "settings": { 9 - "biome": "minecraft:the_void", 10 - "lakes": false, 11 - "features": false, 12 - "layers": [ 13 - { 14 - "height": 1, 15 - "block": "infinity:notes_block" 16 - } 17 - ] 18 } 19 } 20 }
··· 1 { 2 + "infinity_version": 2006003, 3 "options": { 4 + "haunted": true, 5 + "solar_texture": "textures/block/redstone_lamp_on.png", 6 + "moons": [ 7 + { 8 + "lunar_texture": "textures/block/note_block.png" 9 + } 10 + ] 11 }, 12 "generator": { 13 + "type": "minecraft:noise", 14 "settings": { 15 + "sea_level": 0, 16 + "disable_mob_generation": false, 17 + "ore_veins_enabled": false, 18 + "aquifers_enabled": false, 19 + "legacy_random_source": false, 20 + "default_block": { 21 + "Name": "minecraft:black_concrete" 22 + }, 23 + "default_fluid": { 24 + "Name": "minecraft:water" 25 + }, 26 + "spawn_target": [], 27 + "noise": { 28 + "min_y": 0, 29 + "height": 256, 30 + "size_horizontal": 2, 31 + "size_vertical": 2 32 + }, 33 + "noise_router": { 34 + "vein_ridged": "infinity:vein_ridged", 35 + "fluid_level_spread": 0.0, 36 + "vegetation": "infinity:vegetation", 37 + "vein_gap": "infinity:vein_gap", 38 + "continents": "minecraft:overworld/continents", 39 + "initial_density_without_jaggedness": { 40 + "to_y": 4, 41 + "from_value": 1.0, 42 + "to_value": -1.0, 43 + "from_y": 0, 44 + "type": "minecraft:y_clamped_gradient" 45 + }, 46 + "lava": 0.0, 47 + "barrier": 0.0, 48 + "depth": { 49 + "from_value": 1.5, 50 + "to_y": 256, 51 + "to_value": -1.5, 52 + "type": "minecraft:y_clamped_gradient", 53 + "from_y": 0 54 + }, 55 + "ridges": "minecraft:overworld/ridges", 56 + "erosion": "minecraft:overworld/erosion", 57 + "temperature": "infinity:temperature", 58 + "final_density": { 59 + "to_y": 4, 60 + "from_value": 1.0, 61 + "to_value": -1.0, 62 + "from_y": 0, 63 + "type": "minecraft:y_clamped_gradient" 64 + }, 65 + "vein_toggle": "infinity:vein_toggle", 66 + "fluid_level_floodedness": 0.0 67 + }, 68 + "surface_rule": { 69 + "type": "minecraft:sequence", 70 + "sequence": [ 71 + { 72 + "type": "minecraft:condition", 73 + "if_true": { 74 + "type": "minecraft:not", 75 + "invert": { 76 + "type": "y_above", 77 + "anchor": { 78 + "absolute": 1 79 + }, 80 + "surface_depth_multiplier": 0, 81 + "add_stone_depth": false 82 + } 83 + }, 84 + "then_run": { 85 + "type": "minecraft:block", 86 + "result_state": { 87 + "Name": "minecraft:bedrock" 88 + } 89 + } 90 + }, 91 + { 92 + "type": "minecraft:condition", 93 + "if_true": { 94 + "k_x": 0.0, 95 + "k_z": 1.0, 96 + "min": 0.5, 97 + "max": 0.6, 98 + "separation": 128, 99 + "type": "infinity:linear" 100 + }, 101 + "then_run": { 102 + "type": "infinity:lamps" 103 + } 104 + }, 105 + { 106 + "type": "minecraft:condition", 107 + "if_true": { 108 + "k_x": 1.0, 109 + "k_z": 0.0, 110 + "min": 0.5, 111 + "max": 0.6, 112 + "separation": 128, 113 + "type": "infinity:linear" 114 + }, 115 + "then_run": { 116 + "type": "infinity:lamps" 117 + } 118 + }, 119 + { 120 + "type": "infinity:notes" 121 + } 122 + ] 123 + } 124 + }, 125 + "biome_source": { 126 + "type": "fixed", 127 + "biome": "infinity:notes" 128 } 129 } 130 }
+3 -2
src/main/resources/config/common/infinity.json
··· 1 { 2 - "infinity_version": 2005000, 3 "gameRules": { 4 "safeMode": false, 5 "longArithmeticEnabled": false, ··· 12 "enforceModLoadedChecks": true, 13 "forceLowercase": false, 14 "iridSafeMode": false, 15 "maxBiomeCount": 6, 16 "maxStructureCount": 4, 17 "maxDimensionScale": 0, ··· 21 "resetChargeCooldown": 6000 22 }, 23 "disabledDimensions": ["ant", "bash", "checkerboard", 24 - "missing", "notes", "perfection", "terminal"], 25 "portalKey": "", 26 "salt": "", 27 "rootChances": {
··· 1 { 2 + "infinity_version": 2006000, 3 "gameRules": { 4 "safeMode": false, 5 "longArithmeticEnabled": false, ··· 12 "enforceModLoadedChecks": true, 13 "forceLowercase": false, 14 "iridSafeMode": false, 15 + "useFootprints": true, 16 "maxBiomeCount": 6, 17 "maxStructureCount": 4, 18 "maxDimensionScale": 0, ··· 22 "resetChargeCooldown": 6000 23 }, 24 "disabledDimensions": ["ant", "bash", "checkerboard", 25 + "missing", "perfection", "terminal"], 26 "portalKey": "", 27 "salt": "", 28 "rootChances": {
-6
src/main/resources/data/c/tags/item/buckets.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:iridescence_bucket" 5 - ] 6 - }
···
-19
src/main/resources/data/infinity/loot_table/blocks/ant.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:ant" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/data/infinity/loot_table/blocks/book_box.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:book_box" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/data/infinity/loot_table/blocks/cosmic_altar.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:cosmic_altar" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/data/infinity/loot_table/blocks/cursor.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:cursor" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/data/infinity/loot_table/blocks/iridescent_carpet.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:iridescent_carpet" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-21
src/main/resources/data/infinity/loot_table/blocks/iridescent_kelp.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "conditions": [ 7 - { 8 - "condition": "minecraft:survives_explosion" 9 - } 10 - ], 11 - "entries": [ 12 - { 13 - "type": "minecraft:item", 14 - "name": "minecraft:kelp" 15 - } 16 - ], 17 - "rolls": 1.0 18 - } 19 - ], 20 - "random_sequence": "minecraft:blocks/kelp" 21 - }
···
-21
src/main/resources/data/infinity/loot_table/blocks/iridescent_kelp_plant.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "conditions": [ 7 - { 8 - "condition": "minecraft:survives_explosion" 9 - } 10 - ], 11 - "entries": [ 12 - { 13 - "type": "minecraft:item", 14 - "name": "minecraft:kelp" 15 - } 16 - ], 17 - "rolls": 1.0 18 - } 19 - ], 20 - "random_sequence": "minecraft:blocks/kelp" 21 - }
···
-19
src/main/resources/data/infinity/loot_table/blocks/iridescent_wool.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:iridescent_wool" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/data/infinity/loot_table/blocks/netherite_slab.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:netherite_slab" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/data/infinity/loot_table/blocks/netherite_stairs.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:netherite_stairs" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-21
src/main/resources/data/infinity/loot_table/blocks/notes_block.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "conditions": [ 7 - { 8 - "condition": "minecraft:survives_explosion" 9 - } 10 - ], 11 - "entries": [ 12 - { 13 - "type": "minecraft:item", 14 - "name": "infinity:notes_block" 15 - } 16 - ], 17 - "rolls": 1.0 18 - } 19 - ], 20 - "random_sequence": "minecraft:blocks/note_block" 21 - }
···
-21
src/main/resources/data/infinity/recipe/altar.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "redstone", 4 - "key": { 5 - "B": { 6 - "item": "infinity:book_box" 7 - }, 8 - "S": { 9 - "item": "minecraft:stone_slab" 10 - } 11 - }, 12 - "pattern": [ 13 - "SSS", 14 - " B ", 15 - " S " 16 - ], 17 - "result": { 18 - "id": "infinity:altar" 19 - }, 20 - "show_notification": true 21 - }
···
-10
src/main/resources/data/infinity/recipe/altar_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:lectern" 5 - }, 6 - "output": { 7 - "id": "infinity:altar" 8 - }, 9 - "lore": "empty" 10 - }
···
-24
src/main/resources/data/infinity/recipe/ant.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "B": { 6 - "item": "minecraft:black_concrete" 7 - }, 8 - "W": { 9 - "item": "minecraft:white_concrete" 10 - }, 11 - "M": { 12 - "item": "infinity:star_of_lang" 13 - } 14 - }, 15 - "pattern": [ 16 - "WBW", 17 - "BMB", 18 - "WBW" 19 - ], 20 - "result": { 21 - "id": "infinity:ant" 22 - }, 23 - "show_notification": true 24 - }
···
-21
src/main/resources/data/infinity/recipe/ant1.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "B": { 6 - "item": "infinity:black_matter" 7 - }, 8 - "W": { 9 - "item": "infinity:white_matter" 10 - } 11 - }, 12 - "pattern": [ 13 - "WBW", 14 - "B B", 15 - "WBW" 16 - ], 17 - "result": { 18 - "id": "infinity:ant" 19 - }, 20 - "show_notification": true 21 - }
···
-4
src/main/resources/data/infinity/recipe/biome_bottle_combining.json
··· 1 - { 2 - "type": "infinity:biome_bottle_combining", 3 - "category": "misc" 4 - }
···
-10
src/main/resources/data/infinity/recipe/biome_bottle_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:glass_bottle" 5 - }, 6 - "output": { 7 - "id": "infinity:biome_bottle" 8 - }, 9 - "lore": "empty" 10 - }
···
-18
src/main/resources/data/infinity/recipe/black_matter.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "B": { 6 - "item": "minecraft:black_concrete" 7 - } 8 - }, 9 - "pattern": [ 10 - "BBB", 11 - "B B", 12 - "BBB" 13 - ], 14 - "result": { 15 - "id": "infinity:black_matter" 16 - }, 17 - "show_notification": true 18 - }
···
-10
src/main/resources/data/infinity/recipe/book_box_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:bookshelf" 5 - }, 6 - "output": { 7 - "id": "infinity:book_box" 8 - }, 9 - "lore": "empty" 10 - }
···
-10
src/main/resources/data/infinity/recipe/chromatic_carpet.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "tag": "minecraft:wool_carpets" 5 - }, 6 - "output": { 7 - "id": "infinity:chromatic_carpet" 8 - }, 9 - "lore": "recipe_info.portal.infinity.color" 10 - }
···
-4
src/main/resources/data/infinity/recipe/chromatic_carpet_from_wool.json
··· 1 - { 2 - "type": "infinity:chroma_carpet", 3 - "category": "misc" 4 - }
···
-9
src/main/resources/data/infinity/recipe/chromatic_coloring_carpet.json
··· 1 - { 2 - "type": "infinity:chromatic_coloring", 3 - "input": { 4 - "tag": "minecraft:wool_carpets" 5 - }, 6 - "output": { 7 - "id": "infinity:chromatic_carpet" 8 - } 9 - }
···
-9
src/main/resources/data/infinity/recipe/chromatic_coloring_wool.json
··· 1 - { 2 - "type": "infinity:chromatic_coloring", 3 - "input": { 4 - "tag": "minecraft:wool" 5 - }, 6 - "output": { 7 - "id": "infinity:chromatic_wool" 8 - } 9 - }
···
-10
src/main/resources/data/infinity/recipe/chromatic_matter.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "tag": "infinity:matter" 5 - }, 6 - "output": { 7 - "id": "infinity:chromatic_matter" 8 - }, 9 - "lore": "recipe_info.portal.infinity.color" 10 - }
···
-10
src/main/resources/data/infinity/recipe/chromatic_matter_from_iridescence.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": { 4 - "item": "infinity:chromatic_matter" 5 - }, 6 - "output": { 7 - "id": "infinity:chromatic_matter" 8 - }, 9 - "lore": "recipe_info.iridescence.infinity.chromatic_matter" 10 - }
···
-10
src/main/resources/data/infinity/recipe/chromatic_wool.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "tag": "minecraft:wool" 5 - }, 6 - "output": { 7 - "id": "infinity:chromatic_wool" 8 - }, 9 - "lore": "recipe_info.portal.infinity.color" 10 - }
···
-25
src/main/resources/data/infinity/recipe/cosmic_altar.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "L": { 6 - "item": "minecraft:lodestone" 7 - }, 8 - "A": { 9 - "item": "infinity:altar" 10 - }, 11 - "S": { 12 - "item": "infinity:iridescent_star" 13 - } 14 - }, 15 - "pattern": [ 16 - "LAL", 17 - "ASA", 18 - "LAL" 19 - ], 20 - "result": { 21 - "count": 1, 22 - "id": "infinity:cosmic_altar" 23 - }, 24 - "show_notification": true 25 - }
···
-25
src/main/resources/data/infinity/recipe/cursor.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "L": { 6 - "item": "minecraft:lime_concrete" 7 - }, 8 - "B": { 9 - "item": "minecraft:black_concrete" 10 - }, 11 - "S": { 12 - "item": "infinity:star_of_lang" 13 - } 14 - }, 15 - "pattern": [ 16 - "BLB", 17 - "LSL", 18 - "BLB" 19 - ], 20 - "result": { 21 - "count": 8, 22 - "id": "infinity:cursor" 23 - }, 24 - "show_notification": true 25 - }
···
-22
src/main/resources/data/infinity/recipe/f4.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "O": { 6 - "item": "minecraft:obsidian" 7 - }, 8 - "S": { 9 - "item": "infinity:iridescent_star" 10 - } 11 - }, 12 - "pattern": [ 13 - "OOO", 14 - "OSO", 15 - "OOO" 16 - ], 17 - "result": { 18 - "count": 1, 19 - "id": "infinity:f4" 20 - }, 21 - "show_notification": true 22 - }
···
-10
src/main/resources/data/infinity/recipe/f4_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "infinity:f4" 5 - }, 6 - "output": { 7 - "id": "infinity:f4" 8 - }, 9 - "lore": "recipe_info.portal.infinity.attuned" 10 - }
···
-4
src/main/resources/data/infinity/recipe/f4_recharging.json
··· 1 - { 2 - "type": "infinity:f4_recharging", 3 - "category": "misc" 4 - }
···
-21
src/main/resources/data/infinity/recipe/fine_item.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "G": { 6 - "item": "minecraft:grass_block" 7 - }, 8 - "S": { 9 - "item": "infinity:star_of_lang" 10 - } 11 - }, 12 - "pattern": [ 13 - "GGG", 14 - "GSG", 15 - "GGG" 16 - ], 17 - "result": { 18 - "id": "infinity:fine_item" 19 - }, 20 - "show_notification": true 21 - }
···
-19
src/main/resources/data/infinity/recipe/footprint.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "P": { 6 - "item": "minecraft:light_gray_stained_glass_pane" 7 - } 8 - }, 9 - "pattern": [ 10 - "PPP", 11 - "P P", 12 - "PPP" 13 - ], 14 - "result": { 15 - "count": 8, 16 - "id": "infinity:footprint" 17 - }, 18 - "show_notification": true 19 - }
···
-10
src/main/resources/data/infinity/recipe/iridescence_bottle_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "infinity:chromatic_potion" 5 - }, 6 - "output": { 7 - "id": "infinity:iridescent_potion" 8 - }, 9 - "lore": "empty" 10 - }
···
-10
src/main/resources/data/infinity/recipe/iridescent_carpet.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": { 4 - "item": "infinity:chromatic_carpet" 5 - }, 6 - "output": { 7 - "id": "infinity:iridescent_carpet" 8 - }, 9 - "lore": "empty" 10 - }
···
-16
src/main/resources/data/infinity/recipe/iridescent_carpet_from_wool.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "#": { 6 - "item": "infinity:iridescent_wool" 7 - } 8 - }, 9 - "pattern": [ 10 - "## " 11 - ], 12 - "result": { 13 - "count": 3, 14 - "id": "infinity:iridescent_carpet" 15 - } 16 - }
···
-10
src/main/resources/data/infinity/recipe/iridescent_star.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": { 4 - "item": "infinity:star_of_lang" 5 - }, 6 - "output": { 7 - "id": "infinity:iridescent_star" 8 - }, 9 - "lore": "empty" 10 - }
···
-10
src/main/resources/data/infinity/recipe/iridescent_wool.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": { 4 - "item": "infinity:chromatic_wool" 5 - }, 6 - "output": { 7 - "id": "infinity:iridescent_wool" 8 - }, 9 - "lore": "empty" 10 - }
···
-10
src/main/resources/data/infinity/recipe/key_from_iridescence.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": { 4 - "item": "infinity:key" 5 - }, 6 - "output": { 7 - "id": "infinity:key" 8 - }, 9 - "lore": "recipe_info.iridescence.infinity.key" 10 - }
···
-10
src/main/resources/data/infinity/recipe/key_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:amethyst_shard" 5 - }, 6 - "output": { 7 - "id": "infinity:key" 8 - }, 9 - "lore": "recipe_info.portal.infinity.attuned" 10 - }
···
-16
src/main/resources/data/infinity/recipe/netherite_slab.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "#": { 6 - "item": "minecraft:netherite_block" 7 - } 8 - }, 9 - "pattern": [ 10 - "###" 11 - ], 12 - "result": { 13 - "count": 6, 14 - "id": "infinity:netherite_slab" 15 - } 16 - }
···
-9
src/main/resources/data/infinity/recipe/netherite_slab_from_stonecutting.json
··· 1 - { 2 - "type": "minecraft:stonecutting", 3 - "ingredient": { 4 - "item": "minecraft:netherite_block" 5 - }, 6 - "result": { 7 - "count": 2, 8 - "id": "infinity:netherite_slab" 9 - }}
···
-18
src/main/resources/data/infinity/recipe/netherite_stairs.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "#": { 6 - "item": "minecraft:netherite_block" 7 - } 8 - }, 9 - "pattern": [ 10 - "# ", 11 - "## ", 12 - "###" 13 - ], 14 - "result": { 15 - "count": 4, 16 - "id": "infinity:netherite_stairs" 17 - } 18 - }
···
-10
src/main/resources/data/infinity/recipe/netherite_stairs_from_stonecutting.json
··· 1 - { 2 - "type": "minecraft:stonecutting", 3 - "ingredient": { 4 - "item": "minecraft:netherite_block" 5 - }, 6 - "result": { 7 - "count": 1, 8 - "id": "infinity:netherite_stairs" 9 - } 10 - }
···
-10
src/main/resources/data/infinity/recipe/notes_block_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:note_block" 5 - }, 6 - "output": { 7 - "id": "infinity:notes_block" 8 - }, 9 - "lore": "empty" 10 - }
···
-10
src/main/resources/data/infinity/recipe/timebomb_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:tnt" 5 - }, 6 - "output": { 7 - "id": "infinity:timebomb" 8 - }, 9 - "lore": "empty" 10 - }
···
-18
src/main/resources/data/infinity/recipe/white_matter.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "B": { 6 - "item": "minecraft:white_concrete" 7 - } 8 - }, 9 - "pattern": [ 10 - "BBB", 11 - "B B", 12 - "BBB" 13 - ], 14 - "result": { 15 - "id": "infinity:white_matter" 16 - }, 17 - "show_notification": true 18 - }
···
-8
src/main/resources/data/infinity/tags/block/iridescent.json
··· 1 - { 2 - "values": [ 3 - "infinity:iridescent_wool", 4 - "infinity:iridescent_carpet", 5 - "infinity:iridescence", 6 - "infinity:cosmic_altar" 7 - ] 8 - }
···
-11
src/main/resources/data/infinity/tags/item/iridescent.json
··· 1 - { 2 - "values": [ 3 - "infinity:iridescent_wool", 4 - "infinity:iridescent_carpet", 5 - "infinity:iridescent_star", 6 - "infinity:iridescence_bucket", 7 - "infinity:cosmic_altar", 8 - "infinity:chromatic_potion", 9 - "infinity:iridescent_potion" 10 - ] 11 - }
···
-7
src/main/resources/data/infinity/tags/item/matter.json
··· 1 - { 2 - "values": [ 3 - "infinity:white_matter", 4 - "infinity:black_matter", 5 - "infinity:chromatic_matter" 6 - ] 7 - }
···
+32
src/main/resources/data/infinity/worldgen/biome/notes.json
···
··· 1 + { 2 + "has_precipitation": false, 3 + "temperature": 0.8, 4 + "downfall": 0.4, 5 + "effects": { 6 + "sky_color": 7907327, 7 + "water_fog_color": 329011, 8 + "fog_color": 12638463, 9 + "water_color": 4159204 10 + }, 11 + "features": [ 12 + [], 13 + [], 14 + [], 15 + [], 16 + [], 17 + [ 18 + "infinity:jukebox", 19 + "infinity:madhouse" 20 + ], 21 + [], 22 + [], 23 + [], 24 + [ 25 + "infinity:notable_trees" 26 + ], 27 + [] 28 + ], 29 + "spawners": {}, 30 + "spawn_costs": {}, 31 + "carvers": {} 32 + }
+29
src/main/resources/data/infinity/worldgen/placed_feature/jukebox.json
···
··· 1 + { 2 + "feature": { 3 + "type": "infinity:jukebox", 4 + "config": { 5 + } 6 + }, 7 + "placement": [ 8 + { 9 + "type": "count_on_every_layer", 10 + "count": 1 11 + }, 12 + { 13 + "type": "block_predicate_filter", 14 + "predicate": { 15 + "type": "matching_blocks", 16 + "offset": [ 17 + 0, 18 + -1, 19 + 0 20 + ], 21 + "blocks": "minecraft:note_block" 22 + } 23 + }, 24 + { 25 + "type": "rarity_filter", 26 + "chance": 100 27 + } 28 + ] 29 + }
+18
src/main/resources/data/infinity/worldgen/placed_feature/madhouse.json
···
··· 1 + { 2 + "feature": { 3 + "type": "infinity:madhouse", 4 + "config": { 5 + "radius": 4 6 + } 7 + }, 8 + "placement": [ 9 + { 10 + "type": "count_on_every_layer", 11 + "count": 1 12 + }, 13 + { 14 + "type": "rarity_filter", 15 + "chance": 1000 16 + } 17 + ] 18 + }
+67
src/main/resources/data/infinity/worldgen/placed_feature/notable_trees.json
···
··· 1 + { 2 + "feature": { 3 + "type": "minecraft:tree", 4 + "config": { 5 + "decorators": [], 6 + "dirt_provider": { 7 + "type": "minecraft:simple_state_provider", 8 + "state": { 9 + "Name": "minecraft:redstone_lamp" 10 + } 11 + }, 12 + "foliage_placer": { 13 + "type": "minecraft:blob_foliage_placer", 14 + "height": 3, 15 + "offset": 0, 16 + "radius": 2 17 + }, 18 + "foliage_provider": { 19 + "type": "minecraft:simple_state_provider", 20 + "state": { 21 + "Name": "minecraft:note_block" 22 + } 23 + }, 24 + "force_dirt": false, 25 + "ignore_vines": true, 26 + "minimum_size": { 27 + "type": "minecraft:two_layers_feature_size", 28 + "limit": 1, 29 + "lower_size": 0, 30 + "upper_size": 1 31 + }, 32 + "trunk_placer": { 33 + "type": "minecraft:straight_trunk_placer", 34 + "base_height": 4, 35 + "height_rand_a": 2, 36 + "height_rand_b": 0 37 + }, 38 + "trunk_provider": { 39 + "type": "minecraft:simple_state_provider", 40 + "state": { 41 + "Name": "minecraft:observer", 42 + "Properties": { 43 + "facing": "down" 44 + } 45 + } 46 + } 47 + } 48 + }, 49 + "placement": [ 50 + { 51 + "type": "count_on_every_layer", 52 + "count": 1 53 + }, 54 + { 55 + "type": "block_predicate_filter", 56 + "predicate": { 57 + "type": "matching_blocks", 58 + "offset": [ 59 + 0, 60 + -1, 61 + 0 62 + ], 63 + "blocks": "minecraft:note_block" 64 + } 65 + } 66 + ] 67 + }
-6
src/main/resources/data/minecraft/tags/block/mineable/axe.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:book_box" 5 - ] 6 - }
···
-12
src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:altar", 5 - "infinity:cursor", 6 - "infinity:netherite_slab", 7 - "infinity:netherite_stairs", 8 - "infinity:biome_bottle", 9 - "infinity:ant", 10 - "infinity:cosmic_altar" 11 - ] 12 - }
···
-6
src/main/resources/data/minecraft/tags/block/portals.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:neither_portal" 5 - ] 6 - }
···
-6
src/main/resources/data/minecraft/tags/block/slabs.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:netherite_slab" 5 - ] 6 - }
···
-6
src/main/resources/data/minecraft/tags/block/stairs.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:netherite_stairs" 5 - ] 6 - }
···
-7
src/main/resources/data/minecraft/tags/block/wool.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:iridescent_wool", 5 - "infinity:chromatic_wool" 6 - ] 7 - }
···
-7
src/main/resources/data/minecraft/tags/block/wool_carpets.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:iridescent_carpet", 5 - "infinity:chromatic_carpet" 6 - ] 7 - }
···
-6
src/main/resources/data/minecraft/tags/entity_type/arthropod.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:ant" 5 - ] 6 - }
···
-6
src/main/resources/data/minecraft/tags/entity_type/frog_food.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:chaos_slime" 5 - ] 6 - }
···
-6
src/main/resources/data/minecraft/tags/entity_type/skeletons.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:chaos_skeleton" 5 - ] 6 - }
···
-8
src/main/resources/data/minecraft/tags/fluid/water.json
··· 1 - { 2 - "replace": false, 3 - "values": 4 - [ 5 - "infinity:flowing_iridescence", 6 - "infinity:iridescence" 7 - ] 8 - }
···
-7
src/main/resources/data/minecraft/tags/item/wool.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:iridescent_wool", 5 - "infinity:chromatic_wool" 6 - ] 7 - }
···
-7
src/main/resources/data/minecraft/tags/item/wool_carpets.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:iridescent_carpet", 5 - "infinity:chromatic_carpet" 6 - ] 7 - }
···
+3
src/main/resources/fabric.mod.json
··· 29 ], 30 "rrv": [ 31 "net.lerariemann.infinity.compat.rrv.RrvIntegration" 32 ] 33 }, 34 "mixins": [
··· 29 ], 30 "rrv": [ 31 "net.lerariemann.infinity.compat.rrv.RrvIntegration" 32 + ], 33 + "fabric-datagen": [ 34 + "net.lerariemann.infinity.data.InfinityDataGenerator" 35 ] 36 }, 37 "mixins": [
+2
src/main/resources/infinity-forge.mixins.json
··· 58 "mobs.SpawnRestrictionMixin", 59 "mobs.TropicalFishEntityMixin", 60 "options.DimensionTypeMixin", 61 "options.PlayerManagerMixin", 62 "options.ServerWorldMixin", 63 "qol.BlockEntityTypeMixin", 64 "qol.CoralBlockBlockMixin", 65 "qol.CoralParentBlockMixin",
··· 58 "mobs.SpawnRestrictionMixin", 59 "mobs.TropicalFishEntityMixin", 60 "options.DimensionTypeMixin", 61 + "options.NoteBlockMixin", 62 "options.PlayerManagerMixin", 63 "options.ServerWorldMixin", 64 + "qol.JukeboxBlockEntityMixin", 65 "qol.BlockEntityTypeMixin", 66 "qol.CoralBlockBlockMixin", 67 "qol.CoralParentBlockMixin",
+6 -4
src/main/resources/infinity.mixins.json
··· 57 "mobs.SpawnRestrictionMixin", 58 "mobs.TropicalFishEntityMixin", 59 "options.DimensionTypeMixin", 60 "options.PlayerManagerMixin", 61 "options.ServerWorldMixin", 62 "qol.BlockEntityTypeMixin", ··· 64 "qol.CoralParentBlockMixin", 65 "qol.EnderDragonEntityMixin", 66 "qol.FireBlockMixin", 67 - "qol.LavaFluidMixin", 68 - "rrv.FluidItemRendererMixin" 69 ], 70 "client": [ 71 "SoundListMixin", 72 "iridescence.LivingEntityRendererMixin", 73 "iridescence.PostEffectProcessorMixin", 74 - "iridescence.RenderSystemMixin", 75 "iridescence.PostPassMixin", 76 "options.BackgroundRendererMixin", 77 "options.ClientWorldMixin", 78 "options.FogRendererMixin", ··· 81 "options.SoundSystemMixin", 82 "options.WorldRendererMixin", 83 "qol.EditWorldScreenMixin", 84 - "qol.KeyboardMixin" 85 ] 86 }
··· 57 "mobs.SpawnRestrictionMixin", 58 "mobs.TropicalFishEntityMixin", 59 "options.DimensionTypeMixin", 60 + "options.NoteBlockMixin", 61 "options.PlayerManagerMixin", 62 "options.ServerWorldMixin", 63 "qol.BlockEntityTypeMixin", ··· 65 "qol.CoralParentBlockMixin", 66 "qol.EnderDragonEntityMixin", 67 "qol.FireBlockMixin", 68 + "qol.JukeboxBlockEntityMixin", 69 + "qol.LavaFluidMixin" 70 ], 71 "client": [ 72 "SoundListMixin", 73 "iridescence.LivingEntityRendererMixin", 74 "iridescence.PostEffectProcessorMixin", 75 "iridescence.PostPassMixin", 76 + "iridescence.RenderSystemMixin", 77 "options.BackgroundRendererMixin", 78 "options.ClientWorldMixin", 79 "options.FogRendererMixin", ··· 82 "options.SoundSystemMixin", 83 "options.WorldRendererMixin", 84 "qol.EditWorldScreenMixin", 85 + "qol.KeyboardMixin", 86 + "rrv.FluidItemRendererMixin" 87 ] 88 }
-19
src/main/resources/resourcepacks/20/data/infinity/loot_tables/blocks/ant.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:ant" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/resourcepacks/20/data/infinity/loot_tables/blocks/book_box.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:book_box" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/resourcepacks/20/data/infinity/loot_tables/blocks/cosmic_altar.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:cosmic_altar" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/resourcepacks/20/data/infinity/loot_tables/blocks/cursor.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:cursor" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/resourcepacks/20/data/infinity/loot_tables/blocks/iridescent_carpet.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:iridescent_carpet" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-21
src/main/resources/resourcepacks/20/data/infinity/loot_tables/blocks/iridescent_kelp.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "conditions": [ 7 - { 8 - "condition": "minecraft:survives_explosion" 9 - } 10 - ], 11 - "entries": [ 12 - { 13 - "type": "minecraft:item", 14 - "name": "minecraft:kelp" 15 - } 16 - ], 17 - "rolls": 1.0 18 - } 19 - ], 20 - "random_sequence": "minecraft:blocks/kelp" 21 - }
···
-21
src/main/resources/resourcepacks/20/data/infinity/loot_tables/blocks/iridescent_kelp_plant.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "conditions": [ 7 - { 8 - "condition": "minecraft:survives_explosion" 9 - } 10 - ], 11 - "entries": [ 12 - { 13 - "type": "minecraft:item", 14 - "name": "minecraft:kelp" 15 - } 16 - ], 17 - "rolls": 1.0 18 - } 19 - ], 20 - "random_sequence": "minecraft:blocks/kelp" 21 - }
···
-19
src/main/resources/resourcepacks/20/data/infinity/loot_tables/blocks/iridescent_wool.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:iridescent_wool" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/resourcepacks/20/data/infinity/loot_tables/blocks/netherite_slab.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:netherite_slab" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/resourcepacks/20/data/infinity/loot_tables/blocks/netherite_stairs.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:netherite_stairs" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-21
src/main/resources/resourcepacks/20/data/infinity/loot_tables/blocks/notes_block.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "conditions": [ 7 - { 8 - "condition": "minecraft:survives_explosion" 9 - } 10 - ], 11 - "entries": [ 12 - { 13 - "type": "minecraft:item", 14 - "name": "infinity:notes_block" 15 - } 16 - ], 17 - "rolls": 1.0 18 - } 19 - ], 20 - "random_sequence": "minecraft:blocks/note_block" 21 - }
···
-21
src/main/resources/resourcepacks/20/data/infinity/recipes/altar.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "redstone", 4 - "key": { 5 - "B": { 6 - "item": "infinity:book_box" 7 - }, 8 - "S": { 9 - "item": "minecraft:stone_slab" 10 - } 11 - }, 12 - "pattern": [ 13 - "SSS", 14 - " B ", 15 - " S " 16 - ], 17 - "result": { 18 - "item": "infinity:altar" 19 - }, 20 - "show_notification": true 21 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/altar_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:lectern" 5 - }, 6 - "output": { 7 - "item": "infinity:altar" 8 - } 9 - }
···
-24
src/main/resources/resourcepacks/20/data/infinity/recipes/ant.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "B": { 6 - "item": "minecraft:black_concrete" 7 - }, 8 - "W": { 9 - "item": "minecraft:white_concrete" 10 - }, 11 - "M": { 12 - "item": "infinity:star_of_lang" 13 - } 14 - }, 15 - "pattern": [ 16 - "WBW", 17 - "BMB", 18 - "WBW" 19 - ], 20 - "result": { 21 - "item": "infinity:ant" 22 - }, 23 - "show_notification": true 24 - }
···
-21
src/main/resources/resourcepacks/20/data/infinity/recipes/ant1.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "B": { 6 - "item": "infinity:black_matter" 7 - }, 8 - "W": { 9 - "item": "infinity:white_matter" 10 - } 11 - }, 12 - "pattern": [ 13 - "WBW", 14 - "B B", 15 - "WBW" 16 - ], 17 - "result": { 18 - "item": "infinity:ant" 19 - }, 20 - "show_notification": true 21 - }
···
-4
src/main/resources/resourcepacks/20/data/infinity/recipes/biome_bottle_combining.json
··· 1 - { 2 - "type": "infinity:biome_bottle_combining", 3 - "category": "misc" 4 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/biome_bottle_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:glass_bottle" 5 - }, 6 - "output": { 7 - "item": "infinity:biome_bottle" 8 - } 9 - }
···
-18
src/main/resources/resourcepacks/20/data/infinity/recipes/black_matter.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "B": { 6 - "item": "minecraft:black_concrete" 7 - } 8 - }, 9 - "pattern": [ 10 - "BBB", 11 - "B B", 12 - "BBB" 13 - ], 14 - "result": { 15 - "item": "infinity:black_matter" 16 - }, 17 - "show_notification": true 18 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/book_box_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:bookshelf" 5 - }, 6 - "output": { 7 - "item": "infinity:book_box" 8 - } 9 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/chromatic_carpet.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "tag": "minecraft:wool_carpets" 5 - }, 6 - "output": { 7 - "item": "infinity:chromatic_carpet" 8 - } 9 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/chromatic_coloring_carpet.json
··· 1 - { 2 - "type": "infinity:chromatic_coloring", 3 - "input": { 4 - "tag": "minecraft:wool_carpets" 5 - }, 6 - "output": { 7 - "item": "infinity:chromatic_carpet" 8 - } 9 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/chromatic_coloring_wool.json
··· 1 - { 2 - "type": "infinity:chromatic_coloring", 3 - "input": { 4 - "tag": "minecraft:wool" 5 - }, 6 - "output": { 7 - "item": "infinity:chromatic_wool" 8 - } 9 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/chromatic_matter.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "tag": "infinity:matter" 5 - }, 6 - "output": { 7 - "item": "infinity:chromatic_matter" 8 - } 9 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/chromatic_wool.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "tag": "minecraft:wool" 5 - }, 6 - "output": { 7 - "item": "infinity:chromatic_wool" 8 - } 9 - }
···
-25
src/main/resources/resourcepacks/20/data/infinity/recipes/cosmic_altar.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "L": { 6 - "item": "minecraft:lodestone" 7 - }, 8 - "A": { 9 - "item": "infinity:altar" 10 - }, 11 - "S": { 12 - "item": "infinity:iridescent_star" 13 - } 14 - }, 15 - "pattern": [ 16 - "LAL", 17 - "ASA", 18 - "LAL" 19 - ], 20 - "result": { 21 - "count": 1, 22 - "item": "infinity:cosmic_altar" 23 - }, 24 - "show_notification": true 25 - }
···
-25
src/main/resources/resourcepacks/20/data/infinity/recipes/cursor.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "L": { 6 - "item": "minecraft:lime_concrete" 7 - }, 8 - "B": { 9 - "item": "minecraft:black_concrete" 10 - }, 11 - "S": { 12 - "item": "infinity:star_of_lang" 13 - } 14 - }, 15 - "pattern": [ 16 - "BLB", 17 - "LSL", 18 - "BLB" 19 - ], 20 - "result": { 21 - "count": 8, 22 - "item": "infinity:cursor" 23 - }, 24 - "show_notification": true 25 - }
···
-22
src/main/resources/resourcepacks/20/data/infinity/recipes/f4.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "O": { 6 - "item": "minecraft:obsidian" 7 - }, 8 - "S": { 9 - "item": "infinity:iridescent_star" 10 - } 11 - }, 12 - "pattern": [ 13 - "OOO", 14 - "OSO", 15 - "OOO" 16 - ], 17 - "result": { 18 - "count": 1, 19 - "item": "infinity:f4" 20 - }, 21 - "show_notification": true 22 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/f4_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "infinity:f4" 5 - }, 6 - "output": { 7 - "item": "infinity:f4" 8 - } 9 - }
···
-4
src/main/resources/resourcepacks/20/data/infinity/recipes/f4_recharging.json
··· 1 - { 2 - "type": "infinity:f4_recharging", 3 - "category": "misc" 4 - }
···
-21
src/main/resources/resourcepacks/20/data/infinity/recipes/fine_item.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "G": { 6 - "item": "minecraft:grass_block" 7 - }, 8 - "S": { 9 - "item": "infinity:star_of_lang" 10 - } 11 - }, 12 - "pattern": [ 13 - "GGG", 14 - "GSG", 15 - "GGG" 16 - ], 17 - "result": { 18 - "item": "infinity:fine_item" 19 - }, 20 - "show_notification": true 21 - }
···
-19
src/main/resources/resourcepacks/20/data/infinity/recipes/footprint.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "P": { 6 - "item": "minecraft:light_gray_stained_glass_pane" 7 - } 8 - }, 9 - "pattern": [ 10 - "PPP", 11 - "P P", 12 - "PPP" 13 - ], 14 - "result": { 15 - "count": 8, 16 - "item": "infinity:footprint" 17 - }, 18 - "show_notification": true 19 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/iridescence_bottle_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "infinity:chromatic_potion" 5 - }, 6 - "output": { 7 - "item": "infinity:iridescent_potion" 8 - } 9 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/iridescent_carpet.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": { 4 - "item": "infinity:chromatic_carpet" 5 - }, 6 - "output": { 7 - "item": "infinity:iridescent_carpet" 8 - } 9 - }
···
-16
src/main/resources/resourcepacks/20/data/infinity/recipes/iridescent_carpet_from_wool.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "#": { 6 - "item": "infinity:iridescent_wool" 7 - } 8 - }, 9 - "pattern": [ 10 - "## " 11 - ], 12 - "result": { 13 - "count": 3, 14 - "item": "infinity:iridescent_carpet" 15 - } 16 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/iridescent_star.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": { 4 - "item": "infinity:star_of_lang" 5 - }, 6 - "output": { 7 - "item": "infinity:iridescent_star" 8 - } 9 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/iridescent_wool.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": { 4 - "item": "infinity:chromatic_wool" 5 - }, 6 - "output": { 7 - "item": "infinity:iridescent_wool" 8 - } 9 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/key_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:amethyst_shard" 5 - }, 6 - "output": { 7 - "item": "infinity:key" 8 - } 9 - }
···
-16
src/main/resources/resourcepacks/20/data/infinity/recipes/netherite_slab.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "#": { 6 - "item": "minecraft:netherite_block" 7 - } 8 - }, 9 - "pattern": [ 10 - "###" 11 - ], 12 - "result": { 13 - "count": 6, 14 - "item": "infinity:netherite_slab" 15 - } 16 - }
···
-8
src/main/resources/resourcepacks/20/data/infinity/recipes/netherite_slab_from_stonecutting.json
··· 1 - { 2 - "type": "minecraft:stonecutting", 3 - "count": 2, 4 - "ingredient": { 5 - "item": "minecraft:netherite_block" 6 - }, 7 - "result": "infinity:netherite_slab" 8 - }
···
-18
src/main/resources/resourcepacks/20/data/infinity/recipes/netherite_stairs.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "#": { 6 - "item": "minecraft:netherite_block" 7 - } 8 - }, 9 - "pattern": [ 10 - "# ", 11 - "## ", 12 - "###" 13 - ], 14 - "result": { 15 - "count": 4, 16 - "item": "infinity:netherite_stairs" 17 - } 18 - }
···
-8
src/main/resources/resourcepacks/20/data/infinity/recipes/netherite_stairs_from_stonecutting.json
··· 1 - { 2 - "type": "minecraft:stonecutting", 3 - "count": 1, 4 - "ingredient": { 5 - "item": "minecraft:netherite_block" 6 - }, 7 - "result": "infinity:netherite_stairs" 8 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/notes_block_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:note_block" 5 - }, 6 - "output": { 7 - "item": "infinity:notes_block" 8 - } 9 - }
···
-9
src/main/resources/resourcepacks/20/data/infinity/recipes/timebomb_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": { 4 - "item": "minecraft:tnt" 5 - }, 6 - "output": { 7 - "item": "infinity:timebomb" 8 - } 9 - }
···
-18
src/main/resources/resourcepacks/20/data/infinity/recipes/white_matter.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "B": { 6 - "item": "minecraft:white_concrete" 7 - } 8 - }, 9 - "pattern": [ 10 - "BBB", 11 - "B B", 12 - "BBB" 13 - ], 14 - "result": { 15 - "item": "infinity:white_matter" 16 - }, 17 - "show_notification": true 18 - }
···
-8
src/main/resources/resourcepacks/20/data/infinity/tags/blocks/iridescent.json
··· 1 - { 2 - "values": [ 3 - "infinity:iridescent_wool", 4 - "infinity:iridescent_carpet", 5 - "infinity:iridescence", 6 - "infinity:cosmic_altar" 7 - ] 8 - }
···
-11
src/main/resources/resourcepacks/20/data/infinity/tags/items/iridescent.json
··· 1 - { 2 - "values": [ 3 - "infinity:iridescent_wool", 4 - "infinity:iridescent_carpet", 5 - "infinity:iridescent_star", 6 - "infinity:iridescence_bucket", 7 - "infinity:cosmic_altar", 8 - "infinity:chromatic_potion", 9 - "infinity:iridescent_potion" 10 - ] 11 - }
···
-7
src/main/resources/resourcepacks/20/data/infinity/tags/items/matter.json
··· 1 - { 2 - "values": [ 3 - "infinity:white_matter", 4 - "infinity:black_matter", 5 - "infinity:chromatic_matter" 6 - ] 7 - }
···
-6
src/main/resources/resourcepacks/20/data/minecraft/tags/blocks/mineable/axe.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:book_box" 5 - ] 6 - }
···
-12
src/main/resources/resourcepacks/20/data/minecraft/tags/blocks/mineable/pickaxe.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:altar", 5 - "infinity:cursor", 6 - "infinity:netherite_slab", 7 - "infinity:netherite_stairs", 8 - "infinity:biome_bottle", 9 - "infinity:ant", 10 - "infinity:cosmic_altar" 11 - ] 12 - }
···
-7
src/main/resources/resourcepacks/20/data/minecraft/tags/blocks/wool.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:iridescent_wool", 5 - "infinity:chromatic_wool" 6 - ] 7 - }
···
-7
src/main/resources/resourcepacks/20/data/minecraft/tags/blocks/wool_carpets.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:iridescent_carpet", 5 - "infinity:chromatic_carpet" 6 - ] 7 - }
···
-6
src/main/resources/resourcepacks/20/data/minecraft/tags/entity_types/arthropod.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:ant" 5 - ] 6 - }
···
-6
src/main/resources/resourcepacks/20/data/minecraft/tags/entity_types/frog_food.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:chaos_slime" 5 - ] 6 - }
···
-6
src/main/resources/resourcepacks/20/data/minecraft/tags/entity_types/skeletons.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:chaos_skeleton" 5 - ] 6 - }
···
-8
src/main/resources/resourcepacks/20/data/minecraft/tags/fluids/water.json
··· 1 - { 2 - "replace": false, 3 - "values": 4 - [ 5 - "infinity:flowing_iridescence", 6 - "infinity:iridescence" 7 - ] 8 - }
···
-7
src/main/resources/resourcepacks/20/data/minecraft/tags/items/wool.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:iridescent_wool", 5 - "infinity:chromatic_wool" 6 - ] 7 - }
···
-7
src/main/resources/resourcepacks/20/data/minecraft/tags/items/wool_carpets.json
··· 1 - { 2 - "replace": false, 3 - "values": [ 4 - "infinity:iridescent_carpet", 5 - "infinity:chromatic_carpet" 6 - ] 7 - }
···
+1 -1
src/main/resources/resourcepacks/20/pack.mcmeta
··· 1 { 2 "pack": { 3 "description": "Versioned resources for 1.20.1.", 4 - "pack_format": 81 5 } 6 }
··· 1 { 2 "pack": { 3 "description": "Versioned resources for 1.20.1.", 4 + "pack_format": 15 5 } 6 }
+1 -1
src/main/resources/resourcepacks/21/pack.mcmeta
··· 1 { 2 "pack": { 3 "description": "Versioned resources for 1.21.1.", 4 - "pack_format": 81 5 } 6 }
··· 1 { 2 "pack": { 3 "description": "Versioned resources for 1.21.1.", 4 + "pack_format": 48 5 } 6 }
-24
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/altar.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:altar", 10 - "functions": [ 11 - { 12 - "function": "infinity:set_altar_state" 13 - } 14 - ] 15 - } 16 - ], 17 - "conditions": [ 18 - { 19 - "condition": "minecraft:survives_explosion" 20 - } 21 - ] 22 - } 23 - ] 24 - }
···
-19
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/ant.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:ant" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-34
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/biome_bottle.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:biome_bottle", 10 - "functions": [ 11 - { 12 - "function": "minecraft:copy_components", 13 - "include": [ 14 - "infinity:color", 15 - "infinity:charge", 16 - "infinity:biome_contents", 17 - "minecraft:rarity" 18 - ], 19 - "source": "block_entity" 20 - }, 21 - { 22 - "function": "infinity:set_biome_bottle_level" 23 - } 24 - ] 25 - } 26 - ], 27 - "conditions": [ 28 - { 29 - "condition": "minecraft:survives_explosion" 30 - } 31 - ] 32 - } 33 - ] 34 - }
···
-19
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/book_box.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:book_box" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-28
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/chromatic_carpet.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:chromatic_carpet", 10 - "functions": [ 11 - { 12 - "function": "minecraft:copy_components", 13 - "include": [ 14 - "infinity:color" 15 - ], 16 - "source": "block_entity" 17 - } 18 - ] 19 - } 20 - ], 21 - "conditions": [ 22 - { 23 - "condition": "minecraft:survives_explosion" 24 - } 25 - ] 26 - } 27 - ] 28 - }
···
-28
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/chromatic_wool.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:chromatic_wool", 10 - "functions": [ 11 - { 12 - "function": "minecraft:copy_components", 13 - "include": [ 14 - "infinity:color" 15 - ], 16 - "source": "block_entity" 17 - } 18 - ] 19 - } 20 - ], 21 - "conditions": [ 22 - { 23 - "condition": "minecraft:survives_explosion" 24 - } 25 - ] 26 - } 27 - ] 28 - }
···
-19
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/cosmic_altar.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:cosmic_altar" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/cursor.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:cursor" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/iridescent_carpet.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:iridescent_carpet" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-21
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/iridescent_kelp.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "conditions": [ 7 - { 8 - "condition": "minecraft:survives_explosion" 9 - } 10 - ], 11 - "entries": [ 12 - { 13 - "type": "minecraft:item", 14 - "name": "minecraft:kelp" 15 - } 16 - ], 17 - "rolls": 1.0 18 - } 19 - ], 20 - "random_sequence": "minecraft:blocks/kelp" 21 - }
···
-21
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/iridescent_kelp_plant.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "conditions": [ 7 - { 8 - "condition": "minecraft:survives_explosion" 9 - } 10 - ], 11 - "entries": [ 12 - { 13 - "type": "minecraft:item", 14 - "name": "minecraft:kelp" 15 - } 16 - ], 17 - "rolls": 1.0 18 - } 19 - ], 20 - "random_sequence": "minecraft:blocks/kelp" 21 - }
···
-19
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/iridescent_wool.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:iridescent_wool" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/netherite_slab.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:netherite_slab" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-19
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/netherite_stairs.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "rolls": 1, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "name": "infinity:netherite_stairs" 10 - } 11 - ], 12 - "conditions": [ 13 - { 14 - "condition": "minecraft:survives_explosion" 15 - } 16 - ] 17 - } 18 - ] 19 - }
···
-21
src/main/resources/resourcepacks/22/data/infinity/loot_table/blocks/notes_block.json
··· 1 - { 2 - "type": "minecraft:block", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "conditions": [ 7 - { 8 - "condition": "minecraft:survives_explosion" 9 - } 10 - ], 11 - "entries": [ 12 - { 13 - "type": "minecraft:item", 14 - "name": "infinity:notes_block" 15 - } 16 - ], 17 - "rolls": 1.0 18 - } 19 - ], 20 - "random_sequence": "minecraft:blocks/note_block" 21 - }
···
-17
src/main/resources/resourcepacks/22/data/infinity/loot_table/entities/ant.json
··· 1 - { 2 - "type": "minecraft:entity", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "rolls": 1, 7 - "entries": [ 8 - { 9 - "type": "minecraft:item", 10 - "name": "infinity:ant", 11 - "weight": 1, 12 - "functions": [] 13 - } 14 - ] 15 - } 16 - ] 17 - }
···
-17
src/main/resources/resourcepacks/22/data/infinity/loot_table/entities/bishop.json
··· 1 - { 2 - "type": "minecraft:entity", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "rolls": 1, 7 - "entries": [ 8 - { 9 - "type": "minecraft:item", 10 - "name": "infinity:star_of_lang", 11 - "weight": 1, 12 - "functions": [] 13 - } 14 - ] 15 - } 16 - ] 17 - }
···
-36
src/main/resources/resourcepacks/22/data/infinity/loot_table/entities/chaos_pawn_black.json
··· 1 - { 2 - "type": "minecraft:entity", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "functions": [ 10 - { 11 - "add": false, 12 - "count": { 13 - "type": "minecraft:uniform", 14 - "max": 2.0, 15 - "min": 0.0 16 - }, 17 - "function": "minecraft:set_count" 18 - }, 19 - { 20 - "count": { 21 - "type": "minecraft:uniform", 22 - "max": 1.0, 23 - "min": 0.0 24 - }, 25 - "enchantment": "minecraft:looting", 26 - "function": "minecraft:enchanted_count_increase" 27 - } 28 - ], 29 - "name": "minecraft:black_concrete", 30 - "weight": 1 31 - } 32 - ], 33 - "rolls": 1 34 - } 35 - ] 36 - }
···
-36
src/main/resources/resourcepacks/22/data/infinity/loot_table/entities/chaos_pawn_white.json
··· 1 - { 2 - "type": "minecraft:entity", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "functions": [ 10 - { 11 - "add": false, 12 - "count": { 13 - "type": "minecraft:uniform", 14 - "max": 2.0, 15 - "min": 0.0 16 - }, 17 - "function": "minecraft:set_count" 18 - }, 19 - { 20 - "count": { 21 - "type": "minecraft:uniform", 22 - "max": 1.0, 23 - "min": 0.0 24 - }, 25 - "enchantment": "minecraft:looting", 26 - "function": "minecraft:enchanted_count_increase" 27 - } 28 - ], 29 - "name": "minecraft:white_concrete", 30 - "weight": 1 31 - } 32 - ], 33 - "rolls": 1 34 - } 35 - ] 36 - }
···
-36
src/main/resources/resourcepacks/22/data/infinity/loot_table/entities/chaos_skeleton.json
··· 1 - { 2 - "type": "minecraft:entity", 3 - "pools": [ 4 - { 5 - "bonus_rolls": 0.0, 6 - "entries": [ 7 - { 8 - "type": "minecraft:item", 9 - "functions": [ 10 - { 11 - "add": false, 12 - "count": { 13 - "type": "minecraft:uniform", 14 - "max": 2.0, 15 - "min": 0.0 16 - }, 17 - "function": "minecraft:set_count" 18 - }, 19 - { 20 - "count": { 21 - "type": "minecraft:uniform", 22 - "max": 1.0, 23 - "min": 0.0 24 - }, 25 - "enchantment": "minecraft:looting", 26 - "function": "minecraft:enchanted_count_increase" 27 - } 28 - ], 29 - "name": "minecraft:bone" 30 - } 31 - ], 32 - "rolls": 1.0 33 - } 34 - ], 35 - "random_sequence": "minecraft:entities/skeleton" 36 - }
···
-17
src/main/resources/resourcepacks/22/data/infinity/recipe/altar.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "redstone", 4 - "key": { 5 - "B": "infinity:book_box", 6 - "S": "minecraft:stone_slab" 7 - }, 8 - "pattern": [ 9 - "SSS", 10 - " B ", 11 - " S " 12 - ], 13 - "result": { 14 - "id": "infinity:altar" 15 - }, 16 - "show_notification": true 17 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/altar_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": "minecraft:lectern", 4 - "output": { 5 - "id": "infinity:altar" 6 - }, 7 - "lore": "empty" 8 - }
···
-18
src/main/resources/resourcepacks/22/data/infinity/recipe/ant.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "B": "minecraft:black_concrete", 6 - "W": "minecraft:white_concrete", 7 - "M": "infinity:star_of_lang" 8 - }, 9 - "pattern": [ 10 - "WBW", 11 - "BMB", 12 - "WBW" 13 - ], 14 - "result": { 15 - "id": "infinity:ant" 16 - }, 17 - "show_notification": true 18 - }
···
-17
src/main/resources/resourcepacks/22/data/infinity/recipe/ant1.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "B": "infinity:black_matter", 6 - "W": "infinity:white_matter" 7 - }, 8 - "pattern": [ 9 - "WBW", 10 - "B B", 11 - "WBW" 12 - ], 13 - "result": { 14 - "id": "infinity:ant" 15 - }, 16 - "show_notification": true 17 - }
···
-4
src/main/resources/resourcepacks/22/data/infinity/recipe/biome_bottle_combining.json
··· 1 - { 2 - "type": "infinity:biome_bottle_combining", 3 - "category": "misc" 4 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/biome_bottle_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": "minecraft:glass_bottle", 4 - "output": { 5 - "id": "infinity:biome_bottle" 6 - }, 7 - "lore": "empty" 8 - }
···
-16
src/main/resources/resourcepacks/22/data/infinity/recipe/black_matter.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "B": "minecraft:black_concrete" 6 - }, 7 - "pattern": [ 8 - "BBB", 9 - "B B", 10 - "BBB" 11 - ], 12 - "result": { 13 - "id": "infinity:black_matter" 14 - }, 15 - "show_notification": true 16 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/book_box_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": "minecraft:bookshelf", 4 - "output": { 5 - "id": "infinity:book_box" 6 - }, 7 - "lore": "empty" 8 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/chromatic_carpet.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input":"#minecraft:wool_carpets", 4 - "output": { 5 - "id": "infinity:chromatic_carpet" 6 - }, 7 - "lore": "recipe_info.portal.infinity.color" 8 - }
···
-4
src/main/resources/resourcepacks/22/data/infinity/recipe/chromatic_carpet_from_wool.json
··· 1 - { 2 - "type": "infinity:chroma_carpet", 3 - "category": "misc" 4 - }
···
-7
src/main/resources/resourcepacks/22/data/infinity/recipe/chromatic_coloring_carpet.json
··· 1 - { 2 - "type": "infinity:chromatic_coloring", 3 - "input":"#minecraft:wool_carpets", 4 - "output": { 5 - "id": "infinity:chromatic_carpet" 6 - } 7 - }
···
-7
src/main/resources/resourcepacks/22/data/infinity/recipe/chromatic_coloring_wool.json
··· 1 - { 2 - "type": "infinity:chromatic_coloring", 3 - "input": "#minecraft:wool", 4 - "output": { 5 - "id": "infinity:chromatic_wool" 6 - } 7 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/chromatic_matter.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": "#infinity:matter", 4 - "output": { 5 - "id": "infinity:chromatic_matter" 6 - }, 7 - "lore": "recipe_info.portal.infinity.color" 8 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/chromatic_matter_from_iridescence.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": "infinity:chromatic_matter", 4 - "output": { 5 - "id": "infinity:chromatic_matter" 6 - }, 7 - "lore": "recipe_info.iridescence.infinity.chromatic_matter" 8 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/chromatic_wool.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": "#minecraft:wool", 4 - "output": { 5 - "id": "infinity:chromatic_wool" 6 - }, 7 - "lore": "recipe_info.portal.infinity.color" 8 - }
···
-19
src/main/resources/resourcepacks/22/data/infinity/recipe/cosmic_altar.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "L": "minecraft:lodestone", 6 - "A": "infinity:altar", 7 - "S": "infinity:iridescent_star" 8 - }, 9 - "pattern": [ 10 - "LAL", 11 - "ASA", 12 - "LAL" 13 - ], 14 - "result": { 15 - "count": 1, 16 - "id": "infinity:cosmic_altar" 17 - }, 18 - "show_notification": true 19 - }
···
-19
src/main/resources/resourcepacks/22/data/infinity/recipe/cursor.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "L": "minecraft:lime_concrete", 6 - "B": "minecraft:black_concrete", 7 - "S": "infinity:star_of_lang" 8 - }, 9 - "pattern": [ 10 - "BLB", 11 - "LSL", 12 - "BLB" 13 - ], 14 - "result": { 15 - "count": 8, 16 - "id": "infinity:cursor" 17 - }, 18 - "show_notification": true 19 - }
···
-18
src/main/resources/resourcepacks/22/data/infinity/recipe/f4.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "O": "minecraft:obsidian", 6 - "S": "infinity:iridescent_star" 7 - }, 8 - "pattern": [ 9 - "OOO", 10 - "OSO", 11 - "OOO" 12 - ], 13 - "result": { 14 - "count": 1, 15 - "id": "infinity:f4" 16 - }, 17 - "show_notification": true 18 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/f4_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": "infinity:f4", 4 - "output": { 5 - "id": "infinity:f4" 6 - }, 7 - "lore": "recipe_info.portal.infinity.attuned" 8 - }
···
-4
src/main/resources/resourcepacks/22/data/infinity/recipe/f4_recharging.json
··· 1 - { 2 - "type": "infinity:f4_recharging", 3 - "category": "misc" 4 - }
···
-17
src/main/resources/resourcepacks/22/data/infinity/recipe/fine_item.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "G": "minecraft:grass_block", 6 - "S": "infinity:star_of_lang" 7 - }, 8 - "pattern": [ 9 - "GGG", 10 - "GSG", 11 - "GGG" 12 - ], 13 - "result": { 14 - "id": "infinity:fine_item" 15 - }, 16 - "show_notification": true 17 - }
···
-17
src/main/resources/resourcepacks/22/data/infinity/recipe/footprint.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "P": "minecraft:light_gray_stained_glass_pane" 6 - }, 7 - "pattern": [ 8 - "PPP", 9 - "P P", 10 - "PPP" 11 - ], 12 - "result": { 13 - "count": 8, 14 - "id": "infinity:footprint" 15 - }, 16 - "show_notification": true 17 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/iridescence_bottle_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": "infinity:chromatic_potion", 4 - "output": { 5 - "id": "infinity:iridescent_potion" 6 - }, 7 - "lore": "empty" 8 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/iridescent_carpet.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": "infinity:chromatic_carpet", 4 - "output": { 5 - "id": "infinity:iridescent_carpet" 6 - }, 7 - "lore": "empty" 8 - }
···
-14
src/main/resources/resourcepacks/22/data/infinity/recipe/iridescent_carpet_from_wool.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "#": "infinity:iridescent_wool" 6 - }, 7 - "pattern": [ 8 - "## " 9 - ], 10 - "result": { 11 - "count": 3, 12 - "id": "infinity:iridescent_carpet" 13 - } 14 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/iridescent_star.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": "infinity:star_of_lang", 4 - "output": { 5 - "id": "infinity:iridescent_star" 6 - }, 7 - "lore": "empty" 8 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/iridescent_wool.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": "infinity:chromatic_wool", 4 - "output": { 5 - "id": "infinity:iridescent_wool" 6 - }, 7 - "lore": "empty" 8 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/key_from_iridescence.json
··· 1 - { 2 - "type": "infinity:collision_iridescence", 3 - "input": "infinity:key", 4 - "output": { 5 - "id": "infinity:key" 6 - }, 7 - "lore": "recipe_info.iridescence.infinity.key" 8 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/key_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": "minecraft:amethyst_shard", 4 - "output": { 5 - "id": "infinity:key" 6 - }, 7 - "lore": "recipe_info.portal.infinity.attuned" 8 - }
···
-14
src/main/resources/resourcepacks/22/data/infinity/recipe/netherite_slab.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "#": "minecraft:netherite_block" 6 - }, 7 - "pattern": [ 8 - "###" 9 - ], 10 - "result": { 11 - "count": 6, 12 - "id": "infinity:netherite_slab" 13 - } 14 - }
···
-7
src/main/resources/resourcepacks/22/data/infinity/recipe/netherite_slab_from_stonecutting.json
··· 1 - { 2 - "type": "minecraft:stonecutting", 3 - "ingredient": "minecraft:netherite_block", 4 - "result": { 5 - "count": 2, 6 - "id": "infinity:netherite_slab" 7 - }}
···
-16
src/main/resources/resourcepacks/22/data/infinity/recipe/netherite_stairs.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "building", 4 - "key": { 5 - "#": "minecraft:netherite_block" 6 - }, 7 - "pattern": [ 8 - "# ", 9 - "## ", 10 - "###" 11 - ], 12 - "result": { 13 - "count": 4, 14 - "id": "infinity:netherite_stairs" 15 - } 16 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/netherite_stairs_from_stonecutting.json
··· 1 - { 2 - "type": "minecraft:stonecutting", 3 - "ingredient": "minecraft:netherite_block", 4 - "result": { 5 - "count": 1, 6 - "id": "infinity:netherite_stairs" 7 - } 8 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/notes_block_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": "minecraft:note_block", 4 - "output": { 5 - "id": "infinity:notes_block" 6 - }, 7 - "lore": "empty" 8 - }
···
-8
src/main/resources/resourcepacks/22/data/infinity/recipe/timebomb_from_portal.json
··· 1 - { 2 - "type": "infinity:collision_portal", 3 - "input": "minecraft:tnt", 4 - "output": { 5 - "id": "infinity:timebomb" 6 - }, 7 - "lore": "empty" 8 - }
···
-16
src/main/resources/resourcepacks/22/data/infinity/recipe/white_matter.json
··· 1 - { 2 - "type": "minecraft:crafting_shaped", 3 - "category": "misc", 4 - "key": { 5 - "B": "minecraft:white_concrete" 6 - }, 7 - "pattern": [ 8 - "BBB", 9 - "B B", 10 - "BBB" 11 - ], 12 - "result": { 13 - "id": "infinity:white_matter" 14 - }, 15 - "show_notification": true 16 - }
···
src/main/resources/resourcepacks/22/data/infinity/structure/content.nbt

This is a binary file and will not be displayed.

src/main/resources/resourcepacks/22/data/infinity/structure/cosmic_pool/grass.nbt

This is a binary file and will not be displayed.

src/main/resources/resourcepacks/22/data/infinity/structure/cosmic_pool/scratch.nbt

This is a binary file and will not be displayed.

src/main/resources/resourcepacks/22/data/infinity/structure/cosmic_pool/scratch_wool.nbt

This is a binary file and will not be displayed.

src/main/resources/resourcepacks/22/data/infinity/structure/indevhouse.nbt

This is a binary file and will not be displayed.

src/main/resources/resourcepacks/22/data/infinity/structure/isolation.nbt

This is a binary file and will not be displayed.

src/main/resources/resourcepacks/22/data/infinity/structure/missing.nbt

This is a binary file and will not be displayed.

src/main/resources/resourcepacks/22/data/infinity/structure/terminal.nbt

This is a binary file and will not be displayed.

+32
src/main/resources/resourcepacks/22/data/infinity/worldgen/biome/notes.json
···
··· 1 + { 2 + "has_precipitation": false, 3 + "temperature": 0.8, 4 + "downfall": 0.4, 5 + "effects": { 6 + "sky_color": 7907327, 7 + "water_fog_color": 329011, 8 + "fog_color": 12638463, 9 + "water_color": 4159204 10 + }, 11 + "features": [ 12 + [], 13 + [], 14 + [], 15 + [], 16 + [], 17 + [ 18 + "infinity:jukebox", 19 + "infinity:madhouse" 20 + ], 21 + [], 22 + [], 23 + [], 24 + [ 25 + "infinity:notable_trees" 26 + ], 27 + [] 28 + ], 29 + "spawners": {}, 30 + "spawn_costs": {}, 31 + "carvers": [] 32 + }
-536
src/main/resources/resourcepacks/22/data/infinity/worldgen/configured_feature/all_trees.json
··· 1 - { 2 - "type": "minecraft:random_selector", 3 - "config": { 4 - "features": [ 5 - { 6 - "chance": 0.05263158, 7 - "feature": { 8 - "feature": "minecraft:azalea_tree", 9 - "placement": [ 10 - { 11 - "count": 1, 12 - "type": "minecraft:count_on_every_layer" 13 - }, 14 - { 15 - "type": "minecraft:surface_water_depth_filter", 16 - "max_water_depth": 8 17 - }, 18 - { 19 - "predicate": { 20 - "offset": [ 21 - 0, 22 - -1, 23 - 0 24 - ], 25 - "blocks": "minecraft:grass_block", 26 - "type": "minecraft:matching_blocks" 27 - }, 28 - "type": "minecraft:block_predicate_filter" 29 - } 30 - ] 31 - } 32 - }, 33 - { 34 - "chance": 0.055555556, 35 - "feature": { 36 - "feature": "minecraft:birch", 37 - "placement": [ 38 - { 39 - "count": 1, 40 - "type": "minecraft:count_on_every_layer" 41 - }, 42 - { 43 - "type": "minecraft:surface_water_depth_filter", 44 - "max_water_depth": 8 45 - }, 46 - { 47 - "predicate": { 48 - "offset": [ 49 - 0, 50 - -1, 51 - 0 52 - ], 53 - "blocks": "minecraft:grass_block", 54 - "type": "minecraft:matching_blocks" 55 - }, 56 - "type": "minecraft:block_predicate_filter" 57 - } 58 - ] 59 - } 60 - }, 61 - { 62 - "chance": 0.05882353, 63 - "feature": { 64 - "feature": "minecraft:birch_tall", 65 - "placement": [ 66 - { 67 - "count": 1, 68 - "type": "minecraft:count_on_every_layer" 69 - }, 70 - { 71 - "type": "minecraft:surface_water_depth_filter", 72 - "max_water_depth": 8 73 - }, 74 - { 75 - "predicate": { 76 - "offset": [ 77 - 0, 78 - -1, 79 - 0 80 - ], 81 - "blocks": "minecraft:grass_block", 82 - "type": "minecraft:matching_blocks" 83 - }, 84 - "type": "minecraft:block_predicate_filter" 85 - } 86 - ] 87 - } 88 - }, 89 - { 90 - "chance": 0.0625, 91 - "feature": { 92 - "feature": "minecraft:cherry", 93 - "placement": [ 94 - { 95 - "count": 1, 96 - "type": "minecraft:count_on_every_layer" 97 - }, 98 - { 99 - "type": "minecraft:surface_water_depth_filter", 100 - "max_water_depth": 8 101 - }, 102 - { 103 - "predicate": { 104 - "offset": [ 105 - 0, 106 - -1, 107 - 0 108 - ], 109 - "blocks": "minecraft:grass_block", 110 - "type": "minecraft:matching_blocks" 111 - }, 112 - "type": "minecraft:block_predicate_filter" 113 - } 114 - ] 115 - } 116 - }, 117 - { 118 - "chance": 0.06666667, 119 - "feature": { 120 - "feature": "minecraft:dark_oak", 121 - "placement": [ 122 - { 123 - "count": 1, 124 - "type": "minecraft:count_on_every_layer" 125 - }, 126 - { 127 - "type": "minecraft:surface_water_depth_filter", 128 - "max_water_depth": 8 129 - }, 130 - { 131 - "predicate": { 132 - "offset": [ 133 - 0, 134 - -1, 135 - 0 136 - ], 137 - "blocks": "minecraft:grass_block", 138 - "type": "minecraft:matching_blocks" 139 - }, 140 - "type": "minecraft:block_predicate_filter" 141 - } 142 - ] 143 - } 144 - }, 145 - { 146 - "chance": 0.071428575, 147 - "feature": { 148 - "feature": "minecraft:fancy_oak", 149 - "placement": [ 150 - { 151 - "count": 1, 152 - "type": "minecraft:count_on_every_layer" 153 - }, 154 - { 155 - "type": "minecraft:surface_water_depth_filter", 156 - "max_water_depth": 8 157 - }, 158 - { 159 - "predicate": { 160 - "offset": [ 161 - 0, 162 - -1, 163 - 0 164 - ], 165 - "blocks": "minecraft:grass_block", 166 - "type": "minecraft:matching_blocks" 167 - }, 168 - "type": "minecraft:block_predicate_filter" 169 - } 170 - ] 171 - } 172 - }, 173 - { 174 - "chance": 0.07692308, 175 - "feature": { 176 - "feature": "minecraft:jungle_tree", 177 - "placement": [ 178 - { 179 - "count": 1, 180 - "type": "minecraft:count_on_every_layer" 181 - }, 182 - { 183 - "type": "minecraft:surface_water_depth_filter", 184 - "max_water_depth": 8 185 - }, 186 - { 187 - "predicate": { 188 - "offset": [ 189 - 0, 190 - -1, 191 - 0 192 - ], 193 - "blocks": "minecraft:grass_block", 194 - "type": "minecraft:matching_blocks" 195 - }, 196 - "type": "minecraft:block_predicate_filter" 197 - } 198 - ] 199 - } 200 - }, 201 - { 202 - "chance": 0.083333336, 203 - "feature": { 204 - "feature": "minecraft:mangrove", 205 - "placement": [ 206 - { 207 - "count": 1, 208 - "type": "minecraft:count_on_every_layer" 209 - }, 210 - { 211 - "type": "minecraft:surface_water_depth_filter", 212 - "max_water_depth": 8 213 - }, 214 - { 215 - "predicate": { 216 - "offset": [ 217 - 0, 218 - -1, 219 - 0 220 - ], 221 - "blocks": "minecraft:grass_block", 222 - "type": "minecraft:matching_blocks" 223 - }, 224 - "type": "minecraft:block_predicate_filter" 225 - } 226 - ] 227 - } 228 - }, 229 - { 230 - "chance": 0.09090909, 231 - "feature": { 232 - "feature": "minecraft:mega_jungle_tree", 233 - "placement": [ 234 - { 235 - "count": 1, 236 - "type": "minecraft:count_on_every_layer" 237 - }, 238 - { 239 - "type": "minecraft:surface_water_depth_filter", 240 - "max_water_depth": 8 241 - }, 242 - { 243 - "predicate": { 244 - "offset": [ 245 - 0, 246 - -1, 247 - 0 248 - ], 249 - "blocks": "minecraft:grass_block", 250 - "type": "minecraft:matching_blocks" 251 - }, 252 - "type": "minecraft:block_predicate_filter" 253 - } 254 - ] 255 - } 256 - }, 257 - { 258 - "chance": 0.1, 259 - "feature": { 260 - "feature": "minecraft:mega_pine", 261 - "placement": [ 262 - { 263 - "count": 1, 264 - "type": "minecraft:count_on_every_layer" 265 - }, 266 - { 267 - "type": "minecraft:surface_water_depth_filter", 268 - "max_water_depth": 8 269 - }, 270 - { 271 - "predicate": { 272 - "offset": [ 273 - 0, 274 - -1, 275 - 0 276 - ], 277 - "blocks": "minecraft:grass_block", 278 - "type": "minecraft:matching_blocks" 279 - }, 280 - "type": "minecraft:block_predicate_filter" 281 - } 282 - ] 283 - } 284 - }, 285 - { 286 - "chance": 0.11111111, 287 - "feature": { 288 - "feature": "minecraft:mega_spruce", 289 - "placement": [ 290 - { 291 - "count": 1, 292 - "type": "minecraft:count_on_every_layer" 293 - }, 294 - { 295 - "type": "minecraft:surface_water_depth_filter", 296 - "max_water_depth": 8 297 - }, 298 - { 299 - "predicate": { 300 - "offset": [ 301 - 0, 302 - -1, 303 - 0 304 - ], 305 - "blocks": "minecraft:grass_block", 306 - "type": "minecraft:matching_blocks" 307 - }, 308 - "type": "minecraft:block_predicate_filter" 309 - } 310 - ] 311 - } 312 - }, 313 - { 314 - "chance": 0.125, 315 - "feature": { 316 - "feature": "minecraft:oak", 317 - "placement": [ 318 - { 319 - "count": 1, 320 - "type": "minecraft:count_on_every_layer" 321 - }, 322 - { 323 - "type": "minecraft:surface_water_depth_filter", 324 - "max_water_depth": 8 325 - }, 326 - { 327 - "predicate": { 328 - "offset": [ 329 - 0, 330 - -1, 331 - 0 332 - ], 333 - "blocks": "minecraft:grass_block", 334 - "type": "minecraft:matching_blocks" 335 - }, 336 - "type": "minecraft:block_predicate_filter" 337 - } 338 - ] 339 - } 340 - }, 341 - { 342 - "chance": 0.14285715, 343 - "feature": { 344 - "feature": "minecraft:pine", 345 - "placement": [ 346 - { 347 - "count": 1, 348 - "type": "minecraft:count_on_every_layer" 349 - }, 350 - { 351 - "type": "minecraft:surface_water_depth_filter", 352 - "max_water_depth": 8 353 - }, 354 - { 355 - "predicate": { 356 - "offset": [ 357 - 0, 358 - -1, 359 - 0 360 - ], 361 - "blocks": "minecraft:grass_block", 362 - "type": "minecraft:matching_blocks" 363 - }, 364 - "type": "minecraft:block_predicate_filter" 365 - } 366 - ] 367 - } 368 - }, 369 - { 370 - "chance": 0.16666667, 371 - "feature": { 372 - "feature": "minecraft:spruce", 373 - "placement": [ 374 - { 375 - "count": 1, 376 - "type": "minecraft:count_on_every_layer" 377 - }, 378 - { 379 - "type": "minecraft:surface_water_depth_filter", 380 - "max_water_depth": 8 381 - }, 382 - { 383 - "predicate": { 384 - "offset": [ 385 - 0, 386 - -1, 387 - 0 388 - ], 389 - "blocks": "minecraft:grass_block", 390 - "type": "minecraft:matching_blocks" 391 - }, 392 - "type": "minecraft:block_predicate_filter" 393 - } 394 - ] 395 - } 396 - }, 397 - { 398 - "chance": 0.2, 399 - "feature": { 400 - "feature": "minecraft:swamp_oak", 401 - "placement": [ 402 - { 403 - "count": 1, 404 - "type": "minecraft:count_on_every_layer" 405 - }, 406 - { 407 - "type": "minecraft:surface_water_depth_filter", 408 - "max_water_depth": 8 409 - }, 410 - { 411 - "predicate": { 412 - "offset": [ 413 - 0, 414 - -1, 415 - 0 416 - ], 417 - "blocks": "minecraft:grass_block", 418 - "type": "minecraft:matching_blocks" 419 - }, 420 - "type": "minecraft:block_predicate_filter" 421 - } 422 - ] 423 - } 424 - }, 425 - { 426 - "chance": 0.25, 427 - "feature": { 428 - "feature": "minecraft:tall_mangrove", 429 - "placement": [ 430 - { 431 - "count": 1, 432 - "type": "minecraft:count_on_every_layer" 433 - }, 434 - { 435 - "type": "minecraft:surface_water_depth_filter", 436 - "max_water_depth": 8 437 - }, 438 - { 439 - "predicate": { 440 - "offset": [ 441 - 0, 442 - -1, 443 - 0 444 - ], 445 - "blocks": "minecraft:grass_block", 446 - "type": "minecraft:matching_blocks" 447 - }, 448 - "type": "minecraft:block_predicate_filter" 449 - } 450 - ] 451 - } 452 - }, 453 - { 454 - "chance": 0.33333334, 455 - "feature": { 456 - "feature": "minecraft:huge_brown_mushroom", 457 - "placement": [ 458 - { 459 - "count": 1, 460 - "type": "minecraft:count_on_every_layer" 461 - }, 462 - { 463 - "type": "minecraft:surface_water_depth_filter", 464 - "max_water_depth": 8 465 - }, 466 - { 467 - "predicate": { 468 - "offset": [ 469 - 0, 470 - -1, 471 - 0 472 - ], 473 - "blocks": "minecraft:grass_block", 474 - "type": "minecraft:matching_blocks" 475 - }, 476 - "type": "minecraft:block_predicate_filter" 477 - } 478 - ] 479 - } 480 - }, 481 - { 482 - "chance": 0.5, 483 - "feature": { 484 - "feature": "minecraft:huge_red_mushroom", 485 - "placement": [ 486 - { 487 - "count": 1, 488 - "type": "minecraft:count_on_every_layer" 489 - }, 490 - { 491 - "type": "minecraft:surface_water_depth_filter", 492 - "max_water_depth": 8 493 - }, 494 - { 495 - "predicate": { 496 - "offset": [ 497 - 0, 498 - -1, 499 - 0 500 - ], 501 - "blocks": "minecraft:grass_block", 502 - "type": "minecraft:matching_blocks" 503 - }, 504 - "type": "minecraft:block_predicate_filter" 505 - } 506 - ] 507 - } 508 - } 509 - ], 510 - "default": { 511 - "feature": "minecraft:acacia", 512 - "placement": [ 513 - { 514 - "count": 1, 515 - "type": "minecraft:count_on_every_layer" 516 - }, 517 - { 518 - "type": "minecraft:surface_water_depth_filter", 519 - "max_water_depth": 8 520 - }, 521 - { 522 - "predicate": { 523 - "offset": [ 524 - 0, 525 - -1, 526 - 0 527 - ], 528 - "blocks": "minecraft:grass_block", 529 - "type": "minecraft:matching_blocks" 530 - }, 531 - "type": "minecraft:block_predicate_filter" 532 - } 533 - ] 534 - } 535 - } 536 - }
···
-90
src/main/resources/resourcepacks/22/data/infinity/worldgen/configured_feature/alphatree.json
··· 1 - { 2 - "type": "minecraft:tree", 3 - "config": { 4 - "decorators": [], 5 - "dirt_provider": { 6 - "type": "minecraft:simple_state_provider", 7 - "state": { 8 - "Name": "minecraft:dirt" 9 - } 10 - }, 11 - "foliage_placer": { 12 - "type": "minecraft:blob_foliage_placer", 13 - "height": 3, 14 - "offset": 0, 15 - "radius": 2 16 - }, 17 - "foliage_provider": { 18 - "type": "minecraft:weighted_state_provider", 19 - "entries": [ 20 - { 21 - "data": { 22 - "Name": "minecraft:jungle_leaves", 23 - "Properties": { 24 - "distance": "7", 25 - "persistent": "false", 26 - "waterlogged": "false" 27 - } 28 - }, 29 - "weight": 1 30 - }, 31 - { 32 - "data": { 33 - "Name": "minecraft:oak_leaves", 34 - "Properties": { 35 - "distance": "7", 36 - "persistent": "false", 37 - "waterlogged": "false" 38 - } 39 - }, 40 - "weight": 1 41 - }, 42 - { 43 - "data": { 44 - "Name": "minecraft:birch_leaves", 45 - "Properties": { 46 - "distance": "7", 47 - "persistent": "false", 48 - "waterlogged": "false" 49 - } 50 - }, 51 - "weight": 1 52 - }, 53 - { 54 - "data": { 55 - "Name": "minecraft:spruce_leaves", 56 - "Properties": { 57 - "distance": "7", 58 - "persistent": "false", 59 - "waterlogged": "false" 60 - } 61 - }, 62 - "weight": 1 63 - } 64 - ] 65 - }, 66 - "force_dirt": false, 67 - "ignore_vines": true, 68 - "minimum_size": { 69 - "type": "minecraft:two_layers_feature_size", 70 - "limit": 1, 71 - "lower_size": 0, 72 - "upper_size": 1 73 - }, 74 - "trunk_placer": { 75 - "type": "minecraft:straight_trunk_placer", 76 - "base_height": 4, 77 - "height_rand_a": 2, 78 - "height_rand_b": 0 79 - }, 80 - "trunk_provider": { 81 - "type": "minecraft:simple_state_provider", 82 - "state": { 83 - "Name": "minecraft:oak_log", 84 - "Properties": { 85 - "axis": "y" 86 - } 87 - } 88 - } 89 - } 90 - }
···
-11
src/main/resources/resourcepacks/22/data/infinity/worldgen/configured_feature/ant.json
··· 1 - { 2 - "type": "minecraft:simple_block", 3 - "config": { 4 - "to_place": { 5 - "type": "minecraft:simple_state_provider", 6 - "state": { 7 - "Name": "infinity:ant" 8 - } 9 - } 10 - } 11 - }
···
-12
src/main/resources/resourcepacks/22/data/infinity/worldgen/configured_feature/nexus_portals.json
··· 1 - { 2 - "type": "infinity:portal_setupper", 3 - "config": { 4 - "width": 3, 5 - "height": 4, 6 - "offset_l": 8, 7 - "offset_t": 16, 8 - "y": 50, 9 - "sign_offset_l": 2, 10 - "sign_offset_y": 5 11 - } 12 - }
···
-44
src/main/resources/resourcepacks/22/data/infinity/worldgen/configured_feature/tree_black.json
··· 1 - { 2 - "type": "minecraft:tree", 3 - "config": { 4 - "decorators": [], 5 - "dirt_provider": { 6 - "type": "minecraft:simple_state_provider", 7 - "state": { 8 - "Name": "minecraft:black_wool" 9 - } 10 - }, 11 - "foliage_placer": { 12 - "type": "minecraft:blob_foliage_placer", 13 - "height": 3, 14 - "offset": 0, 15 - "radius": 2 16 - }, 17 - "foliage_provider": { 18 - "type": "minecraft:simple_state_provider", 19 - "state": { 20 - "Name": "minecraft:black_wool" 21 - } 22 - }, 23 - "force_dirt": false, 24 - "ignore_vines": true, 25 - "minimum_size": { 26 - "type": "minecraft:two_layers_feature_size", 27 - "limit": 1, 28 - "lower_size": 0, 29 - "upper_size": 1 30 - }, 31 - "trunk_placer": { 32 - "type": "minecraft:straight_trunk_placer", 33 - "base_height": 4, 34 - "height_rand_a": 2, 35 - "height_rand_b": 0 36 - }, 37 - "trunk_provider": { 38 - "type": "minecraft:simple_state_provider", 39 - "state": { 40 - "Name": "minecraft:black_concrete" 41 - } 42 - } 43 - } 44 - }
···
-45
src/main/resources/resourcepacks/22/data/infinity/worldgen/configured_feature/tree_isolation.json
··· 1 - { 2 - "type": "minecraft:tree", 3 - "config": { 4 - "decorators": [], 5 - "dirt_provider": { 6 - "type": "minecraft:simple_state_provider", 7 - "state": { 8 - "Name": "minecraft:dirt" 9 - } 10 - }, 11 - "foliage_placer": { 12 - "type": "minecraft:random_spread_foliage_placer", 13 - "offset": 0, 14 - "radius": 3, 15 - "foliage_height": 3, 16 - "leaf_placement_attempts": 32 17 - }, 18 - "foliage_provider": { 19 - "type": "minecraft:simple_state_provider", 20 - "state": { 21 - "Name": "minecraft:mangrove_roots" 22 - } 23 - }, 24 - "force_dirt": false, 25 - "ignore_vines": true, 26 - "minimum_size": { 27 - "type": "minecraft:two_layers_feature_size", 28 - "limit": 1, 29 - "lower_size": 0, 30 - "upper_size": 1 31 - }, 32 - "trunk_placer": { 33 - "type": "minecraft:straight_trunk_placer", 34 - "base_height": 6, 35 - "height_rand_a": 2, 36 - "height_rand_b": 0 37 - }, 38 - "trunk_provider": { 39 - "type": "minecraft:simple_state_provider", 40 - "state": { 41 - "Name": "minecraft:oak_log" 42 - } 43 - } 44 - } 45 - }
···
-44
src/main/resources/resourcepacks/22/data/infinity/worldgen/configured_feature/tree_white.json
··· 1 - { 2 - "type": "minecraft:tree", 3 - "config": { 4 - "decorators": [], 5 - "dirt_provider": { 6 - "type": "minecraft:simple_state_provider", 7 - "state": { 8 - "Name": "minecraft:white_wool" 9 - } 10 - }, 11 - "foliage_placer": { 12 - "type": "minecraft:blob_foliage_placer", 13 - "height": 3, 14 - "offset": 0, 15 - "radius": 2 16 - }, 17 - "foliage_provider": { 18 - "type": "minecraft:simple_state_provider", 19 - "state": { 20 - "Name": "minecraft:white_wool" 21 - } 22 - }, 23 - "force_dirt": false, 24 - "ignore_vines": true, 25 - "minimum_size": { 26 - "type": "minecraft:two_layers_feature_size", 27 - "limit": 1, 28 - "lower_size": 0, 29 - "upper_size": 1 30 - }, 31 - "trunk_placer": { 32 - "type": "minecraft:straight_trunk_placer", 33 - "base_height": 4, 34 - "height_rand_a": 2, 35 - "height_rand_b": 0 36 - }, 37 - "trunk_provider": { 38 - "type": "minecraft:simple_state_provider", 39 - "state": { 40 - "Name": "minecraft:white_concrete" 41 - } 42 - } 43 - } 44 - }
···
-9
src/main/resources/resourcepacks/22/data/infinity/worldgen/density_function/temperature.json
··· 1 - { 2 - "type": "minecraft:shifted_noise", 3 - "noise": "infinity:temperature", 4 - "shift_x": "minecraft:shift_x", 5 - "shift_y": 0.0, 6 - "shift_z": "minecraft:shift_z", 7 - "xz_scale": 0.25, 8 - "y_scale": 0.0 9 - }
···
-9
src/main/resources/resourcepacks/22/data/infinity/worldgen/density_function/vegetation.json
··· 1 - { 2 - "type": "minecraft:shifted_noise", 3 - "noise": "minecraft:vegetation", 4 - "shift_x": "minecraft:shift_x", 5 - "shift_y": 0.0, 6 - "shift_z": "minecraft:shift_z", 7 - "xz_scale": 0.25, 8 - "y_scale": 0.0 9 - }
···
-6
src/main/resources/resourcepacks/22/data/infinity/worldgen/density_function/vein_gap.json
··· 1 - { 2 - "type": "minecraft:noise", 3 - "noise": "minecraft:ore_gap", 4 - "xz_scale": 1.0, 5 - "y_scale": 1.0 6 - }
···
-45
src/main/resources/resourcepacks/22/data/infinity/worldgen/density_function/vein_ridged.json
··· 1 - { 2 - "type": "minecraft:add", 3 - "argument1": -0.07999999821186066, 4 - "argument2": { 5 - "type": "minecraft:max", 6 - "argument1": { 7 - "type": "minecraft:abs", 8 - "argument": { 9 - "type": "minecraft:interpolated", 10 - "argument": { 11 - "type": "minecraft:range_choice", 12 - "input": "minecraft:y", 13 - "max_exclusive": 51.0, 14 - "min_inclusive": -60.0, 15 - "when_in_range": { 16 - "type": "minecraft:noise", 17 - "noise": "minecraft:ore_vein_a", 18 - "xz_scale": 4.0, 19 - "y_scale": 4.0 20 - }, 21 - "when_out_of_range": 0.0 22 - } 23 - } 24 - }, 25 - "argument2": { 26 - "type": "minecraft:abs", 27 - "argument": { 28 - "type": "minecraft:interpolated", 29 - "argument": { 30 - "type": "minecraft:range_choice", 31 - "input": "minecraft:y", 32 - "max_exclusive": 51.0, 33 - "min_inclusive": -60.0, 34 - "when_in_range": { 35 - "type": "minecraft:noise", 36 - "noise": "minecraft:ore_vein_b", 37 - "xz_scale": 4.0, 38 - "y_scale": 4.0 39 - }, 40 - "when_out_of_range": 0.0 41 - } 42 - } 43 - } 44 - } 45 - }
···
-16
src/main/resources/resourcepacks/22/data/infinity/worldgen/density_function/vein_toggle.json
··· 1 - { 2 - "type": "minecraft:interpolated", 3 - "argument": { 4 - "type": "minecraft:range_choice", 5 - "input": "minecraft:y", 6 - "max_exclusive": 51.0, 7 - "min_inclusive": -60.0, 8 - "when_in_range": { 9 - "type": "minecraft:noise", 10 - "noise": "minecraft:ore_veininess", 11 - "xz_scale": 1.5, 12 - "y_scale": 1.5 13 - }, 14 - "when_out_of_range": 0.0 15 - } 16 - }
···
-9
src/main/resources/resourcepacks/22/data/infinity/worldgen/noise/noise.json
··· 1 - { 2 - "amplitudes": [ 3 - 1.0, 4 - 1.0, 5 - 1.0, 6 - 0.0 7 - ], 8 - "firstOctave": -7 9 - }
···
-11
src/main/resources/resourcepacks/22/data/infinity/worldgen/noise/temperature.json
··· 1 - { 2 - "amplitudes": [ 3 - 1.5, 4 - 0.0, 5 - 1.0, 6 - 0.0, 7 - 0.0, 8 - 0.0 9 - ], 10 - "firstOctave": -7 11 - }
···
-35
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/all_trees.json
··· 1 - { 2 - "feature": "infinity:all_trees", 3 - "placement": [ 4 - { 5 - "count": { 6 - "type": "minecraft:weighted_list", 7 - "distribution": [ 8 - { 9 - "data": 6, 10 - "weight": 9 11 - }, 12 - { 13 - "data": 7, 14 - "weight": 1 15 - } 16 - ] 17 - }, 18 - "type": "minecraft:count" 19 - }, 20 - { 21 - "type": "minecraft:in_square" 22 - }, 23 - { 24 - "type": "minecraft:surface_water_depth_filter", 25 - "max_water_depth": 0 26 - }, 27 - { 28 - "heightmap": "OCEAN_FLOOR", 29 - "type": "minecraft:heightmap" 30 - }, 31 - { 32 - "type": "minecraft:biome" 33 - } 34 - ] 35 - }
···
-26
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/ant.json
··· 1 - { 2 - "feature": "infinity:ant", 3 - "placement": [ 4 - { 5 - "type": "minecraft:count", 6 - "count": 1 7 - }, 8 - { 9 - "type": "minecraft:random_offset", 10 - "xz_spread": 15, 11 - "y_spread": 0 12 - }, 13 - { 14 - "type": "minecraft:rarity_filter", 15 - "chance": 1 16 - }, 17 - { 18 - "type": "infinity:center_proximity", 19 - "radius": 9 20 - }, 21 - { 22 - "type": "minecraft:heightmap", 23 - "heightmap": "MOTION_BLOCKING" 24 - } 25 - ] 26 - }
···
-16
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/bonus_chest.json
··· 1 - { 2 - "feature": "minecraft:bonus_chest", 3 - "placement": [ 4 - { 5 - "type": "minecraft:count", 6 - "count": 3 7 - }, 8 - { 9 - "type": "minecraft:in_square" 10 - }, 11 - { 12 - "type": "minecraft:heightmap", 13 - "heightmap": "MOTION_BLOCKING" 14 - } 15 - ] 16 - }
···
-65
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/flowers_classic.json
··· 1 - { 2 - "feature": { 3 - "type": "minecraft:flower", 4 - "config": { 5 - "feature": { 6 - "feature": { 7 - "type": "minecraft:simple_block", 8 - "config": { 9 - "to_place": { 10 - "type": "minecraft:weighted_state_provider", 11 - "entries": [ 12 - { 13 - "data": { 14 - "Name": "minecraft:poppy" 15 - }, 16 - "weight": 1 17 - }, 18 - { 19 - "data": { 20 - "Name": "minecraft:dandelion" 21 - }, 22 - "weight": 2 23 - } 24 - ] 25 - } 26 - } 27 - }, 28 - "placement": [ 29 - { 30 - "type": "minecraft:block_predicate_filter", 31 - "predicate": { 32 - "type": "minecraft:matching_blocks", 33 - "blocks": "minecraft:air" 34 - } 35 - } 36 - ] 37 - }, 38 - "tries": 64, 39 - "xz_spread": 6, 40 - "y_spread": 2 41 - } 42 - }, 43 - "placement": [ 44 - { 45 - "type": "minecraft:noise_threshold_count", 46 - "above_noise": 4, 47 - "below_noise": 15, 48 - "noise_level": -0.8 49 - }, 50 - { 51 - "type": "minecraft:rarity_filter", 52 - "chance": 32 53 - }, 54 - { 55 - "type": "minecraft:in_square" 56 - }, 57 - { 58 - "type": "minecraft:heightmap", 59 - "heightmap": "MOTION_BLOCKING" 60 - }, 61 - { 62 - "type": "minecraft:biome" 63 - } 64 - ] 65 - }
···
-54
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/isolation_dead_bushes.json
··· 1 - { 2 - "feature": { 3 - "type": "minecraft:flower", 4 - "config": { 5 - "feature": { 6 - "feature": { 7 - "type": "minecraft:simple_block", 8 - "config": { 9 - "to_place": { 10 - "type": "minecraft:simple_state_provider", 11 - "state": { 12 - "Name": "minecraft:dead_bush" 13 - } 14 - } 15 - } 16 - }, 17 - "placement": [ 18 - { 19 - "type": "minecraft:block_predicate_filter", 20 - "predicate": { 21 - "type": "minecraft:matching_blocks", 22 - "blocks": "minecraft:air" 23 - } 24 - } 25 - ] 26 - }, 27 - "tries": 64, 28 - "xz_spread": 12, 29 - "y_spread": 2 30 - } 31 - }, 32 - "placement": [ 33 - { 34 - "type": "minecraft:noise_threshold_count", 35 - "above_noise": 4, 36 - "below_noise": 15, 37 - "noise_level": -0.8 38 - }, 39 - { 40 - "type": "minecraft:rarity_filter", 41 - "chance": 32 42 - }, 43 - { 44 - "type": "minecraft:in_square" 45 - }, 46 - { 47 - "type": "minecraft:heightmap", 48 - "heightmap": "MOTION_BLOCKING" 49 - }, 50 - { 51 - "type": "minecraft:biome" 52 - } 53 - ] 54 - }
···
-9
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/nexus_portals.json
··· 1 - { 2 - "feature": "infinity:nexus_portals", 3 - "placement": [ 4 - { 5 - "type": "minecraft:heightmap", 6 - "heightmap": "MOTION_BLOCKING" 7 - } 8 - ] 9 - }
···
-25
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/tree_black.json
··· 1 - { 2 - "feature": "infinity:tree_black", 3 - "placement": [ 4 - { 5 - "type": "count_on_every_layer", 6 - "count": 1 7 - }, 8 - { 9 - "type": "rarity_filter", 10 - "chance": 10 11 - }, 12 - { 13 - "type": "block_predicate_filter", 14 - "predicate": { 15 - "type": "matching_blocks", 16 - "offset": [ 17 - 0, 18 - -1, 19 - 0 20 - ], 21 - "blocks": "minecraft:black_wool" 22 - } 23 - } 24 - ] 25 - }
···
-25
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/tree_white.json
··· 1 - { 2 - "feature": "infinity:tree_white", 3 - "placement": [ 4 - { 5 - "type": "count_on_every_layer", 6 - "count": 1 7 - }, 8 - { 9 - "type": "rarity_filter", 10 - "chance": 10 11 - }, 12 - { 13 - "type": "block_predicate_filter", 14 - "predicate": { 15 - "type": "matching_blocks", 16 - "offset": [ 17 - 0, 18 - -1, 19 - 0 20 - ], 21 - "blocks": "minecraft:white_wool" 22 - } 23 - } 24 - ] 25 - }
···
-47
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/trees_classic.json
··· 1 - { 2 - "feature": "infinity:alphatree", 3 - "placement": [ 4 - { 5 - "type": "minecraft:count", 6 - "count": { 7 - "type": "minecraft:weighted_list", 8 - "distribution": [ 9 - { 10 - "data": 0, 11 - "weight": 19 12 - }, 13 - { 14 - "data": 1, 15 - "weight": 1 16 - } 17 - ] 18 - } 19 - }, 20 - { 21 - "type": "minecraft:in_square" 22 - }, 23 - { 24 - "type": "minecraft:surface_water_depth_filter", 25 - "max_water_depth": 0 26 - }, 27 - { 28 - "type": "minecraft:heightmap", 29 - "heightmap": "OCEAN_FLOOR" 30 - }, 31 - { 32 - "type": "minecraft:block_predicate_filter", 33 - "predicate": { 34 - "type": "minecraft:would_survive", 35 - "state": { 36 - "Name": "minecraft:oak_sapling", 37 - "Properties": { 38 - "stage": "0" 39 - } 40 - } 41 - } 42 - }, 43 - { 44 - "type": "minecraft:biome" 45 - } 46 - ] 47 - }
···
-363
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/trees_custom.json
··· 1 - { 2 - "feature": { 3 - "type": "minecraft:random_selector", 4 - "config": { 5 - "default": { 6 - "feature": "minecraft:oak", 7 - "placement": [] 8 - }, 9 - "features": [ 10 - { 11 - "chance": 0.1, 12 - "feature": { 13 - "feature": { 14 - "type": "minecraft:simple_random_selector", 15 - "config": { 16 - "features": [ 17 - { 18 - "feature": { 19 - "type": "minecraft:tree", 20 - "config": { 21 - "decorators": [], 22 - "dirt_provider": { 23 - "type": "minecraft:simple_state_provider", 24 - "state": { 25 - "Name": "minecraft:red_wool" 26 - } 27 - }, 28 - "foliage_provider": { 29 - "type": "minecraft:simple_state_provider", 30 - "state": { 31 - "Name": "minecraft:red_wool" 32 - } 33 - }, 34 - "trunk_provider": { 35 - "type": "minecraft:simple_state_provider", 36 - "state": { 37 - "Name": "minecraft:red_terracotta" 38 - } 39 - }, 40 - "foliage_placer": { 41 - "type": "minecraft:blob_foliage_placer", 42 - "height": 3, 43 - "offset": 0, 44 - "radius": 2 45 - }, 46 - "force_dirt": false, 47 - "ignore_vines": true, 48 - "minimum_size": { 49 - "type": "minecraft:two_layers_feature_size", 50 - "limit": 1, 51 - "lower_size": 0, 52 - "upper_size": 1 53 - }, 54 - "trunk_placer": { 55 - "type": "minecraft:straight_trunk_placer", 56 - "base_height": 4, 57 - "height_rand_a": 2, 58 - "height_rand_b": 0 59 - } 60 - } 61 - }, 62 - "placement": [] 63 - }, 64 - { 65 - "feature": { 66 - "type": "minecraft:tree", 67 - "config": { 68 - "decorators": [], 69 - "dirt_provider": { 70 - "type": "minecraft:simple_state_provider", 71 - "state": { 72 - "Name": "minecraft:orange_wool" 73 - } 74 - }, 75 - "foliage_provider": { 76 - "type": "minecraft:simple_state_provider", 77 - "state": { 78 - "Name": "minecraft:orange_wool" 79 - } 80 - }, 81 - "trunk_provider": { 82 - "type": "minecraft:simple_state_provider", 83 - "state": { 84 - "Name": "minecraft:orange_terracotta" 85 - } 86 - }, 87 - "foliage_placer": { 88 - "type": "minecraft:blob_foliage_placer", 89 - "height": 3, 90 - "offset": 0, 91 - "radius": 2 92 - }, 93 - "force_dirt": false, 94 - "ignore_vines": true, 95 - "minimum_size": { 96 - "type": "minecraft:two_layers_feature_size", 97 - "limit": 1, 98 - "lower_size": 0, 99 - "upper_size": 1 100 - }, 101 - "trunk_placer": { 102 - "type": "minecraft:straight_trunk_placer", 103 - "base_height": 4, 104 - "height_rand_a": 2, 105 - "height_rand_b": 0 106 - } 107 - } 108 - }, 109 - "placement": [] 110 - }, 111 - { 112 - "feature": { 113 - "type": "minecraft:tree", 114 - "config": { 115 - "decorators": [], 116 - "dirt_provider": { 117 - "type": "minecraft:simple_state_provider", 118 - "state": { 119 - "Name": "minecraft:yellow_wool" 120 - } 121 - }, 122 - "foliage_provider": { 123 - "type": "minecraft:simple_state_provider", 124 - "state": { 125 - "Name": "minecraft:yellow_wool" 126 - } 127 - }, 128 - "trunk_provider": { 129 - "type": "minecraft:simple_state_provider", 130 - "state": { 131 - "Name": "minecraft:yellow_terracotta" 132 - } 133 - }, 134 - "foliage_placer": { 135 - "type": "minecraft:blob_foliage_placer", 136 - "height": 3, 137 - "offset": 0, 138 - "radius": 2 139 - }, 140 - "force_dirt": false, 141 - "ignore_vines": true, 142 - "minimum_size": { 143 - "type": "minecraft:two_layers_feature_size", 144 - "limit": 1, 145 - "lower_size": 0, 146 - "upper_size": 1 147 - }, 148 - "trunk_placer": { 149 - "type": "minecraft:straight_trunk_placer", 150 - "base_height": 4, 151 - "height_rand_a": 2, 152 - "height_rand_b": 0 153 - } 154 - } 155 - }, 156 - "placement": [] 157 - }, 158 - { 159 - "feature": { 160 - "type": "minecraft:tree", 161 - "config": { 162 - "decorators": [], 163 - "dirt_provider": { 164 - "type": "minecraft:simple_state_provider", 165 - "state": { 166 - "Name": "minecraft:green_wool" 167 - } 168 - }, 169 - "foliage_provider": { 170 - "type": "minecraft:simple_state_provider", 171 - "state": { 172 - "Name": "minecraft:green_wool" 173 - } 174 - }, 175 - "trunk_provider": { 176 - "type": "minecraft:simple_state_provider", 177 - "state": { 178 - "Name": "minecraft:green_terracotta" 179 - } 180 - }, 181 - "foliage_placer": { 182 - "type": "minecraft:blob_foliage_placer", 183 - "height": 3, 184 - "offset": 0, 185 - "radius": 2 186 - }, 187 - "force_dirt": false, 188 - "ignore_vines": true, 189 - "minimum_size": { 190 - "type": "minecraft:two_layers_feature_size", 191 - "limit": 1, 192 - "lower_size": 0, 193 - "upper_size": 1 194 - }, 195 - "trunk_placer": { 196 - "type": "minecraft:straight_trunk_placer", 197 - "base_height": 4, 198 - "height_rand_a": 2, 199 - "height_rand_b": 0 200 - } 201 - } 202 - }, 203 - "placement": [] 204 - }, 205 - { 206 - "feature": { 207 - "type": "minecraft:tree", 208 - "config": { 209 - "decorators": [], 210 - "dirt_provider": { 211 - "type": "minecraft:simple_state_provider", 212 - "state": { 213 - "Name": "minecraft:blue_wool" 214 - } 215 - }, 216 - "foliage_provider": { 217 - "type": "minecraft:simple_state_provider", 218 - "state": { 219 - "Name": "minecraft:blue_wool" 220 - } 221 - }, 222 - "trunk_provider": { 223 - "type": "minecraft:simple_state_provider", 224 - "state": { 225 - "Name": "minecraft:blue_terracotta" 226 - } 227 - }, 228 - "foliage_placer": { 229 - "type": "minecraft:blob_foliage_placer", 230 - "height": 3, 231 - "offset": 0, 232 - "radius": 2 233 - }, 234 - "force_dirt": false, 235 - "ignore_vines": true, 236 - "minimum_size": { 237 - "type": "minecraft:two_layers_feature_size", 238 - "limit": 1, 239 - "lower_size": 0, 240 - "upper_size": 1 241 - }, 242 - "trunk_placer": { 243 - "type": "minecraft:straight_trunk_placer", 244 - "base_height": 4, 245 - "height_rand_a": 2, 246 - "height_rand_b": 0 247 - } 248 - } 249 - }, 250 - "placement": [] 251 - }, 252 - { 253 - "feature": { 254 - "type": "minecraft:tree", 255 - "config": { 256 - "decorators": [], 257 - "dirt_provider": { 258 - "type": "minecraft:simple_state_provider", 259 - "state": { 260 - "Name": "minecraft:purple_wool" 261 - } 262 - }, 263 - "foliage_provider": { 264 - "type": "minecraft:simple_state_provider", 265 - "state": { 266 - "Name": "minecraft:purple_wool" 267 - } 268 - }, 269 - "trunk_provider": { 270 - "type": "minecraft:simple_state_provider", 271 - "state": { 272 - "Name": "minecraft:purple_terracotta" 273 - } 274 - }, 275 - "foliage_placer": { 276 - "type": "minecraft:blob_foliage_placer", 277 - "height": 3, 278 - "offset": 0, 279 - "radius": 2 280 - }, 281 - "force_dirt": false, 282 - "ignore_vines": true, 283 - "minimum_size": { 284 - "type": "minecraft:two_layers_feature_size", 285 - "limit": 1, 286 - "lower_size": 0, 287 - "upper_size": 1 288 - }, 289 - "trunk_placer": { 290 - "type": "minecraft:straight_trunk_placer", 291 - "base_height": 4, 292 - "height_rand_a": 2, 293 - "height_rand_b": 0 294 - } 295 - } 296 - }, 297 - "placement": [] 298 - } 299 - ] 300 - } 301 - }, 302 - "placement": [] 303 - } 304 - }, 305 - { 306 - "chance": 0.5, 307 - "feature": { 308 - "feature": "minecraft:fancy_oak", 309 - "placement": [] 310 - } 311 - } 312 - ] 313 - } 314 - }, 315 - "placement": [ 316 - { 317 - "type": "minecraft:count", 318 - "count": { 319 - "type": "minecraft:weighted_list", 320 - "distribution": [ 321 - { 322 - "data": 0, 323 - "weight": 8 324 - }, 325 - { 326 - "data": 1, 327 - "weight": 3 328 - }, 329 - { 330 - "data": 2, 331 - "weight": 1 332 - } 333 - ] 334 - } 335 - }, 336 - { 337 - "type": "minecraft:in_square" 338 - }, 339 - { 340 - "type": "minecraft:surface_water_depth_filter", 341 - "max_water_depth": 0 342 - }, 343 - { 344 - "type": "minecraft:heightmap", 345 - "heightmap": "OCEAN_FLOOR" 346 - }, 347 - { 348 - "type": "minecraft:block_predicate_filter", 349 - "predicate": { 350 - "type": "minecraft:would_survive", 351 - "state": { 352 - "Name": "minecraft:oak_sapling", 353 - "Properties": { 354 - "stage": "0" 355 - } 356 - } 357 - } 358 - }, 359 - { 360 - "type": "minecraft:biome" 361 - } 362 - ] 363 - }
···
-47
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/trees_isolation.json
··· 1 - { 2 - "feature": "infinity:tree_isolation", 3 - "placement": [ 4 - { 5 - "type": "minecraft:count", 6 - "count": { 7 - "type": "minecraft:weighted_list", 8 - "distribution": [ 9 - { 10 - "data": 0, 11 - "weight": 39 12 - }, 13 - { 14 - "data": 1, 15 - "weight": 1 16 - } 17 - ] 18 - } 19 - }, 20 - { 21 - "type": "minecraft:in_square" 22 - }, 23 - { 24 - "type": "minecraft:surface_water_depth_filter", 25 - "max_water_depth": 0 26 - }, 27 - { 28 - "type": "minecraft:heightmap", 29 - "heightmap": "OCEAN_FLOOR" 30 - }, 31 - { 32 - "type": "minecraft:block_predicate_filter", 33 - "predicate": { 34 - "type": "minecraft:would_survive", 35 - "state": { 36 - "Name": "minecraft:oak_sapling", 37 - "Properties": { 38 - "stage": "0" 39 - } 40 - } 41 - } 42 - }, 43 - { 44 - "type": "minecraft:biome" 45 - } 46 - ] 47 - }
···
-71
src/main/resources/resourcepacks/22/data/infinity/worldgen/placed_feature/trees_pride.json
··· 1 - { 2 - "feature": { 3 - "type": "minecraft:random_selector", 4 - "config": { 5 - "default": { 6 - "feature": "minecraft:oak_bees_005", 7 - "placement": [] 8 - }, 9 - "features": [ 10 - { 11 - "chance": 0.3, 12 - "feature": { 13 - "feature": "minecraft:cherry_bees_005", 14 - "placement": [] 15 - } 16 - }, 17 - { 18 - "chance": 0.5, 19 - "feature": { 20 - "feature": "minecraft:fancy_oak_bees_005", 21 - "placement": [] 22 - } 23 - } 24 - ] 25 - } 26 - }, 27 - "placement": [ 28 - { 29 - "type": "minecraft:count", 30 - "count": { 31 - "type": "minecraft:weighted_list", 32 - "distribution": [ 33 - { 34 - "data": 0, 35 - "weight": 19 36 - }, 37 - { 38 - "data": 1, 39 - "weight": 1 40 - } 41 - ] 42 - } 43 - }, 44 - { 45 - "type": "minecraft:in_square" 46 - }, 47 - { 48 - "type": "minecraft:surface_water_depth_filter", 49 - "max_water_depth": 0 50 - }, 51 - { 52 - "type": "minecraft:heightmap", 53 - "heightmap": "OCEAN_FLOOR" 54 - }, 55 - { 56 - "type": "minecraft:block_predicate_filter", 57 - "predicate": { 58 - "type": "minecraft:would_survive", 59 - "state": { 60 - "Name": "minecraft:oak_sapling", 61 - "Properties": { 62 - "stage": "0" 63 - } 64 - } 65 - } 66 - }, 67 - { 68 - "type": "minecraft:biome" 69 - } 70 - ] 71 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure/content.json
··· 1 - { 2 - "type": "minecraft:jigsaw", 3 - "biomes": "infinity:content", 4 - "step": "surface_structures", 5 - "spawn_overrides": {}, 6 - "terrain_adaptation": "beard_thin", 7 - "start_pool": "infinity:content", 8 - "size": 1, 9 - "start_height": { 10 - "absolute": 60 11 - }, 12 - "project_start_to_heightmap": "WORLD_SURFACE_WG", 13 - "max_distance_from_center": 16, 14 - "use_expansion_hack": false 15 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure/cosmic_pool.json
··· 1 - { 2 - "type": "minecraft:jigsaw", 3 - "biomes": "infinity:custom", 4 - "step": "surface_structures", 5 - "spawn_overrides": {}, 6 - "terrain_adaptation": "beard_thin", 7 - "start_pool": "infinity:cosmic", 8 - "size": 1, 9 - "start_height": { 10 - "absolute": 0 11 - }, 12 - "project_start_to_heightmap": "MOTION_BLOCKING", 13 - "max_distance_from_center": 16, 14 - "use_expansion_hack": false 15 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure/indevhouse.json
··· 1 - { 2 - "type": "minecraft:jigsaw", 3 - "biomes": "infinity:classic", 4 - "step": "surface_structures", 5 - "spawn_overrides": {}, 6 - "terrain_adaptation": "beard_thin", 7 - "start_pool": "infinity:indevhouse", 8 - "size": 1, 9 - "start_height": { 10 - "absolute": 0 11 - }, 12 - "project_start_to_heightmap": "MOTION_BLOCKING", 13 - "max_distance_from_center": 16, 14 - "use_expansion_hack": false 15 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure/isolation.json
··· 1 - { 2 - "type": "minecraft:jigsaw", 3 - "biomes": "infinity:isolation", 4 - "step": "surface_structures", 5 - "spawn_overrides": {}, 6 - "terrain_adaptation": "none", 7 - "start_pool": "infinity:isolation", 8 - "size": 1, 9 - "start_height": { 10 - "absolute": -3 11 - }, 12 - "project_start_to_heightmap": "WORLD_SURFACE_WG", 13 - "max_distance_from_center": 80, 14 - "use_expansion_hack": false 15 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure/missing.json
··· 1 - { 2 - "type": "minecraft:jigsaw", 3 - "biomes": "infinity:missing", 4 - "step": "surface_structures", 5 - "spawn_overrides": {}, 6 - "terrain_adaptation": "beard_thin", 7 - "start_pool": "infinity:missing", 8 - "size": 1, 9 - "start_height": { 10 - "absolute": 2 11 - }, 12 - "project_start_to_heightmap": "WORLD_SURFACE_WG", 13 - "max_distance_from_center": 80, 14 - "use_expansion_hack": false 15 - }
···
-14
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure/pyramid.json
··· 1 - { 2 - "type": "infinity:pyramid", 3 - "biomes": "infinity:classic", 4 - "step": "surface_structures", 5 - "spawn_overrides": {}, 6 - "top_y": 127, 7 - "bottom_y": 50, 8 - "block": { 9 - "type": "simple_state_provider", 10 - "state": { 11 - "Name": "minecraft:bricks" 12 - } 13 - } 14 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure/terminal.json
··· 1 - { 2 - "type": "minecraft:jigsaw", 3 - "biomes": "infinity:terminal", 4 - "step": "surface_structures", 5 - "spawn_overrides": {}, 6 - "terrain_adaptation": "beard_thin", 7 - "start_pool": "infinity:terminal", 8 - "size": 1, 9 - "start_height": { 10 - "absolute": 2 11 - }, 12 - "project_start_to_heightmap": "WORLD_SURFACE_WG", 13 - "max_distance_from_center": 80, 14 - "use_expansion_hack": false 15 - }
···
-19
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure/text_test.json
··· 1 - { 2 - "type": "infinity:text", 3 - "biomes": "infinity:classic", 4 - "step": "surface_structures", 5 - "spawn_overrides": {}, 6 - "text": "We apologize for the inconvenience.", 7 - "block": { 8 - "type": "simple_state_provider", 9 - "state": { 10 - "Name": "minecraft:fire" 11 - } 12 - }, 13 - "y": { 14 - "type": "constant", 15 - "value": { 16 - "absolute": 80 17 - } 18 - } 19 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure_set/content.json
··· 1 - { 2 - "structures": [ 3 - { 4 - "structure": "infinity:content", 5 - "weight": 1 6 - } 7 - ], 8 - "placement": { 9 - "type": "minecraft:random_spread", 10 - "spacing": 4096, 11 - "separation": 4095, 12 - "spread_type": "triangular", 13 - "salt": 1646207470 14 - } 15 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure_set/cosmic_pool.json
··· 1 - { 2 - "structures": [ 3 - { 4 - "structure": "infinity:cosmic_pool", 5 - "weight": 1 6 - } 7 - ], 8 - "placement": { 9 - "type": "minecraft:random_spread", 10 - "spacing": 64, 11 - "separation": 32, 12 - "spread_type": "triangular", 13 - "salt": 1646207470 14 - } 15 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure_set/indevhouse.json
··· 1 - { 2 - "structures": [ 3 - { 4 - "structure": "infinity:indevhouse", 5 - "weight": 1 6 - } 7 - ], 8 - "placement": { 9 - "type": "minecraft:random_spread", 10 - "spacing": 4096, 11 - "separation": 4095, 12 - "spread_type": "triangular", 13 - "salt": 1646207470 14 - } 15 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure_set/isolation.json
··· 1 - { 2 - "structures": [ 3 - { 4 - "structure": "infinity:isolation", 5 - "weight": 1 6 - } 7 - ], 8 - "placement": { 9 - "type": "minecraft:random_spread", 10 - "spacing": 4096, 11 - "separation": 4095, 12 - "spread_type": "triangular", 13 - "salt": 1646207470 14 - } 15 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure_set/missing.json
··· 1 - { 2 - "structures": [ 3 - { 4 - "structure": "infinity:missing", 5 - "weight": 1 6 - } 7 - ], 8 - "placement": { 9 - "type": "minecraft:random_spread", 10 - "spacing": 4096, 11 - "separation": 4095, 12 - "spread_type": "triangular", 13 - "salt": 1646207470 14 - } 15 - }
···
-14
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure_set/pyramid.json
··· 1 - { 2 - "structures": [ 3 - { 4 - "structure": "infinity:pyramid", 5 - "weight": 1 6 - } 7 - ], 8 - "placement": { 9 - "type": "minecraft:random_spread", 10 - "spacing": 48, 11 - "separation": 32, 12 - "salt": 1646 13 - } 14 - }
···
-15
src/main/resources/resourcepacks/22/data/infinity/worldgen/structure_set/terminal.json
··· 1 - { 2 - "structures": [ 3 - { 4 - "structure": "infinity:terminal", 5 - "weight": 1 6 - } 7 - ], 8 - "placement": { 9 - "type": "minecraft:random_spread", 10 - "spacing": 4096, 11 - "separation": 4095, 12 - "spread_type": "triangular", 13 - "salt": 1646207470 14 - } 15 - }
···
-14
src/main/resources/resourcepacks/22/data/infinity/worldgen/template_pool/content.json
··· 1 - { 2 - "fallback": "minecraft:empty", 3 - "elements": [ 4 - { 5 - "weight": 1, 6 - "element": { 7 - "element_type": "minecraft:single_pool_element", 8 - "location": "infinity:content", 9 - "projection": "rigid", 10 - "processors": "minecraft:empty" 11 - } 12 - } 13 - ] 14 - }
···
-23
src/main/resources/resourcepacks/22/data/infinity/worldgen/template_pool/cosmic.json
··· 1 - { 2 - "fallback": "minecraft:empty", 3 - "elements": [ 4 - { 5 - "weight": 1, 6 - "element": { 7 - "element_type": "minecraft:single_pool_element", 8 - "location": "infinity:cosmic_pool/scratch", 9 - "projection": "rigid", 10 - "processors": "minecraft:empty" 11 - } 12 - }, 13 - { 14 - "weight": 1, 15 - "element": { 16 - "element_type": "minecraft:single_pool_element", 17 - "location": "infinity:cosmic_pool/scratch_wool", 18 - "projection": "rigid", 19 - "processors": "minecraft:empty" 20 - } 21 - } 22 - ] 23 - }
···
-14
src/main/resources/resourcepacks/22/data/infinity/worldgen/template_pool/indevhouse.json
··· 1 - { 2 - "fallback": "minecraft:empty", 3 - "elements": [ 4 - { 5 - "weight": 1, 6 - "element": { 7 - "element_type": "minecraft:single_pool_element", 8 - "location": "infinity:indevhouse", 9 - "projection": "rigid", 10 - "processors": "minecraft:empty" 11 - } 12 - } 13 - ] 14 - }
···
-14
src/main/resources/resourcepacks/22/data/infinity/worldgen/template_pool/isolation.json
··· 1 - { 2 - "fallback": "minecraft:empty", 3 - "elements": [ 4 - { 5 - "weight": 1, 6 - "element": { 7 - "element_type": "minecraft:single_pool_element", 8 - "location": "infinity:isolation", 9 - "projection": "rigid", 10 - "processors": "minecraft:empty" 11 - } 12 - } 13 - ] 14 - }
···
-14
src/main/resources/resourcepacks/22/data/infinity/worldgen/template_pool/missing.json
··· 1 - { 2 - "fallback": "minecraft:empty", 3 - "elements": [ 4 - { 5 - "weight": 1, 6 - "element": { 7 - "element_type": "minecraft:single_pool_element", 8 - "location": "infinity:missing", 9 - "projection": "rigid", 10 - "processors": "minecraft:empty" 11 - } 12 - } 13 - ] 14 - }
···
-14
src/main/resources/resourcepacks/22/data/infinity/worldgen/template_pool/pyramid.json
··· 1 - { 2 - "fallback": "minecraft:empty", 3 - "elements": [ 4 - { 5 - "weight": 1, 6 - "element": { 7 - "element_type": "minecraft:single_pool_element", 8 - "location": "infinity:pyramid", 9 - "projection": "rigid", 10 - "processors": "minecraft:empty" 11 - } 12 - } 13 - ] 14 - }
···
-14
src/main/resources/resourcepacks/22/data/infinity/worldgen/template_pool/terminal.json
··· 1 - { 2 - "fallback": "minecraft:empty", 3 - "elements": [ 4 - { 5 - "weight": 1, 6 - "element": { 7 - "element_type": "minecraft:single_pool_element", 8 - "location": "infinity:terminal", 9 - "projection": "rigid", 10 - "processors": "minecraft:empty" 11 - } 12 - } 13 - ] 14 - }
···
+11 -1
stonecutter.gradle.kts
··· 5 id("net.neoforged.moddev") version "2.0.134" apply false 6 id("dev.kikugie.postprocess.jsonlang") version "2.1-beta.4" apply false 7 id("me.modmuss50.mod-publish-plugin") version "0.8.+" apply false 8 } 9 10 - stonecutter active "1.21.8-neoforge" 11 12 stonecutter parameters { 13 constants.match(node.metadata.project.substringAfterLast('-'), "fabric", "forge", "neoforge") ··· 23 group = "publishing" 24 dependsOn(stonecutter.tasks.named("publishMods") { metadata.version == version }) 25 }
··· 5 id("net.neoforged.moddev") version "2.0.134" apply false 6 id("dev.kikugie.postprocess.jsonlang") version "2.1-beta.4" apply false 7 id("me.modmuss50.mod-publish-plugin") version "0.8.+" apply false 8 + id("org.moddedmc.wiki.toolkit") version "0.4.1" 9 } 10 11 + stonecutter active "1.21.8-fabric" 12 13 stonecutter parameters { 14 constants.match(node.metadata.project.substringAfterLast('-'), "fabric", "forge", "neoforge") ··· 24 group = "publishing" 25 dependsOn(stonecutter.tasks.named("publishMods") { metadata.version == version }) 26 } 27 + 28 + 29 + wiki { 30 + // The name of the object (examplemod) should match the registered wiki project ID (if it exists). 31 + docs.create("infinite-dimensions") { 32 + // The path to the folder containing the documentation metadata file (sinytra-wiki.json) 33 + root = file("docs") 34 + } 35 + }
+6
versions/1.20.1-fabric/src/main/generated/data/c/tags/items/buckets.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescence_bucket" 5 + ] 6 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/building_blocks/ant.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:star_of_lang" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:ant" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_star_of_lang", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:ant" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/building_blocks/ant1.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:ant1" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_matter": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": [ 15 + "infinity:white_matter" 16 + ] 17 + } 18 + ] 19 + }, 20 + "trigger": "minecraft:inventory_changed" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_white_matter", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:ant1" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/building_blocks/cursor.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:star_of_lang" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:cursor" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_star_of_lang", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:cursor" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/building_blocks/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_wool": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:iridescent_wool" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:iridescent_carpet_from_wool" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_iridescent_wool", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:iridescent_carpet_from_wool" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/building_blocks/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_slab": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:netherite_slab" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "minecraft:netherite_block_from_netherite_slab_stonecutting" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_netherite_slab", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "minecraft:netherite_block_from_netherite_slab_stonecutting" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/building_blocks/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_stairs": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:netherite_stairs" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "minecraft:netherite_block_from_netherite_stairs_stonecutting" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_netherite_stairs", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "minecraft:netherite_block_from_netherite_stairs_stonecutting" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/building_blocks/netherite_slab.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "minecraft:netherite_block" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:netherite_slab" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_netherite_block", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:netherite_slab" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/building_blocks/netherite_stairs.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "minecraft:netherite_block" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:netherite_stairs" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_netherite_block", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:netherite_stairs" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/misc/black_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_black_concrete": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "minecraft:black_concrete" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:black_matter" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_black_concrete", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:black_matter" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/misc/cosmic_altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:iridescent_star" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:cosmic_altar" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_iridescent_star", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:cosmic_altar" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/misc/f4.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:iridescent_star" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:f4" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_iridescent_star", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:f4" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/misc/fine_item.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:star_of_lang" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:fine_item" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_star_of_lang", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:fine_item" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/misc/footprint.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_light_gray_stained_glass_pane": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "minecraft:light_gray_stained_glass_pane" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:footprint" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_light_gray_stained_glass_pane", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:footprint" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/misc/white_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:white_matter" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_concrete": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": [ 15 + "minecraft:white_concrete" 16 + ] 17 + } 18 + ] 19 + }, 20 + "trigger": "minecraft:inventory_changed" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_white_concrete", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:white_matter" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-fabric/src/main/generated/data/infinity/advancements/recipes/redstone/altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_book_box": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:book_box" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:altar" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_book_box", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:altar" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+20
versions/1.20.1-fabric/src/main/generated/data/infinity/loot_tables/blocks/ant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:ant" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-fabric/src/main/generated/data/infinity/loot_tables/blocks/book_box.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:book_box" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-fabric/src/main/generated/data/infinity/loot_tables/blocks/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cosmic_altar" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-fabric/src/main/generated/data/infinity/loot_tables/blocks/cursor.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cursor" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-fabric/src/main/generated/data/infinity/loot_tables/blocks/iridescent_carpet.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_carpet" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-fabric/src/main/generated/data/infinity/loot_tables/blocks/iridescent_kelp.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-fabric/src/main/generated/data/infinity/loot_tables/blocks/iridescent_kelp_plant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-fabric/src/main/generated/data/infinity/loot_tables/blocks/iridescent_wool.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_wool" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-fabric/src/main/generated/data/infinity/loot_tables/blocks/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:netherite_stairs" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+21
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "redstone", 4 + "key": { 5 + "B": { 6 + "item": "infinity:book_box" 7 + }, 8 + "S": { 9 + "item": "minecraft:stone_slab" 10 + } 11 + }, 12 + "pattern": [ 13 + "SSS", 14 + " B ", 15 + " S " 16 + ], 17 + "result": { 18 + "item": "infinity:altar" 19 + }, 20 + "show_notification": true 21 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/altar_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:lectern" 5 + }, 6 + "output": { 7 + "item": "infinity:altar" 8 + } 9 + }
+24
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/ant.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + }, 8 + "M": { 9 + "item": "infinity:star_of_lang" 10 + }, 11 + "W": { 12 + "item": "minecraft:white_concrete" 13 + } 14 + }, 15 + "pattern": [ 16 + "WBW", 17 + "BMB", 18 + "WBW" 19 + ], 20 + "result": { 21 + "item": "infinity:ant" 22 + }, 23 + "show_notification": true 24 + }
+21
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/ant1.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "infinity:black_matter" 7 + }, 8 + "W": { 9 + "item": "infinity:white_matter" 10 + } 11 + }, 12 + "pattern": [ 13 + "WBW", 14 + "B B", 15 + "WBW" 16 + ], 17 + "result": { 18 + "item": "infinity:ant" 19 + }, 20 + "show_notification": true 21 + }
+4
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/biome_bottle_combining.json
···
··· 1 + { 2 + "type": "infinity:biome_bottle_combining", 3 + "category": "misc" 4 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/biome_bottle_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:glass_bottle" 5 + }, 6 + "output": { 7 + "item": "infinity:biome_bottle" 8 + } 9 + }
+18
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/black_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + } 8 + }, 9 + "pattern": [ 10 + "BBB", 11 + "B B", 12 + "BBB" 13 + ], 14 + "result": { 15 + "item": "infinity:black_matter" 16 + }, 17 + "show_notification": true 18 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/book_box_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:bookshelf" 5 + }, 6 + "output": { 7 + "item": "infinity:book_box" 8 + } 9 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/chromatic_carpet.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": { 4 + "tag": "minecraft:wool_carpets" 5 + }, 6 + "output": { 7 + "item": "infinity:chromatic_carpet" 8 + } 9 + }
+10
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/chromatic_carpet_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "minecraft:wool_carpets" 5 + }, 6 + "lore": "recipe_info.portal.infinity.color", 7 + "output": { 8 + "item": "infinity:chromatic_carpet" 9 + } 10 + }
+4
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/chromatic_carpet_from_wool.json
···
··· 1 + { 2 + "type": "infinity:chroma_carpet", 3 + "category": "misc" 4 + }
+10
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/chromatic_matter_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_matter" 5 + }, 6 + "lore": "recipe_info.iridescence.infinity.chromatic_matter", 7 + "output": { 8 + "item": "infinity:chromatic_matter" 9 + } 10 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/chromatic_matter_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "infinity:matter" 5 + }, 6 + "output": { 7 + "item": "infinity:chromatic_matter" 8 + } 9 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/chromatic_wool.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": { 4 + "tag": "minecraft:wool" 5 + }, 6 + "output": { 7 + "item": "infinity:chromatic_wool" 8 + } 9 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/chromatic_wool_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "minecraft:wool" 5 + }, 6 + "output": { 7 + "item": "infinity:chromatic_wool" 8 + } 9 + }
+24
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "A": { 6 + "item": "infinity:altar" 7 + }, 8 + "L": { 9 + "item": "minecraft:lodestone" 10 + }, 11 + "S": { 12 + "item": "infinity:iridescent_star" 13 + } 14 + }, 15 + "pattern": [ 16 + "LAL", 17 + "ASA", 18 + "LAL" 19 + ], 20 + "result": { 21 + "item": "infinity:cosmic_altar" 22 + }, 23 + "show_notification": true 24 + }
+25
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/cursor.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + }, 8 + "L": { 9 + "item": "minecraft:lime_concrete" 10 + }, 11 + "S": { 12 + "item": "infinity:star_of_lang" 13 + } 14 + }, 15 + "pattern": [ 16 + "BLB", 17 + "LSL", 18 + "BLB" 19 + ], 20 + "result": { 21 + "count": 8, 22 + "item": "infinity:cursor" 23 + }, 24 + "show_notification": true 25 + }
+21
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/f4.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "O": { 6 + "item": "minecraft:obsidian" 7 + }, 8 + "S": { 9 + "item": "infinity:iridescent_star" 10 + } 11 + }, 12 + "pattern": [ 13 + "OOO", 14 + "OSO", 15 + "OOO" 16 + ], 17 + "result": { 18 + "item": "infinity:f4" 19 + }, 20 + "show_notification": true 21 + }
+10
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/f4_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "infinity:f4" 5 + }, 6 + "lore": "recipe_info.portal.infinity.attuned", 7 + "output": { 8 + "item": "infinity:f4" 9 + } 10 + }
+4
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/f4_recharging.json
···
··· 1 + { 2 + "type": "infinity:f4_recharging", 3 + "category": "misc" 4 + }
+21
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/fine_item.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "G": { 6 + "item": "minecraft:grass_block" 7 + }, 8 + "S": { 9 + "item": "infinity:star_of_lang" 10 + } 11 + }, 12 + "pattern": [ 13 + "GGG", 14 + "GSG", 15 + "GGG" 16 + ], 17 + "result": { 18 + "item": "infinity:fine_item" 19 + }, 20 + "show_notification": true 21 + }
+19
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/footprint.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "P": { 6 + "item": "minecraft:light_gray_stained_glass_pane" 7 + } 8 + }, 9 + "pattern": [ 10 + "PPP", 11 + "P P", 12 + "PPP" 13 + ], 14 + "result": { 15 + "count": 8, 16 + "item": "infinity:footprint" 17 + }, 18 + "show_notification": true 19 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/iridescent_carpet_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_carpet" 5 + }, 6 + "output": { 7 + "item": "infinity:iridescent_carpet" 8 + } 9 + }
+17
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "infinity:iridescent_wool" 7 + } 8 + }, 9 + "pattern": [ 10 + "BB" 11 + ], 12 + "result": { 13 + "count": 3, 14 + "item": "infinity:iridescent_carpet" 15 + }, 16 + "show_notification": true 17 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/iridescent_potion_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "infinity:chromatic_potion" 5 + }, 6 + "output": { 7 + "item": "infinity:iridescent_potion" 8 + } 9 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/iridescent_star_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:star_of_lang" 5 + }, 6 + "output": { 7 + "item": "infinity:iridescent_star" 8 + } 9 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/iridescent_wool_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_wool" 5 + }, 6 + "output": { 7 + "item": "infinity:iridescent_wool" 8 + } 9 + }
+10
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/key_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:key" 5 + }, 6 + "lore": "recipe_info.iridescence.infinity.key", 7 + "output": { 8 + "item": "infinity:key" 9 + } 10 + }
+10
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/key_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:amethyst_shard" 5 + }, 6 + "lore": "recipe_info.portal.infinity.attuned", 7 + "output": { 8 + "item": "infinity:key" 9 + } 10 + }
+8
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "count": 2, 4 + "ingredient": { 5 + "item": "infinity:netherite_slab" 6 + }, 7 + "result": "minecraft:netherite_block" 8 + }
+8
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "count": 1, 4 + "ingredient": { 5 + "item": "infinity:netherite_stairs" 6 + }, 7 + "result": "minecraft:netherite_block" 8 + }
+17
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/netherite_slab.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": { 6 + "item": "minecraft:netherite_block" 7 + } 8 + }, 9 + "pattern": [ 10 + "###" 11 + ], 12 + "result": { 13 + "count": 6, 14 + "item": "infinity:netherite_slab" 15 + }, 16 + "show_notification": true 17 + }
+19
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": { 6 + "item": "minecraft:netherite_block" 7 + } 8 + }, 9 + "pattern": [ 10 + "# ", 11 + "## ", 12 + "###" 13 + ], 14 + "result": { 15 + "count": 4, 16 + "item": "infinity:netherite_stairs" 17 + }, 18 + "show_notification": true 19 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/timebomb_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:tnt" 5 + }, 6 + "output": { 7 + "item": "infinity:timebomb" 8 + } 9 + }
+18
versions/1.20.1-fabric/src/main/generated/data/infinity/recipes/white_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:white_concrete" 7 + } 8 + }, 9 + "pattern": [ 10 + "BBB", 11 + "B B", 12 + "BBB" 13 + ], 14 + "result": { 15 + "item": "infinity:white_matter" 16 + }, 17 + "show_notification": true 18 + }
+9
versions/1.20.1-fabric/src/main/generated/data/infinity/tags/blocks/iridescent.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_wool", 5 + "infinity:iridescent_carpet", 6 + "infinity:iridescence", 7 + "infinity:cosmic_altar" 8 + ] 9 + }
+12
versions/1.20.1-fabric/src/main/generated/data/infinity/tags/items/iridescent.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_wool", 5 + "infinity:iridescent_carpet", 6 + "infinity:iridescence_bucket", 7 + "infinity:iridescent_star", 8 + "infinity:iridescent_potion", 9 + "infinity:chromatic_potion", 10 + "infinity:cosmic_altar" 11 + ] 12 + }
+8
versions/1.20.1-fabric/src/main/generated/data/infinity/tags/items/matter.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:black_matter", 5 + "infinity:chromatic_matter", 6 + "infinity:white_matter" 7 + ] 8 + }
+6
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/blocks/mineable/axe.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:book_box" 5 + ] 6 + }
+12
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/blocks/mineable/pickaxe.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:altar", 5 + "infinity:cursor", 6 + "infinity:netherite_slab", 7 + "infinity:netherite_stairs", 8 + "infinity:biome_bottle", 9 + "infinity:ant", 10 + "infinity:cosmic_altar" 11 + ] 12 + }
+6
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/blocks/portals.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:neither_portal" 5 + ] 6 + }
+6
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/blocks/slabs.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:netherite_slab" 5 + ] 6 + }
+6
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/blocks/stairs.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:netherite_stairs" 5 + ] 6 + }
+7
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/blocks/wool.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_wool", 5 + "infinity:chromatic_wool" 6 + ] 7 + }
+7
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/blocks/wool_carpets.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_carpet", 5 + "infinity:chromatic_carpet" 6 + ] 7 + }
+6
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/entity_types/frog_food.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:chaos_slime" 5 + ] 6 + }
+6
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/entity_types/skeletons.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:chaos_skeleton" 5 + ] 6 + }
+7
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/fluids/water.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:flowing_iridescence", 5 + "infinity:iridescence" 6 + ] 7 + }
+6
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/items/music_discs.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:disc" 5 + ] 6 + }
+7
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/items/wool.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_wool", 5 + "infinity:chromatic_wool" 6 + ] 7 + }
+7
versions/1.20.1-fabric/src/main/generated/data/minecraft/tags/items/wool_carpets.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_carpet", 5 + "infinity:chromatic_carpet" 6 + ] 7 + }
+6
versions/1.20.1-forge/src/main/generated/data/c/tags/items/buckets.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescence_bucket" 5 + ] 6 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/building_blocks/ant.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:star_of_lang" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:ant" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_star_of_lang", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:ant" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/building_blocks/ant1.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:ant1" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_matter": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": [ 15 + "infinity:white_matter" 16 + ] 17 + } 18 + ] 19 + }, 20 + "trigger": "minecraft:inventory_changed" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_white_matter", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:ant1" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/building_blocks/cursor.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:star_of_lang" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:cursor" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_star_of_lang", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:cursor" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/building_blocks/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_wool": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:iridescent_wool" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:iridescent_carpet_from_wool" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_iridescent_wool", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:iridescent_carpet_from_wool" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/building_blocks/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_slab": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:netherite_slab" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "minecraft:netherite_block_from_netherite_slab_stonecutting" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_netherite_slab", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "minecraft:netherite_block_from_netherite_slab_stonecutting" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/building_blocks/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_stairs": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:netherite_stairs" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "minecraft:netherite_block_from_netherite_stairs_stonecutting" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_netherite_stairs", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "minecraft:netherite_block_from_netherite_stairs_stonecutting" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/building_blocks/netherite_slab.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "minecraft:netherite_block" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:netherite_slab" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_netherite_block", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:netherite_slab" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/building_blocks/netherite_stairs.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "minecraft:netherite_block" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:netherite_stairs" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_netherite_block", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:netherite_stairs" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/misc/black_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_black_concrete": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "minecraft:black_concrete" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:black_matter" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_black_concrete", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:black_matter" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/misc/cosmic_altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:iridescent_star" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:cosmic_altar" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_iridescent_star", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:cosmic_altar" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/misc/f4.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:iridescent_star" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:f4" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_iridescent_star", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:f4" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/misc/fine_item.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:star_of_lang" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:fine_item" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_star_of_lang", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:fine_item" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/misc/footprint.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_light_gray_stained_glass_pane": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "minecraft:light_gray_stained_glass_pane" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:footprint" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_light_gray_stained_glass_pane", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:footprint" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/misc/white_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:white_matter" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_concrete": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": [ 15 + "minecraft:white_concrete" 16 + ] 17 + } 18 + ] 19 + }, 20 + "trigger": "minecraft:inventory_changed" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_white_concrete", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:white_matter" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+35
versions/1.20.1-forge/src/main/generated/data/infinity/advancements/recipes/redstone/altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_book_box": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": [ 9 + "infinity:book_box" 10 + ] 11 + } 12 + ] 13 + }, 14 + "trigger": "minecraft:inventory_changed" 15 + }, 16 + "has_the_recipe": { 17 + "conditions": { 18 + "recipe": "infinity:altar" 19 + }, 20 + "trigger": "minecraft:recipe_unlocked" 21 + } 22 + }, 23 + "requirements": [ 24 + [ 25 + "has_book_box", 26 + "has_the_recipe" 27 + ] 28 + ], 29 + "rewards": { 30 + "recipes": [ 31 + "infinity:altar" 32 + ] 33 + }, 34 + "sends_telemetry_event": false 35 + }
+20
versions/1.20.1-forge/src/main/generated/data/infinity/loot_tables/blocks/ant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:ant" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-forge/src/main/generated/data/infinity/loot_tables/blocks/book_box.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:book_box" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-forge/src/main/generated/data/infinity/loot_tables/blocks/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cosmic_altar" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-forge/src/main/generated/data/infinity/loot_tables/blocks/cursor.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cursor" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-forge/src/main/generated/data/infinity/loot_tables/blocks/iridescent_carpet.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_carpet" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-forge/src/main/generated/data/infinity/loot_tables/blocks/iridescent_kelp.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-forge/src/main/generated/data/infinity/loot_tables/blocks/iridescent_kelp_plant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-forge/src/main/generated/data/infinity/loot_tables/blocks/iridescent_wool.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_wool" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.20.1-forge/src/main/generated/data/infinity/loot_tables/blocks/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:netherite_stairs" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+21
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "redstone", 4 + "key": { 5 + "B": { 6 + "item": "infinity:book_box" 7 + }, 8 + "S": { 9 + "item": "minecraft:stone_slab" 10 + } 11 + }, 12 + "pattern": [ 13 + "SSS", 14 + " B ", 15 + " S " 16 + ], 17 + "result": { 18 + "item": "infinity:altar" 19 + }, 20 + "show_notification": true 21 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/altar_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:lectern" 5 + }, 6 + "output": { 7 + "item": "infinity:altar" 8 + } 9 + }
+24
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/ant.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + }, 8 + "M": { 9 + "item": "infinity:star_of_lang" 10 + }, 11 + "W": { 12 + "item": "minecraft:white_concrete" 13 + } 14 + }, 15 + "pattern": [ 16 + "WBW", 17 + "BMB", 18 + "WBW" 19 + ], 20 + "result": { 21 + "item": "infinity:ant" 22 + }, 23 + "show_notification": true 24 + }
+21
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/ant1.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "infinity:black_matter" 7 + }, 8 + "W": { 9 + "item": "infinity:white_matter" 10 + } 11 + }, 12 + "pattern": [ 13 + "WBW", 14 + "B B", 15 + "WBW" 16 + ], 17 + "result": { 18 + "item": "infinity:ant" 19 + }, 20 + "show_notification": true 21 + }
+4
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/biome_bottle_combining.json
···
··· 1 + { 2 + "type": "infinity:biome_bottle_combining", 3 + "category": "misc" 4 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/biome_bottle_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:glass_bottle" 5 + }, 6 + "output": { 7 + "item": "infinity:biome_bottle" 8 + } 9 + }
+18
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/black_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + } 8 + }, 9 + "pattern": [ 10 + "BBB", 11 + "B B", 12 + "BBB" 13 + ], 14 + "result": { 15 + "item": "infinity:black_matter" 16 + }, 17 + "show_notification": true 18 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/book_box_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:bookshelf" 5 + }, 6 + "output": { 7 + "item": "infinity:book_box" 8 + } 9 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/chromatic_carpet.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": { 4 + "tag": "minecraft:wool_carpets" 5 + }, 6 + "output": { 7 + "item": "infinity:chromatic_carpet" 8 + } 9 + }
+10
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/chromatic_carpet_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "minecraft:wool_carpets" 5 + }, 6 + "lore": "recipe_info.portal.infinity.color", 7 + "output": { 8 + "item": "infinity:chromatic_carpet" 9 + } 10 + }
+4
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/chromatic_carpet_from_wool.json
···
··· 1 + { 2 + "type": "infinity:chroma_carpet", 3 + "category": "misc" 4 + }
+10
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/chromatic_matter_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_matter" 5 + }, 6 + "lore": "recipe_info.iridescence.infinity.chromatic_matter", 7 + "output": { 8 + "item": "infinity:chromatic_matter" 9 + } 10 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/chromatic_matter_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "infinity:matter" 5 + }, 6 + "output": { 7 + "item": "infinity:chromatic_matter" 8 + } 9 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/chromatic_wool.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": { 4 + "tag": "minecraft:wool" 5 + }, 6 + "output": { 7 + "item": "infinity:chromatic_wool" 8 + } 9 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/chromatic_wool_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "minecraft:wool" 5 + }, 6 + "output": { 7 + "item": "infinity:chromatic_wool" 8 + } 9 + }
+24
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "A": { 6 + "item": "infinity:altar" 7 + }, 8 + "L": { 9 + "item": "minecraft:lodestone" 10 + }, 11 + "S": { 12 + "item": "infinity:iridescent_star" 13 + } 14 + }, 15 + "pattern": [ 16 + "LAL", 17 + "ASA", 18 + "LAL" 19 + ], 20 + "result": { 21 + "item": "infinity:cosmic_altar" 22 + }, 23 + "show_notification": true 24 + }
+25
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/cursor.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + }, 8 + "L": { 9 + "item": "minecraft:lime_concrete" 10 + }, 11 + "S": { 12 + "item": "infinity:star_of_lang" 13 + } 14 + }, 15 + "pattern": [ 16 + "BLB", 17 + "LSL", 18 + "BLB" 19 + ], 20 + "result": { 21 + "count": 8, 22 + "item": "infinity:cursor" 23 + }, 24 + "show_notification": true 25 + }
+21
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/f4.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "O": { 6 + "item": "minecraft:obsidian" 7 + }, 8 + "S": { 9 + "item": "infinity:iridescent_star" 10 + } 11 + }, 12 + "pattern": [ 13 + "OOO", 14 + "OSO", 15 + "OOO" 16 + ], 17 + "result": { 18 + "item": "infinity:f4" 19 + }, 20 + "show_notification": true 21 + }
+10
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/f4_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "infinity:f4" 5 + }, 6 + "lore": "recipe_info.portal.infinity.attuned", 7 + "output": { 8 + "item": "infinity:f4" 9 + } 10 + }
+4
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/f4_recharging.json
···
··· 1 + { 2 + "type": "infinity:f4_recharging", 3 + "category": "misc" 4 + }
+21
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/fine_item.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "G": { 6 + "item": "minecraft:grass_block" 7 + }, 8 + "S": { 9 + "item": "infinity:star_of_lang" 10 + } 11 + }, 12 + "pattern": [ 13 + "GGG", 14 + "GSG", 15 + "GGG" 16 + ], 17 + "result": { 18 + "item": "infinity:fine_item" 19 + }, 20 + "show_notification": true 21 + }
+19
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/footprint.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "P": { 6 + "item": "minecraft:light_gray_stained_glass_pane" 7 + } 8 + }, 9 + "pattern": [ 10 + "PPP", 11 + "P P", 12 + "PPP" 13 + ], 14 + "result": { 15 + "count": 8, 16 + "item": "infinity:footprint" 17 + }, 18 + "show_notification": true 19 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/iridescent_carpet_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_carpet" 5 + }, 6 + "output": { 7 + "item": "infinity:iridescent_carpet" 8 + } 9 + }
+17
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "infinity:iridescent_wool" 7 + } 8 + }, 9 + "pattern": [ 10 + "BB" 11 + ], 12 + "result": { 13 + "count": 3, 14 + "item": "infinity:iridescent_carpet" 15 + }, 16 + "show_notification": true 17 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/iridescent_potion_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "infinity:chromatic_potion" 5 + }, 6 + "output": { 7 + "item": "infinity:iridescent_potion" 8 + } 9 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/iridescent_star_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:star_of_lang" 5 + }, 6 + "output": { 7 + "item": "infinity:iridescent_star" 8 + } 9 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/iridescent_wool_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_wool" 5 + }, 6 + "output": { 7 + "item": "infinity:iridescent_wool" 8 + } 9 + }
+10
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/key_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:key" 5 + }, 6 + "lore": "recipe_info.iridescence.infinity.key", 7 + "output": { 8 + "item": "infinity:key" 9 + } 10 + }
+10
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/key_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:amethyst_shard" 5 + }, 6 + "lore": "recipe_info.portal.infinity.attuned", 7 + "output": { 8 + "item": "infinity:key" 9 + } 10 + }
+8
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "count": 2, 4 + "ingredient": { 5 + "item": "infinity:netherite_slab" 6 + }, 7 + "result": "minecraft:netherite_block" 8 + }
+8
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "count": 1, 4 + "ingredient": { 5 + "item": "infinity:netherite_stairs" 6 + }, 7 + "result": "minecraft:netherite_block" 8 + }
+17
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/netherite_slab.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": { 6 + "item": "minecraft:netherite_block" 7 + } 8 + }, 9 + "pattern": [ 10 + "###" 11 + ], 12 + "result": { 13 + "count": 6, 14 + "item": "infinity:netherite_slab" 15 + }, 16 + "show_notification": true 17 + }
+19
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": { 6 + "item": "minecraft:netherite_block" 7 + } 8 + }, 9 + "pattern": [ 10 + "# ", 11 + "## ", 12 + "###" 13 + ], 14 + "result": { 15 + "count": 4, 16 + "item": "infinity:netherite_stairs" 17 + }, 18 + "show_notification": true 19 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/timebomb_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:tnt" 5 + }, 6 + "output": { 7 + "item": "infinity:timebomb" 8 + } 9 + }
+18
versions/1.20.1-forge/src/main/generated/data/infinity/recipes/white_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:white_concrete" 7 + } 8 + }, 9 + "pattern": [ 10 + "BBB", 11 + "B B", 12 + "BBB" 13 + ], 14 + "result": { 15 + "item": "infinity:white_matter" 16 + }, 17 + "show_notification": true 18 + }
+9
versions/1.20.1-forge/src/main/generated/data/infinity/tags/blocks/iridescent.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_wool", 5 + "infinity:iridescent_carpet", 6 + "infinity:iridescence", 7 + "infinity:cosmic_altar" 8 + ] 9 + }
+12
versions/1.20.1-forge/src/main/generated/data/infinity/tags/items/iridescent.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_wool", 5 + "infinity:iridescent_carpet", 6 + "infinity:iridescence_bucket", 7 + "infinity:iridescent_star", 8 + "infinity:iridescent_potion", 9 + "infinity:chromatic_potion", 10 + "infinity:cosmic_altar" 11 + ] 12 + }
+8
versions/1.20.1-forge/src/main/generated/data/infinity/tags/items/matter.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:black_matter", 5 + "infinity:chromatic_matter", 6 + "infinity:white_matter" 7 + ] 8 + }
+6
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/blocks/mineable/axe.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:book_box" 5 + ] 6 + }
+12
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/blocks/mineable/pickaxe.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:altar", 5 + "infinity:cursor", 6 + "infinity:netherite_slab", 7 + "infinity:netherite_stairs", 8 + "infinity:biome_bottle", 9 + "infinity:ant", 10 + "infinity:cosmic_altar" 11 + ] 12 + }
+6
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/blocks/portals.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:neither_portal" 5 + ] 6 + }
+6
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/blocks/slabs.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:netherite_slab" 5 + ] 6 + }
+6
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/blocks/stairs.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:netherite_stairs" 5 + ] 6 + }
+7
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/blocks/wool.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_wool", 5 + "infinity:chromatic_wool" 6 + ] 7 + }
+7
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/blocks/wool_carpets.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_carpet", 5 + "infinity:chromatic_carpet" 6 + ] 7 + }
+6
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/entity_types/frog_food.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:chaos_slime" 5 + ] 6 + }
+6
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/entity_types/skeletons.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:chaos_skeleton" 5 + ] 6 + }
+7
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/fluids/water.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:flowing_iridescence", 5 + "infinity:iridescence" 6 + ] 7 + }
+6
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/items/music_discs.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:disc" 5 + ] 6 + }
+7
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/items/wool.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_wool", 5 + "infinity:chromatic_wool" 6 + ] 7 + }
+7
versions/1.20.1-forge/src/main/generated/data/minecraft/tags/items/wool_carpets.json
···
··· 1 + { 2 + "replace": false, 3 + "values": [ 4 + "infinity:iridescent_carpet", 5 + "infinity:chromatic_carpet" 6 + ] 7 + }
+5
versions/1.21.1-fabric/src/main/generated/data/c/tags/item/buckets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescence_bucket" 4 + ] 5 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/ant.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:ant" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:ant" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/ant1.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:ant1" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_matter": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": "infinity:white_matter" 15 + } 16 + ] 17 + }, 18 + "trigger": "minecraft:inventory_changed" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_white_matter" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:ant1" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/cursor.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:cursor" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:cursor" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_wool": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_wool" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:iridescent_carpet_from_wool" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_wool" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:iridescent_carpet_from_wool" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_slab": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:netherite_slab" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_block_from_netherite_slab_stonecutting" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_slab" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_block_from_netherite_slab_stonecutting" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_stairs": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:netherite_stairs" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_block_from_netherite_stairs_stonecutting" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_stairs" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_block_from_netherite_stairs_stonecutting" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_slab.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:netherite_block" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_slab" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_block" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_slab" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_stairs.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:netherite_block" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_stairs" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_block" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_stairs" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/misc/black_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_black_concrete": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:black_concrete" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:black_matter" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_black_concrete" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:black_matter" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/misc/cosmic_altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_star" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:cosmic_altar" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_star" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:cosmic_altar" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/misc/f4.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_star" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:f4" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_star" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:f4" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/misc/fine_item.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:fine_item" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:fine_item" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/misc/footprint.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_light_gray_stained_glass_pane": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:light_gray_stained_glass_pane" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:footprint" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_light_gray_stained_glass_pane" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:footprint" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/misc/white_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:white_matter" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_concrete": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": "minecraft:white_concrete" 15 + } 16 + ] 17 + }, 18 + "trigger": "minecraft:inventory_changed" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_white_concrete" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:white_matter" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-fabric/src/main/generated/data/infinity/advancement/recipes/redstone/altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_book_box": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:book_box" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:altar" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_book_box" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:altar" 30 + ] 31 + } 32 + }
+20
versions/1.21.1-fabric/src/main/generated/data/infinity/loot_table/blocks/ant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:ant" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-fabric/src/main/generated/data/infinity/loot_table/blocks/book_box.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:book_box" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-fabric/src/main/generated/data/infinity/loot_table/blocks/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cosmic_altar" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-fabric/src/main/generated/data/infinity/loot_table/blocks/cursor.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cursor" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-fabric/src/main/generated/data/infinity/loot_table/blocks/iridescent_carpet.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_carpet" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-fabric/src/main/generated/data/infinity/loot_table/blocks/iridescent_kelp.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-fabric/src/main/generated/data/infinity/loot_table/blocks/iridescent_kelp_plant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-fabric/src/main/generated/data/infinity/loot_table/blocks/iridescent_wool.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_wool" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-fabric/src/main/generated/data/infinity/loot_table/blocks/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:netherite_stairs" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+21
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "redstone", 4 + "key": { 5 + "B": { 6 + "item": "infinity:book_box" 7 + }, 8 + "S": { 9 + "item": "minecraft:stone_slab" 10 + } 11 + }, 12 + "pattern": [ 13 + "SSS", 14 + " B ", 15 + " S " 16 + ], 17 + "result": { 18 + "count": 1, 19 + "id": "infinity:altar" 20 + } 21 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/altar_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:lectern" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:altar" 10 + } 11 + }
+24
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/ant.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + }, 8 + "M": { 9 + "item": "infinity:star_of_lang" 10 + }, 11 + "W": { 12 + "item": "minecraft:white_concrete" 13 + } 14 + }, 15 + "pattern": [ 16 + "WBW", 17 + "BMB", 18 + "WBW" 19 + ], 20 + "result": { 21 + "count": 1, 22 + "id": "infinity:ant" 23 + } 24 + }
+21
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/ant1.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "infinity:black_matter" 7 + }, 8 + "W": { 9 + "item": "infinity:white_matter" 10 + } 11 + }, 12 + "pattern": [ 13 + "WBW", 14 + "B B", 15 + "WBW" 16 + ], 17 + "result": { 18 + "count": 1, 19 + "id": "infinity:ant" 20 + } 21 + }
+4
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/biome_bottle_combining.json
···
··· 1 + { 2 + "type": "infinity:biome_bottle_combining", 3 + "category": "misc" 4 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/biome_bottle_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:glass_bottle" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:biome_bottle" 10 + } 11 + }
+18
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/black_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + } 8 + }, 9 + "pattern": [ 10 + "BBB", 11 + "B B", 12 + "BBB" 13 + ], 14 + "result": { 15 + "count": 1, 16 + "id": "infinity:black_matter" 17 + } 18 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/book_box_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:bookshelf" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:book_box" 10 + } 11 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/chromatic_carpet_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "minecraft:wool_carpets" 5 + }, 6 + "lore": "recipe_info.portal.infinity.color", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:chromatic_carpet" 10 + } 11 + }
+4
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/chromatic_carpet_from_wool.json
···
··· 1 + { 2 + "type": "infinity:chroma_carpet", 3 + "category": "misc" 4 + }
+10
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/chromatic_coloring_carpet.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": { 4 + "tag": "minecraft:wool_carpets" 5 + }, 6 + "output": { 7 + "count": 1, 8 + "id": "infinity:chromatic_carpet" 9 + } 10 + }
+10
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/chromatic_coloring_wool.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": { 4 + "tag": "minecraft:wool" 5 + }, 6 + "output": { 7 + "count": 1, 8 + "id": "infinity:chromatic_wool" 9 + } 10 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/chromatic_matter.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "infinity:matter" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:chromatic_matter" 10 + } 11 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/chromatic_matter_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_matter" 5 + }, 6 + "lore": "recipe_info.iridescence.infinity.chromatic_matter", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:chromatic_matter" 10 + } 11 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/chromatic_wool.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "minecraft:wool" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:chromatic_wool" 10 + } 11 + }
+24
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "A": { 6 + "item": "infinity:altar" 7 + }, 8 + "L": { 9 + "item": "minecraft:lodestone" 10 + }, 11 + "S": { 12 + "item": "infinity:iridescent_star" 13 + } 14 + }, 15 + "pattern": [ 16 + "LAL", 17 + "ASA", 18 + "LAL" 19 + ], 20 + "result": { 21 + "count": 1, 22 + "id": "infinity:cosmic_altar" 23 + } 24 + }
+24
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/cursor.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + }, 8 + "L": { 9 + "item": "minecraft:lime_concrete" 10 + }, 11 + "S": { 12 + "item": "infinity:star_of_lang" 13 + } 14 + }, 15 + "pattern": [ 16 + "BLB", 17 + "LSL", 18 + "BLB" 19 + ], 20 + "result": { 21 + "count": 8, 22 + "id": "infinity:cursor" 23 + } 24 + }
+21
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/f4.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "O": { 6 + "item": "minecraft:obsidian" 7 + }, 8 + "S": { 9 + "item": "infinity:iridescent_star" 10 + } 11 + }, 12 + "pattern": [ 13 + "OOO", 14 + "OSO", 15 + "OOO" 16 + ], 17 + "result": { 18 + "count": 1, 19 + "id": "infinity:f4" 20 + } 21 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/f4_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "infinity:f4" 5 + }, 6 + "lore": "recipe_info.portal.infinity.attuned", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:f4" 10 + } 11 + }
+4
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/f4_recharging.json
···
··· 1 + { 2 + "type": "infinity:f4_recharging", 3 + "category": "misc" 4 + }
+21
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/fine_item.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "G": { 6 + "item": "minecraft:grass_block" 7 + }, 8 + "S": { 9 + "item": "infinity:star_of_lang" 10 + } 11 + }, 12 + "pattern": [ 13 + "GGG", 14 + "GSG", 15 + "GGG" 16 + ], 17 + "result": { 18 + "count": 1, 19 + "id": "infinity:fine_item" 20 + } 21 + }
+18
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/footprint.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "P": { 6 + "item": "minecraft:light_gray_stained_glass_pane" 7 + } 8 + }, 9 + "pattern": [ 10 + "PPP", 11 + "P P", 12 + "PPP" 13 + ], 14 + "result": { 15 + "count": 8, 16 + "id": "infinity:footprint" 17 + } 18 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/iridescence_bottle_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "infinity:chromatic_potion" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:iridescent_potion" 10 + } 11 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/iridescent_carpet.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_carpet" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:iridescent_carpet" 10 + } 11 + }
+16
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "infinity:iridescent_wool" 7 + } 8 + }, 9 + "pattern": [ 10 + "BB" 11 + ], 12 + "result": { 13 + "count": 3, 14 + "id": "infinity:iridescent_carpet" 15 + } 16 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/iridescent_star.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:star_of_lang" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:iridescent_star" 10 + } 11 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/iridescent_wool.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_wool" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:iridescent_wool" 10 + } 11 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/key_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:key" 5 + }, 6 + "lore": "recipe_info.iridescence.infinity.key", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:key" 10 + } 11 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/key_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:amethyst_shard" 5 + }, 6 + "lore": "recipe_info.portal.infinity.attuned", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:key" 10 + } 11 + }
+10
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "ingredient": { 4 + "item": "infinity:netherite_slab" 5 + }, 6 + "result": { 7 + "count": 2, 8 + "id": "minecraft:netherite_block" 9 + } 10 + }
+10
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "ingredient": { 4 + "item": "infinity:netherite_stairs" 5 + }, 6 + "result": { 7 + "count": 1, 8 + "id": "minecraft:netherite_block" 9 + } 10 + }
+16
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/netherite_slab.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": { 6 + "item": "minecraft:netherite_block" 7 + } 8 + }, 9 + "pattern": [ 10 + "###" 11 + ], 12 + "result": { 13 + "count": 6, 14 + "id": "infinity:netherite_slab" 15 + } 16 + }
+18
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": { 6 + "item": "minecraft:netherite_block" 7 + } 8 + }, 9 + "pattern": [ 10 + "# ", 11 + "## ", 12 + "###" 13 + ], 14 + "result": { 15 + "count": 4, 16 + "id": "infinity:netherite_stairs" 17 + } 18 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/timebomb_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:tnt" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:timebomb" 10 + } 11 + }
+18
versions/1.21.1-fabric/src/main/generated/data/infinity/recipe/white_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:white_concrete" 7 + } 8 + }, 9 + "pattern": [ 10 + "BBB", 11 + "B B", 12 + "BBB" 13 + ], 14 + "result": { 15 + "count": 1, 16 + "id": "infinity:white_matter" 17 + } 18 + }
+8
versions/1.21.1-fabric/src/main/generated/data/infinity/tags/block/iridescent.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:iridescent_carpet", 5 + "infinity:iridescence", 6 + "infinity:cosmic_altar" 7 + ] 8 + }
+11
versions/1.21.1-fabric/src/main/generated/data/infinity/tags/item/iridescent.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:iridescent_carpet", 5 + "infinity:iridescence_bucket", 6 + "infinity:iridescent_star", 7 + "infinity:iridescent_potion", 8 + "infinity:chromatic_potion", 9 + "infinity:cosmic_altar" 10 + ] 11 + }
+7
versions/1.21.1-fabric/src/main/generated/data/infinity/tags/item/matter.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:black_matter", 4 + "infinity:chromatic_matter", 5 + "infinity:white_matter" 6 + ] 7 + }
+5
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/block/mineable/axe.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:book_box" 4 + ] 5 + }
+11
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/block/mineable/pickaxe.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:altar", 4 + "infinity:cursor", 5 + "infinity:netherite_slab", 6 + "infinity:netherite_stairs", 7 + "infinity:biome_bottle", 8 + "infinity:ant", 9 + "infinity:cosmic_altar" 10 + ] 11 + }
+5
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/block/portals.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:neither_portal" 4 + ] 5 + }
+5
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/block/slabs.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:netherite_slab" 4 + ] 5 + }
+5
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/block/stairs.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:netherite_stairs" 4 + ] 5 + }
+6
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/block/wool.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:chromatic_wool" 5 + ] 6 + }
+6
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/block/wool_carpets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_carpet", 4 + "infinity:chromatic_carpet" 5 + ] 6 + }
+5
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/entity_type/arthropod.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:ant" 4 + ] 5 + }
+5
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/entity_type/frog_food.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:chaos_slime" 4 + ] 5 + }
+5
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/entity_type/skeletons.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:chaos_skeleton" 4 + ] 5 + }
+6
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/fluid/water.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:flowing_iridescence", 4 + "infinity:iridescence" 5 + ] 6 + }
+6
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/item/wool.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:chromatic_wool" 5 + ] 6 + }
+6
versions/1.21.1-fabric/src/main/generated/data/minecraft/tags/item/wool_carpets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_carpet", 4 + "infinity:chromatic_carpet" 5 + ] 6 + }
+5
versions/1.21.1-neoforge/src/main/generated/data/c/tags/item/buckets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescence_bucket" 4 + ] 5 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/ant.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:ant" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:ant" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/ant1.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:ant1" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_matter": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": "infinity:white_matter" 15 + } 16 + ] 17 + }, 18 + "trigger": "minecraft:inventory_changed" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_white_matter" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:ant1" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/cursor.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:cursor" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:cursor" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_wool": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_wool" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:iridescent_carpet_from_wool" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_wool" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:iridescent_carpet_from_wool" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_slab": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:netherite_slab" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_block_from_netherite_slab_stonecutting" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_slab" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_block_from_netherite_slab_stonecutting" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_stairs": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:netherite_stairs" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_block_from_netherite_stairs_stonecutting" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_stairs" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_block_from_netherite_stairs_stonecutting" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_slab.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:netherite_block" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_slab" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_block" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_slab" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_stairs.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:netherite_block" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_stairs" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_block" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_stairs" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/black_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_black_concrete": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:black_concrete" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:black_matter" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_black_concrete" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:black_matter" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/cosmic_altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_star" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:cosmic_altar" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_star" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:cosmic_altar" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/f4.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_star" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:f4" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_star" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:f4" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/fine_item.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:fine_item" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:fine_item" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/footprint.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_light_gray_stained_glass_pane": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:light_gray_stained_glass_pane" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:footprint" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_light_gray_stained_glass_pane" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:footprint" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/white_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:white_matter" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_concrete": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": "minecraft:white_concrete" 15 + } 16 + ] 17 + }, 18 + "trigger": "minecraft:inventory_changed" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_white_concrete" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:white_matter" 30 + ] 31 + } 32 + }
+32
versions/1.21.1-neoforge/src/main/generated/data/infinity/advancement/recipes/redstone/altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_book_box": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:book_box" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:altar" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_book_box" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:altar" 30 + ] 31 + } 32 + }
+20
versions/1.21.1-neoforge/src/main/generated/data/infinity/loot_table/blocks/ant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:ant" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-neoforge/src/main/generated/data/infinity/loot_table/blocks/book_box.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:book_box" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-neoforge/src/main/generated/data/infinity/loot_table/blocks/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cosmic_altar" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-neoforge/src/main/generated/data/infinity/loot_table/blocks/cursor.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cursor" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-neoforge/src/main/generated/data/infinity/loot_table/blocks/iridescent_carpet.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_carpet" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-neoforge/src/main/generated/data/infinity/loot_table/blocks/iridescent_kelp.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-neoforge/src/main/generated/data/infinity/loot_table/blocks/iridescent_kelp_plant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-neoforge/src/main/generated/data/infinity/loot_table/blocks/iridescent_wool.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_wool" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.1-neoforge/src/main/generated/data/infinity/loot_table/blocks/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:netherite_stairs" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+21
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "redstone", 4 + "key": { 5 + "B": { 6 + "item": "infinity:book_box" 7 + }, 8 + "S": { 9 + "item": "minecraft:stone_slab" 10 + } 11 + }, 12 + "pattern": [ 13 + "SSS", 14 + " B ", 15 + " S " 16 + ], 17 + "result": { 18 + "count": 1, 19 + "id": "infinity:altar" 20 + } 21 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/altar_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:lectern" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:altar" 10 + } 11 + }
+24
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/ant.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + }, 8 + "M": { 9 + "item": "infinity:star_of_lang" 10 + }, 11 + "W": { 12 + "item": "minecraft:white_concrete" 13 + } 14 + }, 15 + "pattern": [ 16 + "WBW", 17 + "BMB", 18 + "WBW" 19 + ], 20 + "result": { 21 + "count": 1, 22 + "id": "infinity:ant" 23 + } 24 + }
+21
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/ant1.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "infinity:black_matter" 7 + }, 8 + "W": { 9 + "item": "infinity:white_matter" 10 + } 11 + }, 12 + "pattern": [ 13 + "WBW", 14 + "B B", 15 + "WBW" 16 + ], 17 + "result": { 18 + "count": 1, 19 + "id": "infinity:ant" 20 + } 21 + }
+4
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/biome_bottle_combining.json
···
··· 1 + { 2 + "type": "infinity:biome_bottle_combining", 3 + "category": "misc" 4 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/biome_bottle_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:glass_bottle" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:biome_bottle" 10 + } 11 + }
+18
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/black_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + } 8 + }, 9 + "pattern": [ 10 + "BBB", 11 + "B B", 12 + "BBB" 13 + ], 14 + "result": { 15 + "count": 1, 16 + "id": "infinity:black_matter" 17 + } 18 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/book_box_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:bookshelf" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:book_box" 10 + } 11 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/chromatic_carpet_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "minecraft:wool_carpets" 5 + }, 6 + "lore": "recipe_info.portal.infinity.color", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:chromatic_carpet" 10 + } 11 + }
+4
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/chromatic_carpet_from_wool.json
···
··· 1 + { 2 + "type": "infinity:chroma_carpet", 3 + "category": "misc" 4 + }
+10
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/chromatic_coloring_carpet.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": { 4 + "tag": "minecraft:wool_carpets" 5 + }, 6 + "output": { 7 + "count": 1, 8 + "id": "infinity:chromatic_carpet" 9 + } 10 + }
+10
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/chromatic_coloring_wool.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": { 4 + "tag": "minecraft:wool" 5 + }, 6 + "output": { 7 + "count": 1, 8 + "id": "infinity:chromatic_wool" 9 + } 10 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/chromatic_matter.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "infinity:matter" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:chromatic_matter" 10 + } 11 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/chromatic_matter_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_matter" 5 + }, 6 + "lore": "recipe_info.iridescence.infinity.chromatic_matter", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:chromatic_matter" 10 + } 11 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/chromatic_wool.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "tag": "minecraft:wool" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:chromatic_wool" 10 + } 11 + }
+24
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "A": { 6 + "item": "infinity:altar" 7 + }, 8 + "L": { 9 + "item": "minecraft:lodestone" 10 + }, 11 + "S": { 12 + "item": "infinity:iridescent_star" 13 + } 14 + }, 15 + "pattern": [ 16 + "LAL", 17 + "ASA", 18 + "LAL" 19 + ], 20 + "result": { 21 + "count": 1, 22 + "id": "infinity:cosmic_altar" 23 + } 24 + }
+24
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/cursor.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:black_concrete" 7 + }, 8 + "L": { 9 + "item": "minecraft:lime_concrete" 10 + }, 11 + "S": { 12 + "item": "infinity:star_of_lang" 13 + } 14 + }, 15 + "pattern": [ 16 + "BLB", 17 + "LSL", 18 + "BLB" 19 + ], 20 + "result": { 21 + "count": 8, 22 + "id": "infinity:cursor" 23 + } 24 + }
+21
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/f4.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "O": { 6 + "item": "minecraft:obsidian" 7 + }, 8 + "S": { 9 + "item": "infinity:iridescent_star" 10 + } 11 + }, 12 + "pattern": [ 13 + "OOO", 14 + "OSO", 15 + "OOO" 16 + ], 17 + "result": { 18 + "count": 1, 19 + "id": "infinity:f4" 20 + } 21 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/f4_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "infinity:f4" 5 + }, 6 + "lore": "recipe_info.portal.infinity.attuned", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:f4" 10 + } 11 + }
+4
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/f4_recharging.json
···
··· 1 + { 2 + "type": "infinity:f4_recharging", 3 + "category": "misc" 4 + }
+21
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/fine_item.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "G": { 6 + "item": "minecraft:grass_block" 7 + }, 8 + "S": { 9 + "item": "infinity:star_of_lang" 10 + } 11 + }, 12 + "pattern": [ 13 + "GGG", 14 + "GSG", 15 + "GGG" 16 + ], 17 + "result": { 18 + "count": 1, 19 + "id": "infinity:fine_item" 20 + } 21 + }
+18
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/footprint.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "P": { 6 + "item": "minecraft:light_gray_stained_glass_pane" 7 + } 8 + }, 9 + "pattern": [ 10 + "PPP", 11 + "P P", 12 + "PPP" 13 + ], 14 + "result": { 15 + "count": 8, 16 + "id": "infinity:footprint" 17 + } 18 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/iridescence_bottle_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "infinity:chromatic_potion" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:iridescent_potion" 10 + } 11 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/iridescent_carpet.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_carpet" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:iridescent_carpet" 10 + } 11 + }
+16
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": { 6 + "item": "infinity:iridescent_wool" 7 + } 8 + }, 9 + "pattern": [ 10 + "BB" 11 + ], 12 + "result": { 13 + "count": 3, 14 + "id": "infinity:iridescent_carpet" 15 + } 16 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/iridescent_star.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:star_of_lang" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:iridescent_star" 10 + } 11 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/iridescent_wool.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:chromatic_wool" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:iridescent_wool" 10 + } 11 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/key_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": { 4 + "item": "infinity:key" 5 + }, 6 + "lore": "recipe_info.iridescence.infinity.key", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:key" 10 + } 11 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/key_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:amethyst_shard" 5 + }, 6 + "lore": "recipe_info.portal.infinity.attuned", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:key" 10 + } 11 + }
+10
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "ingredient": { 4 + "item": "infinity:netherite_slab" 5 + }, 6 + "result": { 7 + "count": 2, 8 + "id": "minecraft:netherite_block" 9 + } 10 + }
+10
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "ingredient": { 4 + "item": "infinity:netherite_stairs" 5 + }, 6 + "result": { 7 + "count": 1, 8 + "id": "minecraft:netherite_block" 9 + } 10 + }
+16
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/netherite_slab.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": { 6 + "item": "minecraft:netherite_block" 7 + } 8 + }, 9 + "pattern": [ 10 + "###" 11 + ], 12 + "result": { 13 + "count": 6, 14 + "id": "infinity:netherite_slab" 15 + } 16 + }
+18
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": { 6 + "item": "minecraft:netherite_block" 7 + } 8 + }, 9 + "pattern": [ 10 + "# ", 11 + "## ", 12 + "###" 13 + ], 14 + "result": { 15 + "count": 4, 16 + "id": "infinity:netherite_stairs" 17 + } 18 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/timebomb_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": { 4 + "item": "minecraft:tnt" 5 + }, 6 + "lore": "empty", 7 + "output": { 8 + "count": 1, 9 + "id": "infinity:timebomb" 10 + } 11 + }
+18
versions/1.21.1-neoforge/src/main/generated/data/infinity/recipe/white_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": { 6 + "item": "minecraft:white_concrete" 7 + } 8 + }, 9 + "pattern": [ 10 + "BBB", 11 + "B B", 12 + "BBB" 13 + ], 14 + "result": { 15 + "count": 1, 16 + "id": "infinity:white_matter" 17 + } 18 + }
+8
versions/1.21.1-neoforge/src/main/generated/data/infinity/tags/block/iridescent.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:iridescent_carpet", 5 + "infinity:iridescence", 6 + "infinity:cosmic_altar" 7 + ] 8 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/infinity/tags/item/iridescent.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:iridescent_carpet", 5 + "infinity:iridescence_bucket", 6 + "infinity:iridescent_star", 7 + "infinity:iridescent_potion", 8 + "infinity:chromatic_potion", 9 + "infinity:cosmic_altar" 10 + ] 11 + }
+7
versions/1.21.1-neoforge/src/main/generated/data/infinity/tags/item/matter.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:black_matter", 4 + "infinity:chromatic_matter", 5 + "infinity:white_matter" 6 + ] 7 + }
+5
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/block/mineable/axe.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:book_box" 4 + ] 5 + }
+11
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/block/mineable/pickaxe.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:altar", 4 + "infinity:cursor", 5 + "infinity:netherite_slab", 6 + "infinity:netherite_stairs", 7 + "infinity:biome_bottle", 8 + "infinity:ant", 9 + "infinity:cosmic_altar" 10 + ] 11 + }
+5
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/block/portals.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:neither_portal" 4 + ] 5 + }
+5
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/block/slabs.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:netherite_slab" 4 + ] 5 + }
+5
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/block/stairs.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:netherite_stairs" 4 + ] 5 + }
+6
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/block/wool.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:chromatic_wool" 5 + ] 6 + }
+6
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/block/wool_carpets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_carpet", 4 + "infinity:chromatic_carpet" 5 + ] 6 + }
+5
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/entity_type/arthropod.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:ant" 4 + ] 5 + }
+5
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/entity_type/frog_food.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:chaos_slime" 4 + ] 5 + }
+5
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/entity_type/skeletons.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:chaos_skeleton" 4 + ] 5 + }
+6
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/fluid/water.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:flowing_iridescence", 4 + "infinity:iridescence" 5 + ] 6 + }
+6
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/item/wool.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:chromatic_wool" 5 + ] 6 + }
+6
versions/1.21.1-neoforge/src/main/generated/data/minecraft/tags/item/wool_carpets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_carpet", 4 + "infinity:chromatic_carpet" 5 + ] 6 + }
+1 -1
versions/1.21.8-fabric/gradle.properties
··· 4 5 mod.mc_dep_fabric=~1.21.6 <1.21.9 6 7 - deps.rrv=6.2.1+1.21.8 8 deps.cloth = 19.0.147 9 deps.modmenu=15.0.0-beta.3 10 deps.architectury = 17.0.8
··· 4 5 mod.mc_dep_fabric=~1.21.6 <1.21.9 6 7 + deps.rrv=6.3.3+1.21.8 8 deps.cloth = 19.0.147 9 deps.modmenu=15.0.0-beta.3 10 deps.architectury = 17.0.8
+5
versions/1.21.8-fabric/src/main/generated/data/c/tags/item/buckets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescence_bucket" 4 + ] 5 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/ant.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:ant" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:ant" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/ant1.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:ant1" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_matter": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": "infinity:white_matter" 15 + } 16 + ] 17 + }, 18 + "trigger": "minecraft:inventory_changed" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_white_matter" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:ant1" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/cursor.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:cursor" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:cursor" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_wool": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_wool" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:iridescent_carpet_from_wool" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_wool" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:iridescent_carpet_from_wool" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_slab": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:netherite_slab" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_block_from_netherite_slab_stonecutting" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_slab" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_block_from_netherite_slab_stonecutting" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_stairs": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:netherite_stairs" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_block_from_netherite_stairs_stonecutting" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_stairs" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_block_from_netherite_stairs_stonecutting" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_slab.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:netherite_block" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_slab" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_block" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_slab" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_stairs.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:netherite_block" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_stairs" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_block" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_stairs" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/misc/black_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_black_concrete": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:black_concrete" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:black_matter" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_black_concrete" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:black_matter" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/misc/cosmic_altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_star" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:cosmic_altar" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_star" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:cosmic_altar" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/misc/f4.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_star" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:f4" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_star" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:f4" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/misc/fine_item.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:fine_item" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:fine_item" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/misc/footprint.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_light_gray_stained_glass_pane": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:light_gray_stained_glass_pane" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:footprint" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_light_gray_stained_glass_pane" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:footprint" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/misc/white_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:white_matter" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_concrete": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": "minecraft:white_concrete" 15 + } 16 + ] 17 + }, 18 + "trigger": "minecraft:inventory_changed" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_white_concrete" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:white_matter" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-fabric/src/main/generated/data/infinity/advancement/recipes/redstone/altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_book_box": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:book_box" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:altar" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_book_box" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:altar" 30 + ] 31 + } 32 + }
+20
versions/1.21.8-fabric/src/main/generated/data/infinity/loot_table/blocks/ant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:ant" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-fabric/src/main/generated/data/infinity/loot_table/blocks/book_box.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:book_box" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-fabric/src/main/generated/data/infinity/loot_table/blocks/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cosmic_altar" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-fabric/src/main/generated/data/infinity/loot_table/blocks/cursor.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cursor" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-fabric/src/main/generated/data/infinity/loot_table/blocks/iridescent_carpet.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_carpet" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-fabric/src/main/generated/data/infinity/loot_table/blocks/iridescent_kelp.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-fabric/src/main/generated/data/infinity/loot_table/blocks/iridescent_kelp_plant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-fabric/src/main/generated/data/infinity/loot_table/blocks/iridescent_wool.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_wool" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-fabric/src/main/generated/data/infinity/loot_table/blocks/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:netherite_stairs" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+17
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "redstone", 4 + "key": { 5 + "B": "infinity:book_box", 6 + "S": "minecraft:stone_slab" 7 + }, 8 + "pattern": [ 9 + "SSS", 10 + " B ", 11 + " S " 12 + ], 13 + "result": { 14 + "count": 1, 15 + "id": "infinity:altar" 16 + } 17 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/altar_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "minecraft:lectern", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:altar" 8 + } 9 + }
+18
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/ant.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": "minecraft:black_concrete", 6 + "M": "infinity:star_of_lang", 7 + "W": "minecraft:white_concrete" 8 + }, 9 + "pattern": [ 10 + "WBW", 11 + "BMB", 12 + "WBW" 13 + ], 14 + "result": { 15 + "count": 1, 16 + "id": "infinity:ant" 17 + } 18 + }
+17
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/ant1.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": "infinity:black_matter", 6 + "W": "infinity:white_matter" 7 + }, 8 + "pattern": [ 9 + "WBW", 10 + "B B", 11 + "WBW" 12 + ], 13 + "result": { 14 + "count": 1, 15 + "id": "infinity:ant" 16 + } 17 + }
+4
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/biome_bottle_combining.json
···
··· 1 + { 2 + "type": "infinity:biome_bottle_combining", 3 + "category": "misc" 4 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/biome_bottle_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "minecraft:glass_bottle", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:biome_bottle" 8 + } 9 + }
+16
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/black_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": "minecraft:black_concrete" 6 + }, 7 + "pattern": [ 8 + "BBB", 9 + "B B", 10 + "BBB" 11 + ], 12 + "result": { 13 + "count": 1, 14 + "id": "infinity:black_matter" 15 + } 16 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/book_box_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "minecraft:bookshelf", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:book_box" 8 + } 9 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/chromatic_carpet_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "#minecraft:wool_carpets", 4 + "lore": "recipe_info.portal.infinity.color", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:chromatic_carpet" 8 + } 9 + }
+4
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/chromatic_carpet_from_wool.json
···
··· 1 + { 2 + "type": "infinity:chroma_carpet", 3 + "category": "misc" 4 + }
+8
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/chromatic_coloring_carpet.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": "#minecraft:wool_carpets", 4 + "output": { 5 + "count": 1, 6 + "id": "infinity:chromatic_carpet" 7 + } 8 + }
+8
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/chromatic_coloring_wool.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": "#minecraft:wool", 4 + "output": { 5 + "count": 1, 6 + "id": "infinity:chromatic_wool" 7 + } 8 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/chromatic_matter.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "#infinity:matter", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:chromatic_matter" 8 + } 9 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/chromatic_matter_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": "infinity:chromatic_matter", 4 + "lore": "recipe_info.iridescence.infinity.chromatic_matter", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:chromatic_matter" 8 + } 9 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/chromatic_wool.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "#minecraft:wool", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:chromatic_wool" 8 + } 9 + }
+18
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "A": "infinity:altar", 6 + "L": "minecraft:lodestone", 7 + "S": "infinity:iridescent_star" 8 + }, 9 + "pattern": [ 10 + "LAL", 11 + "ASA", 12 + "LAL" 13 + ], 14 + "result": { 15 + "count": 1, 16 + "id": "infinity:cosmic_altar" 17 + } 18 + }
+18
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/cursor.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": "minecraft:black_concrete", 6 + "L": "minecraft:lime_concrete", 7 + "S": "infinity:star_of_lang" 8 + }, 9 + "pattern": [ 10 + "BLB", 11 + "LSL", 12 + "BLB" 13 + ], 14 + "result": { 15 + "count": 8, 16 + "id": "infinity:cursor" 17 + } 18 + }
+17
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/f4.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "O": "minecraft:obsidian", 6 + "S": "infinity:iridescent_star" 7 + }, 8 + "pattern": [ 9 + "OOO", 10 + "OSO", 11 + "OOO" 12 + ], 13 + "result": { 14 + "count": 1, 15 + "id": "infinity:f4" 16 + } 17 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/f4_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "infinity:f4", 4 + "lore": "recipe_info.portal.infinity.attuned", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:f4" 8 + } 9 + }
+4
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/f4_recharging.json
···
··· 1 + { 2 + "type": "infinity:f4_recharging", 3 + "category": "misc" 4 + }
+17
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/fine_item.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "G": "minecraft:grass_block", 6 + "S": "infinity:star_of_lang" 7 + }, 8 + "pattern": [ 9 + "GGG", 10 + "GSG", 11 + "GGG" 12 + ], 13 + "result": { 14 + "count": 1, 15 + "id": "infinity:fine_item" 16 + } 17 + }
+16
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/footprint.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "P": "minecraft:light_gray_stained_glass_pane" 6 + }, 7 + "pattern": [ 8 + "PPP", 9 + "P P", 10 + "PPP" 11 + ], 12 + "result": { 13 + "count": 8, 14 + "id": "infinity:footprint" 15 + } 16 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/iridescence_bottle_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "infinity:chromatic_potion", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:iridescent_potion" 8 + } 9 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/iridescent_carpet.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": "infinity:chromatic_carpet", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:iridescent_carpet" 8 + } 9 + }
+14
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": "infinity:iridescent_wool" 6 + }, 7 + "pattern": [ 8 + "BB" 9 + ], 10 + "result": { 11 + "count": 3, 12 + "id": "infinity:iridescent_carpet" 13 + } 14 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/iridescent_star.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": "infinity:star_of_lang", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:iridescent_star" 8 + } 9 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/iridescent_wool.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": "infinity:chromatic_wool", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:iridescent_wool" 8 + } 9 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/key_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": "infinity:key", 4 + "lore": "recipe_info.iridescence.infinity.key", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:key" 8 + } 9 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/key_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "minecraft:amethyst_shard", 4 + "lore": "recipe_info.portal.infinity.attuned", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:key" 8 + } 9 + }
+8
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "ingredient": "infinity:netherite_slab", 4 + "result": { 5 + "count": 2, 6 + "id": "minecraft:netherite_block" 7 + } 8 + }
+8
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "ingredient": "infinity:netherite_stairs", 4 + "result": { 5 + "count": 1, 6 + "id": "minecraft:netherite_block" 7 + } 8 + }
+14
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/netherite_slab.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": "minecraft:netherite_block" 6 + }, 7 + "pattern": [ 8 + "###" 9 + ], 10 + "result": { 11 + "count": 6, 12 + "id": "infinity:netherite_slab" 13 + } 14 + }
+16
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": "minecraft:netherite_block" 6 + }, 7 + "pattern": [ 8 + "# ", 9 + "## ", 10 + "###" 11 + ], 12 + "result": { 13 + "count": 4, 14 + "id": "infinity:netherite_stairs" 15 + } 16 + }
+9
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/timebomb_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "minecraft:tnt", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:timebomb" 8 + } 9 + }
+16
versions/1.21.8-fabric/src/main/generated/data/infinity/recipe/white_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": "minecraft:white_concrete" 6 + }, 7 + "pattern": [ 8 + "BBB", 9 + "B B", 10 + "BBB" 11 + ], 12 + "result": { 13 + "count": 1, 14 + "id": "infinity:white_matter" 15 + } 16 + }
+8
versions/1.21.8-fabric/src/main/generated/data/infinity/tags/block/iridescent.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:iridescent_carpet", 5 + "infinity:iridescence", 6 + "infinity:cosmic_altar" 7 + ] 8 + }
+11
versions/1.21.8-fabric/src/main/generated/data/infinity/tags/item/iridescent.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:iridescent_carpet", 5 + "infinity:iridescence_bucket", 6 + "infinity:iridescent_star", 7 + "infinity:iridescent_potion", 8 + "infinity:chromatic_potion", 9 + "infinity:cosmic_altar" 10 + ] 11 + }
+7
versions/1.21.8-fabric/src/main/generated/data/infinity/tags/item/matter.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:black_matter", 4 + "infinity:chromatic_matter", 5 + "infinity:white_matter" 6 + ] 7 + }
+5
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/block/mineable/axe.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:book_box" 4 + ] 5 + }
+11
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/block/mineable/pickaxe.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:altar", 4 + "infinity:cursor", 5 + "infinity:netherite_slab", 6 + "infinity:netherite_stairs", 7 + "infinity:biome_bottle", 8 + "infinity:ant", 9 + "infinity:cosmic_altar" 10 + ] 11 + }
+5
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/block/portals.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:neither_portal" 4 + ] 5 + }
+5
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/block/slabs.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:netherite_slab" 4 + ] 5 + }
+5
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/block/stairs.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:netherite_stairs" 4 + ] 5 + }
+6
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/block/wool.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:chromatic_wool" 5 + ] 6 + }
+6
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/block/wool_carpets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_carpet", 4 + "infinity:chromatic_carpet" 5 + ] 6 + }
+5
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/entity_type/arthropod.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:ant" 4 + ] 5 + }
+5
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/entity_type/frog_food.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:chaos_slime" 4 + ] 5 + }
+5
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/entity_type/skeletons.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:chaos_skeleton" 4 + ] 5 + }
+6
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/fluid/water.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:flowing_iridescence", 4 + "infinity:iridescence" 5 + ] 6 + }
+6
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/item/wool.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:chromatic_wool" 5 + ] 6 + }
+6
versions/1.21.8-fabric/src/main/generated/data/minecraft/tags/item/wool_carpets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_carpet", 4 + "infinity:chromatic_carpet" 5 + ] 6 + }
+1 -1
versions/1.21.8-neoforge/gradle.properties
··· 4 5 mod.mc_dep_forgelike=[1.21.6, 1.21.8] 6 7 - deps.rrv=6.2.1+1.21.8 8 deps.cloth = 19.0.147 9 deps.architectury = 17.0.8 10 deps.cct = 1.116.1
··· 4 5 mod.mc_dep_forgelike=[1.21.6, 1.21.8] 6 7 + deps.rrv=6.3.3+1.21.8 8 deps.cloth = 19.0.147 9 deps.architectury = 17.0.8 10 deps.cct = 1.116.1
+5
versions/1.21.8-neoforge/src/main/generated/data/c/tags/item/buckets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescence_bucket" 4 + ] 5 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/ant.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:ant" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:ant" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/ant1.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:ant1" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_matter": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": "infinity:white_matter" 15 + } 16 + ] 17 + }, 18 + "trigger": "minecraft:inventory_changed" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_white_matter" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:ant1" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/cursor.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:cursor" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:cursor" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_wool": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_wool" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:iridescent_carpet_from_wool" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_wool" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:iridescent_carpet_from_wool" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_slab": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:netherite_slab" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_block_from_netherite_slab_stonecutting" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_slab" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_block_from_netherite_slab_stonecutting" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_stairs": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:netherite_stairs" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_block_from_netherite_stairs_stonecutting" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_stairs" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_block_from_netherite_stairs_stonecutting" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_slab.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:netherite_block" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_slab" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_block" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_slab" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/building_blocks/netherite_stairs.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_netherite_block": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:netherite_block" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:netherite_stairs" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_netherite_block" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:netherite_stairs" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/black_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_black_concrete": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:black_concrete" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:black_matter" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_black_concrete" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:black_matter" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/cosmic_altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_star" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:cosmic_altar" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_star" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:cosmic_altar" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/f4.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_iridescent_star": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:iridescent_star" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:f4" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_iridescent_star" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:f4" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/fine_item.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_star_of_lang": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:star_of_lang" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:fine_item" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_star_of_lang" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:fine_item" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/footprint.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_light_gray_stained_glass_pane": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "minecraft:light_gray_stained_glass_pane" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:footprint" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_light_gray_stained_glass_pane" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:footprint" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/misc/white_matter.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_the_recipe": { 5 + "conditions": { 6 + "recipe": "infinity:white_matter" 7 + }, 8 + "trigger": "minecraft:recipe_unlocked" 9 + }, 10 + "has_white_concrete": { 11 + "conditions": { 12 + "items": [ 13 + { 14 + "items": "minecraft:white_concrete" 15 + } 16 + ] 17 + }, 18 + "trigger": "minecraft:inventory_changed" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_white_concrete" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:white_matter" 30 + ] 31 + } 32 + }
+32
versions/1.21.8-neoforge/src/main/generated/data/infinity/advancement/recipes/redstone/altar.json
···
··· 1 + { 2 + "parent": "minecraft:recipes/root", 3 + "criteria": { 4 + "has_book_box": { 5 + "conditions": { 6 + "items": [ 7 + { 8 + "items": "infinity:book_box" 9 + } 10 + ] 11 + }, 12 + "trigger": "minecraft:inventory_changed" 13 + }, 14 + "has_the_recipe": { 15 + "conditions": { 16 + "recipe": "infinity:altar" 17 + }, 18 + "trigger": "minecraft:recipe_unlocked" 19 + } 20 + }, 21 + "requirements": [ 22 + [ 23 + "has_the_recipe", 24 + "has_book_box" 25 + ] 26 + ], 27 + "rewards": { 28 + "recipes": [ 29 + "infinity:altar" 30 + ] 31 + } 32 + }
+20
versions/1.21.8-neoforge/src/main/generated/data/infinity/loot_table/blocks/ant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:ant" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-neoforge/src/main/generated/data/infinity/loot_table/blocks/book_box.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:book_box" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-neoforge/src/main/generated/data/infinity/loot_table/blocks/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cosmic_altar" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-neoforge/src/main/generated/data/infinity/loot_table/blocks/cursor.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:cursor" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-neoforge/src/main/generated/data/infinity/loot_table/blocks/iridescent_carpet.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_carpet" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-neoforge/src/main/generated/data/infinity/loot_table/blocks/iridescent_kelp.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-neoforge/src/main/generated/data/infinity/loot_table/blocks/iridescent_kelp_plant.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "minecraft:kelp" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-neoforge/src/main/generated/data/infinity/loot_table/blocks/iridescent_wool.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:iridescent_wool" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+20
versions/1.21.8-neoforge/src/main/generated/data/infinity/loot_table/blocks/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:block", 3 + "pools": [ 4 + { 5 + "bonus_rolls": 0.0, 6 + "conditions": [ 7 + { 8 + "condition": "minecraft:survives_explosion" 9 + } 10 + ], 11 + "entries": [ 12 + { 13 + "type": "minecraft:item", 14 + "name": "infinity:netherite_stairs" 15 + } 16 + ], 17 + "rolls": 1.0 18 + } 19 + ] 20 + }
+17
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "redstone", 4 + "key": { 5 + "B": "infinity:book_box", 6 + "S": "minecraft:stone_slab" 7 + }, 8 + "pattern": [ 9 + "SSS", 10 + " B ", 11 + " S " 12 + ], 13 + "result": { 14 + "count": 1, 15 + "id": "infinity:altar" 16 + } 17 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/altar_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "minecraft:lectern", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:altar" 8 + } 9 + }
+18
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/ant.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": "minecraft:black_concrete", 6 + "M": "infinity:star_of_lang", 7 + "W": "minecraft:white_concrete" 8 + }, 9 + "pattern": [ 10 + "WBW", 11 + "BMB", 12 + "WBW" 13 + ], 14 + "result": { 15 + "count": 1, 16 + "id": "infinity:ant" 17 + } 18 + }
+17
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/ant1.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": "infinity:black_matter", 6 + "W": "infinity:white_matter" 7 + }, 8 + "pattern": [ 9 + "WBW", 10 + "B B", 11 + "WBW" 12 + ], 13 + "result": { 14 + "count": 1, 15 + "id": "infinity:ant" 16 + } 17 + }
+4
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/biome_bottle_combining.json
···
··· 1 + { 2 + "type": "infinity:biome_bottle_combining", 3 + "category": "misc" 4 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/biome_bottle_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "minecraft:glass_bottle", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:biome_bottle" 8 + } 9 + }
+16
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/black_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": "minecraft:black_concrete" 6 + }, 7 + "pattern": [ 8 + "BBB", 9 + "B B", 10 + "BBB" 11 + ], 12 + "result": { 13 + "count": 1, 14 + "id": "infinity:black_matter" 15 + } 16 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/book_box_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "minecraft:bookshelf", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:book_box" 8 + } 9 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/chromatic_carpet_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "#minecraft:wool_carpets", 4 + "lore": "recipe_info.portal.infinity.color", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:chromatic_carpet" 8 + } 9 + }
+4
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/chromatic_carpet_from_wool.json
···
··· 1 + { 2 + "type": "infinity:chroma_carpet", 3 + "category": "misc" 4 + }
+8
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/chromatic_coloring_carpet.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": "#minecraft:wool_carpets", 4 + "output": { 5 + "count": 1, 6 + "id": "infinity:chromatic_carpet" 7 + } 8 + }
+8
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/chromatic_coloring_wool.json
···
··· 1 + { 2 + "type": "infinity:chromatic_coloring", 3 + "input": "#minecraft:wool", 4 + "output": { 5 + "count": 1, 6 + "id": "infinity:chromatic_wool" 7 + } 8 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/chromatic_matter.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "#infinity:matter", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:chromatic_matter" 8 + } 9 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/chromatic_matter_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": "infinity:chromatic_matter", 4 + "lore": "recipe_info.iridescence.infinity.chromatic_matter", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:chromatic_matter" 8 + } 9 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/chromatic_wool.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "#minecraft:wool", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:chromatic_wool" 8 + } 9 + }
+18
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/cosmic_altar.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "A": "infinity:altar", 6 + "L": "minecraft:lodestone", 7 + "S": "infinity:iridescent_star" 8 + }, 9 + "pattern": [ 10 + "LAL", 11 + "ASA", 12 + "LAL" 13 + ], 14 + "result": { 15 + "count": 1, 16 + "id": "infinity:cosmic_altar" 17 + } 18 + }
+18
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/cursor.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": "minecraft:black_concrete", 6 + "L": "minecraft:lime_concrete", 7 + "S": "infinity:star_of_lang" 8 + }, 9 + "pattern": [ 10 + "BLB", 11 + "LSL", 12 + "BLB" 13 + ], 14 + "result": { 15 + "count": 8, 16 + "id": "infinity:cursor" 17 + } 18 + }
+17
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/f4.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "O": "minecraft:obsidian", 6 + "S": "infinity:iridescent_star" 7 + }, 8 + "pattern": [ 9 + "OOO", 10 + "OSO", 11 + "OOO" 12 + ], 13 + "result": { 14 + "count": 1, 15 + "id": "infinity:f4" 16 + } 17 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/f4_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "infinity:f4", 4 + "lore": "recipe_info.portal.infinity.attuned", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:f4" 8 + } 9 + }
+4
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/f4_recharging.json
···
··· 1 + { 2 + "type": "infinity:f4_recharging", 3 + "category": "misc" 4 + }
+17
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/fine_item.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "G": "minecraft:grass_block", 6 + "S": "infinity:star_of_lang" 7 + }, 8 + "pattern": [ 9 + "GGG", 10 + "GSG", 11 + "GGG" 12 + ], 13 + "result": { 14 + "count": 1, 15 + "id": "infinity:fine_item" 16 + } 17 + }
+16
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/footprint.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "P": "minecraft:light_gray_stained_glass_pane" 6 + }, 7 + "pattern": [ 8 + "PPP", 9 + "P P", 10 + "PPP" 11 + ], 12 + "result": { 13 + "count": 8, 14 + "id": "infinity:footprint" 15 + } 16 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/iridescence_bottle_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "infinity:chromatic_potion", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:iridescent_potion" 8 + } 9 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/iridescent_carpet.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": "infinity:chromatic_carpet", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:iridescent_carpet" 8 + } 9 + }
+14
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/iridescent_carpet_from_wool.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "B": "infinity:iridescent_wool" 6 + }, 7 + "pattern": [ 8 + "BB" 9 + ], 10 + "result": { 11 + "count": 3, 12 + "id": "infinity:iridescent_carpet" 13 + } 14 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/iridescent_star.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": "infinity:star_of_lang", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:iridescent_star" 8 + } 9 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/iridescent_wool.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": "infinity:chromatic_wool", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:iridescent_wool" 8 + } 9 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/key_from_iridescence.json
···
··· 1 + { 2 + "type": "infinity:collision_iridescence", 3 + "input": "infinity:key", 4 + "lore": "recipe_info.iridescence.infinity.key", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:key" 8 + } 9 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/key_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "minecraft:amethyst_shard", 4 + "lore": "recipe_info.portal.infinity.attuned", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:key" 8 + } 9 + }
+8
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/netherite_block_from_netherite_slab_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "ingredient": "infinity:netherite_slab", 4 + "result": { 5 + "count": 2, 6 + "id": "minecraft:netherite_block" 7 + } 8 + }
+8
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/netherite_block_from_netherite_stairs_stonecutting.json
···
··· 1 + { 2 + "type": "minecraft:stonecutting", 3 + "ingredient": "infinity:netherite_stairs", 4 + "result": { 5 + "count": 1, 6 + "id": "minecraft:netherite_block" 7 + } 8 + }
+14
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/netherite_slab.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": "minecraft:netherite_block" 6 + }, 7 + "pattern": [ 8 + "###" 9 + ], 10 + "result": { 11 + "count": 6, 12 + "id": "infinity:netherite_slab" 13 + } 14 + }
+16
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/netherite_stairs.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "building", 4 + "key": { 5 + "#": "minecraft:netherite_block" 6 + }, 7 + "pattern": [ 8 + "# ", 9 + "## ", 10 + "###" 11 + ], 12 + "result": { 13 + "count": 4, 14 + "id": "infinity:netherite_stairs" 15 + } 16 + }
+9
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/timebomb_from_portal.json
···
··· 1 + { 2 + "type": "infinity:collision_portal", 3 + "input": "minecraft:tnt", 4 + "lore": "empty", 5 + "output": { 6 + "count": 1, 7 + "id": "infinity:timebomb" 8 + } 9 + }
+16
versions/1.21.8-neoforge/src/main/generated/data/infinity/recipe/white_matter.json
···
··· 1 + { 2 + "type": "minecraft:crafting_shaped", 3 + "category": "misc", 4 + "key": { 5 + "B": "minecraft:white_concrete" 6 + }, 7 + "pattern": [ 8 + "BBB", 9 + "B B", 10 + "BBB" 11 + ], 12 + "result": { 13 + "count": 1, 14 + "id": "infinity:white_matter" 15 + } 16 + }
+8
versions/1.21.8-neoforge/src/main/generated/data/infinity/tags/block/iridescent.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:iridescent_carpet", 5 + "infinity:iridescence", 6 + "infinity:cosmic_altar" 7 + ] 8 + }
+11
versions/1.21.8-neoforge/src/main/generated/data/infinity/tags/item/iridescent.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:iridescent_carpet", 5 + "infinity:iridescence_bucket", 6 + "infinity:iridescent_star", 7 + "infinity:iridescent_potion", 8 + "infinity:chromatic_potion", 9 + "infinity:cosmic_altar" 10 + ] 11 + }
+7
versions/1.21.8-neoforge/src/main/generated/data/infinity/tags/item/matter.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:black_matter", 4 + "infinity:chromatic_matter", 5 + "infinity:white_matter" 6 + ] 7 + }
+5
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/block/mineable/axe.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:book_box" 4 + ] 5 + }
+11
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/block/mineable/pickaxe.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:altar", 4 + "infinity:cursor", 5 + "infinity:netherite_slab", 6 + "infinity:netherite_stairs", 7 + "infinity:biome_bottle", 8 + "infinity:ant", 9 + "infinity:cosmic_altar" 10 + ] 11 + }
+5
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/block/portals.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:neither_portal" 4 + ] 5 + }
+5
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/block/slabs.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:netherite_slab" 4 + ] 5 + }
+5
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/block/stairs.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:netherite_stairs" 4 + ] 5 + }
+6
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/block/wool.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:chromatic_wool" 5 + ] 6 + }
+6
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/block/wool_carpets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_carpet", 4 + "infinity:chromatic_carpet" 5 + ] 6 + }
+5
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/entity_type/arthropod.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:ant" 4 + ] 5 + }
+5
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/entity_type/frog_food.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:chaos_slime" 4 + ] 5 + }
+5
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/entity_type/skeletons.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:chaos_skeleton" 4 + ] 5 + }
+6
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/fluid/water.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:flowing_iridescence", 4 + "infinity:iridescence" 5 + ] 6 + }
+6
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/item/wool.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_wool", 4 + "infinity:chromatic_wool" 5 + ] 6 + }
+6
versions/1.21.8-neoforge/src/main/generated/data/minecraft/tags/item/wool_carpets.json
···
··· 1 + { 2 + "values": [ 3 + "infinity:iridescent_carpet", 4 + "infinity:chromatic_carpet" 5 + ] 6 + }