From 0cb6427133f7a9eea3789aa84d50161c462c6fef Mon Sep 17 00:00:00 2001 From: Dane Strandboge Date: Tue, 17 Aug 2021 01:21:31 -0500 Subject: [PATCH] Primitive Multi Rewrite (#85) * new PBF working * implement primitive recipes * finish PBF * refactor Coke Oven * update changelog * fix tech memeing on me --- CHANGELOG-GTCEU.md | 6 +- .../capability/impl/PrimitiveRecipeLogic.java | 60 +++ ...ecipeMapPrimitiveMultiblockController.java | 51 +++ .../java/gregtech/api/recipes/RecipeMap.java | 2 + .../java/gregtech/api/recipes/RecipeMaps.java | 29 +- .../builders/CokeOvenRecipeBuilder.java | 137 ------- .../recipes/builders/PBFRecipeBuilder.java | 139 ------- .../builders/PrimitiveRecipeBuilder.java | 37 ++ .../crafttweaker/CokeOvenRecipeExpansion.java | 17 - .../crafttweaker/PBFRecipeExpansion.java | 17 - .../recipeproperties/PrimitiveProperty.java | 27 ++ .../multi/MetaTileEntityCokeOven.java | 240 ++--------- .../MetaTileEntityPrimitiveBlastFurnace.java | 387 ++---------------- .../gregtech/integration/jei/GTJeiPlugin.java | 14 - .../jei/recipe/GTRecipeWrapper.java | 10 +- .../primitive/CokeOvenRecipeCategory.java | 58 --- .../primitive/CokeOvenRecipeWrapper.java | 53 --- .../PrimitiveBlastRecipeCategory.java | 55 --- .../PrimitiveBlastRecipeWrapper.java | 57 --- .../primitive/PrimitiveRecipeCategory.java | 1 + .../loaders/recipe/MachineRecipeLoader.java | 34 +- .../resources/assets/gregtech/lang/en_us.lang | 2 + 22 files changed, 282 insertions(+), 1151 deletions(-) create mode 100644 src/main/java/gregtech/api/capability/impl/PrimitiveRecipeLogic.java create mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapPrimitiveMultiblockController.java delete mode 100644 src/main/java/gregtech/api/recipes/builders/CokeOvenRecipeBuilder.java delete mode 100644 src/main/java/gregtech/api/recipes/builders/PBFRecipeBuilder.java create mode 100644 src/main/java/gregtech/api/recipes/builders/PrimitiveRecipeBuilder.java delete mode 100644 src/main/java/gregtech/api/recipes/crafttweaker/CokeOvenRecipeExpansion.java delete mode 100644 src/main/java/gregtech/api/recipes/crafttweaker/PBFRecipeExpansion.java create mode 100644 src/main/java/gregtech/api/recipes/recipeproperties/PrimitiveProperty.java delete mode 100644 src/main/java/gregtech/integration/jei/recipe/primitive/CokeOvenRecipeCategory.java delete mode 100644 src/main/java/gregtech/integration/jei/recipe/primitive/CokeOvenRecipeWrapper.java delete mode 100644 src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveBlastRecipeCategory.java delete mode 100644 src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveBlastRecipeWrapper.java diff --git a/CHANGELOG-GTCEU.md b/CHANGELOG-GTCEU.md index dda07f89ba3..2648556b1dc 100644 --- a/CHANGELOG-GTCEU.md +++ b/CHANGELOG-GTCEU.md @@ -178,7 +178,7 @@ ### CraftTweaker - Materials can now automatically generate IDs - Be careful, as changing the order of this will cause items in-world to disappear - +- Coke Oven and PBF have normal RecipeMaps now, instead of using custom ones ### Removals - Potion Fluids placeable in-world were removed @@ -210,3 +210,7 @@ - OrePrefix is no longer an Enum, and can easily be added to by addons - Shaped and Shapeless Recipe methods in `ModHandler` can now accept more types - `debug` config will now log failed recipe removals and additions +- There is now a "PrimitiveMultiblockController" base class, which uses a normal RecipeMap. When paired with the `PrimitiveRecipeBuilder`, it will: + - Allow recipes to be run without power + - (by default) Initialize inventory for items and fluids to the Controller instead of Multiblock Parts (overridable) + - Hide the EU/t and Total EU info from the JEI page diff --git a/src/main/java/gregtech/api/capability/impl/PrimitiveRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/PrimitiveRecipeLogic.java new file mode 100644 index 00000000000..a9bc1937690 --- /dev/null +++ b/src/main/java/gregtech/api/capability/impl/PrimitiveRecipeLogic.java @@ -0,0 +1,60 @@ +package gregtech.api.capability.impl; + +import gregtech.api.GTValues; +import gregtech.api.metatileentity.multiblock.RecipeMapPrimitiveMultiblockController; +import gregtech.api.recipes.RecipeMap; + +/** + * Recipe Logic for a Multiblock that does not require power. + */ +public class PrimitiveRecipeLogic extends AbstractRecipeLogic { + + public PrimitiveRecipeLogic(RecipeMapPrimitiveMultiblockController tileEntity, RecipeMap recipeMap) { + super(tileEntity, recipeMap); + } + + @Override + protected long getEnergyStored() { + return Integer.MAX_VALUE; + } + + @Override + protected long getEnergyCapacity() { + return Integer.MAX_VALUE; + } + + @Override + protected boolean drawEnergy(int recipeEUt) { + return true; // spoof energy being drawn + } + + @Override + protected long getMaxVoltage() { + return GTValues.LV; + } + + @Override + protected int[] calculateOverclock(int EUt, long voltage, int duration) { + return new int[]{1, duration}; + } + + @Override + protected int getOverclockingTier(long voltage) { + return GTValues.LV; // just return something reasonable + } + + /** + * Used to reset cached values in the Recipe Logic on structure deform + */ + public void invalidate() { + lastItemInputs = null; + lastFluidInputs = null; + previousRecipe = null; + progressTime = 0; + maxProgressTime = 0; + recipeEUt = 0; + fluidOutputs = null; + itemOutputs = null; + setActive(false); // this marks dirty for us + } +} diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapPrimitiveMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapPrimitiveMultiblockController.java new file mode 100644 index 00000000000..fb8d8dd56a2 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapPrimitiveMultiblockController.java @@ -0,0 +1,51 @@ +package gregtech.api.metatileentity.multiblock; + +import gregtech.api.capability.impl.*; +import gregtech.api.recipes.RecipeMap; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.items.ItemStackHandler; + +import java.util.ArrayList; +import java.util.List; + +public abstract class RecipeMapPrimitiveMultiblockController extends MultiblockWithDisplayBase { + + protected PrimitiveRecipeLogic recipeMapWorkable; + + public RecipeMapPrimitiveMultiblockController(ResourceLocation metaTileEntityId, RecipeMap recipeMap) { + super(metaTileEntityId); + this.recipeMapWorkable = new PrimitiveRecipeLogic(this, recipeMap); + initializeAbilities(); + } + + // just initialize inventories based on RecipeMap values by default + protected void initializeAbilities() { + this.importItems = new ItemStackHandler(recipeMapWorkable.recipeMap.getMaxInputs()); + this.importFluids = new FluidTankList(true, makeFluidTanks(recipeMapWorkable.recipeMap.getMaxFluidInputs())); + this.exportItems = new ItemStackHandler(recipeMapWorkable.recipeMap.getMaxOutputs()); + this.exportFluids = new FluidTankList(false, makeFluidTanks(recipeMapWorkable.recipeMap.getMaxFluidOutputs())); + + this.itemInventory = new ItemHandlerProxy(this.importItems, this.exportItems); + this.fluidInventory = new FluidHandlerProxy(this.importFluids, this.exportFluids); + } + + private List makeFluidTanks(int length) { + List fluidTankList = new ArrayList<>(length); + for (int i = 0; i < length; i++) { + fluidTankList.add(new FluidTank(32000)); + } + return fluidTankList; + } + + @Override + protected void updateFormedValid() { + recipeMapWorkable.update(); + } + + @Override + public void invalidateStructure() { + super.invalidateStructure(); + recipeMapWorkable.invalidate(); + } +} diff --git a/src/main/java/gregtech/api/recipes/RecipeMap.java b/src/main/java/gregtech/api/recipes/RecipeMap.java index 1c6e683b03c..0de8ec4e935 100644 --- a/src/main/java/gregtech/api/recipes/RecipeMap.java +++ b/src/main/java/gregtech/api/recipes/RecipeMap.java @@ -18,6 +18,7 @@ import gregtech.api.gui.widgets.SlotWidget; import gregtech.api.gui.widgets.TankWidget; import gregtech.api.recipes.builders.IntCircuitRecipeBuilder; +import gregtech.api.recipes.builders.PrimitiveRecipeBuilder; import gregtech.api.recipes.crafttweaker.CTRecipe; import gregtech.api.recipes.crafttweaker.CTRecipeBuilder; import gregtech.api.unification.material.Material; @@ -93,6 +94,7 @@ public static List> getRecipeMaps() { public static void sortMaps() { for (RecipeMap rmap : RECIPE_MAP_REGISTRY.values()) { + if (rmap.recipeBuilder() instanceof PrimitiveRecipeBuilder) continue; // just for cleanliness rmap.recipeList.sort(Comparator.comparingInt(Recipe::getDuration) .thenComparingInt(Recipe::getEUt)); } diff --git a/src/main/java/gregtech/api/recipes/RecipeMaps.java b/src/main/java/gregtech/api/recipes/RecipeMaps.java index 87a5627b805..f8d10e125be 100644 --- a/src/main/java/gregtech/api/recipes/RecipeMaps.java +++ b/src/main/java/gregtech/api/recipes/RecipeMaps.java @@ -704,36 +704,27 @@ public class RecipeMaps { .setProgressBar(GuiTextures.PROGRESS_BAR_BATH, MoveType.HORIZONTAL); @ZenProperty - public static final FuelRecipeMap COMBUSTION_GENERATOR_FUELS = new FuelRecipeMap("combustion_generator"); - + public static final RecipeMap PRIMITIVE_BLAST_FURNACE_RECIPES = new RecipeMap<>("primitive_blast_furnace", 2, 2, 1, 2, 0, 0, 0, 0, new PrimitiveRecipeBuilder(), false); @ZenProperty - public static final FuelRecipeMap GAS_TURBINE_FUELS = new FuelRecipeMap("gas_turbine"); + public static final RecipeMap COKE_OVEN_RECIPES = new RecipeMap<>("coke_oven", 1, 1, 0, 1, 0, 0, 0, 1, new PrimitiveRecipeBuilder(), false); + ////////////////////////////////////// + // Fuel Recipe Maps // + ////////////////////////////////////// @ZenProperty - public static final FuelRecipeMap STEAM_TURBINE_FUELS = new FuelRecipeMap("steam_turbine"); + public static final FuelRecipeMap COMBUSTION_GENERATOR_FUELS = new FuelRecipeMap("combustion_generator"); @ZenProperty - public static final FuelRecipeMap SEMI_FLUID_GENERATOR_FUELS = new FuelRecipeMap("semi_fluid_generator"); + public static final FuelRecipeMap GAS_TURBINE_FUELS = new FuelRecipeMap("gas_turbine"); @ZenProperty - public static final FuelRecipeMap PLASMA_GENERATOR_FUELS = new FuelRecipeMap("plasma_generator"); + public static final FuelRecipeMap STEAM_TURBINE_FUELS = new FuelRecipeMap("steam_turbine"); @ZenProperty - public static final List PRIMITIVE_BLAST_FURNACE_RECIPES = new CopyOnWriteArrayList<>(); + public static final FuelRecipeMap SEMI_FLUID_GENERATOR_FUELS = new FuelRecipeMap("semi_fluid_generator"); @ZenProperty - public static final List COKE_OVEN_RECIPES = new CopyOnWriteArrayList<>(); - - @ZenMethod - public static List getPrimitiveBlastFurnaceRecipes() { - return PRIMITIVE_BLAST_FURNACE_RECIPES; - } - - @ZenMethod - public static List getCokeOvenRecipes() { - return COKE_OVEN_RECIPES; - } - + public static final FuelRecipeMap PLASMA_GENERATOR_FUELS = new FuelRecipeMap("plasma_generator"); } diff --git a/src/main/java/gregtech/api/recipes/builders/CokeOvenRecipeBuilder.java b/src/main/java/gregtech/api/recipes/builders/CokeOvenRecipeBuilder.java deleted file mode 100644 index 7d361a547ee..00000000000 --- a/src/main/java/gregtech/api/recipes/builders/CokeOvenRecipeBuilder.java +++ /dev/null @@ -1,137 +0,0 @@ -package gregtech.api.recipes.builders; - -import crafttweaker.annotations.ZenRegister; -import crafttweaker.api.item.IIngredient; -import crafttweaker.api.item.IItemStack; -import crafttweaker.api.liquid.ILiquidStack; -import crafttweaker.api.minecraft.CraftTweakerMC; -import gregtech.api.GTValues; -import gregtech.api.recipes.CountableIngredient; -import gregtech.api.recipes.RecipeMaps; -import gregtech.api.recipes.crafttweaker.CTRecipeBuilder.CraftTweakerIngredientWrapper; -import gregtech.api.recipes.recipes.CokeOvenRecipe; -import gregtech.api.unification.material.Material; -import gregtech.api.unification.ore.OrePrefix; -import gregtech.api.util.EnumValidationResult; -import gregtech.api.util.GTLog; -import gregtech.api.util.ValidationResult; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fml.common.Optional.Method; -import stanhebben.zenscript.annotations.ZenClass; -import stanhebben.zenscript.annotations.ZenMethod; - -@ZenClass("mods.gregtech.recipe.CokeOvenRecipeBuilder") -@ZenRegister -public class CokeOvenRecipeBuilder { - - private CountableIngredient input; - private ItemStack output; - private FluidStack fluidOutput; - private int duration = -1; - - private CokeOvenRecipeBuilder() { - } - - @ZenMethod - public static CokeOvenRecipeBuilder start() { - return new CokeOvenRecipeBuilder(); - } - - public CokeOvenRecipeBuilder input(Ingredient input, int amount) { - this.input = new CountableIngredient(input, amount); - return this; - } - - public CokeOvenRecipeBuilder input(ItemStack itemStack) { - this.input = CountableIngredient.from(itemStack); - return this; - } - - public CokeOvenRecipeBuilder input(OrePrefix orePrefix, Material material) { - this.input = CountableIngredient.from(orePrefix, material); - return this; - } - - public CokeOvenRecipeBuilder input(OrePrefix orePrefix, Material material, int amount) { - this.input = CountableIngredient.from(orePrefix, material, amount); - return this; - } - - @ZenMethod - public CokeOvenRecipeBuilder duration(int duration) { - this.duration = duration; - return this; - } - - public CokeOvenRecipeBuilder output(ItemStack output) { - this.output = output; - return this; - } - - public CokeOvenRecipeBuilder fluidOutput(FluidStack fluidOutput) { - this.fluidOutput = fluidOutput; - return this; - } - - public ValidationResult build() { - return ValidationResult.newResult(validate(), - new CokeOvenRecipe(input, output, fluidOutput, duration)); - } - - protected EnumValidationResult validate() { - EnumValidationResult result = EnumValidationResult.VALID; - - if (input == null) { - GTLog.logger.error("Input Ingredient cannot be null", new IllegalArgumentException()); - result = EnumValidationResult.INVALID; - } - - if (output == null || output.isEmpty()) { - GTLog.logger.error("Output ItemStack cannot be null or empty", new IllegalArgumentException()); - result = EnumValidationResult.INVALID; - } - - if (fluidOutput == null || fluidOutput.amount == 0) { - GTLog.logger.error("Output FluidStack cannot be null or empty", new IllegalArgumentException()); - result = EnumValidationResult.INVALID; - } - - if (duration <= 0) { - GTLog.logger.error("Duration cannot be less or equal to 0", new IllegalArgumentException()); - result = EnumValidationResult.INVALID; - } - - return result; - } - - @ZenMethod - public void buildAndRegister() { - ValidationResult result = build(); - - if (result.getType() == EnumValidationResult.VALID) { - CokeOvenRecipe recipe = result.getResult(); - RecipeMaps.COKE_OVEN_RECIPES.add(recipe); - } - } - - @ZenMethod - @Method(modid = GTValues.MODID_CT) - public CokeOvenRecipeBuilder input(IIngredient ingredient) { - return input(new CraftTweakerIngredientWrapper(ingredient), ingredient.getAmount()); - } - - @ZenMethod - @Method(modid = GTValues.MODID_CT) - public CokeOvenRecipeBuilder fluidOutput(ILiquidStack liquidStack) { - return fluidOutput(CraftTweakerMC.getLiquidStack(liquidStack)); - } - - @ZenMethod - @Method(modid = GTValues.MODID_CT) - public CokeOvenRecipeBuilder output(IItemStack itemStack) { - return output(CraftTweakerMC.getItemStack(itemStack)); - } - -} diff --git a/src/main/java/gregtech/api/recipes/builders/PBFRecipeBuilder.java b/src/main/java/gregtech/api/recipes/builders/PBFRecipeBuilder.java deleted file mode 100644 index 1dbf928ba48..00000000000 --- a/src/main/java/gregtech/api/recipes/builders/PBFRecipeBuilder.java +++ /dev/null @@ -1,139 +0,0 @@ -package gregtech.api.recipes.builders; - -import crafttweaker.annotations.ZenRegister; -import crafttweaker.api.item.IIngredient; -import crafttweaker.api.item.IItemStack; -import crafttweaker.api.minecraft.CraftTweakerMC; -import gregtech.api.GTValues; -import gregtech.api.recipes.CountableIngredient; -import gregtech.api.recipes.RecipeMaps; -import gregtech.api.recipes.crafttweaker.CTRecipeBuilder.CraftTweakerIngredientWrapper; -import gregtech.api.recipes.recipes.PrimitiveBlastFurnaceRecipe; -import gregtech.api.unification.OreDictUnifier; -import gregtech.api.unification.material.Material; -import gregtech.api.unification.ore.OrePrefix; -import gregtech.api.util.EnumValidationResult; -import gregtech.api.util.GTLog; -import gregtech.api.util.ValidationResult; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; -import net.minecraftforge.fml.common.Optional.Method; -import stanhebben.zenscript.annotations.ZenClass; -import stanhebben.zenscript.annotations.ZenMethod; - -@ZenClass("mods.gregtech.recipe.PBFRecipeBuilder") -@ZenRegister -public class PBFRecipeBuilder { - - private CountableIngredient input; - private ItemStack output; - - private int duration = -1; - private int fuelAmount = -1; - - private PBFRecipeBuilder() { - } - - @ZenMethod - public static PBFRecipeBuilder start() { - return new PBFRecipeBuilder(); - } - - public PBFRecipeBuilder input(Ingredient input, int amount) { - this.input = new CountableIngredient(input, amount); - return this; - } - - public PBFRecipeBuilder input(ItemStack itemStack) { - this.input = CountableIngredient.from(itemStack); - return this; - } - - public PBFRecipeBuilder input(OrePrefix orePrefix, Material material) { - return input(orePrefix, material, 1); - } - - public PBFRecipeBuilder input(OrePrefix orePrefix, Material material, int amount) { - this.input = CountableIngredient.from(orePrefix, material, amount); - return this; - } - - @ZenMethod - public PBFRecipeBuilder duration(int duration) { - this.duration = duration; - return this; - } - - @ZenMethod - public PBFRecipeBuilder fuelAmount(int fuelAmount) { - this.fuelAmount = fuelAmount; - return this; - } - - public PBFRecipeBuilder output(ItemStack output) { - this.output = output; - return this; - } - - public PBFRecipeBuilder output(OrePrefix prefix, Material material, int amount) { - this.output = OreDictUnifier.get(prefix, material, amount); - return this; - } - - public PBFRecipeBuilder output(OrePrefix prefix, Material material) { - return output(prefix, material, 1); - } - - public ValidationResult build() { - return ValidationResult.newResult(validate(), - new PrimitiveBlastFurnaceRecipe(input, output, duration, fuelAmount)); - } - - protected EnumValidationResult validate() { - EnumValidationResult result = EnumValidationResult.VALID; - - if (input == null) { - GTLog.logger.error("Input Ingredient cannot be null", new IllegalArgumentException()); - result = EnumValidationResult.INVALID; - } - - if (output == null || output.isEmpty()) { - GTLog.logger.error("Output ItemStack cannot be null or empty", new IllegalArgumentException()); - result = EnumValidationResult.INVALID; - } - - if (fuelAmount <= 0) { - GTLog.logger.error("FuelAmount cannot be less or equal to 0", new IllegalArgumentException()); - result = EnumValidationResult.INVALID; - } - if (duration <= 0) { - GTLog.logger.error("Duration cannot be less or equal to 0", new IllegalArgumentException()); - result = EnumValidationResult.INVALID; - } - - return result; - } - - @ZenMethod - public void buildAndRegister() { - ValidationResult result = build(); - - if (result.getType() == EnumValidationResult.VALID) { - PrimitiveBlastFurnaceRecipe recipe = result.getResult(); - RecipeMaps.PRIMITIVE_BLAST_FURNACE_RECIPES.add(recipe); - } - } - - @ZenMethod - @Method(modid = GTValues.MODID_CT) - public PBFRecipeBuilder input(IIngredient ingredient) { - return input(new CraftTweakerIngredientWrapper(ingredient), ingredient.getAmount()); - } - - @ZenMethod - @Method(modid = GTValues.MODID_CT) - public PBFRecipeBuilder output(IItemStack itemStack) { - return output(CraftTweakerMC.getItemStack(itemStack)); - } - -} diff --git a/src/main/java/gregtech/api/recipes/builders/PrimitiveRecipeBuilder.java b/src/main/java/gregtech/api/recipes/builders/PrimitiveRecipeBuilder.java new file mode 100644 index 00000000000..dd1398066e3 --- /dev/null +++ b/src/main/java/gregtech/api/recipes/builders/PrimitiveRecipeBuilder.java @@ -0,0 +1,37 @@ +package gregtech.api.recipes.builders; + +import gregtech.api.recipes.Recipe; +import gregtech.api.recipes.RecipeBuilder; +import gregtech.api.recipes.RecipeMap; +import gregtech.api.recipes.recipeproperties.PrimitiveProperty; +import gregtech.api.util.EnumValidationResult; +import gregtech.api.util.ValidationResult; + +public class PrimitiveRecipeBuilder extends RecipeBuilder { + + public PrimitiveRecipeBuilder() { + } + + public PrimitiveRecipeBuilder(Recipe recipe, RecipeMap recipeMap) { + super(recipe, recipeMap); + } + + public PrimitiveRecipeBuilder(RecipeBuilder recipeBuilder) { + super(recipeBuilder); + } + + @Override + public PrimitiveRecipeBuilder copy() { + return new PrimitiveRecipeBuilder(this); + } + + @Override + public ValidationResult build() { + this.EUt(1); // secretly force to 1 to allow recipe matching to work properly + Recipe recipe = new Recipe(inputs, outputs, chancedOutputs, fluidInputs, fluidOutputs, duration, EUt, hidden); + if (!recipe.setProperty(PrimitiveProperty.getInstance(), true)) { + return ValidationResult.newResult(EnumValidationResult.INVALID, recipe); + } + return ValidationResult.newResult(finalizeAndValidate(), recipe); + } +} diff --git a/src/main/java/gregtech/api/recipes/crafttweaker/CokeOvenRecipeExpansion.java b/src/main/java/gregtech/api/recipes/crafttweaker/CokeOvenRecipeExpansion.java deleted file mode 100644 index 128feb3ad2e..00000000000 --- a/src/main/java/gregtech/api/recipes/crafttweaker/CokeOvenRecipeExpansion.java +++ /dev/null @@ -1,17 +0,0 @@ -package gregtech.api.recipes.crafttweaker; - -import crafttweaker.annotations.ZenRegister; -import gregtech.api.recipes.RecipeMaps; -import gregtech.api.recipes.recipes.CokeOvenRecipe; -import stanhebben.zenscript.annotations.ZenExpansion; -import stanhebben.zenscript.annotations.ZenMethod; - -@ZenExpansion("mods.gregtech.recipe.CokeOvenRecipe") -@ZenRegister -public class CokeOvenRecipeExpansion { - - @ZenMethod - public static void remove(CokeOvenRecipe recipe) { - RecipeMaps.getCokeOvenRecipes().remove(recipe); - } -} diff --git a/src/main/java/gregtech/api/recipes/crafttweaker/PBFRecipeExpansion.java b/src/main/java/gregtech/api/recipes/crafttweaker/PBFRecipeExpansion.java deleted file mode 100644 index 2a4aeda06e5..00000000000 --- a/src/main/java/gregtech/api/recipes/crafttweaker/PBFRecipeExpansion.java +++ /dev/null @@ -1,17 +0,0 @@ -package gregtech.api.recipes.crafttweaker; - -import crafttweaker.annotations.ZenRegister; -import gregtech.api.recipes.RecipeMaps; -import gregtech.api.recipes.recipes.PrimitiveBlastFurnaceRecipe; -import stanhebben.zenscript.annotations.ZenExpansion; -import stanhebben.zenscript.annotations.ZenMethod; - -@ZenExpansion("mods.gregtech.recipe.PrimitiveBlastFurnaceRecipe") -@ZenRegister -public class PBFRecipeExpansion { - - @ZenMethod - public static void remove(PrimitiveBlastFurnaceRecipe recipe) { - RecipeMaps.getPrimitiveBlastFurnaceRecipes().remove(recipe); - } -} diff --git a/src/main/java/gregtech/api/recipes/recipeproperties/PrimitiveProperty.java b/src/main/java/gregtech/api/recipes/recipeproperties/PrimitiveProperty.java new file mode 100644 index 00000000000..59dc9ca3270 --- /dev/null +++ b/src/main/java/gregtech/api/recipes/recipeproperties/PrimitiveProperty.java @@ -0,0 +1,27 @@ +package gregtech.api.recipes.recipeproperties; + +import net.minecraft.client.Minecraft; + +/** + * Simple Marker Property to tell JEI to not display Total EU and EU/t. + */ +public class PrimitiveProperty extends RecipeProperty { + + private static final String KEY = "primitive_property"; + private static PrimitiveProperty INSTANCE; + + private PrimitiveProperty() { + super(KEY, Boolean.class); + } + + public static PrimitiveProperty getInstance() { + if (INSTANCE == null) { + INSTANCE = new PrimitiveProperty(); + } + return INSTANCE; + } + + @Override + public void drawInfo(Minecraft minecraft, int x, int y, int color, Object value) { + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java index b451814a15b..c4924f82934 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java @@ -3,205 +3,57 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -import gregtech.api.capability.impl.FluidTankList; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.ProgressWidget.MoveType; +import gregtech.api.gui.widgets.ProgressWidget; import gregtech.api.gui.widgets.SlotWidget; import gregtech.api.gui.widgets.TankWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.MetaTileEntityHolder; import gregtech.api.metatileentity.multiblock.IMultiblockPart; -import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; +import gregtech.api.metatileentity.multiblock.RecipeMapPrimitiveMultiblockController; import gregtech.api.multiblock.BlockPattern; -import gregtech.api.multiblock.BlockWorldState; import gregtech.api.multiblock.FactoryBlockPattern; import gregtech.api.recipes.RecipeMaps; -import gregtech.api.recipes.recipes.CokeOvenRecipe; import gregtech.api.render.ICubeRenderer; import gregtech.api.render.Textures; -import gregtech.common.blocks.BlockMetalCasing.MetalCasingType; +import gregtech.common.blocks.BlockMetalCasing; import gregtech.common.blocks.MetaBlocks; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTank; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemHandlerHelper; -import net.minecraftforge.items.ItemStackHandler; -import java.util.function.Predicate; - -public class MetaTileEntityCokeOven extends MultiblockControllerBase { - - private int maxProgressDuration; - private int currentProgress; - private ItemStack outputStack; - private FluidStack outputFluid; - private boolean isActive; - private boolean wasActiveAndNeedUpdate; - - private ItemStack lastInputStack = ItemStack.EMPTY; - private CokeOvenRecipe previousRecipe; +public class MetaTileEntityCokeOven extends RecipeMapPrimitiveMultiblockController { public MetaTileEntityCokeOven(ResourceLocation metaTileEntityId) { - super(metaTileEntityId); - } - - @Override - protected void updateFormedValid() { - if (maxProgressDuration == 0) { - if (tryPickNewRecipe()) { - if (wasActiveAndNeedUpdate) { - this.wasActiveAndNeedUpdate = false; - } else setActive(true); - } - } else if (++currentProgress >= maxProgressDuration) { - finishCurrentRecipe(); - this.wasActiveAndNeedUpdate = true; - return; - } - if (wasActiveAndNeedUpdate) { - this.wasActiveAndNeedUpdate = false; - setActive(false); - } - } - - private void finishCurrentRecipe() { - this.maxProgressDuration = 0; - this.currentProgress = 0; - ItemHandlerHelper.insertItemStacked(exportItems, outputStack, false); - this.exportFluids.fill(outputFluid, true); - markDirty(); - } - - private CokeOvenRecipe getOrRefreshRecipe(ItemStack inputStack) { - CokeOvenRecipe currentRecipe = null; - if (previousRecipe != null && - previousRecipe.getInput().getIngredient().apply(inputStack)) { - currentRecipe = previousRecipe; - } else if (!areItemStacksEqual(inputStack, lastInputStack)) { - this.lastInputStack = inputStack.isEmpty() ? ItemStack.EMPTY : inputStack.copy(); - currentRecipe = RecipeMaps.COKE_OVEN_RECIPES.stream() - .filter(it -> it.getInput().getIngredient().test(inputStack)) - .findFirst().orElse(null); - if (currentRecipe != null) { - this.previousRecipe = currentRecipe; - } - } - return currentRecipe; - } - - private static boolean areItemStacksEqual(ItemStack stackA, ItemStack stackB) { - return (stackA.isEmpty() && stackB.isEmpty()) || - (ItemStack.areItemsEqual(stackA, stackB) && - ItemStack.areItemStackTagsEqual(stackA, stackB)); - } - - private boolean setupRecipe(ItemStack inputStack, CokeOvenRecipe recipe) { - return inputStack.getCount() >= recipe.getInput().getCount() && - ItemHandlerHelper.insertItemStacked(exportItems, recipe.getOutput(), true).isEmpty() && - exportFluids.fill(recipe.getFluidOutput(), false) == recipe.getFluidOutput().amount; - } - - private boolean tryPickNewRecipe() { - ItemStack inputStack = importItems.getStackInSlot(0); - if (inputStack.isEmpty()) { - return false; - } - CokeOvenRecipe currentRecipe = getOrRefreshRecipe(inputStack); - if (currentRecipe != null && setupRecipe(inputStack, currentRecipe)) { - inputStack.shrink(currentRecipe.getInput().getCount()); - this.maxProgressDuration = currentRecipe.getDuration(); - this.currentProgress = 0; - this.outputStack = currentRecipe.getOutput().copy(); - this.outputFluid = currentRecipe.getFluidOutput().copy(); - markDirty(); - return true; - } - return false; - } - - @Override - public NBTTagCompound writeToNBT(NBTTagCompound data) { - super.writeToNBT(data); - data.setBoolean("Active", isActive); - data.setBoolean("WasActive", wasActiveAndNeedUpdate); - data.setInteger("MaxProgress", maxProgressDuration); - if (maxProgressDuration > 0) { - data.setInteger("Progress", currentProgress); - data.setTag("OutputItem", outputStack.writeToNBT(new NBTTagCompound())); - data.setTag("OutputFluid", outputFluid.writeToNBT(new NBTTagCompound())); - } - return data; + super(metaTileEntityId, RecipeMaps.COKE_OVEN_RECIPES); } @Override - public void readFromNBT(NBTTagCompound data) { - super.readFromNBT(data); - this.isActive = data.getBoolean("Active"); - this.wasActiveAndNeedUpdate = data.getBoolean("WasActive"); - this.maxProgressDuration = data.getInteger("MaxProgress"); - if (maxProgressDuration > 0) { - this.currentProgress = data.getInteger("Progress"); - this.outputStack = new ItemStack(data.getCompoundTag("OutputItem")); - this.outputFluid = FluidStack.loadFluidStackFromNBT(data.getCompoundTag("OutputFluid")); - } - } - - @Override - public void writeInitialSyncData(PacketBuffer buf) { - super.writeInitialSyncData(buf); - buf.writeBoolean(isActive); - } - - @Override - public void receiveInitialSyncData(PacketBuffer buf) { - super.receiveInitialSyncData(buf); - this.isActive = buf.readBoolean(); + public MetaTileEntity createMetaTileEntity(MetaTileEntityHolder holder) { + return new MetaTileEntityCokeOven(metaTileEntityId); } @Override - public void receiveCustomData(int dataId, PacketBuffer buf) { - super.receiveCustomData(dataId, buf); - if (dataId == 100) { - this.isActive = buf.readBoolean(); - getWorld().checkLight(getPos()); - getHolder().scheduleChunkForRenderUpdate(); - } - } - - public void setActive(boolean active) { - this.isActive = active; - if (!getWorld().isRemote) { - writeCustomData(100, b -> b.writeBoolean(isActive)); - getWorld().checkLight(getPos()); - } + protected BlockPattern createStructurePattern() { + return FactoryBlockPattern.start() + .aisle("XXX", "XZX", "XXX") + .aisle("XZX", "Z#Z", "XZX") + .aisle("XXX", "XYX", "XXX") + .where('Z', statePredicate(getCasingState()).or(tilePredicate((state, tile) -> tile instanceof MetaTileEntityCokeOvenHatch))) + .where('X', statePredicate(getCasingState())) + .where('#', isAirPredicate()) + .where('Y', selfPredicate()) + .build(); } - public boolean isActive() { - return isActive; + protected IBlockState getCasingState() { + return MetaBlocks.METAL_CASING.getState(BlockMetalCasing.MetalCasingType.COKE_BRICKS); } @Override public int getLightValueForPart(IMultiblockPart sourcePart) { - return sourcePart == null && isActive ? 15 : 0; - } - - public double getProgressScaled() { - return maxProgressDuration == 0 ? 0.0 : (currentProgress / (maxProgressDuration * 1.0)); - } - - protected IBlockState getCasingState() { - return MetaBlocks.METAL_CASING.getState(MetalCasingType.COKE_BRICKS); + return sourcePart == null && recipeMapWorkable.isActive() ? 15 : 0; } @Override @@ -212,65 +64,21 @@ public ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) { @Override public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { super.renderMetaTileEntity(renderState, translation, pipeline); - Textures.COKE_OVEN_OVERLAY.render(renderState, translation, pipeline, getFrontFacing(), isActive()); - } - - @Override - public T getCapability(Capability capability, EnumFacing side) { - if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || - capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { - return null; - } - return super.getCapability(capability, side); - } - - @Override - protected IItemHandlerModifiable createImportItemHandler() { - return new ItemStackHandler(1); - } - - @Override - protected IItemHandlerModifiable createExportItemHandler() { - return new ItemStackHandler(1); - } - - @Override - protected FluidTankList createExportFluidHandler() { - return new FluidTankList(false, new FluidTank(32000)); - } - - @Override - protected BlockPattern createStructurePattern() { - Predicate hatchPredicate = tilePredicate((state, tile) -> tile instanceof MetaTileEntityCokeOvenHatch); - return FactoryBlockPattern.start() - .aisle("XXX", "XZX", "XXX") - .aisle("XZX", "Z#Z", "XZX") - .aisle("XXX", "XYX", "XXX") - .where('Z', statePredicate(getCasingState()).or(hatchPredicate)) - .where('X', statePredicate(getCasingState())) - .where('#', isAirPredicate()) - .where('Y', selfPredicate()) - .build(); - } - - @Override - public MetaTileEntity createMetaTileEntity(MetaTileEntityHolder holder) { - return new MetaTileEntityCokeOven(metaTileEntityId); + Textures.COKE_OVEN_OVERLAY.render(renderState, translation, pipeline, getFrontFacing(), recipeMapWorkable.isActive()); } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { + protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { return ModularUI.builder(GuiTextures.BACKGROUND, 176, 166) .widget(new SlotWidget(importItems, 0, 33, 30, true, true) .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.FURNACE_OVERLAY)) - .progressBar(this::getProgressScaled, 58, 30, 20, 15, GuiTextures.BRONZE_BLAST_FURNACE_PROGRESS_BAR, MoveType.HORIZONTAL) + .progressBar(recipeMapWorkable::getProgressPercent, 58, 30, 20, 15, GuiTextures.BRONZE_BLAST_FURNACE_PROGRESS_BAR, ProgressWidget.MoveType.HORIZONTAL) .widget(new SlotWidget(exportItems, 0, 85, 30, true, false) .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.FURNACE_OVERLAY)) .widget(new TankWidget(exportFluids.getTankAt(0), 133, 13, 20, 58) .setBackgroundTexture(GuiTextures.FLUID_TANK_BACKGROUND) .setOverlayTexture(GuiTextures.FLUID_TANK_OVERLAY) .setContainerClicking(true, false)) - .bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 0) - .build(getHolder(), entityPlayer); + .bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 0); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java index 9a3cf77a0b7..988b35bc9de 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java @@ -5,376 +5,35 @@ import codechicken.lib.texture.TextureUtils; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import gregtech.api.GTValues; -import gregtech.api.capability.impl.ItemHandlerProxy; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.ProgressWidget.MoveType; +import gregtech.api.gui.widgets.ProgressWidget; import gregtech.api.gui.widgets.SlotWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.MetaTileEntityHolder; import gregtech.api.metatileentity.multiblock.IMultiblockPart; -import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; +import gregtech.api.metatileentity.multiblock.RecipeMapPrimitiveMultiblockController; import gregtech.api.multiblock.BlockPattern; import gregtech.api.multiblock.FactoryBlockPattern; import gregtech.api.recipes.RecipeMaps; -import gregtech.api.recipes.recipes.PrimitiveBlastFurnaceRecipe; import gregtech.api.render.ICubeRenderer; import gregtech.api.render.Textures; -import gregtech.api.unification.OreDictUnifier; -import gregtech.api.unification.material.Material; -import gregtech.api.unification.material.Materials; -import gregtech.api.unification.ore.OrePrefix; -import gregtech.api.unification.stack.MaterialStack; -import gregtech.api.unification.stack.UnificationEntry; -import gregtech.common.blocks.BlockMetalCasing.MetalCasingType; +import gregtech.common.blocks.BlockMetalCasing; import gregtech.common.blocks.MetaBlocks; -import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; -import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.MathHelper; -import net.minecraftforge.common.util.Constants.NBT; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemStackHandler; -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static gregtech.api.util.InventoryUtils.simulateItemStackMerge; - -public class MetaTileEntityPrimitiveBlastFurnace extends MultiblockControllerBase { - - private static final List FUEL_DISPLAY_PREFIXES = ImmutableList.of( - OrePrefix.gem, OrePrefix.dust, OrePrefix.block); - - private static final Map ALTERNATIVE_MATERIAL_NAMES = ImmutableMap.of( - "fuelCoke", new MaterialStack(Materials.Coke, GTValues.M), - "blockFuelCoke", new MaterialStack(Materials.Coke, GTValues.M * 9L)); - - private static final Map MATERIAL_FUEL_MAP = ImmutableMap.of( - Materials.Lignite, 0.7f, - Materials.Charcoal, 1.0f, - Materials.Coal, 1.0f, - Materials.Coke, 2.0f); - - private int maxProgressDuration; - private int currentProgress; - private NonNullList outputsList; - private float fuelUnitsLeft; - private boolean isActive; - private boolean wasActiveAndNeedUpdate; - - private ItemStack lastInputStack = ItemStack.EMPTY; - private PrimitiveBlastFurnaceRecipe previousRecipe; +public class MetaTileEntityPrimitiveBlastFurnace extends RecipeMapPrimitiveMultiblockController { public MetaTileEntityPrimitiveBlastFurnace(ResourceLocation metaTileEntityId) { - super(metaTileEntityId); - } - - @Override - protected void updateFormedValid() { - if (maxProgressDuration == 0) { - if (tryPickNewRecipe()) { - if (wasActiveAndNeedUpdate) { - this.wasActiveAndNeedUpdate = false; - } else setActive(true); - } - } else if (++currentProgress >= maxProgressDuration) { - finishCurrentRecipe(); - this.wasActiveAndNeedUpdate = true; - return; - } - if (wasActiveAndNeedUpdate) { - this.wasActiveAndNeedUpdate = false; - setActive(false); - } - } - - private void finishCurrentRecipe() { - this.maxProgressDuration = 0; - this.currentProgress = 0; - MetaTileEntity.addItemsToItemHandler(exportItems, false, outputsList); - this.outputsList = null; - markDirty(); - } - - private PrimitiveBlastFurnaceRecipe getOrRefreshRecipe(ItemStack inputStack) { - PrimitiveBlastFurnaceRecipe currentRecipe = null; - if (previousRecipe != null && - previousRecipe.getInput().getIngredient().apply(inputStack)) { - currentRecipe = previousRecipe; - } else if (!areItemStacksEqual(inputStack, lastInputStack)) { - this.lastInputStack = inputStack.isEmpty() ? ItemStack.EMPTY : inputStack.copy(); - currentRecipe = RecipeMaps.PRIMITIVE_BLAST_FURNACE_RECIPES.stream() - .filter(it -> it.getInput().getIngredient().test(inputStack)) - .findFirst().orElse(null); - if (currentRecipe != null) { - this.previousRecipe = currentRecipe; - } - } - return currentRecipe; - } - - private static boolean areItemStacksEqual(ItemStack stackA, ItemStack stackB) { - return (stackA.isEmpty() && stackB.isEmpty()) || - (ItemStack.areItemsEqual(stackA, stackB) && - ItemStack.areItemStackTagsEqual(stackA, stackB)); - } - - private boolean setupRecipe(ItemStack inputStack, int fuelAmount, PrimitiveBlastFurnaceRecipe recipe) { - List outputs = new ArrayList<>(); - outputs.add(recipe.getOutput()); - outputs.add(getAshForRecipeFuelConsumption(recipe.getFuelAmount())); - return inputStack.getCount() >= recipe.getInput().getCount() && fuelAmount >= recipe.getFuelAmount() && - simulateItemStackMerge(outputs, exportItems); - } - - private boolean tryPickNewRecipe() { - ItemStack inputStack = importItems.getStackInSlot(0); - ItemStack fuelStack = importItems.getStackInSlot(1); - if (inputStack.isEmpty() || (fuelStack.isEmpty() && fuelUnitsLeft == 0)) { - return false; - } - float fuelUnitsPerItem = getFuelUnits(fuelStack); - float totalFuelUnits = fuelUnitsLeft + fuelUnitsPerItem * fuelStack.getCount(); - PrimitiveBlastFurnaceRecipe currentRecipe = getOrRefreshRecipe(inputStack); - if (currentRecipe != null && setupRecipe(inputStack, (int) totalFuelUnits, currentRecipe)) { - inputStack.shrink(currentRecipe.getInput().getCount()); - float fuelUnitsToConsume = currentRecipe.getFuelAmount(); - float remainderConsumed = Math.min(fuelUnitsToConsume, fuelUnitsLeft); - fuelUnitsToConsume -= remainderConsumed; - - int fuelItemsToConsume = (int) Math.ceil(fuelUnitsToConsume / (fuelUnitsPerItem * 1.0)); - float remainderAdded = fuelItemsToConsume * fuelUnitsPerItem - fuelUnitsToConsume; - - this.fuelUnitsLeft += (remainderAdded - remainderConsumed); - fuelStack.shrink(fuelItemsToConsume); - this.maxProgressDuration = currentRecipe.getDuration(); - this.currentProgress = 0; - NonNullList outputs = NonNullList.create(); - outputs.add(currentRecipe.getOutput().copy()); - outputs.add(getAshForRecipeFuelConsumption(currentRecipe.getFuelAmount())); - this.outputsList = outputs; - markDirty(); - return true; - } - return false; - } - - @Override - public NBTTagCompound writeToNBT(NBTTagCompound data) { - super.writeToNBT(data); - data.setBoolean("Active", isActive); - data.setBoolean("WasActive", wasActiveAndNeedUpdate); - data.setFloat("FuelUnitsLeft", fuelUnitsLeft); - data.setInteger("MaxProgress", maxProgressDuration); - if (maxProgressDuration > 0) { - data.setInteger("Progress", currentProgress); - NBTTagList itemOutputs = new NBTTagList(); - for (ItemStack itemStack : outputsList) { - itemOutputs.appendTag(itemStack.writeToNBT(new NBTTagCompound())); - } - data.setTag("Outputs", itemOutputs); - } - return data; + super(metaTileEntityId, RecipeMaps.PRIMITIVE_BLAST_FURNACE_RECIPES); } @Override - public void readFromNBT(NBTTagCompound data) { - super.readFromNBT(data); - this.isActive = data.getBoolean("Active"); - this.wasActiveAndNeedUpdate = data.getBoolean("WasActive"); - this.fuelUnitsLeft = data.getFloat("FuelUnitsLeft"); - this.maxProgressDuration = data.getInteger("MaxProgress"); - if (maxProgressDuration > 0) { - this.currentProgress = data.getInteger("Progress"); - NBTTagList itemOutputs = data.getTagList("Outputs", NBT.TAG_COMPOUND); - this.outputsList = NonNullList.create(); - for (int i = 0; i < itemOutputs.tagCount(); i++) { - this.outputsList.add(new ItemStack(itemOutputs.getCompoundTagAt(i))); - } - } - } - - @Override - public void writeInitialSyncData(PacketBuffer buf) { - super.writeInitialSyncData(buf); - buf.writeBoolean(isActive); - } - - @Override - public void receiveInitialSyncData(PacketBuffer buf) { - super.receiveInitialSyncData(buf); - this.isActive = buf.readBoolean(); - } - - @Override - public void receiveCustomData(int dataId, PacketBuffer buf) { - super.receiveCustomData(dataId, buf); - if (dataId == 100) { - this.isActive = buf.readBoolean(); - getWorld().checkLight(getPos()); - getHolder().scheduleChunkForRenderUpdate(); - } - } - - public void setActive(boolean active) { - this.isActive = active; - if (!getWorld().isRemote) { - writeCustomData(100, b -> b.writeBoolean(isActive)); - getWorld().checkLight(getPos()); - } - } - - public boolean isActive() { - return isActive; - } - - public double getProgressScaled() { - return maxProgressDuration == 0 ? 0.0 : (currentProgress / (maxProgressDuration * 1.0)); - } - - @Override - public int getLightValueForPart(IMultiblockPart sourcePart) { - return sourcePart == null && isActive ? 15 : 0; - } - - public static float getFuelUnits(ItemStack fuelType) { - if (fuelType.isEmpty()) { - return 0; - } - MaterialStack materialStack = OreDictUnifier.getMaterial(fuelType); - if (materialStack == null) { - //try alternative material names if we can't find valid standard one - materialStack = OreDictUnifier.getOreDictionaryNames(fuelType).stream() - .map(ALTERNATIVE_MATERIAL_NAMES::get) - .filter(Objects::nonNull) - .findFirst().orElse(null); - } - - if (materialStack != null && materialStack.amount >= GTValues.M) { - int materialAmount = (int) (materialStack.amount / GTValues.M); - Float materialMultiplier = MATERIAL_FUEL_MAP.get(materialStack.material); - return materialMultiplier == null ? 0 : materialAmount * materialMultiplier; - } - return 0; - } - - public static List getDisplayFuelsForRecipe(int recipeFuelUnits) { - ArrayList resultStacks = new ArrayList<>(); - - for (OrePrefix orePrefix : FUEL_DISPLAY_PREFIXES) { - int materialAmount = (int) (orePrefix.materialAmount / GTValues.M); - for (Material fuelMaterial : MATERIAL_FUEL_MAP.keySet()) { - float materialMultiplier = MATERIAL_FUEL_MAP.get(fuelMaterial); - float materialFuelUnits = materialAmount * materialMultiplier; - int stackSize = (int) Math.ceil(recipeFuelUnits / materialFuelUnits); - - List materialStacks = OreDictUnifier.getAll(new UnificationEntry(orePrefix, fuelMaterial)); - for (ItemStack materialStack : materialStacks) { - materialStack.setCount(stackSize); - resultStacks.add(materialStack); - } - } - } - - for (String specialFuelName : ALTERNATIVE_MATERIAL_NAMES.keySet()) { - List allItemStacks = OreDictUnifier.getAllWithOreDictionaryName(specialFuelName); - MaterialStack materialStack = ALTERNATIVE_MATERIAL_NAMES.get(specialFuelName); - int materialAmount = (int) (materialStack.amount / GTValues.M); - float materialMultiplier = MATERIAL_FUEL_MAP.getOrDefault(materialStack.material, 0.0f); - float materialFuelUnits = materialAmount * materialMultiplier; - int stackSize = (int) Math.ceil(recipeFuelUnits / materialFuelUnits); - - for (ItemStack itemStack : allItemStacks) { - itemStack.setCount(stackSize); - resultStacks.add(itemStack); - } - } - - //de-duplicate items in the result list - int currentIndex = 0; - loop: - while (currentIndex < resultStacks.size()) { - ItemStack itemStack = resultStacks.get(currentIndex); - - for (int i = 0; i < currentIndex; i++) { - ItemStack otherStack = resultStacks.get(i); - if (ItemStack.areItemsEqual(itemStack, otherStack)) { - resultStacks.remove(currentIndex); //remove duplicate item - continue loop; - } - } - //increment index only if we didn't remove item - currentIndex++; - } - - return resultStacks; - } - - public static ItemStack getAshForRecipeFuelConsumption(int fuelUnitsConsumed) { - int ashAmount = MathHelper.clamp(1 + fuelUnitsConsumed, 2, 8); - return OreDictUnifier.get(OrePrefix.dustTiny, Materials.DarkAsh, ashAmount); - } - - protected IBlockState getCasingState() { - return MetaBlocks.METAL_CASING.getState(MetalCasingType.PRIMITIVE_BRICKS); - } - - @Override - public ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) { - return Textures.PRIMITIVE_BRICKS; - } - - @Override - public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { - super.renderMetaTileEntity(renderState, translation, pipeline); - Textures.PRIMITIVE_BLAST_FURNACE_OVERLAY.render(renderState, translation, pipeline, getFrontFacing(), isActive()); - if (isActive() && isStructureFormed()) { - EnumFacing back = getFrontFacing().getOpposite(); - Matrix4 offset = translation.copy().translate(back.getXOffset(), -0.3, back.getZOffset()); - TextureAtlasSprite sprite = TextureUtils.getBlockTexture("lava_still"); - renderState.brightness = 0xF000F0; - renderState.colour = 0xFFFFFFFF; - Textures.renderFace(renderState, offset, new IVertexOperation[0], EnumFacing.UP, Cuboid6.full, sprite); - } - } - - @Override - protected void initializeInventory() { - super.initializeInventory(); - ItemStackHandler emptyHandler = new ItemStackHandler(0); - this.itemInventory = new ItemHandlerProxy(emptyHandler, emptyHandler); - } - - @Override - protected IItemHandlerModifiable createImportItemHandler() { - return new ItemStackHandler(2) { - @Nonnull - @Override - public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { - if (slot == 1 && getFuelUnits(stack) == 0) - return stack; - return super.insertItem(slot, stack, simulate); - } - }; - } - - @Override - protected IItemHandlerModifiable createExportItemHandler() { - return new ItemStackHandler(2); + public MetaTileEntity createMetaTileEntity(MetaTileEntityHolder holder) { + return new MetaTileEntityPrimitiveBlastFurnace(metaTileEntityId); } @Override @@ -383,30 +42,48 @@ protected BlockPattern createStructurePattern() { .aisle("XXX", "XXX", "XXX", "XXX") .aisle("XXX", "X#X", "X#X", "X#X") .aisle("XXX", "XYX", "XXX", "XXX") - .where('X', statePredicate(getCasingState())) + .where('X', statePredicate(MetaBlocks.METAL_CASING.getState(BlockMetalCasing.MetalCasingType.PRIMITIVE_BRICKS))) .where('#', isAirPredicate()) .where('Y', selfPredicate()) .build(); } @Override - public MetaTileEntity createMetaTileEntity(MetaTileEntityHolder holder) { - return new MetaTileEntityPrimitiveBlastFurnace(metaTileEntityId); + public ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) { + return Textures.PRIMITIVE_BRICKS; + } + + @Override + public int getLightValueForPart(IMultiblockPart sourcePart) { + return sourcePart == null && recipeMapWorkable.isActive() ? 15 : 0; } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { + protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { return ModularUI.builder(GuiTextures.BACKGROUND, 176, 166) .widget(new SlotWidget(importItems, 0, 33, 15, true, true) .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.INGOT_OVERLAY)) .widget(new SlotWidget(importItems, 1, 33, 33, true, true) .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.FURNACE_OVERLAY)) - .progressBar(this::getProgressScaled, 58, 24, 20, 15, GuiTextures.BRONZE_BLAST_FURNACE_PROGRESS_BAR, MoveType.HORIZONTAL) + .progressBar(recipeMapWorkable::getProgressPercent, 58, 24, 20, 15, GuiTextures.BRONZE_BLAST_FURNACE_PROGRESS_BAR, ProgressWidget.MoveType.HORIZONTAL) .widget(new SlotWidget(exportItems, 0, 85, 24, true, false) .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.INGOT_OVERLAY)) .widget(new SlotWidget(exportItems, 1, 103, 24, true, false) .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.DUST_OVERLAY)) - .bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 0) - .build(getHolder(), entityPlayer); + .bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 0); + } + + @Override + public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { + super.renderMetaTileEntity(renderState, translation, pipeline); + Textures.PRIMITIVE_BLAST_FURNACE_OVERLAY.render(renderState, translation, pipeline, getFrontFacing(), recipeMapWorkable.isActive()); + if (recipeMapWorkable.isActive() && isStructureFormed()) { + EnumFacing back = getFrontFacing().getOpposite(); + Matrix4 offset = translation.copy().translate(back.getXOffset(), -0.3, back.getZOffset()); + TextureAtlasSprite sprite = TextureUtils.getBlockTexture("lava_still"); + renderState.brightness = 0xF000F0; + renderState.colour = 0xFFFFFFFF; + Textures.renderFace(renderState, offset, new IVertexOperation[0], EnumFacing.UP, Cuboid6.full, sprite); + } } } diff --git a/src/main/java/gregtech/integration/jei/GTJeiPlugin.java b/src/main/java/gregtech/integration/jei/GTJeiPlugin.java index c83a11c1ab6..136da33fd44 100755 --- a/src/main/java/gregtech/integration/jei/GTJeiPlugin.java +++ b/src/main/java/gregtech/integration/jei/GTJeiPlugin.java @@ -75,8 +75,6 @@ public void registerCategories(IRecipeCategoryRegistration registry) { for (FuelRecipeMap fuelRecipeMap : FuelRecipeMap.getRecipeMaps()) { registry.addRecipeCategories(new FuelRecipeMapCategory(fuelRecipeMap, registry.getJeiHelpers().getGuiHelper())); } - registry.addRecipeCategories(new PrimitiveBlastRecipeCategory(registry.getJeiHelpers().getGuiHelper())); - registry.addRecipeCategories(new CokeOvenRecipeCategory(registry.getJeiHelpers().getGuiHelper())); registry.addRecipeCategories(new OreByProductCategory(registry.getJeiHelpers().getGuiHelper())); registry.addRecipeCategories(new GTOreCategory(registry.getJeiHelpers().getGuiHelper())); } @@ -150,18 +148,6 @@ public void register(IModRegistry registry) { registry.addIngredientInfo(Objects.requireNonNull(MetaItems.FLUID_CELL.getStackForm()), VanillaTypes.ITEM, I18n.format("gregtech.item.fluid_cell.jei_description")); - String primitiveBlastId = GTValues.MODID + ":" + "primitive_blast_furnace"; - registry.addRecipes(RecipeMaps.PRIMITIVE_BLAST_FURNACE_RECIPES.stream() - .map(PrimitiveBlastRecipeWrapper::new) - .collect(Collectors.toList()), primitiveBlastId); - registry.addRecipeCatalyst(MetaTileEntities.PRIMITIVE_BLAST_FURNACE.getStackForm(), primitiveBlastId); - - String cokeOvenId = GTValues.MODID + ":" + "coke_oven"; - registry.addRecipes(RecipeMaps.COKE_OVEN_RECIPES.stream() - .map(CokeOvenRecipeWrapper::new) - .collect(Collectors.toList()), cokeOvenId); - registry.addRecipeCatalyst(MetaTileEntities.COKE_OVEN.getStackForm(), cokeOvenId); - //TODO, add Electromagnetic Separator to the Ore Byproduct page List oreByproductList = new CopyOnWriteArrayList<>(); for (Material material : MaterialRegistry.MATERIAL_REGISTRY) { diff --git a/src/main/java/gregtech/integration/jei/recipe/GTRecipeWrapper.java b/src/main/java/gregtech/integration/jei/recipe/GTRecipeWrapper.java index e18b4509c06..5a92426991e 100644 --- a/src/main/java/gregtech/integration/jei/recipe/GTRecipeWrapper.java +++ b/src/main/java/gregtech/integration/jei/recipe/GTRecipeWrapper.java @@ -3,6 +3,7 @@ import gregtech.api.recipes.CountableIngredient; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.Recipe.ChanceEntry; +import gregtech.api.recipes.recipeproperties.PrimitiveProperty; import gregtech.api.recipes.recipeproperties.RecipeProperty; import gregtech.api.unification.OreDictUnifier; import gregtech.api.util.ItemStackHashStrategy; @@ -123,11 +124,12 @@ public void addTooltip(int slotIndex, boolean input, Object ingredient, List= 0 ? "gregtech.recipe.eu" : "gregtech.recipe.eu_inverted", Math.abs(recipe.getEUt()), JEIHelpers.getMinTierForVoltage(recipe.getEUt())), 0, yPosition += LINE_HEIGHT, 0x111111); + if (recipe.getProperty(PrimitiveProperty.getInstance(), null) == null) { + minecraft.fontRenderer.drawString(I18n.format("gregtech.recipe.total", Math.abs((long) recipe.getEUt()) * recipe.getDuration()), 0, yPosition, 0x111111); + minecraft.fontRenderer.drawString(I18n.format(recipe.getEUt() >= 0 ? "gregtech.recipe.eu" : "gregtech.recipe.eu_inverted", Math.abs(recipe.getEUt()), JEIHelpers.getMinTierForVoltage(recipe.getEUt())), 0, yPosition += LINE_HEIGHT, 0x111111); + } minecraft.fontRenderer.drawString(I18n.format("gregtech.recipe.duration", recipe.getDuration() / 20f), 0, yPosition += LINE_HEIGHT, 0x111111); for (Map.Entry, Object> propertyEntry : recipe.getPropertyValues()) { if (!propertyEntry.getKey().isHidden()) { diff --git a/src/main/java/gregtech/integration/jei/recipe/primitive/CokeOvenRecipeCategory.java b/src/main/java/gregtech/integration/jei/recipe/primitive/CokeOvenRecipeCategory.java deleted file mode 100644 index 7d8254a2b37..00000000000 --- a/src/main/java/gregtech/integration/jei/recipe/primitive/CokeOvenRecipeCategory.java +++ /dev/null @@ -1,58 +0,0 @@ -package gregtech.integration.jei.recipe.primitive; - -import gregtech.api.gui.GuiTextures; -import gregtech.api.recipes.recipes.CokeOvenRecipe; -import mezz.jei.api.IGuiHelper; -import mezz.jei.api.gui.IDrawable; -import mezz.jei.api.gui.IGuiFluidStackGroup; -import mezz.jei.api.gui.IGuiItemStackGroup; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.client.Minecraft; - -import javax.annotation.Nonnull; - -public class CokeOvenRecipeCategory extends PrimitiveRecipeCategory { - - protected final IDrawable slot; - protected final IDrawable progressBar; - protected final IDrawable fluidTank; - - - public CokeOvenRecipeCategory(IGuiHelper guiHelper) { - super("coke_oven", - "gregtech.machine.coke_oven.name", - guiHelper.createBlankDrawable(176, 60), guiHelper); - - this.slot = guiHelper.drawableBuilder(GuiTextures.SLOT.imageLocation, 0, 0, 18, 18).setTextureSize(18, 18).build(); - this.progressBar = guiHelper.drawableBuilder(GuiTextures.PROGRESS_BAR_COKE_OVEN.imageLocation, 0, 0, 36, 18).setTextureSize(36, 18).build(); - this.fluidTank = guiHelper.drawableBuilder(GuiTextures.FLUID_SLOT.imageLocation, 0, 0, 18, 18).setTextureSize(18, 18).build(); -// this.fluidTankOverlay = guiHelper.drawableBuilder(GuiTextures.FLUID_TANK_OVERLAY.imageLocation, 0, 0, 20, 58).setTextureSize(20, 58).build(); - } - - @Override - public void setRecipe(IRecipeLayout recipeLayout, @Nonnull CokeOvenRecipeWrapper recipeWrapper, @Nonnull IIngredients ingredients) { - IGuiItemStackGroup itemStackGroup = recipeLayout.getItemStacks(); - IGuiFluidStackGroup fluidStackGroup = recipeLayout.getFluidStacks(); - itemStackGroup.init(0, true, 51, 18); - itemStackGroup.init(1, false, 105, 9); - itemStackGroup.set(ingredients); - fluidStackGroup.init(0, false, 105, 27, 18, 18, 5000, false, null); //todo convert to modularUI, change capacity to 32B - fluidStackGroup.set(ingredients); - } - - @Nonnull - @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull CokeOvenRecipe recipe) { - return new CokeOvenRecipeWrapper(recipe); - } - - @Override - public void drawExtras(Minecraft minecraft) { - this.slot.draw(minecraft, 51, 18); - this.slot.draw(minecraft, 105, 9); - this.progressBar.draw(minecraft, 69, 18); - this.fluidTank.draw(minecraft, 105, 27); - } -} diff --git a/src/main/java/gregtech/integration/jei/recipe/primitive/CokeOvenRecipeWrapper.java b/src/main/java/gregtech/integration/jei/recipe/primitive/CokeOvenRecipeWrapper.java deleted file mode 100644 index fa11dce6143..00000000000 --- a/src/main/java/gregtech/integration/jei/recipe/primitive/CokeOvenRecipeWrapper.java +++ /dev/null @@ -1,53 +0,0 @@ -package gregtech.integration.jei.recipe.primitive; - -import gregtech.api.recipes.CountableIngredient; -import gregtech.api.recipes.recipes.CokeOvenRecipe; -import gregtech.api.unification.OreDictUnifier; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.ingredients.VanillaTypes; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.I18n; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -public class CokeOvenRecipeWrapper implements IRecipeWrapper { - - private final CokeOvenRecipe recipe; - private final List> matchingInputs = new ArrayList<>(); - private final List outputs = new ArrayList<>(); - private final List fluidOutputs = new ArrayList<>(); - - public CokeOvenRecipeWrapper(CokeOvenRecipe recipe) { - this.recipe = recipe; - CountableIngredient ingredient = recipe.getInput(); - - List ingredientValues = Arrays.stream(ingredient.getIngredient().getMatchingStacks()) - .map(ItemStack::copy) - .sorted(OreDictUnifier.getItemStackComparator()) - .collect(Collectors.toList()); - ingredientValues.forEach(stack -> stack.setCount(ingredient.getCount())); - - this.matchingInputs.add(ingredientValues); - this.outputs.add(recipe.getOutput()); - this.fluidOutputs.add(recipe.getFluidOutput()); - } - - @Override - public void getIngredients(IIngredients ingredients) { - ingredients.setInputLists(VanillaTypes.ITEM, this.matchingInputs); - ingredients.setOutputs(VanillaTypes.ITEM, this.outputs); - ingredients.setOutputs(VanillaTypes.FLUID, this.fluidOutputs); - } - - @Override - public void drawInfo(Minecraft minecraft, int recipeWidth, int recipeHeight, int mouseX, int mouseY) { - minecraft.fontRenderer.drawString(I18n.format("gregtech.recipe.duration", this.recipe.getDuration() / 20f), 0, 50, 0x111111); - } - -} diff --git a/src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveBlastRecipeCategory.java b/src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveBlastRecipeCategory.java deleted file mode 100644 index b6156b9bb55..00000000000 --- a/src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveBlastRecipeCategory.java +++ /dev/null @@ -1,55 +0,0 @@ -package gregtech.integration.jei.recipe.primitive; - -import gregtech.api.gui.GuiTextures; -import gregtech.api.recipes.recipes.PrimitiveBlastFurnaceRecipe; -import mezz.jei.api.IGuiHelper; -import mezz.jei.api.gui.IDrawable; -import mezz.jei.api.gui.IGuiItemStackGroup; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.client.Minecraft; - -import javax.annotation.Nonnull; - -public class PrimitiveBlastRecipeCategory extends PrimitiveRecipeCategory { - - protected final IDrawable slot; - protected final IDrawable progressBar; - - public PrimitiveBlastRecipeCategory(IGuiHelper guiHelper) { - super("primitive_blast_furnace", - "gregtech.machine.primitive_blast_furnace.bronze.name", - guiHelper.createBlankDrawable(140, 60), guiHelper); - - this.slot = guiHelper.drawableBuilder(GuiTextures.SLOT.imageLocation, 0, 0, 18, 18).setTextureSize(18, 18).build(); - this.progressBar = guiHelper.drawableBuilder(GuiTextures.BRONZE_BLAST_FURNACE_PROGRESS_BAR.imageLocation, 0, 0, 20, 15).setTextureSize(20, 30).build(); - } - - @Override - public void setRecipe(IRecipeLayout recipeLayout, @Nonnull PrimitiveBlastRecipeWrapper recipeWrapper, - @Nonnull IIngredients ingredients) { - IGuiItemStackGroup itemStackGroup = recipeLayout.getItemStacks(); - itemStackGroup.init(0, true, 32, 4); - itemStackGroup.init(1, true, 32, 22); - - itemStackGroup.init(2, false, 84, 13); - itemStackGroup.init(3, false, 102, 13); - itemStackGroup.set(ingredients); - } - - @Nonnull - @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull PrimitiveBlastFurnaceRecipe recipe) { - return new PrimitiveBlastRecipeWrapper(recipe); - } - - @Override - public void drawExtras(Minecraft minecraft) { - this.slot.draw(minecraft, 32, 4); - this.slot.draw(minecraft, 32, 22); - this.slot.draw(minecraft, 84, 13); - this.slot.draw(minecraft, 102, 13); - this.progressBar.draw(minecraft, 57, 14); - } -} diff --git a/src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveBlastRecipeWrapper.java b/src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveBlastRecipeWrapper.java deleted file mode 100644 index 1f39349b4de..00000000000 --- a/src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveBlastRecipeWrapper.java +++ /dev/null @@ -1,57 +0,0 @@ -package gregtech.integration.jei.recipe.primitive; - -import com.google.common.collect.ImmutableList; -import gregtech.api.recipes.CountableIngredient; -import gregtech.api.recipes.recipes.PrimitiveBlastFurnaceRecipe; -import gregtech.api.unification.OreDictUnifier; -import gregtech.common.metatileentities.multi.MetaTileEntityPrimitiveBlastFurnace; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.ingredients.VanillaTypes; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.I18n; -import net.minecraft.item.ItemStack; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -public class PrimitiveBlastRecipeWrapper implements IRecipeWrapper { - - private final PrimitiveBlastFurnaceRecipe recipe; - private final List> matchingInputs = new ArrayList<>(); - private final List> outputs = new ArrayList<>(); - - public PrimitiveBlastRecipeWrapper(PrimitiveBlastFurnaceRecipe recipe) { - this.recipe = recipe; - CountableIngredient ingredient = recipe.getInput(); - - List ingredientValues = Arrays.stream(ingredient.getIngredient().getMatchingStacks()) - .map(ItemStack::copy) - .sorted(OreDictUnifier.getItemStackComparator()) - .collect(Collectors.toList()); - ingredientValues.forEach(stack -> stack.setCount(ingredient.getCount())); - - this.matchingInputs.add(ingredientValues); - - List displayFuelStacks = MetaTileEntityPrimitiveBlastFurnace.getDisplayFuelsForRecipe(recipe.getFuelAmount()); - this.matchingInputs.add(displayFuelStacks); - - ItemStack ashesItemStack = MetaTileEntityPrimitiveBlastFurnace.getAshForRecipeFuelConsumption(recipe.getFuelAmount()); - this.outputs.add(ImmutableList.of(recipe.getOutput())); - this.outputs.add(ImmutableList.of(ashesItemStack)); - } - - @Override - public void getIngredients(IIngredients ingredients) { - ingredients.setInputLists(VanillaTypes.ITEM, this.matchingInputs); - ingredients.setOutputLists(VanillaTypes.ITEM, this.outputs); - } - - @Override - public void drawInfo(Minecraft minecraft, int recipeWidth, int recipeHeight, int mouseX, int mouseY) { - minecraft.fontRenderer.drawString(I18n.format("gregtech.recipe.duration", this.recipe.getDuration() / 20f), 0, 55, 0x111111); - } - -} diff --git a/src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveRecipeCategory.java b/src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveRecipeCategory.java index 3ecd7654e0b..4f2c691c6ad 100644 --- a/src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveRecipeCategory.java +++ b/src/main/java/gregtech/integration/jei/recipe/primitive/PrimitiveRecipeCategory.java @@ -14,6 +14,7 @@ import java.util.Collections; import java.util.List; +// TODO Should be renamed to "BasicRecipeCategory" public abstract class PrimitiveRecipeCategory implements IRecipeCategory, IRecipeWrapperFactory { public final String uniqueName; diff --git a/src/main/java/gregtech/loaders/recipe/MachineRecipeLoader.java b/src/main/java/gregtech/loaders/recipe/MachineRecipeLoader.java index d4b484b10a0..21ff004543e 100644 --- a/src/main/java/gregtech/loaders/recipe/MachineRecipeLoader.java +++ b/src/main/java/gregtech/loaders/recipe/MachineRecipeLoader.java @@ -4,8 +4,6 @@ import gregtech.api.items.metaitem.MetaItem; import gregtech.api.recipes.ModHandler; import gregtech.api.recipes.RecipeMaps; -import gregtech.api.recipes.builders.CokeOvenRecipeBuilder; -import gregtech.api.recipes.builders.PBFRecipeBuilder; import gregtech.api.recipes.ingredients.IntCircuitIngredient; import gregtech.api.unification.OreDictUnifier; import gregtech.api.unification.material.MarkerMaterials; @@ -199,17 +197,35 @@ private static void registerBendingCompressingRecipes() { .duration(400).EUt(2).buildAndRegister(); } + // todo this should be done better but will work for now private static void registerPrimitiveBlastFurnaceRecipes() { - PBFRecipeBuilder.start().input(ingot, Iron).output(ingot, Steel).duration(1500).fuelAmount(2).buildAndRegister(); - PBFRecipeBuilder.start().input(block, Iron).output(block, Steel).duration(13500).fuelAmount(18).buildAndRegister(); - PBFRecipeBuilder.start().input(ingot, WroughtIron).output(ingot, Steel).duration(600).fuelAmount(2).buildAndRegister(); - PBFRecipeBuilder.start().input(block, WroughtIron).output(block, Steel).duration(5600).fuelAmount(18).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, Iron).input(gem, Coal, 2).output(ingot, Steel).duration(1500).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, Iron).input(dust, Coal, 2).output(ingot, Steel).duration(1500).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, Iron).input(gem, Charcoal, 2).output(ingot, Steel).duration(1500).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, Iron).input(dust, Charcoal, 2).output(ingot, Steel).duration(1500).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, Iron).input(gem, Lignite, 3).output(ingot, Steel).duration(1500).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, Iron).input(dust, Lignite, 3).output(ingot, Steel).duration(1500).buildAndRegister(); + + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(block, Iron).input(block, Coal, 2).output(block, Steel).duration(13500).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(block, Iron).input(block, Charcoal, 2).output(block, Steel).duration(13500).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(block, Iron).input(block, Lignite, 3).output(block, Steel).duration(13500).buildAndRegister(); + + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, WroughtIron).input(gem, Coal, 2).output(ingot, Steel).duration(600).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, WroughtIron).input(dust, Coal, 2).output(ingot, Steel).duration(600).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, WroughtIron).input(gem, Charcoal, 2).output(ingot, Steel).duration(600).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, WroughtIron).input(dust, Charcoal, 2).output(ingot, Steel).duration(600).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, WroughtIron).input(gem, Lignite, 3).output(ingot, Steel).duration(600).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(ingot, WroughtIron).input(dust, Lignite, 3).output(ingot, Steel).duration(600).buildAndRegister(); + + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(block, WroughtIron).input(block, Coal, 2).output(block, Steel).duration(5600).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(block, WroughtIron).input(block, Charcoal, 2).output(block, Steel).duration(5600).buildAndRegister(); + PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder().input(block, WroughtIron).input(block, Lignite, 3).output(block, Steel).duration(5600).buildAndRegister(); } private static void registerCokeOvenRecipes() { - CokeOvenRecipeBuilder.start().input(OrePrefix.log, Materials.Wood).output(OreDictUnifier.get(OrePrefix.gem, Materials.Charcoal)).fluidOutput(Materials.Creosote.getFluid(250)).duration(900).buildAndRegister(); - CokeOvenRecipeBuilder.start().input(OrePrefix.gem, Materials.Coal).output(OreDictUnifier.get(OrePrefix.gem, Materials.Coke)).fluidOutput(Materials.Creosote.getFluid(500)).duration(900).buildAndRegister(); - CokeOvenRecipeBuilder.start().input(OrePrefix.block, Materials.Coal).output(OreDictUnifier.get(OrePrefix.block, Materials.Coke)).fluidOutput(Materials.Creosote.getFluid(4500)).duration(8100).buildAndRegister(); + COKE_OVEN_RECIPES.recipeBuilder().input(log, Wood).output(gem, Charcoal).fluidOutputs(Creosote.getFluid(250)).duration(900).buildAndRegister(); + COKE_OVEN_RECIPES.recipeBuilder().input(gem, Coal).output(gem, Coke).fluidOutputs(Creosote.getFluid(500)).duration(900).buildAndRegister(); + COKE_OVEN_RECIPES.recipeBuilder().input(block, Coal).output(block, Coke).fluidOutputs(Creosote.getFluid(4500)).duration(8100).buildAndRegister(); } private static void registerStoneBricksRecipes() { diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index c834e660196..fc73e7c8c3d 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -1936,6 +1936,8 @@ recipemap.plasma_generator.name=Plasma Generator recipemap.circuit_assembler.name=Circuit Assembler recipemap.mass_fabricator.name=Mass Fabricator recipemap.gas_collector.name=Gas Collector +recipemap.primitive_blast_furnace.name=Primitive Blast Furnace +recipemap.coke_oven.name=Coke Oven behaviour.hoe=Can till dirt behaviour.soft_hammer=Activates and Deactivates Machines