Multiblock testing, JEI support, Alloying Recipe type

This commit is contained in:
XevianLight
2026-01-17 22:07:49 -07:00
parent 28639dae81
commit 557c2761a7
46 changed files with 988 additions and 121 deletions

View File

@@ -0,0 +1,43 @@
package net.xevianlight.aphelion.compat;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.BlastingRecipe;
import net.minecraft.world.item.crafting.Ingredient;
import net.xevianlight.aphelion.recipe.ElectricArcFurnaceRecipe;
import org.jetbrains.annotations.Nullable;
public record ElectricArcFurnaceJeiRecipe (
Ingredient base,
int baseCount,
@Nullable Ingredient alloy,
int secondaryCount,
ItemStack result,
int cookTime
){
public boolean isAlloying() {
return alloy != null;
}
public static ElectricArcFurnaceJeiRecipe fromAlloying(ElectricArcFurnaceRecipe r) {
return new ElectricArcFurnaceJeiRecipe(
r.base(),
r.baseCount(),
r.alloy(),
r.alloyCount(),
r.getResultItem(null),
r.cookTime()
);
}
public static ElectricArcFurnaceJeiRecipe fromBlasting(BlastingRecipe r) {
Ingredient in = r.getIngredients().get(0);
return new ElectricArcFurnaceJeiRecipe(
in,
1,
null,
1,
r.getResultItem(null),
r.getCookingTime()
);
}
}

View File

@@ -0,0 +1,96 @@
package net.xevianlight.aphelion.compat;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.builder.IRecipeLayoutBuilder;
import mezz.jei.api.gui.drawable.IDrawable;
import mezz.jei.api.gui.drawable.IDrawableAnimated;
import mezz.jei.api.gui.drawable.IDrawableStatic;
import mezz.jei.api.gui.ingredient.IRecipeSlotsView;
import mezz.jei.api.helpers.IGuiHelper;
import mezz.jei.api.recipe.IFocusGroup;
import mezz.jei.api.recipe.RecipeIngredientRole;
import mezz.jei.api.recipe.RecipeType;
import mezz.jei.api.recipe.category.IRecipeCategory;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.xevianlight.aphelion.Aphelion;
import net.xevianlight.aphelion.core.init.ModBlocks;
import net.xevianlight.aphelion.recipe.ElectricArcFurnaceRecipe;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class ElectricArcFurnaceRecipeCategory implements IRecipeCategory<ElectricArcFurnaceJeiRecipe> {
private final Int2ObjectMap<IDrawableAnimated> arrows = new Int2ObjectOpenHashMap<>();
private final Int2ObjectMap<IDrawableAnimated> energyBars = new Int2ObjectOpenHashMap<>();
private final IGuiHelper helper;
public static final ResourceLocation UID = ResourceLocation.fromNamespaceAndPath(Aphelion.MOD_ID, "alloying");
public static final ResourceLocation TEXTURE = ResourceLocation.fromNamespaceAndPath(Aphelion.MOD_ID,
"textures/gui/electric_arc_furnace/jei.png");
public static final RecipeType<ElectricArcFurnaceJeiRecipe> ELECTRIC_ARC_FURNACE_RECIPE_TYPE =
new RecipeType<>(UID, ElectricArcFurnaceJeiRecipe.class);
private final IDrawable background;
private final IDrawable icon;
public ElectricArcFurnaceRecipeCategory(IGuiHelper helper) {
this.helper = helper;
this.background = helper.createDrawable(TEXTURE, 0, 0, 176, 82);
this.icon = helper.createDrawableIngredient(VanillaTypes.ITEM_STACK, new ItemStack(ModBlocks.ELECTRIC_ARC_FURNACE.get()));
}
private IDrawableAnimated getArrow(int cookTime) {
return arrows.computeIfAbsent(cookTime, t -> {
IDrawableStatic arrowStatic = helper.createDrawable(TEXTURE, 176, 0, 24, 15);
return helper.createAnimatedDrawable(arrowStatic, t, IDrawableAnimated.StartDirection.LEFT, false);
});
}
private IDrawableAnimated getEnergyBar() {
return arrows.computeIfAbsent(200, t -> {
IDrawableStatic arrowStatic = helper.createDrawable(TEXTURE, 176, 15, 14, 42);
return helper.createAnimatedDrawable(arrowStatic, t, IDrawableAnimated.StartDirection.TOP, true);
});
}
@Override
public void draw(ElectricArcFurnaceJeiRecipe recipe, IRecipeSlotsView recipeSlotsView, GuiGraphics guiGraphics, double mouseX, double mouseY) {
getArrow(recipe.cookTime()).draw(guiGraphics, 89, 35);
getEnergyBar().draw(guiGraphics, 9, 9);
}
@Override
public RecipeType<ElectricArcFurnaceJeiRecipe> getRecipeType() {
return ELECTRIC_ARC_FURNACE_RECIPE_TYPE;
}
@Override
public Component getTitle() {
return Component.translatable("block.aphelion.electric_arc_furnace");
}
@Override
public @NotNull IDrawable getBackground() {
return background;
}
@Override
public @Nullable IDrawable getIcon() {
return icon;
}
@Override
public void setRecipe(IRecipeLayoutBuilder builder, ElectricArcFurnaceJeiRecipe recipe, IFocusGroup focuses) {
builder.addSlot(RecipeIngredientRole.INPUT, 63, 35).addIngredients(recipe.base());
if(recipe.alloy() != null) {
builder.addSlot(RecipeIngredientRole.INPUT, 40, 35).addIngredients(recipe.alloy());
}
builder.addSlot(RecipeIngredientRole.OUTPUT, 125, 35).addItemStack(recipe.result());
}
}

