Add abstractions for upcoming compressed sieve and hammer

This commit is contained in:
thedarkcolour 2024-03-21 21:55:29 -07:00
parent a339bbe4ce
commit c8e423129d
4 changed files with 40 additions and 17 deletions

View File

@ -27,12 +27,12 @@ import net.minecraft.util.Mth;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
import net.minecraft.world.level.storage.loot.providers.number.NumberProvider;
import thedarkcolour.exdeorum.recipe.RecipeUtil;
import thedarkcolour.exdeorum.recipe.sieve.SieveRecipe;
import thedarkcolour.exdeorum.registry.EItems;
import thedarkcolour.exdeorum.registry.ERecipeTypes;
import java.util.ArrayList;
import java.util.Comparator;
@ -43,11 +43,11 @@ import java.util.Objects;
public record GroupedSieveRecipe(Ingredient ingredient, ItemStack mesh, List<Result> results) {
public static int maxSieveRows;
public static ImmutableList<GroupedSieveRecipe> getAllRecipesGrouped() {
public static ImmutableList<GroupedSieveRecipe> getAllRecipesGrouped(RecipeType<SieveRecipe> recipeType) {
maxSieveRows = 1;
// copy the list so we can do removals
List<SieveRecipe> recipes = new ArrayList<>(Objects.requireNonNull(Minecraft.getInstance().level).getRecipeManager().getAllRecipesFor(ERecipeTypes.SIEVE.get()));
List<SieveRecipe> recipes = new ArrayList<>(Objects.requireNonNull(Minecraft.getInstance().level).getRecipeManager().getAllRecipesFor(recipeType));
Multimap<Ingredient, SieveRecipe> ingredientGrouper = ArrayListMultimap.create();
for (int i = 0; i < recipes.size(); i++) {

View File

@ -192,7 +192,7 @@ public class ExDeorumJeiPlugin implements IModPlugin {
crookRecipes.add(CrookJeiRecipe.create(recipe));
}
registration.addRecipes(CROOK, crookRecipes);
registration.addRecipes(SIEVE, GroupedSieveRecipe.getAllRecipesGrouped());
registration.addRecipes(SIEVE, GroupedSieveRecipe.getAllRecipesGrouped(ERecipeTypes.SIEVE.get()));
addCrucibleHeatSources(registration);
}

View File

@ -27,12 +27,13 @@ import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.storage.loot.providers.number.NumberProvider;
import org.jetbrains.annotations.Nullable;
import thedarkcolour.exdeorum.recipe.ProbabilityRecipe;
import thedarkcolour.exdeorum.recipe.RecipeUtil;
import thedarkcolour.exdeorum.registry.ERecipeSerializers;
import thedarkcolour.exdeorum.registry.ERecipeTypes;
import java.util.Objects;
public class HammerRecipe extends ProbabilityRecipe {
public HammerRecipe(ResourceLocation id, Ingredient ingredient, Item result, NumberProvider resultAmount) {
super(id, ingredient, result, resultAmount);
@ -48,28 +49,39 @@ public class HammerRecipe extends ProbabilityRecipe {
return ERecipeTypes.HAMMER.get();
}
public static class Serializer implements RecipeSerializer<HammerRecipe> {
public static abstract class AbstractSerializer implements RecipeSerializer<HammerRecipe> {
protected abstract HammerRecipe createHammerRecipe(ResourceLocation id, Ingredient ingredient, Item result, NumberProvider resultAmount);
@Override
public HammerRecipe fromJson(ResourceLocation name, JsonObject json) {
Ingredient ingredient = RecipeUtil.readIngredient(json, "ingredient");
Item result = RecipeUtil.readItem(json, "result");
NumberProvider resultAmount = RecipeUtil.readNumberProvider(json, "result_amount");
return new HammerRecipe(name, ingredient, result, resultAmount);
return createHammerRecipe(name, ingredient, result, resultAmount);
}
@Override
public @Nullable HammerRecipe fromNetwork(ResourceLocation name, FriendlyByteBuf buffer) {
@SuppressWarnings("deprecation")
public HammerRecipe fromNetwork(ResourceLocation name, FriendlyByteBuf buffer) {
Ingredient ingredient = Ingredient.fromNetwork(buffer);
Item result = buffer.readById(BuiltInRegistries.ITEM);
Item result = Objects.requireNonNull(buffer.readById(BuiltInRegistries.ITEM));
NumberProvider resultAmount = RecipeUtil.fromNetworkNumberProvider(buffer);
return new HammerRecipe(name, ingredient, result, resultAmount);
return createHammerRecipe(name, ingredient, result, resultAmount);
}
@Override
@SuppressWarnings("deprecation")
public void toNetwork(FriendlyByteBuf buffer, HammerRecipe recipe) {
recipe.getIngredient().toNetwork(buffer);
buffer.writeId(BuiltInRegistries.ITEM, recipe.result);
RecipeUtil.toNetworkNumberProvider(buffer, recipe.resultAmount);
}
}
public static class Serializer extends AbstractSerializer {
@Override
protected HammerRecipe createHammerRecipe(ResourceLocation id, Ingredient ingredient, Item result, NumberProvider resultAmount) {
return new HammerRecipe(id, ingredient, result, resultAmount);
}
}
}

View File

@ -19,6 +19,7 @@
package thedarkcolour.exdeorum.recipe.sieve;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.FriendlyByteBuf;
@ -39,6 +40,8 @@ import thedarkcolour.exdeorum.recipe.RecipeUtil;
import thedarkcolour.exdeorum.registry.ERecipeSerializers;
import thedarkcolour.exdeorum.registry.ERecipeTypes;
import java.util.Objects;
public class SieveRecipe extends ProbabilityRecipe {
public final Item mesh;
public final boolean byHandOnly;
@ -60,7 +63,9 @@ public class SieveRecipe extends ProbabilityRecipe {
return ERecipeTypes.SIEVE.get();
}
public static class Serializer implements RecipeSerializer<SieveRecipe> {
public static abstract class AbstractSerializer implements RecipeSerializer<SieveRecipe> {
protected abstract SieveRecipe createSieveRecipe(ResourceLocation id, Ingredient ingredient, Item mesh, Item result, NumberProvider resultAmount, boolean byHandOnly);
@Override
public SieveRecipe fromJson(ResourceLocation id, JsonObject json) {
Ingredient ingredient = RecipeUtil.readIngredient(json, "ingredient");
@ -78,23 +83,22 @@ public class SieveRecipe extends ProbabilityRecipe {
return null;
}
} else {
ExDeorum.LOGGER.error("Failed to load recipe {}, missing \"result\" item location or \"result_tag\" tag location", id);
return null;
throw new JsonSyntaxException("missing \"result\" item location or \"result_tag\" tag location");
}
NumberProvider resultAmount = RecipeUtil.readNumberProvider(json, "result_amount");
boolean byHandOnly = json.has("by_hand_only") && json.get("by_hand_only").getAsBoolean();
return new SieveRecipe(id, ingredient, mesh, result, resultAmount, byHandOnly);
return createSieveRecipe(id, ingredient, mesh, result, resultAmount, byHandOnly);
}
@SuppressWarnings("deprecation")
@Override
public @Nullable SieveRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) {
Ingredient ingredient = Ingredient.fromNetwork(buffer);
Item mesh = buffer.readById(BuiltInRegistries.ITEM);
Item result = buffer.readById(BuiltInRegistries.ITEM);
Item mesh = Objects.requireNonNull(buffer.readById(BuiltInRegistries.ITEM));
Item result = Objects.requireNonNull(buffer.readById(BuiltInRegistries.ITEM));
NumberProvider resultAmount = RecipeUtil.fromNetworkNumberProvider(buffer);
return new SieveRecipe(id, ingredient, mesh, result, resultAmount, buffer.readBoolean());
return createSieveRecipe(id, ingredient, mesh, result, resultAmount, buffer.readBoolean());
}
@SuppressWarnings("deprecation")
@ -107,4 +111,11 @@ public class SieveRecipe extends ProbabilityRecipe {
buffer.writeBoolean(recipe.byHandOnly);
}
}
public static class Serializer extends AbstractSerializer {
@Override
protected SieveRecipe createSieveRecipe(ResourceLocation id, Ingredient ingredient, Item mesh, Item result, NumberProvider resultAmount, boolean byHandOnly) {
return new SieveRecipe(id, ingredient, mesh, result, resultAmount, byHandOnly);
}
}
}