package com.thebrokenrail.energonrelics.client.rei.infuser; import com.thebrokenrail.energonrelics.EnergonRelics; import com.thebrokenrail.energonrelics.registry.infuser.data.InfuserEntry; import com.thebrokenrail.energonrelics.registry.infuser.data.InfuserOutputItem; import com.thebrokenrail.energonrelics.registry.infuser.InfuserRegistry; import com.thebrokenrail.energonrelics.client.rei.EnergonRelicsPlugin; import com.thebrokenrail.energonrelics.config.HardcodedConfig; import com.thebrokenrail.energonrelics.util.BooleanIterator; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeCategory; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.widgets.Widgets; import me.shedaniel.rei.gui.widget.Widget; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.resource.language.I18n; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; @Environment(EnvType.CLIENT) public class InfuserCategory implements RecipeCategory { @Override public List setupDisplay(InfuserDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); List widgets = new ArrayList<>(); widgets.add(Widgets.createRecipeBase(bounds)); widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width / 2, bounds.y + 9), new TranslatableText("category.rei." + EnergonRelics.NAMESPACE + ".infusing.chance", new DecimalFormat("###.##").format(display.successChance * 100d))).noShadow().centered().color(0xFF404040, 0xFFBBBBBB)); widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width / 2, bounds.y + 18), new TranslatableText("category.rei." + EnergonRelics.NAMESPACE + ".infusing.cost", display.cost)).noShadow().centered().color(0xFF404040, 0xFFBBBBBB)); widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 25)).animationDurationTicks(HardcodedConfig.INFUSER_TIME)); widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 26)).entries(display.getInputEntries().get(0)).markInput()); int outputX = startPoint.x + 61; int outputY = startPoint.y + 26; if (display.outputsItem) { widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 26))); widgets.add(Widgets.createSlot(new Point(outputX, outputY)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); } else { Identifier outputID = Registry.ITEM.getId(display.output.getItem()); Text text = new TranslatableText("category.rei." + EnergonRelics.NAMESPACE + ".infusing.display_item." + outputID.getNamespace() + "." + outputID.getPath()); widgets.add(Widgets.createLabel(new Point(outputX - 7, outputY + 3), text).noShadow().leftAligned().color(0xFF404040, 0xFFBBBBBB)); } return widgets; } @Override public int getDisplayHeight() { return 66; } @Override public Identifier getIdentifier() { return EnergonRelicsPlugin.INFUSING; } @Override public EntryStack getLogo() { return EntryStack.create(EnergonRelics.INFUSER_BLOCK); } @Override public String getCategoryName() { return I18n.translate("category.rei." + EnergonRelics.NAMESPACE + ".infusing.name"); } public static void register(RecipeHelper recipeHelper) { for (Map.Entry entry : InfuserRegistry.entrySet()) { BooleanIterator.run(isFail -> { List list = entry.getValue().getOutputItems(isFail); for (InfuserOutputItem item : list) { recipeHelper.registerDisplay(new InfuserDisplay(new ItemStack(entry.getKey()), item, entry.getValue().getSingleChance(isFail), entry.getValue().cost)); } }); } } }