Merge remote-tracking branch 'origin/master'

This commit is contained in:
Michael Hillcox 2020-10-31 19:47:38 +00:00
commit 4eee99c75b
No known key found for this signature in database
GPG key ID: 971C5B254742488F
35 changed files with 370 additions and 476 deletions

View file

@ -3,7 +3,6 @@ package de.ellpeck.actuallyadditions.api.internal;
import de.ellpeck.actuallyadditions.api.booklet.IBookletChapter;
import de.ellpeck.actuallyadditions.api.booklet.IBookletEntry;
import de.ellpeck.actuallyadditions.api.booklet.IBookletPage;
import de.ellpeck.actuallyadditions.api.recipe.CoffeeIngredient;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;

View file

@ -1,16 +0,0 @@
package de.ellpeck.actuallyadditions.api.recipe;
import net.minecraft.item.ItemStack;
import net.minecraft.util.WeightedRandom;
@Deprecated
public class BallOfFurReturn extends WeightedRandom.Item {
public final ItemStack returnItem;
public BallOfFurReturn(ItemStack returnItem, int chance) {
super(chance);
this.returnItem = returnItem;
}
}

View file

@ -1,49 +0,0 @@
package de.ellpeck.actuallyadditions.api.recipe;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.potion.EffectInstance;
@Deprecated
public class CoffeeIngredient {
protected final Ingredient input;
protected final int maxAmplifier;
protected EffectInstance[] effects;
@Deprecated
public CoffeeIngredient(ItemStack input, EffectInstance[] effects, int maxAmplifier) {
this(Ingredient.fromStacks(input), maxAmplifier, effects);
}
public CoffeeIngredient(Ingredient input, int maxAmplifier, EffectInstance... effects) {
this.input = input;
this.effects = effects;
this.maxAmplifier = maxAmplifier;
}
public boolean matches(ItemStack stack) {
return this.input.test(stack);
}
public Ingredient getInput() {
return this.input;
}
public EffectInstance[] getEffects() {
return this.effects;
}
public boolean effect(ItemStack stack) {
return ActuallyAdditionsAPI.methodHandler.addEffectToStack(stack, this);
}
public String getExtraText() {
return "";
}
public int getMaxAmplifier() {
return this.maxAmplifier;
}
}

View file

@ -1,48 +0,0 @@
package de.ellpeck.actuallyadditions.api.recipe;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
@Deprecated
public class CompostRecipe {
protected final Ingredient input;
protected final ItemStack output;
protected final BlockState inputDisplay;
protected final BlockState outputDisplay;
@Deprecated
public CompostRecipe(ItemStack input, Block inputDisplay, ItemStack output, Block outputDisplay) {
this(Ingredient.fromStacks(input), inputDisplay.getDefaultState(), output, outputDisplay.getDefaultState());
}
public CompostRecipe(Ingredient input, BlockState inputDisplay, ItemStack output, BlockState outputDisplay) {
this.input = input;
this.output = output;
this.inputDisplay = inputDisplay;
this.outputDisplay = outputDisplay;
}
public boolean matches(ItemStack stack) {
return this.input.test(stack);
}
public Ingredient getInput() {
return this.input;
}
public ItemStack getOutput() {
return this.output;
}
public BlockState getInputDisplay() {
return this.inputDisplay;
}
public BlockState getOutputDisplay() {
return this.outputDisplay;
}
}

View file

@ -1,45 +0,0 @@
package de.ellpeck.actuallyadditions.api.recipe;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
public class CrusherRecipe {
protected Ingredient input;
protected ItemStack outputOne;
protected ItemStack outputTwo;
protected int outputChance;
@Deprecated
public CrusherRecipe(ItemStack input, ItemStack outputOne, ItemStack outputTwo, int outputChance) {
this(Ingredient.fromStacks(input), outputOne, outputTwo, outputChance);
}
public CrusherRecipe(Ingredient input, ItemStack outputOne, ItemStack outputTwo, int outputChance) {
this.input = input;
this.outputOne = outputOne;
this.outputTwo = outputTwo;
this.outputChance = outputChance;
}
public boolean matches(ItemStack stack) {
return this.input.test(stack);
}
public ItemStack getOutputOne() {
return this.outputOne;
}
public ItemStack getOutputTwo() {
return this.outputTwo;
}
public int getSecondChance() {
return this.outputChance;
}
public Ingredient getInput() {
return this.input;
}
}

View file

@ -7,7 +7,6 @@ import java.util.List;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.booklet.IBookletEntry;
import de.ellpeck.actuallyadditions.api.booklet.IBookletPage;
import de.ellpeck.actuallyadditions.api.recipe.CoffeeIngredient;
import de.ellpeck.actuallyadditions.booklet.page.BookletPage;
import de.ellpeck.actuallyadditions.booklet.page.PageCoffeeMachine;
import de.ellpeck.actuallyadditions.common.items.ItemCoffee;

