Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -159,9 +159,11 @@ dependencies {

compileOnly fg.deobf("dev.architectury:architectury-forge:9.2.14")
compileOnly fg.deobf("me.shedaniel:RoughlyEnoughItems-forge:12.1.785")
compileOnly fg.deobf("me.shedaniel.cloth:cloth-config-forge:11.1.136")
if (enableREI) {
runtimeOnly fg.deobf("dev.architectury:architectury-forge:9.2.14")
runtimeOnly fg.deobf("me.shedaniel:RoughlyEnoughItems-forge:12.1.785")
runtimeOnly fg.deobf("me.shedaniel.cloth:cloth-config-forge:11.1.136")
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package com.rempler.exnihiloadditions.compat.rei;

import me.shedaniel.rei.api.client.plugins.REIClientPlugin;
import me.shedaniel.rei.api.client.registry.category.CategoryRegistry;
import me.shedaniel.rei.api.client.registry.display.DisplayRegistry;
import me.shedaniel.rei.api.common.util.EntryStacks;
import me.shedaniel.rei.forge.REIPluginClient;
import net.minecraft.world.item.Item;
import com.rempler.exnihiloadditions.compat.rei.compost.CompostRecipeCategory;
import com.rempler.exnihiloadditions.compat.rei.compost.CompostRecipeDisplay;
import com.rempler.exnihiloadditions.compat.rei.crushing.CrushingRecipeCategory;
import com.rempler.exnihiloadditions.compat.rei.crushing.CrushingRecipeDisplay;
import com.rempler.exnihiloadditions.compat.rei.harvest.HarvestRecipeCategory;
import com.rempler.exnihiloadditions.compat.rei.harvest.HarvestRecipeDisplay;
import com.rempler.exnihiloadditions.compat.rei.heat.HeatRecipeCategory;
import com.rempler.exnihiloadditions.compat.rei.heat.HeatRecipeDisplay;
import com.rempler.exnihiloadditions.compat.rei.melting.MeltingRecipeCategory;
import com.rempler.exnihiloadditions.compat.rei.melting.MeltingRecipeDisplay;
import com.rempler.exnihiloadditions.compat.rei.precipitate.PrecipitateRecipeCategory;
import com.rempler.exnihiloadditions.compat.rei.precipitate.PrecipitateRecipeDisplay;
import com.rempler.exnihiloadditions.compat.rei.sifting.SiftingRecipeCategory;
import com.rempler.exnihiloadditions.compat.rei.sifting.SiftingRecipeDisplay;
import com.rempler.exnihiloadditions.compat.rei.solidifying.SolidifyingRecipeCategory;
import com.rempler.exnihiloadditions.compat.rei.solidifying.SolidifyingRecipeDisplay;
import com.rempler.exnihiloadditions.compat.rei.transition.TransitionRecipeCategory;
import com.rempler.exnihiloadditions.compat.rei.transition.TransitionRecipeDisplay;
import novamachina.exnihilosequentia.world.item.EXNItems;
import novamachina.exnihilosequentia.world.item.crafting.CompostRecipe;
import novamachina.exnihilosequentia.world.item.crafting.CrushingRecipe;
import novamachina.exnihilosequentia.world.item.crafting.EXNRecipeTypes;
import novamachina.exnihilosequentia.world.item.crafting.HarvestRecipe;
import novamachina.exnihilosequentia.world.item.crafting.HeatRecipe;
import novamachina.exnihilosequentia.world.item.crafting.MeltingRecipe;
import novamachina.exnihilosequentia.world.item.crafting.PrecipitateRecipe;
import novamachina.exnihilosequentia.world.item.crafting.SiftingRecipe;
import novamachina.exnihilosequentia.world.item.crafting.SolidifyingRecipe;
import novamachina.exnihilosequentia.world.item.crafting.TransitionRecipe;
import novamachina.exnihilosequentia.world.level.block.EXNBlocks;
import novamachina.novacore.world.item.ItemDefinition;

//@REIPluginClient
public class EXAREIClientPlugin implements REIClientPlugin {

public void registerCategories(CategoryRegistry registry) {
registry.add(new CompostRecipeCategory());
registry.add(new CrushingRecipeCategory());
registry.add(new HarvestRecipeCategory());
registry.add(new HeatRecipeCategory());
registry.add(new MeltingRecipeCategory());
registry.add(new PrecipitateRecipeCategory());
registry.add(new SiftingRecipeCategory());
registry.add(new SolidifyingRecipeCategory());
registry.add(new TransitionRecipeCategory());

for (ItemDefinition<? extends Item> item : EXNBlocks.getDefinitions()) {
if (item.getEnglishName().toLowerCase().contains("barrel")) {
registry.addWorkstations(CompostRecipeCategory.COMPOSTING, EntryStacks.of(item));
registry.addWorkstations(PrecipitateRecipeCategory.PRECIPITATE, EntryStacks.of(item));
registry.addWorkstations(SolidifyingRecipeCategory.SOLIDIFY, EntryStacks.of(item));
registry.addWorkstations(TransitionRecipeCategory.TRANSITION, EntryStacks.of(item));
}
if (item.getEnglishName().toLowerCase().contains("crucible")) {
registry.addWorkstations(MeltingRecipeCategory.MELTING, EntryStacks.of(item));
registry.addWorkstations(HeatRecipeCategory.HEATING, EntryStacks.of(item));
}
if (item.getEnglishName().toLowerCase().contains("sieve")) {
registry.addWorkstations(SiftingRecipeCategory.SIFTING, EntryStacks.of(item));
}
}
for (ItemDefinition<? extends Item> item : EXNItems.getDefinitions()) {
if (item.getEnglishName().toLowerCase().contains("hammer")) {
registry.addWorkstations(CrushingRecipeCategory.CRUSHING, EntryStacks.of(item));
}
if (item.getEnglishName().toLowerCase().contains("crook")) {
registry.addWorkstations(HarvestRecipeCategory.HARVESTING, EntryStacks.of(item));
}
}
}

public void registerDisplays(DisplayRegistry registry) {
registry.registerRecipeFiller(CompostRecipe.class, EXNRecipeTypes.COMPOST, CompostRecipeDisplay::new);
registry.registerRecipeFiller(CrushingRecipe.class, EXNRecipeTypes.CRUSHING, CrushingRecipeDisplay::new);
registry.registerRecipeFiller(HarvestRecipe.class, EXNRecipeTypes.HARVEST, HarvestRecipeDisplay::new);
registry.registerRecipeFiller(HeatRecipe.class, EXNRecipeTypes.HEAT, HeatRecipeDisplay::new);
registry.registerRecipeFiller(MeltingRecipe.class, EXNRecipeTypes.MELTING, MeltingRecipeDisplay::new);
registry.registerRecipeFiller(PrecipitateRecipe.class, EXNRecipeTypes.PRECIPITATE, PrecipitateRecipeDisplay::new);
registry.registerRecipeFiller(SiftingRecipe.class, EXNRecipeTypes.SIFTING, SiftingRecipeDisplay::new);
registry.registerRecipeFiller(SolidifyingRecipe.class, EXNRecipeTypes.SOLIDIFYING, SolidifyingRecipeDisplay::new);
registry.registerRecipeFiller(TransitionRecipe.class, EXNRecipeTypes.TRANSITION, TransitionRecipeDisplay::new);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.rempler.exnihiloadditions.compat.rei;

import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
import me.shedaniel.rei.api.common.entry.EntryIngredient;

import java.util.List;

public abstract class SimpleBasicDisplay extends BasicDisplay {
public SimpleBasicDisplay(List<EntryIngredient> inputs, List<EntryIngredient> outputs) {
super(inputs, outputs);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package com.rempler.exnihiloadditions.compat.rei.compost;

import com.google.common.collect.Lists;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.client.gui.Renderer;
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.client.registry.display.DisplayCategory;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.util.EntryStacks;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import com.rempler.exnihiloadditions.compat.rei.SimpleBasicDisplay;
import novamachina.exnihilosequentia.common.Config;
import novamachina.exnihilosequentia.common.registries.ExNihiloRegistries;
import novamachina.exnihilosequentia.common.utility.ExNihiloConstants;
import novamachina.exnihilosequentia.world.item.crafting.CompostRecipe;
import novamachina.exnihilosequentia.world.level.block.EXNBlocks;

import javax.annotation.Nonnull;
import java.util.Arrays;
import java.util.List;

public class CompostRecipeCategory implements DisplayCategory<SimpleBasicDisplay> {

@Nonnull
public static final ResourceLocation UID =
new ResourceLocation(ExNihiloConstants.ModIds.EX_NIHILO_SEQUENTIA, "compost");

@Nonnull
private static final ResourceLocation texture =
new ResourceLocation(ExNihiloConstants.ModIds.EX_NIHILO_SEQUENTIA, "textures/gui/jei_mid.png");
public static final CategoryIdentifier<CompostRecipeDisplay> COMPOSTING = CategoryIdentifier.of(UID);

@Override
public CategoryIdentifier<? extends SimpleBasicDisplay> getCategoryIdentifier() {
return COMPOSTING;
}

@Nonnull
@Override
public Component getTitle() {
return Component.translatable("jei.category.compost");
}

@Override
public Renderer getIcon() {
return EntryStacks.of(EXNBlocks.OAK_BARREL);
}

@Override
public List<Widget> setupDisplay(SimpleBasicDisplay display, Rectangle bounds) {
final Point startPoint = new Point(bounds.getCenterX() - 83, bounds.getCenterY() - 27);
List<Widget> widgets = Lists.newArrayList();
widgets.add(Widgets.createTexturedWidget(texture, startPoint.x, startPoint.y, 0, 168, 166, 54));

EntryIngredient output = display.getOutputEntries().get(0);
for (CompostRecipe recipe : ExNihiloRegistries.COMPOST_REGISTRY.getRecipeList()) {
if (Arrays.stream(recipe.getInput().getItems()).toList().get(0).is(((ItemStack) display.getInputEntries().get(0).get(0).castValue()).getItem())) {
output.get(0).tooltip(Component.literal(String.format("Amount: %d / %d", recipe.getAmount(), Config.getBarrelMaxSolidAmount())));
}
}
widgets.add(Widgets.createSlot(new Point(startPoint.x + 3, startPoint.y + 21))
.entries(output).markOutput());

int rerolls = 1;
if (display.getInputEntries().size() > 21) {
rerolls = (int) Math.ceil(display.getInputEntries().size() / 21.0);
}
while (rerolls > 0) {
for (int xf = 0; xf < display.getInputEntries().size(); xf++) {
final int slotX = 39 + (xf % 7 * 18);
final int slotY = 3 + xf / 7 * 18;
widgets.add(Widgets.createSlot(new Point(startPoint.x + slotX, startPoint.y + slotY))
.entries(display.getInputEntries().get(xf)).tooltipsEnabled(true).markInput());
}
rerolls--;
}

return widgets;
}

@Override
public int getDisplayHeight() {
return 56;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.rempler.exnihiloadditions.compat.rei.compost;

import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.util.EntryIngredients;
import me.shedaniel.rei.api.common.util.EntryStacks;
import net.minecraft.world.item.Items;
import com.rempler.exnihiloadditions.compat.rei.SimpleBasicDisplay;
import novamachina.exnihilosequentia.world.item.crafting.CompostRecipe;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CompostRecipeDisplay extends SimpleBasicDisplay {
public CompostRecipeDisplay(CompostRecipe recipe) {
//TODO: should be changed if compost recipe will have different outputs!
super(getIngredients(recipe), Collections.singletonList(EntryIngredient.of(EntryStacks.of(Items.DIRT))));
}

private static List<EntryIngredient> getIngredients(CompostRecipe recipe) {
List<EntryIngredient> list = new ArrayList<>();
list.add(EntryIngredients.ofIngredient(recipe.getInput()));
return list;
}

@Override
public CategoryIdentifier<?> getCategoryIdentifier() {
return CompostRecipeCategory.COMPOSTING;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package com.rempler.exnihiloadditions.compat.rei.crushing;

import com.google.common.collect.Lists;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.client.gui.Renderer;
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.client.registry.display.DisplayCategory;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.util.EntryStacks;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import com.rempler.exnihiloadditions.compat.rei.SimpleBasicDisplay;
import novamachina.exnihilosequentia.common.registries.ExNihiloRegistries;
import novamachina.exnihilosequentia.common.utility.ExNihiloConstants;
import novamachina.exnihilosequentia.world.item.EXNItems;
import novamachina.exnihilosequentia.world.item.crafting.CrushingRecipe;
import novamachina.novacore.util.StringUtils;

import javax.annotation.Nonnull;
import java.util.List;

public class CrushingRecipeCategory implements DisplayCategory<SimpleBasicDisplay> {

@Nonnull
public static final ResourceLocation UID =
new ResourceLocation(ExNihiloConstants.ModIds.EX_NIHILO_SEQUENTIA, "crushing");

@Nonnull
private static final ResourceLocation texture =
new ResourceLocation(ExNihiloConstants.ModIds.EX_NIHILO_SEQUENTIA, "textures/gui/jei_mid.png");
public static final CategoryIdentifier<CrushingRecipeDisplay> CRUSHING = CategoryIdentifier.of(UID);

@Override
public CategoryIdentifier<? extends SimpleBasicDisplay> getCategoryIdentifier() {
return CRUSHING;
}

@Nonnull
@Override
public Component getTitle() {
return Component.translatable("jei.category.crushing");
}

@Override
public Renderer getIcon() {
return EntryStacks.of(EXNItems.HAMMER_WOOD);
}

@Override
public List<Widget> setupDisplay(SimpleBasicDisplay display, Rectangle bounds) {
final Point startPoint = new Point(bounds.getCenterX() - 83, bounds.getCenterY() - 27);
List<Widget> widgets = Lists.newArrayList();
widgets.add(Widgets.createTexturedWidget(texture, startPoint.x, startPoint.y, 0, 56, 166, 54));

widgets.add(Widgets.createSlot(new Point(startPoint.x + 11, startPoint.y + 39))
.entries(display.getInputEntries().get(0)).markInput());

int rerolls = 1;
List<EntryIngredient> list = display.getOutputEntries();
if (list.size() > 21) {
rerolls = (int) Math.ceil(list.size() / 21.0);
}
while (rerolls > 0) {
for (int i = 0; i < list.size(); i++) {
final int slotX = 39 + (i % 7 * 18);
final int slotY = 3 + i / 7 * 18;

@Nonnull final EntryIngredient outputStack = list.get(i);
CrushingRecipe recipeOptional = ExNihiloRegistries.HAMMER_REGISTRY.getRecipeList().get(i);
if (recipeOptional.getDrops().get(i).getChance() != 1.0) {
outputStack.get(i).tooltip(Component.literal(String.format(
"Chance: %s", StringUtils.formatPercent((recipeOptional.getDrops().get(i).getChance())))));
}
widgets.add(Widgets.createSlot(new Point(startPoint.x + slotX, startPoint.y + slotY))
.entries(outputStack).disableBackground().markOutput());
}
rerolls--;
}

return widgets;
}

@Override
public int getDisplayHeight() {
return 56;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.rempler.exnihiloadditions.compat.rei.crushing;

import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.util.EntryIngredients;
import com.rempler.exnihiloadditions.compat.rei.SimpleBasicDisplay;
import novamachina.exnihilosequentia.world.item.crafting.CrushingRecipe;
import novamachina.exnihilosequentia.world.item.crafting.ItemStackWithChance;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CrushingRecipeDisplay extends SimpleBasicDisplay {
public CrushingRecipeDisplay(CrushingRecipe recipe) {
super(Collections.singletonList(EntryIngredient.of(EntryIngredients.ofIngredient(recipe.getInput()))), getIngredients(recipe));
}


private static List<EntryIngredient> getIngredients(CrushingRecipe recipe) {
List<EntryIngredient> list = new ArrayList<>();
for (ItemStackWithChance entry : recipe.getDrops()) {
list.add(EntryIngredients.of(entry.getStack()));
}
return list;
}

@Override
public CategoryIdentifier<?> getCategoryIdentifier() {
return CrushingRecipeCategory.CRUSHING;
}
}
Loading