diff --git a/src/main/java/thedarkcolour/exdeorum/compat/CompatHelper.java b/src/main/java/thedarkcolour/exdeorum/compat/CompatHelper.java index cfe3e856..5e582d1f 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/CompatHelper.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/CompatHelper.java @@ -18,61 +18,49 @@ package thedarkcolour.exdeorum.compat; -import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; import net.minecraftforge.fml.ModList; import thedarkcolour.exdeorum.material.DefaultMaterials; +import thedarkcolour.exdeorum.material.MaterialRegistry; import thedarkcolour.exdeorum.registry.EItems; import java.util.ArrayList; import java.util.List; public class CompatHelper { - public static List getAvailableBarrels(boolean registered) { - List barrels = new ArrayList<>(); - for (var material : DefaultMaterials.BARRELS) { - if (registered == ModList.get().isLoaded(material.requiredModId)) { - barrels.add(material.getItem()); - } - } - return barrels; + public static List getAvailableBarrels(boolean registered) { + return getAvailableMaterials(DefaultMaterials.BARRELS, registered); } - public static List getAvailableSieves(boolean registered, boolean includeMechanical) { - List sieves = new ArrayList<>(); - for (var material : DefaultMaterials.SIEVES) { - if (registered == ModList.get().isLoaded(material.requiredModId)) { - sieves.add(material.getItem()); - } - } + public static List getAvailableSieves(boolean registered, boolean includeMechanical) { + List sieves = getAvailableMaterials(DefaultMaterials.SIEVES, registered); if (includeMechanical) { sieves.add(EItems.MECHANICAL_SIEVE.get()); } - return sieves; } - public static List getAvailableLavaCrucibles(boolean registered) { - List lavaCrucibles = new ArrayList<>(); - - for (var material : DefaultMaterials.LAVA_CRUCIBLES) { - if (registered == ModList.get().isLoaded(material.requiredModId)) { - lavaCrucibles.add(material.getItem()); - } - } - - return lavaCrucibles; + public static List getAvailableLavaCrucibles(boolean registered) { + return getAvailableMaterials(DefaultMaterials.LAVA_CRUCIBLES, registered); } - public static List getAvailableWaterCrucibles(boolean registered) { - List waterCrucibles = new ArrayList<>(); + public static List getAvailableWaterCrucibles(boolean registered) { + return getAvailableMaterials(DefaultMaterials.WATER_CRUCIBLES, registered); + } - for (var material : DefaultMaterials.WATER_CRUCIBLES) { + public static List getAvailableCompressedSieves(boolean registered) { + return getAvailableMaterials(DefaultMaterials.COMPRESSED_SIEVES, registered); + } + + private static List getAvailableMaterials(MaterialRegistry registry, boolean registered) { + List materials = new ArrayList<>(); + + for (var material : registry) { if (registered == ModList.get().isLoaded(material.requiredModId)) { - waterCrucibles.add(material.getItem()); + materials.add(material); } } - - return waterCrucibles; + return materials; } } diff --git a/src/main/java/thedarkcolour/exdeorum/compat/GroupedSieveRecipe.java b/src/main/java/thedarkcolour/exdeorum/compat/GroupedSieveRecipe.java index e4e1adf3..f73735da 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/GroupedSieveRecipe.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/GroupedSieveRecipe.java @@ -43,7 +43,7 @@ import java.util.Objects; public record GroupedSieveRecipe(Ingredient ingredient, ItemStack mesh, List results) { public static int maxSieveRows; - public static ImmutableList getAllRecipesGrouped(RecipeType recipeType) { + public static ImmutableList getAllRecipesGrouped(RecipeType recipeType) { maxSieveRows = 1; // copy the list so we can do removals diff --git a/src/main/java/thedarkcolour/exdeorum/compat/jei/CompressedSieveCategory.java b/src/main/java/thedarkcolour/exdeorum/compat/jei/CompressedSieveCategory.java new file mode 100644 index 00000000..bd0611b6 --- /dev/null +++ b/src/main/java/thedarkcolour/exdeorum/compat/jei/CompressedSieveCategory.java @@ -0,0 +1,37 @@ +/* + * Ex Deorum + * Copyright (c) 2024 thedarkcolour + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package thedarkcolour.exdeorum.compat.jei; + +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.RecipeType; +import net.minecraft.network.chat.Component; +import thedarkcolour.exdeorum.compat.GroupedSieveRecipe; +import thedarkcolour.exdeorum.data.TranslationKeys; +import thedarkcolour.exdeorum.material.DefaultMaterials; + +class CompressedSieveCategory extends SieveCategory { + CompressedSieveCategory(IGuiHelper helper) { + super(helper, DefaultMaterials.OAK_COMPRESSED_SIEVE, Component.translatable(TranslationKeys.COMPRESSED_SIEVE_CATEGORY_TITLE)); + } + + @Override + public RecipeType getRecipeType() { + return ExDeorumJeiPlugin.COMPRESSED_SIEVE; + } +} diff --git a/src/main/java/thedarkcolour/exdeorum/compat/jei/ExDeorumJeiPlugin.java b/src/main/java/thedarkcolour/exdeorum/compat/jei/ExDeorumJeiPlugin.java index 6bddab7d..78d89dec 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/jei/ExDeorumJeiPlugin.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/jei/ExDeorumJeiPlugin.java @@ -78,6 +78,7 @@ public class ExDeorumJeiPlugin implements IModPlugin { static final RecipeType WATER_CRUCIBLE = RecipeType.create(ExDeorum.ID, "water_crucible", CrucibleRecipe.class); static final RecipeType CRUCIBLE_HEAT_SOURCES = RecipeType.create(ExDeorum.ID, "crucible_heat_sources", CrucibleHeatSourceRecipe.class); static final RecipeType SIEVE = RecipeType.create(ExDeorum.ID, "sieve", GroupedSieveRecipe.class); + static final RecipeType COMPRESSED_SIEVE = RecipeType.create(ExDeorum.ID, "compressed_sieve", GroupedSieveRecipe.class); static final RecipeType HAMMER = RecipeType.create(ExDeorum.ID, "hammer", HammerRecipe.class); static final RecipeType CROOK = RecipeType.create(ExDeorum.ID, "crook", CrookJeiRecipe.class); @@ -99,34 +100,33 @@ public class ExDeorumJeiPlugin implements IModPlugin { registration.addRecipeCategories(new CrucibleCategory.WaterCrucible(helper, arrow)); registration.addRecipeCategories(new CrucibleHeatSourcesCategory(registration.getJeiHelpers())); registration.addRecipeCategories(new SieveCategory(helper)); + registration.addRecipeCategories(new CompressedSieveCategory(helper)); registration.addRecipeCategories(new HammerCategory(helper, arrow)); registration.addRecipeCategories(new CrookCategory(registration.getJeiHelpers(), arrow)); } @Override public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { - var barrels = CompatHelper.getAvailableBarrels(true); - var sieves = CompatHelper.getAvailableSieves(true, true); - var lavaCrucibles = CompatHelper.getAvailableLavaCrucibles(true); - var waterCrucibles = CompatHelper.getAvailableWaterCrucibles(true); - - for (var barrel : barrels) { + for (var barrel : CompatHelper.getAvailableBarrels(true)) { var stack = new ItemStack(barrel); registration.addRecipeCatalyst(stack, BARREL_COMPOST); registration.addRecipeCatalyst(stack, BARREL_MIXING); registration.addRecipeCatalyst(stack, BARREL_FLUID_MIXING); } - for (var lavaCrucible : lavaCrucibles) { + for (var lavaCrucible : CompatHelper.getAvailableLavaCrucibles(true)) { var stack = new ItemStack(lavaCrucible); registration.addRecipeCatalyst(stack, LAVA_CRUCIBLE); registration.addRecipeCatalyst(stack, CRUCIBLE_HEAT_SOURCES); } - for (var waterCrucible : waterCrucibles) { + for (var waterCrucible : CompatHelper.getAvailableWaterCrucibles(true)) { registration.addRecipeCatalyst(new ItemStack(waterCrucible), WATER_CRUCIBLE); } - for (var sieve : sieves) { + for (var sieve : CompatHelper.getAvailableSieves(true, true)) { registration.addRecipeCatalyst(new ItemStack(sieve), SIEVE); } + for (var compressedSieve : CompatHelper.getAvailableCompressedSieves(true)) { + registration.addRecipeCatalyst(new ItemStack(compressedSieve), COMPRESSED_SIEVE); + } registration.addRecipeCatalyst(new ItemStack(EItems.WOODEN_HAMMER.get()), HAMMER); registration.addRecipeCatalyst(new ItemStack(EItems.STONE_HAMMER.get()), HAMMER); @@ -159,13 +159,11 @@ public class ExDeorumJeiPlugin implements IModPlugin { var toRemove = new ArrayList(); - if (RecipeUtil.isTagEmpty(EItemTags.ORES_ALUMINUM)) - toRemove.add(new ItemStack(EItems.ALUMINUM_ORE_CHUNK.get())); + if (RecipeUtil.isTagEmpty(EItemTags.ORES_ALUMINUM)) toRemove.add(new ItemStack(EItems.ALUMINUM_ORE_CHUNK.get())); if (RecipeUtil.isTagEmpty(EItemTags.ORES_COBALT)) toRemove.add(new ItemStack(EItems.COBALT_ORE_CHUNK.get())); if (RecipeUtil.isTagEmpty(EItemTags.ORES_SILVER)) toRemove.add(new ItemStack(EItems.SILVER_ORE_CHUNK.get())); if (RecipeUtil.isTagEmpty(EItemTags.ORES_LEAD)) toRemove.add(new ItemStack(EItems.LEAD_ORE_CHUNK.get())); - if (RecipeUtil.isTagEmpty(EItemTags.ORES_PLATINUM)) - toRemove.add(new ItemStack(EItems.PLATINUM_ORE_CHUNK.get())); + if (RecipeUtil.isTagEmpty(EItemTags.ORES_PLATINUM)) toRemove.add(new ItemStack(EItems.PLATINUM_ORE_CHUNK.get())); if (RecipeUtil.isTagEmpty(EItemTags.ORES_NICKEL)) toRemove.add(new ItemStack(EItems.NICKEL_ORE_CHUNK.get())); if (RecipeUtil.isTagEmpty(EItemTags.ORES_URANIUM)) toRemove.add(new ItemStack(EItems.URANIUM_ORE_CHUNK.get())); if (RecipeUtil.isTagEmpty(EItemTags.ORES_OSMIUM)) toRemove.add(new ItemStack(EItems.OSMIUM_ORE_CHUNK.get())); @@ -193,6 +191,7 @@ public class ExDeorumJeiPlugin implements IModPlugin { } registration.addRecipes(CROOK, crookRecipes); registration.addRecipes(SIEVE, GroupedSieveRecipe.getAllRecipesGrouped(ERecipeTypes.SIEVE.get())); + registration.addRecipes(COMPRESSED_SIEVE, GroupedSieveRecipe.getAllRecipesGrouped(ERecipeTypes.COMPRESSED_SIEVE.get())); addCrucibleHeatSources(registration); } diff --git a/src/main/java/thedarkcolour/exdeorum/compat/jei/SieveCategory.java b/src/main/java/thedarkcolour/exdeorum/compat/jei/SieveCategory.java index 1790ad61..1b0b9414 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/jei/SieveCategory.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/jei/SieveCategory.java @@ -33,6 +33,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; @@ -61,12 +62,16 @@ class SieveCategory implements IRecipeCategory { private final IDrawable icon; private final Component title; - public SieveCategory(IGuiHelper helper) { + SieveCategory(IGuiHelper helper, ItemLike icon, Component title) { this.background = Lazy.of(() -> helper.createBlankDrawable(WIDTH, ROW_START + 18 * GroupedSieveRecipe.maxSieveRows)); this.slot = helper.getSlotDrawable(); this.row = helper.createDrawable(ExDeorumJeiPlugin.EX_DEORUM_JEI_TEXTURE, 0, 0, 162, 18); - this.icon = helper.createDrawableItemStack(new ItemStack(DefaultMaterials.OAK_SIEVE.getItem())); - this.title = Component.translatable(TranslationKeys.SIEVE_CATEGORY_TITLE); + this.icon = helper.createDrawableItemStack(new ItemStack(icon)); + this.title = title; + } + + SieveCategory(IGuiHelper helper) { + this(helper, DefaultMaterials.OAK_SIEVE, Component.translatable(TranslationKeys.SIEVE_CATEGORY_TITLE)); } @Override diff --git a/src/main/java/thedarkcolour/exdeorum/compat/rei/ExDeorumReiPlugin.java b/src/main/java/thedarkcolour/exdeorum/compat/rei/ExDeorumReiPlugin.java index 309bce81..199c7bd4 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/rei/ExDeorumReiPlugin.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/rei/ExDeorumReiPlugin.java @@ -47,6 +47,9 @@ public class ExDeorumReiPlugin implements REIClientPlugin { for (var crucible : CompatHelper.getAvailableWaterCrucibles(false)) { builder.add(EntryStack.of(VanillaEntryTypes.ITEM, new ItemStack(crucible))); } + for (var compressedSieve : CompatHelper.getAvailableCompressedSieves(false)) { + builder.add(EntryStack.of(VanillaEntryTypes.ITEM, new ItemStack(compressedSieve))); + } return builder.build(); }); } diff --git a/src/main/java/thedarkcolour/exdeorum/data/English.java b/src/main/java/thedarkcolour/exdeorum/data/English.java index fe99b551..dfe43c3e 100644 --- a/src/main/java/thedarkcolour/exdeorum/data/English.java +++ b/src/main/java/thedarkcolour/exdeorum/data/English.java @@ -21,7 +21,6 @@ package thedarkcolour.exdeorum.data; import thedarkcolour.exdeorum.ExDeorum; import thedarkcolour.exdeorum.client.screen.RedstoneControlWidget; import thedarkcolour.exdeorum.material.DefaultMaterials; -import thedarkcolour.exdeorum.registry.EBlocks; import thedarkcolour.modkit.data.MKEnglishProvider; class English { @@ -74,6 +73,7 @@ class English { english.add(TranslationKeys.CROOK_CATEGORY_TITLE, "Crook"); english.add(TranslationKeys.CROOK_CATEGORY_REQUIRES_STATE, "Requires properties:"); english.add(TranslationKeys.SIEVE_CATEGORY_TITLE, "Sieve"); + english.add(TranslationKeys.COMPRESSED_SIEVE_CATEGORY_TITLE, "Compressed Sieve"); english.add(TranslationKeys.SIEVE_RECIPE_CHANCE, "Chance: %s%%"); english.add(TranslationKeys.SIEVE_RECIPE_AVERAGE_OUTPUT, "Avg. Output: %s"); english.add(TranslationKeys.SIEVE_RECIPE_MIN_OUTPUT, "Min: %s"); diff --git a/src/main/java/thedarkcolour/exdeorum/data/TranslationKeys.java b/src/main/java/thedarkcolour/exdeorum/data/TranslationKeys.java index 4f1c9262..e3948e2a 100644 --- a/src/main/java/thedarkcolour/exdeorum/data/TranslationKeys.java +++ b/src/main/java/thedarkcolour/exdeorum/data/TranslationKeys.java @@ -73,6 +73,7 @@ public class TranslationKeys { public static final String CROOK_CATEGORY_TITLE = "gui." + ExDeorum.ID + ".category.crook"; public static final String CROOK_CATEGORY_REQUIRES_STATE = "gui." + ExDeorum.ID + ".category.crook.requires_state"; public static final String SIEVE_CATEGORY_TITLE = "gui." + ExDeorum.ID + ".category.sieve"; + public static final String COMPRESSED_SIEVE_CATEGORY_TITLE = "gui." + ExDeorum.ID + ".category.sieve"; public static final String SIEVE_RECIPE_CHANCE = "gui." + ExDeorum.ID + ".category.sieve.chance"; public static final String SIEVE_RECIPE_AVERAGE_OUTPUT = "gui." + ExDeorum.ID + ".category.sieve.average_output"; public static final String SIEVE_RECIPE_MIN_OUTPUT = "gui." + ExDeorum.ID + ".category.sieve.min_output"; diff --git a/src/main/java/thedarkcolour/exdeorum/material/AbstractMaterial.java b/src/main/java/thedarkcolour/exdeorum/material/AbstractMaterial.java index b0285fd6..7a7c708c 100644 --- a/src/main/java/thedarkcolour/exdeorum/material/AbstractMaterial.java +++ b/src/main/java/thedarkcolour/exdeorum/material/AbstractMaterial.java @@ -20,12 +20,13 @@ package thedarkcolour.exdeorum.material; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraftforge.registries.RegistryObject; -public abstract class AbstractMaterial { +public abstract class AbstractMaterial implements ItemLike { // The sound this block makes (a string corresponding to a field in SoundType or a JSON object with the five sound events used to create a sound type) public final SoundType soundType; // The hardness of the barrel when harvesting @@ -63,4 +64,9 @@ public abstract class AbstractMaterial { public Block getBlock() { return this.block.get(); } + + @Override + public Item asItem() { + return this.item.get(); + } }