diff --git a/build.gradle.kts b/build.gradle.kts index 2de284c..8314ff5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -32,7 +32,15 @@ val jeiVersion: String by project val jeiMcVersion: String by project val emiVersion: String by project +enum class RecipeViewer { + None, + JEI, + EMI, + REI +} + val withTop = true +val recipeViewer: RecipeViewer = RecipeViewer.EMI version = modVersion group = modGroupId @@ -181,14 +189,29 @@ dependencies { implementation ("net.neoforged:neoforge:${neoVersion}") compileOnly("mcjty.theoneprobe:theoneprobe:${topVersion}") - if (withTop) + if (withTop) { runtimeOnly("mcjty.theoneprobe:theoneprobe:${topVersion}") -// compileOnly("dev.emi:emi-neoforge:${emiVersion}:api") -// runtimeOnly("dev.emi:emi-neoforge:${emiVersion}") -// runtimeOnly("me.shedaniel:RoughlyEnoughItems-neoforge:${reiVersion}") -// compileOnly("me.shedaniel:RoughlyEnoughItems-api-neoforge:${reiVersion}") -// compileOnly("me.shedaniel:RoughlyEnoughItems-default-plugin-neoforge:${reiVersion}") + } + when (recipeViewer) { + RecipeViewer.None -> {} + RecipeViewer.JEI -> { + runtimeOnly("mezz.jei:jei-${jeiMcVersion}-neoforge:${jeiVersion}") + } + RecipeViewer.EMI -> { + runtimeOnly("dev.emi:emi-neoforge:${emiVersion}") + } + RecipeViewer.REI -> { + runtimeOnly("me.shedaniel:RoughlyEnoughItems-neoforge:${reiVersion}") + compileOnly("me.shedaniel:RoughlyEnoughItems-api-neoforge:${reiVersion}") + compileOnly("me.shedaniel:RoughlyEnoughItems-default-plugin-neoforge:${reiVersion}") + } + } + + // API's + compileOnly("mezz.jei:jei-${jeiMcVersion}-common-api:${jeiVersion}") + compileOnly("mezz.jei:jei-${jeiMcVersion}-neoforge-api:${jeiVersion}") + compileOnly("dev.emi:emi-neoforge:${emiVersion}:api") // Testing junitImplementation(platform("org.junit:junit-bom:${junitVersion}")) @@ -199,9 +222,6 @@ dependencies { // Example mod dependency with JEI // The JEI API is declared for compile time use, while the full JEI artifact is used at runtime - compileOnly("mezz.jei:jei-${jeiMcVersion}-common-api:${jeiVersion}") - compileOnly("mezz.jei:jei-${jeiMcVersion}-neoforge-api:${jeiVersion}") - runtimeOnly("mezz.jei:jei-${jeiMcVersion}-neoforge:${jeiVersion}") // Example mod dependency using a mod jar from ./libs with a flat dir repository // This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar diff --git a/gradle.properties b/gradle.properties index 8f383b7..b247b2e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -48,4 +48,4 @@ topVersion=1.21_neo-12.0.0-1 reiVersion=16.0.729 jeiVersion=19.0.0.11 jeiMcVersion=1.21 -emiVersion=1.1.7+1.21 \ No newline at end of file +emiVersion=1.1.8+1.21 \ No newline at end of file diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index b9dad00..ddc8043 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,9 +1,9 @@ -// 1.21 2024-06-16T13:02:59.3382935 Recipes +// 1.21 2024-06-30T22:00:58.313201409 Recipes 375ee3cb8eaf222bd0d5576061d1741b5b3d5cff data/environmenttech/advancement/recipes/environmental_essence.json 99b83974e5a7a570c2111cab62a292d126c36524 data/environmenttech/advancement/recipes/misc/env_collector_block_item.json 6962e07757d0b7087542bf51dddde36d4beb3ee4 data/environmenttech/advancement/recipes/misc/glass_tank.json 76b6b2850a79c80b2f2969b93b26bc3832a77ab4 data/environmenttech/advancement/recipes/tools/env_detector_item.json -d462a41d1b0fda35660ed3e4c807f83f6dc0e0cd data/environmenttech/recipe/environmental_essence.json 23bb508829cafa270f61c06c8cc5aa3ad58e54e1 data/environmenttech/recipe/env_collector_block_item.json 17b9bb86d970f10b3784048b790ba541ed3bf8fd data/environmenttech/recipe/env_detector_item.json +63c5fdb8c8563f643e4f502a3132c0d049c2c17b data/environmenttech/recipe/environmental_essence.json 935db7eeeeb437ba83909ba578f14109f62485ef data/environmenttech/recipe/glass_tank.json diff --git a/src/generated/resources/data/environmenttech/recipe/environmental_essence.json b/src/generated/resources/data/environmenttech/recipe/environmental_essence.json index 4f78b62..b73bee3 100644 --- a/src/generated/resources/data/environmenttech/recipe/environmental_essence.json +++ b/src/generated/resources/data/environmenttech/recipe/environmental_essence.json @@ -1,6 +1,7 @@ { "type": "environmenttech:env_collector", "envUsed": 10, + "id": "environmenttech:environmental_essence", "ingredient": { "item": "minecraft:iron_ingot" }, diff --git a/src/main/java/robaertschi/environmenttech/compat/emi/EmiCompatPlugin.java b/src/main/java/robaertschi/environmenttech/compat/emi/EmiCompatPlugin.java new file mode 100644 index 0000000..a59d430 --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/compat/emi/EmiCompatPlugin.java @@ -0,0 +1,39 @@ +package robaertschi.environmenttech.compat.emi; + +import dev.emi.emi.api.EmiEntrypoint; +import dev.emi.emi.api.EmiPlugin; +import dev.emi.emi.api.EmiRegistry; +import dev.emi.emi.api.recipe.EmiRecipeCategory; +import dev.emi.emi.api.render.EmiTexture; +import dev.emi.emi.api.stack.EmiStack; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; +import robaertschi.environmenttech.ET; +import robaertschi.environmenttech.data.recipes.ETRecipes; +import robaertschi.environmenttech.data.recipes.EnvCollectorRecipe; +import robaertschi.environmenttech.level.item.ETItems; +import robaertschi.environmenttech.menu.ETMenus; + +@EmiEntrypoint +public class EmiCompatPlugin implements EmiPlugin { + public static final ResourceLocation ENV_COLLECTOR_SHEET = ET.id("textures/gui/container/env_collector.png"); + public static final EmiStack ENV_COLLECTOR = EmiStack.of(ETItems.ENV_COLLECTOR_BLOCK_ITEM); + public static final EmiRecipeCategory ENV_COLLECTOR_CATEGORY = new EmiRecipeCategory(ET.id("env_collector"), ENV_COLLECTOR, new EmiTexture(ENV_COLLECTOR_SHEET,48, 18, 110, 50)); + + @Override + public void register(EmiRegistry registry) { + registry.addCategory(ENV_COLLECTOR_CATEGORY); + registry.addWorkstation(ENV_COLLECTOR_CATEGORY, ENV_COLLECTOR); + + RecipeManager manager = registry.getRecipeManager(); + + for (RecipeHolder recipe : manager.getAllRecipesFor(ETRecipes.ENV_COLLECTOR_RECIPE_TYPE.get())) { + registry.addRecipe(new EnvCollectorEmiRecipe(recipe.value())); + } + + registry.addRecipeHandler(ETMenus.ENV_COLLECTOR_MENU.get(), new EnvCollectorEmiRecipeHandler()); + + } + +} diff --git a/src/main/java/robaertschi/environmenttech/compat/emi/EnvCollectorEmiRecipe.java b/src/main/java/robaertschi/environmenttech/compat/emi/EnvCollectorEmiRecipe.java new file mode 100644 index 0000000..3f878e7 --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/compat/emi/EnvCollectorEmiRecipe.java @@ -0,0 +1,29 @@ +package robaertschi.environmenttech.compat.emi; + +import dev.emi.emi.api.recipe.BasicEmiRecipe; +import dev.emi.emi.api.render.EmiTexture; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; +import dev.emi.emi.api.widget.WidgetHolder; +import net.minecraft.network.chat.Component; +import robaertschi.environmenttech.client.renderer.EnvStorageRenderer; +import robaertschi.environmenttech.data.recipes.EnvCollectorRecipe; + +public class EnvCollectorEmiRecipe extends BasicEmiRecipe { + private final EnvCollectorRecipe recipe; + + public EnvCollectorEmiRecipe(EnvCollectorRecipe recipe) { + super(EmiCompatPlugin.ENV_COLLECTOR_CATEGORY, recipe.id(), 76, 30); + this.inputs.add(EmiIngredient.of(recipe.input())); + this.outputs.add(EmiStack.of(recipe.output())); + this.recipe = recipe; + } + + @Override + public void addWidgets(WidgetHolder widgets) { + widgets.addTexture(EmiTexture.EMPTY_ARROW, 26, 1); + widgets.addText(Component.literal(recipe.envUsed() + " ENV"), 42, 20, EnvStorageRenderer.to, true); + widgets.addSlot(inputs.getFirst(), 0, 0); + widgets.addSlot(outputs.getFirst(), 58, 0).recipeContext(this); + } +} diff --git a/src/main/java/robaertschi/environmenttech/compat/emi/EnvCollectorEmiRecipeHandler.java b/src/main/java/robaertschi/environmenttech/compat/emi/EnvCollectorEmiRecipeHandler.java new file mode 100644 index 0000000..3c36004 --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/compat/emi/EnvCollectorEmiRecipeHandler.java @@ -0,0 +1,32 @@ +package robaertschi.environmenttech.compat.emi; + +import dev.emi.emi.api.recipe.EmiRecipe; +import dev.emi.emi.api.recipe.handler.StandardRecipeHandler; +import net.minecraft.world.inventory.Slot; +import org.apache.commons.compress.utils.Lists; +import robaertschi.environmenttech.menu.EnvCollectorMenu; + +import java.util.List; + +public class EnvCollectorEmiRecipeHandler implements StandardRecipeHandler { + @Override + public List getInputSources(EnvCollectorMenu handler) { + List list = Lists.newArrayList(); + list.add(handler.getSlot(0)); + int invStart = 2; + for (int i = invStart; i < invStart + 36; i++) { + list.add(handler.getSlot(i)); + } + return list; + } + + @Override + public List getCraftingSlots(EnvCollectorMenu handler) { + return List.of(handler.getSlot(0)); + } + + @Override + public boolean supportsRecipe(EmiRecipe recipe) { + return recipe.getCategory() == EmiCompatPlugin.ENV_COLLECTOR_CATEGORY && recipe.supportsRecipeTree(); + } +} diff --git a/src/main/java/robaertschi/environmenttech/data/recipes/EnvCollectorRecipe.java b/src/main/java/robaertschi/environmenttech/data/recipes/EnvCollectorRecipe.java index 2d69f82..a26410b 100644 --- a/src/main/java/robaertschi/environmenttech/data/recipes/EnvCollectorRecipe.java +++ b/src/main/java/robaertschi/environmenttech/data/recipes/EnvCollectorRecipe.java @@ -28,7 +28,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.Level; -public record EnvCollectorRecipe(Ingredient input, ItemStack output, int envUsed) implements Recipe { +public record EnvCollectorRecipe(ResourceLocation id, Ingredient input, ItemStack output, int envUsed) implements Recipe { @Override public boolean matches(@NotNull RecipeInput pContainer, @NotNull Level pLevel) { return this.input.test(pContainer.getItem(0)); @@ -99,7 +99,7 @@ public record EnvCollectorRecipe(Ingredient input, ItemStack output, int envUsed this.criteria.forEach(advancementBuilder::addCriterion); - EnvCollectorRecipe envCollectorRecipe = new EnvCollectorRecipe(this.ingredient, this.output, this.envUsed); + EnvCollectorRecipe envCollectorRecipe = new EnvCollectorRecipe(pId, this.ingredient, this.output, this.envUsed); pRecipeOutput.accept(pId, envCollectorRecipe, advancementBuilder.build(pId.withPrefix("recipes/"))); } diff --git a/src/main/java/robaertschi/environmenttech/data/recipes/EnvCollectorRecipeSerializer.java b/src/main/java/robaertschi/environmenttech/data/recipes/EnvCollectorRecipeSerializer.java index ae24dd6..8fe6f22 100644 --- a/src/main/java/robaertschi/environmenttech/data/recipes/EnvCollectorRecipeSerializer.java +++ b/src/main/java/robaertschi/environmenttech/data/recipes/EnvCollectorRecipeSerializer.java @@ -6,6 +6,7 @@ */ package robaertschi.environmenttech.data.recipes; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -21,6 +22,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; public class EnvCollectorRecipeSerializer implements RecipeSerializer { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( envCollectorRecipeInstance -> envCollectorRecipeInstance.group( + ResourceLocation.CODEC.fieldOf("id").forGetter(EnvCollectorRecipe::id), Ingredient.CODEC_NONEMPTY.fieldOf("ingredient").forGetter(EnvCollectorRecipe::input), ItemStack.CODEC.fieldOf("output").forGetter(EnvCollectorRecipe::output), Codec.INT.fieldOf("envUsed").forGetter(EnvCollectorRecipe::envUsed) @@ -39,13 +41,15 @@ public class EnvCollectorRecipeSerializer implements RecipeSerializer