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

chroma matter in iridescence

Lera f45d6a03 7479964f

+64 -38
+1 -1
common/src/main/java/net/lerariemann/infinity/block/custom/InfinityPortalBlock.java
··· 160 160 MinecraftServer server = world.getServer(); 161 161 if (entity instanceof ItemEntity e) { 162 162 ModItemFunctions.checkCollisionRecipes(world, e, ModItemFunctions.PORTAL_CRAFTING_TYPE.get(), 163 - item -> PortalDataHolder.addPortalComponents(item, e.getStack(), ipbe)); 163 + item -> PortalDataHolder.addPortalComponents(item, ipbe)); 164 164 InfinityMod.provider.getPortalKeyAsItem().ifPresent(item -> { //opening a portal by tossing a key in 165 165 if (e.getStack().isOf(item)) { 166 166 InfinityPortal.tryUpdateOpenStatus(ipbe, world, pos, server);
+4 -3
common/src/main/java/net/lerariemann/infinity/iridescence/Iridescence.java
··· 16 16 import net.lerariemann.infinity.util.core.RandomProvider; 17 17 import net.lerariemann.infinity.util.loading.ShaderLoader; 18 18 import net.lerariemann.infinity.util.teleport.WarpLogic; 19 + import net.lerariemann.infinity.util.var.ColorLogic; 19 20 import net.minecraft.block.Block; 20 21 import net.minecraft.entity.EntityType; 21 22 import net.minecraft.entity.LivingEntity; ··· 43 44 import net.minecraft.world.biome.Biome; 44 45 import org.jetbrains.annotations.Nullable; 45 46 46 - import java.awt.Color; 47 47 import java.nio.file.Files; 48 48 import java.nio.file.Path; 49 49 import java.time.LocalTime; ··· 77 77 } 78 78 79 79 static int getPosBasedColor(BlockPos pos) { 80 - return Color.HSBtoRGB((float)InfinityMethods.sample(pos), 1.0F, 1.0F) & 0xFFFFFF; 80 + return ColorLogic.getPureHue(InfinityMethods.sample(pos)); 81 81 } 82 + 82 83 //todo: figure out how minecraft offsets animations to sync this with irid items' textures' animation loops 83 84 static int getTimeBasedColor() { 84 85 long timeMS = LocalTime.now().toNanoOfDay() / 1000000; 85 86 int hue = (int)(timeMS % 24000); 86 - return Color.HSBtoRGB((float)(hue / 24000.0), 1.0f, 1.0f) & 0xFFFFFF; 87 + return ColorLogic.getPureHue(hue / 24000.0); 87 88 } 88 89 89 90 java.util.List<DyeColor> dyeColors = List.of(
+1 -1
common/src/main/java/net/lerariemann/infinity/iridescence/IridescenceLiquidBlock.java
··· 32 32 if (!Iridescence.isIridescentItem(item.getStack()) && item.getOwner() instanceof LivingEntity le && 33 33 !Iridescence.getPhase(le).equals(Iridescence.Phase.INITIAL)) 34 34 ModItemFunctions.checkCollisionRecipes(w, item, ModItemFunctions.IRIDESCENCE_CRAFTING_TYPE.get(), 35 - PortalDataHolder::addIridComponents); 35 + i -> PortalDataHolder.getIridComponents(i, item)); 36 36 } 37 37 default -> {} 38 38 }
+20 -8
common/src/main/java/net/lerariemann/infinity/item/ChromaticItem.java
··· 6 6 import net.lerariemann.infinity.registry.core.ModBlocks; 7 7 import net.lerariemann.infinity.registry.core.ModComponentTypes; 8 8 import net.lerariemann.infinity.registry.var.ModTags; 9 + import net.lerariemann.infinity.util.InfinityMethods; 9 10 import net.lerariemann.infinity.util.var.ColorLogic; 10 11 import net.minecraft.block.BlockState; 11 12 import net.minecraft.component.ComponentChanges; 13 + import net.minecraft.entity.ItemEntity; 12 14 import net.minecraft.entity.player.PlayerEntity; 13 15 import net.minecraft.item.Item; 14 16 import net.minecraft.item.ItemStack; ··· 18 20 import net.minecraft.util.DyeColor; 19 21 import net.minecraft.util.Hand; 20 22 import net.minecraft.util.math.BlockPos; 23 + import net.minecraft.util.math.Vec3d; 21 24 import net.minecraft.world.World; 22 25 23 - import java.awt.*; 26 + import java.util.Optional; 24 27 import java.util.concurrent.atomic.AtomicBoolean; 25 28 26 29 public class ChromaticItem extends Item implements PortalDataHolder { ··· 28 31 super(settings); 29 32 } 30 33 @Override 31 - public ComponentChanges.Builder getPortalComponents(InfinityPortalBlockEntity ipbe) { 32 - return ComponentChanges.builder() 33 - .add(ModComponentTypes.COLOR.get(), ipbe.getPortalColor()) 34 - .remove(ModComponentTypes.DYE_COLOR.get()) 35 - .remove(ModComponentTypes.HUE.get()); 34 + public ComponentChanges getPortalComponents(InfinityPortalBlockEntity ipbe) { 35 + return ofColor(ipbe.getPortalColor()); 36 36 } 37 37 @Override 38 + public Optional<ComponentChanges> getIridComponents(ItemEntity entity) { 39 + Vec3d pos = entity.getPos(); 40 + int hue = (int)(360*InfinityMethods.sampler.sample(pos.x, pos.y, pos.z)); 41 + return Optional.of(ofHue(hue)); 42 + } 43 + 44 + @Override 38 45 public ItemStack getStack() { 39 46 return getDefaultStack(); 40 47 } ··· 52 59 } 53 60 static ComponentChanges ofHue(int hue) { 54 61 return ComponentChanges.builder() 55 - .add(ModComponentTypes.COLOR.get(), Color.HSBtoRGB(hue/360f, 1.0f, 1.0f) & 0xFFFFFF) 62 + .add(ModComponentTypes.COLOR.get(), ColorLogic.getPureHue(hue/360f)) 56 63 .remove(ModComponentTypes.DYE_COLOR.get()) 57 64 .add(ModComponentTypes.HUE.get(), hue) 58 65 .build(); ··· 99 106 else return false; 100 107 } 101 108 if (i > 0) { 102 - if (i != currColor) newStack.applyChanges(ofColor(i)); 109 + int currHue = currStack.getOrDefault(ModComponentTypes.HUE.get(), -1); 110 + if (currHue > 0) { 111 + if (ColorLogic.matchesPureHue(i, currHue)) return false; 112 + newStack.applyChanges(ofColor(i)); 113 + } 114 + else if (i != currColor) newStack.applyChanges(ofColor(i)); 103 115 else return false; 104 116 } 105 117 player.setStackInHand(hand, newStack);
+13 -15
common/src/main/java/net/lerariemann/infinity/item/PortalDataHolder.java
··· 4 4 import net.lerariemann.infinity.registry.core.ModComponentTypes; 5 5 import net.lerariemann.infinity.util.InfinityMethods; 6 6 import net.minecraft.component.ComponentChanges; 7 + import net.minecraft.entity.ItemEntity; 7 8 import net.minecraft.item.Item; 8 9 import net.minecraft.item.ItemStack; 9 10 import net.minecraft.util.Identifier; ··· 27 28 return (isDestinationRandom(id)) ? InfinityMethods.getRandomId(world.random) : id; 28 29 } 29 30 30 - static Optional<ComponentChanges> addPortalComponents(Item item, ItemStack oldStack, InfinityPortalBlockEntity ipbe) { 31 + static Optional<ComponentChanges> addPortalComponents(Item item, InfinityPortalBlockEntity ipbe) { 31 32 if (item instanceof PortalDataHolder pdh) 32 - return Optional.of(pdh.addPortalComponents(oldStack, ipbe)); 33 + return Optional.of(pdh.getPortalComponents(ipbe)); 33 34 return Optional.empty(); 34 35 } 35 - 36 - default ComponentChanges addPortalComponents(ItemStack oldStack, InfinityPortalBlockEntity ipbe) { 37 - return getPortalComponents(ipbe).build(); 38 - } 39 - 40 - default ComponentChanges.Builder getPortalComponents(InfinityPortalBlockEntity ipbe) { 36 + default ComponentChanges getPortalComponents(InfinityPortalBlockEntity ipbe) { 41 37 return ComponentChanges.builder() 42 - .add(ModComponentTypes.COLOR.get(), ipbe.getPortalColor()); 38 + .add(ModComponentTypes.COLOR.get(), ipbe.getPortalColor()) 39 + .build(); 43 40 } 44 41 45 - static Optional<ComponentChanges> addIridComponents(Item item) { 42 + static Optional<ComponentChanges> getIridComponents(Item item, ItemEntity entity) { 46 43 if (item instanceof PortalDataHolder pdh) 47 - return pdh.addIridComponents(); 44 + return pdh.getIridComponents(entity); 48 45 return Optional.empty(); 49 46 } 50 - default Optional<ComponentChanges> addIridComponents() { 47 + default Optional<ComponentChanges> getIridComponents(ItemEntity entity) { 51 48 return Optional.empty(); 52 49 } 53 50 54 51 default ItemStack withPortalData(InfinityPortalBlockEntity ipbe) { 55 52 ItemStack stack = getStack(); 56 - stack.applyChanges(addPortalComponents(stack, ipbe)); 53 + stack.applyChanges(getPortalComponents(ipbe)); 57 54 return stack; 58 55 } 59 56 ··· 61 58 62 59 interface Destinable extends PortalDataHolder { 63 60 @Override 64 - default ComponentChanges.Builder getPortalComponents(InfinityPortalBlockEntity ipbe) { 61 + default ComponentChanges getPortalComponents(InfinityPortalBlockEntity ipbe) { 65 62 return ComponentChanges.builder() 66 63 .add(ModComponentTypes.DESTINATION.get(), ipbe.getDimension()) 67 - .add(ModComponentTypes.COLOR.get(), ipbe.getPortalColor()); 64 + .add(ModComponentTypes.COLOR.get(), ipbe.getPortalColor()) 65 + .build(); 68 66 } 69 67 } 70 68 }
+5 -3
common/src/main/java/net/lerariemann/infinity/item/TransfiniteKeyItem.java
··· 5 5 import net.lerariemann.infinity.registry.core.ModComponentTypes; 6 6 import net.lerariemann.infinity.util.InfinityMethods; 7 7 import net.minecraft.component.ComponentChanges; 8 + import net.minecraft.entity.ItemEntity; 8 9 import net.minecraft.item.Item; 9 10 import net.minecraft.item.ItemStack; 10 11 import net.minecraft.item.tooltip.TooltipType; ··· 26 27 } 27 28 28 29 @Override 29 - public ComponentChanges.Builder getPortalComponents(InfinityPortalBlockEntity ipbe) { 30 + public ComponentChanges getPortalComponents(InfinityPortalBlockEntity ipbe) { 30 31 Identifier id = ipbe.getDimension(); 31 32 int color = (ipbe.getWorld() instanceof ServerWorld w) ? 32 33 PortalColorApplier.of(id, w.getServer()).apply(BlockPos.ORIGIN) : 33 34 (int)InfinityMethods.getNumericFromId(id); 34 35 return ComponentChanges.builder() 35 36 .add(ModComponentTypes.DESTINATION.get(), id) 36 - .add(ModComponentTypes.COLOR.get(), color & 0xFFFFFF); 37 + .add(ModComponentTypes.COLOR.get(), color & 0xFFFFFF) 38 + .build(); 37 39 } 38 40 39 41 @Override 40 - public Optional<ComponentChanges> addIridComponents() { 42 + public Optional<ComponentChanges> getIridComponents(ItemEntity entity) { 41 43 return Optional.of(ComponentChanges.builder() 42 44 .remove(ModComponentTypes.DESTINATION.get()) 43 45 .remove(ModComponentTypes.COLOR.get())
+3 -7
common/src/main/java/net/lerariemann/infinity/registry/core/ModItemFunctions.java
··· 48 48 public static final DeferredRegister<RecipeType<?>> RECIPE_TYPES = 49 49 DeferredRegister.create(MOD_ID, RegistryKeys.RECIPE_TYPE); 50 50 51 - 52 51 public static RegistrySupplier<LootFunctionType<SetLevelLootFunction>> SET_BIOME_BOTTLE_LEVEL = 53 52 LOOT_FUNCTION_TYPES.register("set_biome_bottle_level", () -> new LootFunctionType<>(SetLevelLootFunction.CODEC)); 54 53 public static RegistrySupplier<LootFunctionType<SetAltarStateLootFunction>> SET_ALTAR_STATE = 55 54 LOOT_FUNCTION_TYPES.register("set_altar_state", () -> new LootFunctionType<>(SetAltarStateLootFunction.CODEC)); 56 55 56 + //special recipe serializers 57 57 public static RegistrySupplier<RecipeSerializer<BiomeBottleCombiningRecipe>> BIOME_BOTTLE_COMBINING = 58 58 RECIPE_SERIALIZERS.register("biome_bottle_combining", () -> 59 59 new SpecialRecipeSerializer<>(BiomeBottleCombiningRecipe::new)); ··· 63 63 public static RegistrySupplier<RecipeSerializer<ChromaCarpetRecipe>> CARPET = 64 64 RECIPE_SERIALIZERS.register("chroma_carpet", () -> 65 65 new SpecialRecipeSerializer<>(ChromaCarpetRecipe::new)); 66 - 66 + //regular recipe serializers 67 67 public static RegistrySupplier<RecipeSerializer<ChromaticColoringRecipe>> CHROMATIC_COLORING = 68 68 RECIPE_SERIALIZERS.register("chromatic_coloring", () -> 69 69 new ChromaticColoringRecipe.Serializer(ChromaticColoringRecipe::new)); ··· 73 73 public static RegistrySupplier<RecipeSerializer<CollisionCraftingRecipe>> IRIDESCENCE_CRAFTING = 74 74 RECIPE_SERIALIZERS.register("collision_iridescence", () -> 75 75 new CollisionCraftingRecipe.Serializer(CollisionCraftingRecipe.OfIridescence::new)); 76 - 76 + //recipe types 77 77 public static RegistrySupplier<RecipeType<CollisionCraftingRecipe>> PORTAL_CRAFTING_TYPE = 78 78 RECIPE_TYPES.register("collision_portal", () -> CollisionCraftingRecipe.Type.PORTAL); 79 79 public static RegistrySupplier<RecipeType<CollisionCraftingRecipe>> IRIDESCENCE_CRAFTING_TYPE = ··· 149 149 int charge = BiomeBottleBlock.getCharge(stack); 150 150 return Math.clamp(charge / 1000.0f, 0f, 1f); 151 151 }); 152 - ItemPropertiesRegistry.register(ModItems.IRIDESCENT_CARPET.get(), InfinityMethods.getId("iridescent"), 153 - ModItemFunctions::iridPredicate); 154 - ItemPropertiesRegistry.register(ModItems.IRIDESCENT_WOOL.get(), InfinityMethods.getId("iridescent"), 155 - ModItemFunctions::iridPredicate); 156 152 ItemPropertiesRegistry.register(ModItems.F4.get(), InfinityMethods.getId("f4"), 157 153 (stack, world, entity, seed) -> { 158 154 Identifier id = ModItems.F4.get().getDestination(stack);
+6
common/src/main/java/net/lerariemann/infinity/util/var/ColorLogic.java
··· 36 36 return chromaticColors.getOrDefault(dye.getName(), 0xFFFFFF); 37 37 } 38 38 39 + static int getPureHue(double hue) { 40 + return getPureHue((float)hue); 41 + } 42 + static int getPureHue(float hue) { 43 + return Color.HSBtoRGB(hue, 1.0F, 1.0F) & 0xFFFFFF; 44 + } 39 45 static boolean matchesPureHue(int rgb, int pureHue) { 40 46 Color c = new Color(rgb); 41 47 float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null);
+1
common/src/main/resources/assets/infinity/lang/en_us.json
··· 140 140 "recipe_info.portal.infinity.color": "The item inherits its color from the portal", 141 141 "recipe_info.portal.infinity.attuned": "The item is attuned to the portal used", 142 142 "recipe_info.iridescence.infinity.key": "No matter the key provided, a random one is born", 143 + "recipe_info.iridescence.infinity.chromatic_matter": "Gets drenched with the liquid's hue", 143 144 "stat.infinity.portals_opened_stat": "Infinity portals opened", 144 145 "stat.infinity.dimensions_opened_stat": "Unique dimensions discovered", 145 146 "stat.infinity.worlds_destroyed_stat": "Unique dimensions destroyed",
+10
common/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 + }