View File

@@ -0,0 +1,77 @@
package net.xevianlight.aphelion.compat;
import mezz.jei.api.IModPlugin;
import mezz.jei.api.JeiPlugin;
import mezz.jei.api.constants.RecipeTypes;
import mezz.jei.api.registration.IGuiHandlerRegistration;
import mezz.jei.api.registration.IRecipeCatalystRegistration;
import mezz.jei.api.registration.IRecipeCategoryRegistration;
import mezz.jei.api.registration.IRecipeRegistration;
import net.minecraft.client.Minecraft;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.RecipeHolder;
import net.minecraft.world.item.crafting.RecipeManager;
import net.minecraft.world.item.crafting.RecipeType;
import net.xevianlight.aphelion.Aphelion;
import net.xevianlight.aphelion.core.init.ModBlocks;
import net.xevianlight.aphelion.recipe.ElectricArcFurnaceRecipe;
import net.xevianlight.aphelion.recipe.ModRecipes;
import net.xevianlight.aphelion.screen.ElectricArcFurnaceScreen;
import java.util.ArrayList;
import java.util.List;
@JeiPlugin
public class JEIAphelionPlugin implements IModPlugin {
@Override
public ResourceLocation getPluginUid() {
return ResourceLocation.fromNamespaceAndPath(Aphelion.MOD_ID, "jei_plugin");
}
@Override
public void registerCategories(IRecipeCategoryRegistration registration) {
registration.addRecipeCategories(new ElectricArcFurnaceRecipeCategory(
registration.getJeiHelpers().getGuiHelper()
));
}
@Override
public void registerRecipes(IRecipeRegistration registration) {
var level = Minecraft.getInstance().level;
if (level == null) return;
RecipeManager recipeManager = level.getRecipeManager();
List<ElectricArcFurnaceJeiRecipe> recipes = new ArrayList<>();
for (var holder : recipeManager.getAllRecipesFor(ModRecipes.ELECTRIC_ARC_FURNACE_RECIPE_TYPE.get())) {
recipes.add(ElectricArcFurnaceJeiRecipe.fromAlloying(holder.value()));
}
for (var holder : recipeManager.getAllRecipesFor(RecipeType.BLASTING)) {
recipes.add(ElectricArcFurnaceJeiRecipe.fromBlasting(holder.value()));
}
// List<ElectricArcFurnaceRecipe> electricArcFurnaceRecipes = recipeManager
// .getAllRecipesFor(ModRecipes.ELECTRIC_ARC_FURNACE_RECIPE_TYPE.get()).stream().map(RecipeHolder::value).toList();
registration.addRecipes(ElectricArcFurnaceRecipeCategory.ELECTRIC_ARC_FURNACE_RECIPE_TYPE, recipes);
}
@Override
public void registerGuiHandlers(IGuiHandlerRegistration registration) {
registration.addRecipeClickArea(ElectricArcFurnaceScreen.class, 88, 35, 24, 16,
ElectricArcFurnaceRecipeCategory.ELECTRIC_ARC_FURNACE_RECIPE_TYPE);
}
@Override
public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) {
registration.addRecipeCatalyst(
new ItemStack(ModBlocks.ELECTRIC_ARC_FURNACE.get()), ElectricArcFurnaceRecipeCategory.ELECTRIC_ARC_FURNACE_RECIPE_TYPE
);
registration.addRecipeCatalyst(
new ItemStack(ModBlocks.ELECTRIC_ARC_FURNACE.get()),
RecipeTypes.BLASTING
);
}
}