View file

@ -6,7 +6,6 @@ import java.util.List;
import de.ellpeck.actuallyadditions.api.booklet.IBookletEntry;
import de.ellpeck.actuallyadditions.api.booklet.IBookletPage;
import de.ellpeck.actuallyadditions.api.recipe.CrusherRecipe;
import de.ellpeck.actuallyadditions.booklet.page.PageCrusherRecipe;
import de.ellpeck.actuallyadditions.common.crafting.CrusherCrafting;
import net.minecraft.item.ItemStack;

View file

@ -4,7 +4,6 @@ import java.util.List;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.booklet.internal.GuiBookletBase;
import de.ellpeck.actuallyadditions.api.recipe.CoffeeIngredient;
import de.ellpeck.actuallyadditions.booklet.gui.GuiBooklet;
import de.ellpeck.actuallyadditions.common.items.InitItems;
import de.ellpeck.actuallyadditions.common.items.metalists.TheMiscItems;

View file

@ -3,7 +3,6 @@ package de.ellpeck.actuallyadditions.booklet.page;
import java.util.List;
import de.ellpeck.actuallyadditions.api.booklet.internal.GuiBookletBase;
import de.ellpeck.actuallyadditions.api.recipe.CrusherRecipe;
import de.ellpeck.actuallyadditions.common.ActuallyAdditions;
import de.ellpeck.actuallyadditions.booklet.gui.GuiBooklet;
import de.ellpeck.actuallyadditions.common.util.StackUtil;

View file

@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.recipe.CrusherRecipe;
import de.ellpeck.actuallyadditions.common.ActuallyAdditions;
import de.ellpeck.actuallyadditions.common.items.InitItems;
import de.ellpeck.actuallyadditions.common.items.metalists.TheDusts;

View file

@ -6,7 +6,6 @@ import java.util.List;
import javax.annotation.Nullable;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.recipe.CoffeeIngredient;
import de.ellpeck.actuallyadditions.common.ActuallyAdditions;
import de.ellpeck.actuallyadditions.common.items.base.ItemFoodBase;
import de.ellpeck.actuallyadditions.common.items.metalists.TheMiscItems;

View file

@ -2,9 +2,6 @@ package de.ellpeck.actuallyadditions.common.jei;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.booklet.IBookletPage;
import de.ellpeck.actuallyadditions.api.recipe.CoffeeIngredient;
import de.ellpeck.actuallyadditions.api.recipe.CompostRecipe;
import de.ellpeck.actuallyadditions.api.recipe.CrusherRecipe;
import de.ellpeck.actuallyadditions.api.recipe.EmpowererRecipe;
import de.ellpeck.actuallyadditions.api.recipe.LensConversionRecipe;
import de.ellpeck.actuallyadditions.common.blocks.InitBlocks;

View file

@ -7,7 +7,6 @@ import com.google.common.base.Strings;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.booklet.IBookletPage;
import de.ellpeck.actuallyadditions.api.recipe.CoffeeIngredient;
import de.ellpeck.actuallyadditions.common.ActuallyAdditions;
import de.ellpeck.actuallyadditions.common.blocks.InitBlocks;
import de.ellpeck.actuallyadditions.booklet.misc.BookletUtils;

View file

@ -3,7 +3,6 @@ package de.ellpeck.actuallyadditions.common.jei.compost;
import java.util.Arrays;
import de.ellpeck.actuallyadditions.api.booklet.IBookletPage;
import de.ellpeck.actuallyadditions.api.recipe.CompostRecipe;
import de.ellpeck.actuallyadditions.common.blocks.InitBlocks;
import de.ellpeck.actuallyadditions.booklet.misc.BookletUtils;
import de.ellpeck.actuallyadditions.common.jei.RecipeWrapperWithButton;

View file

@ -5,7 +5,6 @@ import java.util.Arrays;
import java.util.List;
import de.ellpeck.actuallyadditions.api.booklet.IBookletPage;
import de.ellpeck.actuallyadditions.api.recipe.CrusherRecipe;
import de.ellpeck.actuallyadditions.common.blocks.InitBlocks;
import de.ellpeck.actuallyadditions.booklet.misc.BookletUtils;
import de.ellpeck.actuallyadditions.common.jei.RecipeWrapperWithButton;

View file

