Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
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*///?}