Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
at master 82 lines 3.3 kB view raw
1package net.lerariemann.infinity.compat.emi; 2 3//? if <1.21.2 { 4 5/*import dev.emi.emi.api.recipe.BasicEmiRecipe; 6import dev.emi.emi.api.stack.EmiIngredient; 7import dev.emi.emi.api.widget.WidgetHolder; 8import net.lerariemann.infinity.util.InfinityMethods; 9import net.lerariemann.infinity.util.var.ColorLogic; 10import net.minecraft.Util; 11import net.minecraft.network.chat.Component; 12import net.minecraft.network.chat.MutableComponent; 13import net.minecraft.network.chat.Style; 14import net.minecraft.resources.ResourceLocation; 15import net.minecraft.world.item.Item; 16import net.minecraft.world.item.crafting.Ingredient; 17import org.jspecify.annotations.Nullable; 18 19import java.awt.*; 20import java.util.*; 21 22public class ChromaticEmiRecipe extends BasicEmiRecipe { 23 ResourceLocation infoId; 24 25 public static ChromaticEmiRecipe of(String id, Item item) { 26 return new ChromaticEmiRecipe(InfinityMethods.getId("/"+id), item, null); 27 } 28 public static ChromaticEmiRecipe withInfo(String id, Item item) { 29 return new ChromaticEmiRecipe(InfinityMethods.getId("/"+id), item, InfinityMethods.getId(id)); 30 } 31 32 public ChromaticEmiRecipe(ResourceLocation id, Item item, @Nullable ResourceLocation infoId) { 33 super(EmiCompat.CHROMATIC, id, 140, 18); 34 this.inputs.add(EmiIngredient.of(Ingredient.of(item))); 35 this.infoId = infoId; 36 } 37 38 @Override 39 public void addWidgets(WidgetHolder widgets) { 40 widgets.addSlot(inputs.get(0), 0, 0); 41 MutableComponent text = Component.translatable(Util.makeDescriptionId("chromatic", this.id)); 42 Map<Integer, MutableComponent> chars = new HashMap<>(); 43 text.getVisualOrderText().accept((index, style, codepoint) -> { 44 chars.put(index, Component.literal(String.valueOf(Character.toChars(codepoint))).withStyle(style)); 45 return true; 46 }); 47 int len = chars.size(); 48 MutableComponent finalText = Component.empty(); 49 for (int i = 0; i < len; i++) { 50 MutableComponent ch = chars.get(i); 51 if (ch == null) continue; 52 finalText.append(ch.withStyle(Style.EMPTY.withColor(getCharColor(i, len)))); 53 } 54 if (infoId != null) 55 EmiCompat.addInfo(widgets, 128, 5, Component.translatable(Util.makeDescriptionId("recipe_info.chromatic", this.infoId))); 56 widgets.addText(finalText, 24, 5, 0xFFFFFF, false); 57 } 58 59 public int getCharColor(int chnum, int len) { 60 float hue = 0.7417f; 61 float saturation; 62 float brightness; 63 if (id.getPath().contains("hue")) { 64 hue = chnum / (float)len; 65 saturation = 1.0f; 66 brightness = 0.85f; 67 } 68 else if (id.getPath().contains("saturation")) { 69 saturation = 0.6157f * chnum / (float)len; 70 if (id.getPath().contains("minus")) saturation = 0.6157f - saturation; 71 brightness = 0.5f; 72 } 73 else if (id.getPath().contains("brightness")) { 74 brightness = 0.8588f * chnum / (float)len; 75 if (id.getPath().contains("minus")) brightness = 0.8588f - brightness; 76 saturation = 0.6157f; 77 } 78 else return ColorLogic.defaultChromatic; 79 return Color.HSBtoRGB(hue, saturation, brightness); 80 } 81} 82*///?}