@ -10,7 +10,6 @@ import de.ellpeck.actuallyadditions.api.booklet.IBookletPage;
import de.ellpeck.actuallyadditions.api.internal.IAtomicReconstructor;
import de.ellpeck.actuallyadditions.api.internal.IMethodHandler;
import de.ellpeck.actuallyadditions.api.lens.Lens;
import de.ellpeck.actuallyadditions.api.recipe.CoffeeIngredient;
import de.ellpeck.actuallyadditions.api.recipe.LensConversionRecipe;
import de.ellpeck.actuallyadditions.common.blocks.BlockLaserRelay;
import de.ellpeck.actuallyadditions.booklet.chapter.BookletChapter;

View file

@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.recipe.CrusherRecipe;
import de.ellpeck.actuallyadditions.common.ActuallyAdditions;
import de.ellpeck.actuallyadditions.common.config.values.ConfigStringListValues;
import de.ellpeck.actuallyadditions.common.util.StackUtil;

View file

@ -6,10 +6,12 @@ import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nonnull;
/**
* Recipe class for the AtomicReconstructor when hitting a items stack
*/
public class AtomicReconstructorBlockRecipe implements IDummyRecipe {
public class AtomicReconstructorBlockRecipe implements IDummyRecipe<AtomicReconstructorBlockRecipe> {
public static final IRecipeType<AtomicReconstructorBlockRecipe> ATOMIC_RECONSTRUCTOR_BLOCK_RECIPE_TYPE = IRecipeType.register("actuallyadditions:atomic_reconstructor_block");
@ -44,16 +46,19 @@ public class AtomicReconstructorBlockRecipe implements IDummyRecipe {
return energyConsumption;
}
@Nonnull
@Override
public ResourceLocation getId(){
return this.recipeId;
}
@Nonnull
@Override
public IRecipeSerializer<?> getSerializer(){
public IRecipeSerializer<AtomicReconstructorBlockRecipe> getSerializer(){
return AtomicReconstructorBlockRecipeFactory.INSTANCE;
}
@Nonnull
@Override
public IRecipeType<?> getType(){
return ATOMIC_RECONSTRUCTOR_BLOCK_RECIPE_TYPE;

View file

@ -7,21 +7,23 @@ import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nonnull;
/**
* Recipe class for the AtomicReconstructor when hitting a items stack
*/
public class AtomicReconstructorItemRecipe implements IDummyRecipe {
public class AtomicReconstructorItemRecipe implements IDummyRecipe<AtomicReconstructorItemRecipe> {
public static final IRecipeType<AtomicReconstructorItemRecipe> ATOMIC_RECONSTRUCTOR_ITEM_RECIPE_TYPE = IRecipeType.register("actuallyadditions:atomic_reconstructor_item");
private final ResourceLocation recipeId;
@Nonnull private final ResourceLocation recipeId;
private final Lens lens;
private final Ingredient input;
private final ItemStack output;
@Nonnull private final Lens lens;
@Nonnull private final Ingredient input;
@Nonnull private final ItemStack output;
private final int energyConsumption;
public AtomicReconstructorItemRecipe(ResourceLocation recipeId, Lens lens, Ingredient input, ItemStack output, int energyConsumption){
public AtomicReconstructorItemRecipe(@Nonnull ResourceLocation recipeId, @Nonnull Lens lens, @Nonnull Ingredient input, @Nonnull ItemStack output, int energyConsumption){
this.recipeId = recipeId;
this.lens = lens;
this.input = input;
@ -29,14 +31,17 @@ public class AtomicReconstructorItemRecipe implements IDummyRecipe {
this.energyConsumption = energyConsumption;
}
@Nonnull
public Lens getLens(){
return lens;
}
@Nonnull
public Ingredient getInput(){
return input;
}
@Nonnull
public ItemStack getOutput(){
return output;
}
@ -45,16 +50,19 @@ public class AtomicReconstructorItemRecipe implements IDummyRecipe {
return energyConsumption;
}
@Nonnull
@Override
public ResourceLocation getId(){
return this.recipeId;
}
@Nonnull
@Override
public IRecipeSerializer<?> getSerializer(){
public IRecipeSerializer<AtomicReconstructorItemRecipe> getSerializer(){
return AtomicReconstructorItemRecipeFactory.INSTANCE;
}
@Nonnull
@Override
public IRecipeType<?> getType(){
return ATOMIC_RECONSTRUCTOR_ITEM_RECIPE_TYPE;

View file

@ -1,45 +0,0 @@
package de.ellpeck.actuallyadditions.common.recipes;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.util.ResourceLocation;
public class BallOfFurRecipe implements IDummyRecipe {
public static final IRecipeType<BallOfFurRecipe> BALL_OF_FUR_RECIPE_TYPE = IRecipeType.register("actuallyadditions:ball_of_fur");
private final ResourceLocation recipeId;
private final ItemStack returnItem;
private final int chance;
public BallOfFurRecipe(ResourceLocation recipeId, ItemStack returnItem, int chance){
this.recipeId = recipeId;
this.returnItem = returnItem;
this.chance = chance;
}
public ItemStack getReturnItem(){
return this.returnItem;
}
public int getChance(){
return this.chance;
}
@Override
public ResourceLocation getId(){
return this.recipeId;
}
@Override
public IRecipeSerializer<?> getSerializer(){
return BallOfFurRecipeFactory.INSTANCE;
}
@Override
public IRecipeType<?> getType(){
return BALL_OF_FUR_RECIPE_TYPE;
}
}

View file

@ -1,65 +0,0 @@
package de.ellpeck.actuallyadditions.common.recipes;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.ShapedRecipe;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.registries.ForgeRegistryEntry;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class BallOfFurRecipeFactory extends ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<BallOfFurRecipe> {
public static final BallOfFurRecipeFactory INSTANCE = IRecipeSerializer.register("actuallyadditions:ball_of_fur", new BallOfFurRecipeFactory());
@Nonnull
@Override
public BallOfFurRecipe read(@Nonnull ResourceLocation recipeId, @Nonnull JsonObject json){
ItemStack stack;
int chance;
if(json.has("stack")){
JsonElement stackJsonElement = json.get("stack");
if(stackJsonElement.isJsonObject()){
stack = ShapedRecipe.deserializeItem(stackJsonElement.getAsJsonObject());
} else {
throw new JsonParseException("BallOfFurRecipe stack has to be a json object!");
}
} else {
throw new JsonParseException("BallOfFurRecipe has no json stack object!");
}
if(json.has("chance")){
JsonElement chanceJsonElement = json.get("chance");
if(chanceJsonElement.isJsonPrimitive()){
chance = chanceJsonElement.getAsInt();
} else {
throw new JsonParseException("BallOfFurRecipe chance is not a json integer!");
}
} else {
throw new JsonParseException("BallOfFurRecipe has no chance integer!");
}
return new BallOfFurRecipe(recipeId, stack, chance);
}
@Nullable
@Override
public BallOfFurRecipe read(@Nonnull ResourceLocation recipeId, @Nonnull PacketBuffer buffer){
ItemStack stack = buffer.readItemStack();
int chance = buffer.readInt();
return new BallOfFurRecipe(recipeId, stack, chance);
}
@Override
public void write(@Nonnull PacketBuffer buffer, @Nonnull BallOfFurRecipe recipe){
buffer.writeItemStack(recipe.getReturnItem());
buffer.writeInt(recipe.getChance());
}
}

View file

@ -6,22 +6,25 @@ import net.minecraft.item.crafting.Ingredient;
import net.minecraft.potion.EffectInstance;
import net.minecraft.util.ResourceLocation;
public class CoffeeMachineIngredient implements IDummyRecipe{
import javax.annotation.Nonnull;
public class CoffeeMachineIngredient implements IDummyRecipe<CoffeeMachineIngredient> {
public static final IRecipeType<CoffeeMachineIngredient> COFFEE_MACHINE_RECIPE_TYPE = IRecipeType.register("actuallyadditions:coffee_machine");
protected final ResourceLocation recipeId;
protected final Ingredient input;
protected final int maxAmplifier;
protected final EffectInstance[] effects;
@Nonnull private final ResourceLocation recipeId;
@Nonnull private final Ingredient input;
private final int maxAmplifier;
@Nonnull private final EffectInstance[] effects;
public CoffeeMachineIngredient(ResourceLocation recipeId, Ingredient input, int maxAmplifier, EffectInstance[] effects){
public CoffeeMachineIngredient(@Nonnull ResourceLocation recipeId, @Nonnull Ingredient input, int maxAmplifier, @Nonnull EffectInstance[] effects){
this.recipeId = recipeId;
this.input = input;
this.maxAmplifier = maxAmplifier;
this.effects = effects;
}
@Nonnull
public Ingredient getInput(){
return input;
}
@ -30,20 +33,24 @@ public class CoffeeMachineIngredient implements IDummyRecipe{
return maxAmplifier;
}
@Nonnull
public EffectInstance[] getEffects(){
return effects;
}
@Nonnull
@Override
public ResourceLocation getId(){
return this.recipeId;
}
@Nonnull
@Override
public IRecipeSerializer<?> getSerializer(){
public IRecipeSerializer<CoffeeMachineIngredient> getSerializer(){
return CoffeeMachineIngredientFactory.INSTANCE;
}
@Nonnull
@Override
public IRecipeType<?> getType(){
return COFFEE_MACHINE_RECIPE_TYPE;

View file

@ -1,59 +0,0 @@
package de.ellpeck.actuallyadditions.common.recipes;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.ResourceLocation;
public class CompostRecipe implements IDummyRecipe {
public static final IRecipeType<CompostRecipe> COMPOST_RECIPE_TYPE = IRecipeType.register("actuallyadditions:compost");
private final ResourceLocation recipeId;
private final Ingredient input;
private final ItemStack output;
private final BlockState inputDisplay;
private final BlockState outputDisplay;
public CompostRecipe(ResourceLocation recipeId, Ingredient input, ItemStack output, BlockState inputDisplay, BlockState outputDisplay){
this.recipeId = recipeId;
this.input = input;
this.output = output;
this.inputDisplay = inputDisplay;
this.outputDisplay = outputDisplay;
}
public Ingredient getInput(){
return this.input;
}
public ItemStack getOutput(){
return this.output;
}
public BlockState getInputDisplay(){
return this.inputDisplay;
}
public BlockState getOutputDisplay(){
return this.outputDisplay;
}
@Override
public ResourceLocation getId(){
return this.recipeId;
}
@Override
public IRecipeSerializer<?> getSerializer(){
return CompostRecipeFactory.INSTANCE;
}
@Override
public IRecipeType<?> getType(){
return COMPOST_RECIPE_TYPE;
}
}

View file

@ -1,101 +0,0 @@
package de.ellpeck.actuallyadditions.common.recipes;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.mojang.datafixers.Dynamic;
import com.mojang.datafixers.types.JsonOps;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.item.crafting.ShapedRecipe;
import net.minecraft.nbt.*;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.registries.ForgeRegistryEntry;
import javax.annotation.Nullable;
public class CompostRecipeFactory extends ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<CompostRecipe> {
public static final CompostRecipeFactory INSTANCE = IRecipeSerializer.register("actuallyadditions:compost", new CompostRecipeFactory());
@Override
public CompostRecipe read(ResourceLocation recipeId, JsonObject json){
Ingredient input;
ItemStack output;
BlockState inputDisplay;
BlockState outputDisplay;
if(json.has("input")){
input = Ingredient.deserialize(json.get("input"));
} else {
throw new JsonParseException("CompostRecipe needs a input ingredient json element!");
}
if(json.has("output")){
JsonElement outputJsonElement = json.get("output");
if(outputJsonElement.isJsonObject()){
output = ShapedRecipe.deserializeItem(outputJsonElement.getAsJsonObject());
} else {
throw new JsonParseException("CompostRecipe output element is not a json object!");
}
} else {
throw new JsonParseException("CompostRecipe needs a output itemstack json object!");
}
if(json.has("display")){
JsonElement displayJsonElement = json.get("display");
if(displayJsonElement.isJsonObject()){
JsonObject displayJsonObject = displayJsonElement.getAsJsonObject();
if(displayJsonObject.has("input")){
inputDisplay = BlockState.deserialize(new Dynamic<>(JsonOps.INSTANCE, displayJsonObject.get("input")));
} else {
throw new JsonParseException("CompostRecipe display needs an input json element!");
}
if(displayJsonObject.has("output")){
outputDisplay = BlockState.deserialize(new Dynamic<>(JsonOps.INSTANCE, displayJsonObject.get("output")));
} else {
throw new JsonParseException("CompostRecipe display needs an output json element!");
}
} else {
throw new JsonParseException("CompostRecipe display has to be a json object!");
}
} else {
// no exception but default values
inputDisplay = Blocks.DIRT.getDefaultState();
outputDisplay = Blocks.COARSE_DIRT.getDefaultState();
}
return new CompostRecipe(recipeId, input, output, inputDisplay, outputDisplay);
}
@Nullable
@Override
public CompostRecipe read(ResourceLocation recipeId, PacketBuffer buffer){
Ingredient input = Ingredient.read(buffer);
ItemStack output = buffer.readItemStack();
CompoundNBT inputNBT = buffer.readCompoundTag();
CompoundNBT outputNBT = buffer.readCompoundTag();
BlockState inputDisplay = BlockState.deserialize(new Dynamic<>(NBTDynamicOps.INSTANCE, inputNBT));
BlockState outputDisplay = BlockState.deserialize(new Dynamic<>(NBTDynamicOps.INSTANCE, outputNBT));
return new CompostRecipe(recipeId, input, output, inputDisplay, outputDisplay);
}
@Override
public void write(PacketBuffer buffer, CompostRecipe recipe){
recipe.getInput().write(buffer);
buffer.writeItemStack(recipe.getOutput());
INBT inputNBT = BlockState.serialize(NBTDynamicOps.INSTANCE, recipe.getInputDisplay()).getValue();
buffer.writeCompoundTag((CompoundNBT) inputNBT); // if it isn't a compound than something real big is wrong and a crash should be the best way to handle it
INBT outputNBT = BlockState.serialize(NBTDynamicOps.INSTANCE, recipe.getOutputDisplay()).getValue();
buffer.writeCompoundTag((CompoundNBT) outputNBT);
}
}

View file

@ -0,0 +1,136 @@
package de.ellpeck.actuallyadditions.common.recipes;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nonnull;
public class CrusherRecipe implements IDummyRecipe<CrusherRecipe> {
public static final IRecipeType<CrusherRecipe> RECIPE_TYPE = IRecipeType.register("actuallyadditions:crusher");
public static final CrusherRecipeFactory FACTORY = IRecipeSerializer.register("actuallyadditions:crusher", new CrusherRecipeFactory());
@Nonnull
private final ResourceLocation recipeId;
@Nonnull
private final Ingredient input;
@Nonnull
private final ItemStack output;
@Nonnull
private final ItemStack secondaryOutput;
private final int outputChance;
public CrusherRecipe(@Nonnull ResourceLocation recipeId, @Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnull ItemStack secondaryOutput, int outputChance){
this.recipeId = recipeId;
this.input = input;
this.output = output;
this.secondaryOutput = secondaryOutput;
this.outputChance = outputChance;
}
public CrusherRecipe(@Nonnull ResourceLocation recipeId, @Nonnull Ingredient input, @Nonnull ItemStack output){
this(recipeId, input, output, ItemStack.EMPTY, 0);
}
@Nonnull
public Ingredient getInput(){
return input;
}
@Nonnull
public ItemStack getOutput(){
return output;
}
@Nonnull
public ItemStack getSecondaryOutput(){
return secondaryOutput;
}
public int getOutputChance(){
return outputChance;
}
@Nonnull
@Override
public ResourceLocation getId(){
return this.recipeId;
}
@Nonnull
@Override
public IRecipeSerializer<CrusherRecipe> getSerializer(){
return FACTORY;
}
@Nonnull
@Override
public IRecipeType<?> getType(){
return RECIPE_TYPE;
}
static class CrusherRecipeFactory extends RecipeFactoryBase<CrusherRecipe> {
@Nonnull
@Override
public CrusherRecipe read(@Nonnull ResourceLocation recipeId, @Nonnull JsonObject json){
Ingredient input = this.readIngredient(json, "input");
ItemStack firstOutput = this.readItemStack(json, "output");
ItemStack secondOutput = ItemStack.EMPTY;
int secondaryOutputChance = 0;
if(json.has("secondary")){ // Optional
JsonElement secondaryElement = json.get("secondary");
if(secondaryElement.isJsonObject()){
JsonObject secondary = secondaryElement.getAsJsonObject();
secondOutput = this.readItemStack(secondary, "output", ItemStack.EMPTY);
secondaryOutputChance = this.readInt(secondary, "chance", 0);
} else {
throw new JsonSyntaxException("Secondary is not valid!");
}
}
return new CrusherRecipe(recipeId, input, firstOutput, secondOutput, secondaryOutputChance);
}
@Override
public void write(@Nonnull JsonObject json, @Nonnull CrusherRecipe recipe){
json.add("input", recipe.getInput().serialize());
json.add("output", this.writeItemStack(recipe.getOutput()));
if(!recipe.getSecondaryOutput().isEmpty() && recipe.getOutputChance() > 0){
JsonObject secondary = new JsonObject();
secondary.add("output", this.writeItemStack(recipe.getSecondaryOutput()));
secondary.addProperty("chance", recipe.getOutputChance());
json.add("secondary", secondary);
}
}
@Nonnull
@Override
public CrusherRecipe read(@Nonnull ResourceLocation recipeId, @Nonnull PacketBuffer buffer){
Ingredient input = Ingredient.read(buffer);
ItemStack output = buffer.readItemStack();
ItemStack secondaryOutput = buffer.readItemStack();
int chance = buffer.readVarInt();
return new CrusherRecipe(recipeId, input, output, secondaryOutput, chance);
}
@Override
public void write(@Nonnull PacketBuffer buffer, @Nonnull CrusherRecipe recipe){
recipe.getInput().write(buffer);
buffer.writeItemStack(recipe.getOutput());
buffer.writeItemStack(recipe.getSecondaryOutput());
buffer.writeVarInt(recipe.getOutputChance());
}
}
}

View file

@ -1,25 +1,37 @@
package de.ellpeck.actuallyadditions.common.recipes;
import com.google.gson.JsonObject;
import net.minecraft.data.IFinishedRecipe;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* A dummy Recipe implementation, because the minecraft recipe system forces us to use IRecipe with all of it's methods,
* but we don't need any of them.
* Additionally the "isDynamic()" methods now returns true, because this indicates that the recipe book doesn't list
* this recipe at all.
*/
public interface IDummyRecipe extends IRecipe<IInventory> {
public interface IDummyRecipe<T extends IDummyRecipe<T>> extends IRecipe<IInventory>, IFinishedRecipe {
@Nonnull
@Override
IRecipeSerializer<T> getSerializer();
@Override
default boolean matches(IInventory inv, World worldIn){
default boolean matches(@Nonnull IInventory inv, @Nonnull World world){
return false;
}
@Nonnull
@Override
default ItemStack getCraftingResult(IInventory inv){
default ItemStack getCraftingResult(@Nonnull IInventory inv){
return ItemStack.EMPTY;
}
@ -28,6 +40,7 @@ public interface IDummyRecipe extends IRecipe<IInventory> {
return false;
}
@Nonnull
@Override
default ItemStack getRecipeOutput(){
return ItemStack.EMPTY;
@ -39,4 +52,28 @@ public interface IDummyRecipe extends IRecipe<IInventory> {
return true;
}
@Override
default void serialize(@Nonnull JsonObject json){
if(this.getSerializer() instanceof RecipeFactoryBase){
(((RecipeFactoryBase<T>) this.getSerializer())).write(json, (T) this);
}
}
@Nonnull
@Override
default ResourceLocation getID(){
return this.getId();
}
@Nullable
@Override
default JsonObject getAdvancementJson(){
return null;
}
@Nullable
@Override
default ResourceLocation getAdvancementID(){
return null;
}
}

View file

@ -0,0 +1,95 @@
package de.ellpeck.actuallyadditions.common.recipes;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.crafting.CraftingHelper;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.ForgeRegistryEntry;
public abstract class RecipeFactoryBase<T extends IDummyRecipe<T>> extends ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<T> {
public abstract void write(JsonObject json, T recipe);
protected Ingredient readIngredient(JsonObject json, String key){
if(json.has(key)){
return Ingredient.deserialize(json.get(key));
} else {
throw new JsonSyntaxException(String.format("Json element does not contain any element with the key: '%s'", key));
}
}
protected Ingredient readIngredient(JsonObject json, String key, Ingredient alternative){
try{
return this.readIngredient(json, key);
} catch(JsonSyntaxException e){
return alternative;
}
}
protected ItemStack readItemStack(JsonObject json, String key){
if(json.has(key)){
if(json.get(key).isJsonObject()){
return CraftingHelper.getItemStack(json.get(key).getAsJsonObject(), true);
} else if(json.get(key).isJsonPrimitive()){
ResourceLocation itemKey = new ResourceLocation(json.get(key).getAsString());
if(ForgeRegistries.ITEMS.containsKey(itemKey)){
return new ItemStack(ForgeRegistries.ITEMS.getValue(itemKey));
} else {
throw new JsonSyntaxException(String.format("Item with the key: '%s' is not registered!", key));
}
} else {
throw new JsonSyntaxException(String.format("Json element with the key: '%s' is neither a object nor a string!", key));
}
} else {
throw new JsonSyntaxException(String.format("Json element does not contain any element with the key: '%s'!", key));
}
}
protected JsonObject writeItemStack(ItemStack stack){
JsonObject json = new JsonObject();
json.addProperty("item", stack.getItem().getRegistryName().toString());
json.addProperty("count", stack.getCount());
if(stack.hasTag()){
json.add("nbt", new JsonParser().parse(stack.getTag().toString()));
}
return json;
}
protected ItemStack readItemStack(JsonObject json, String key, ItemStack alternative){
try{
return this.readItemStack(json, key);
} catch(JsonSyntaxException e){
return alternative;
}
}
protected int readInt(JsonObject json, String key){
if(json.has(key)){
if(json.get(key).isJsonPrimitive()){
try{
return json.get(key).getAsJsonPrimitive().getAsInt();
} catch(NumberFormatException e){
throw new JsonSyntaxException(String.format("Json element '%s' is not a valid integer!", key), e);
}
} else {
throw new JsonSyntaxException(String.format("Json element '%s' is not a valid integer!", key));
}
} else {
throw new JsonSyntaxException(String.format("Json element '%s' does not exist!", key));
}
}
protected int readInt(JsonObject json, String key, int alternative){
try{
return this.readInt(json, key);
} catch(Exception e){
return alternative;
}
}
}

View file

@ -1,6 +1,5 @@
package de.ellpeck.actuallyadditions.common.tile;
import de.ellpeck.actuallyadditions.api.recipe.CoffeeIngredient;
import de.ellpeck.actuallyadditions.common.items.InitItems;
import de.ellpeck.actuallyadditions.common.items.ItemCoffee;
import de.ellpeck.actuallyadditions.common.items.metalists.TheMiscItems;

View file

@ -1,7 +1,6 @@
package de.ellpeck.actuallyadditions.common.tile;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.recipe.CompostRecipe;
import de.ellpeck.actuallyadditions.common.util.ItemStackHandlerAA.IAcceptor;
import de.ellpeck.actuallyadditions.common.util.ItemStackHandlerAA.IRemover;
import de.ellpeck.actuallyadditions.common.util.ItemUtil;

View file

@ -1,6 +1,5 @@
package de.ellpeck.actuallyadditions.common.tile;
import de.ellpeck.actuallyadditions.api.recipe.CrusherRecipe;
import de.ellpeck.actuallyadditions.common.blocks.BlockFurnaceDouble;
import de.ellpeck.actuallyadditions.common.misc.SoundHandler;
import de.ellpeck.actuallyadditions.common.network.gui.IButtonReactor;

View file

@ -3,7 +3,6 @@ package de.ellpeck.actuallyadditions.common.util;
import java.util.List;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.recipe.CrusherRecipe;
import de.ellpeck.actuallyadditions.api.recipe.EmpowererRecipe;
import de.ellpeck.actuallyadditions.api.recipe.LensConversionRecipe;
import de.ellpeck.actuallyadditions.common.util.crafting.RecipeHandler;

View file

@ -1,6 +1,9 @@
package de.ellpeck.actuallyadditions.data;
import de.ellpeck.actuallyadditions.common.ActuallyAdditions;
import de.ellpeck.actuallyadditions.data.recipes.CrusherRecipeGenerator;
import net.minecraft.data.DataGenerator;
import net.minecraftforge.client.model.generators.ExistingFileHelper;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.GatherDataEvent;
@ -9,7 +12,11 @@ import net.minecraftforge.fml.event.lifecycle.GatherDataEvent;
public class AADataGenerator {
@SubscribeEvent
public static void gatherData(GatherDataEvent event) {
public static void gatherData(GatherDataEvent event){
DataGenerator dataGenerator = event.getGenerator();
ExistingFileHelper existingFileHelper = event.getExistingFileHelper();
dataGenerator.addProvider(new BlockStateGenerator(dataGenerator, existingFileHelper));
dataGenerator.addProvider(new CrusherRecipeGenerator(dataGenerator));
}
}

View file

@ -0,0 +1,28 @@
package de.ellpeck.actuallyadditions.data;
import de.ellpeck.actuallyadditions.common.ActuallyAdditions;
import de.ellpeck.actuallyadditions.common.blocks.InitBlocks;
import net.minecraft.block.Block;
import net.minecraft.data.DataGenerator;
import net.minecraftforge.client.model.generators.BlockStateProvider;
import net.minecraftforge.client.model.generators.ExistingFileHelper;
import net.minecraftforge.fml.RegistryObject;
public class BlockStateGenerator extends BlockStateProvider {
public BlockStateGenerator(DataGenerator dataGenerator, ExistingFileHelper existingFileHelper){
super(dataGenerator, ActuallyAdditions.MODID, existingFileHelper);
}
@Override
protected void registerStatesAndModels(){
for(RegistryObject<Block> blockEntry : InitBlocks.BLOCKS.getEntries()){
blockEntry.ifPresent(block -> {
// todo check if the blocks aren't "simple" and provide a different model,
// probably with the help of a interface the block implements, like naturesaura does
this.simpleBlock(block);
});
}
}
}

View file

@ -0,0 +1,26 @@
package de.ellpeck.actuallyadditions.data.recipes;
import de.ellpeck.actuallyadditions.common.ActuallyAdditions;
import de.ellpeck.actuallyadditions.common.recipes.CrusherRecipe;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.IFinishedRecipe;
import net.minecraft.data.RecipeProvider;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.ResourceLocation;
import java.util.function.Consumer;
public class CrusherRecipeGenerator extends RecipeProvider {
public CrusherRecipeGenerator(DataGenerator dataGenerator){
super(dataGenerator);
}
@Override
protected void registerRecipes(Consumer<IFinishedRecipe> consumer){
super.registerRecipes(consumer);
consumer.accept(new CrusherRecipe(new ResourceLocation(ActuallyAdditions.MODID, "test"), Ingredient.fromItems(Items.DIAMOND), new ItemStack(Items.DIRT, 64)));
}
}

View file

@ -1,8 +0,0 @@
{
"recipes": {
"atomic_reconstructor": "de.ellpeck.actuallyadditions.common.recipes.AtomicReconstructorRecipeFactory",
"ball_of_fur": "de.ellpeck.actuallyadditions.common.recipes.BallOfFurRecipeFactory",
"coffee_machine_ingredient": "de.ellpeck.actuallyadditions.common.recipes.CoffeeMachineIngredientFactory",
"compost": "de.ellpeck.actuallyadditions.common.recipes.CompostRecipeFactory"
}
}