Start on recipe serde rewrite
This commit is contained in:
parent
5eab27bead
commit
47eea962a0
17 changed files with 411 additions and 229 deletions
|
@ -24,17 +24,12 @@
|
|||
|
||||
package reborncore.common.crafting;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import net.minecraft.block.entity.BlockEntity;
|
||||
import net.minecraft.fluid.Fluid;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.JsonHelper;
|
||||
import net.minecraft.util.collection.DefaultedList;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import reborncore.common.crafting.ingredient.RebornIngredient;
|
||||
import reborncore.common.fluid.FluidValue;
|
||||
import reborncore.common.fluid.container.FluidInstance;
|
||||
import reborncore.common.util.Tank;
|
||||
|
||||
|
@ -56,35 +51,6 @@ public abstract class RebornFluidRecipe extends RebornRecipe {
|
|||
this.fluidInstance = fluidInstance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deserialize(JsonObject jsonObject) {
|
||||
super.deserialize(jsonObject);
|
||||
if(jsonObject.has("tank")){
|
||||
JsonObject tank = jsonObject.get("tank").getAsJsonObject();
|
||||
|
||||
Identifier identifier = new Identifier(JsonHelper.getString(tank, "fluid"));
|
||||
Fluid fluid = Registry.FLUID.get(identifier);
|
||||
|
||||
FluidValue value = FluidValue.BUCKET;
|
||||
if(tank.has("amount")){
|
||||
value = FluidValue.parseFluidValue(tank.get("amount"));
|
||||
}
|
||||
|
||||
fluidInstance = new FluidInstance(fluid, value);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serialize(JsonObject jsonObject) {
|
||||
super.serialize(jsonObject);
|
||||
|
||||
JsonObject tankObject = new JsonObject();
|
||||
tankObject.addProperty("fluid", Registry.FLUID.getId(fluidInstance.getFluid()).toString());
|
||||
tankObject.addProperty("value", fluidInstance.getAmount().getRawValue());
|
||||
|
||||
jsonObject.add("tank", tankObject);
|
||||
}
|
||||
|
||||
public abstract Tank getTank(BlockEntity be);
|
||||
|
||||
@Override
|
||||
|
|
|
@ -30,6 +30,7 @@ import com.mojang.serialization.Dynamic;
|
|||
import com.mojang.serialization.JsonOps;
|
||||
import io.github.cottonmc.libcd.api.CustomOutputRecipe;
|
||||
import net.minecraft.block.entity.BlockEntity;
|
||||
import net.minecraft.data.server.recipe.RecipeJsonProvider;
|
||||
import net.minecraft.inventory.Inventory;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
@ -61,79 +62,33 @@ public class RebornRecipe implements Recipe<Inventory>, CustomOutputRecipe {
|
|||
private final RebornRecipeType<?> type;
|
||||
private final Identifier name;
|
||||
|
||||
private DefaultedList<RebornIngredient> ingredients = DefaultedList.of();
|
||||
private DefaultedList<ItemStack> outputs = DefaultedList.of();
|
||||
protected int power;
|
||||
protected int time;
|
||||
private final List<RebornIngredient> ingredients;
|
||||
private final List<ItemStack> outputs;
|
||||
protected final int power;
|
||||
protected final int time;
|
||||
|
||||
protected boolean dummy = false;
|
||||
|
||||
public RebornRecipe(RebornRecipeType<?> type, Identifier name) {
|
||||
public RebornRecipe(RebornRecipeType<?> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time) {
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public RebornRecipe(RebornRecipeType<?> type, Identifier name, DefaultedList<RebornIngredient> ingredients, DefaultedList<ItemStack> outputs, int power, int time) {
|
||||
this(type, name);
|
||||
this.ingredients = ingredients;
|
||||
this.outputs = outputs;
|
||||
this.power = power;
|
||||
this.time = time;
|
||||
}
|
||||
|
||||
public void deserialize(JsonObject jsonObject) {
|
||||
if (jsonObject.has("dummy")) {
|
||||
makeDummy();
|
||||
return;
|
||||
}
|
||||
|
||||
//Crash if the recipe has all ready been deserialized
|
||||
Validate.isTrue(ingredients.isEmpty());
|
||||
|
||||
power = JsonHelper.getInt(jsonObject, "power");
|
||||
time = JsonHelper.getInt(jsonObject, "time");
|
||||
|
||||
ingredients = SerializationUtil.stream(JsonHelper.getArray(jsonObject, "ingredients"))
|
||||
.map(IngredientManager::deserialize)
|
||||
.collect(DefaultedListCollector.toList());
|
||||
|
||||
JsonArray resultsJson = JsonHelper.getArray(jsonObject, "results");
|
||||
outputs = RecipeUtils.deserializeItems(resultsJson);
|
||||
}
|
||||
|
||||
public void serialize(JsonObject jsonObject) {
|
||||
if (isDummy()) {
|
||||
jsonObject.addProperty("dummy", true);
|
||||
return;
|
||||
}
|
||||
jsonObject.addProperty("power", power);
|
||||
jsonObject.addProperty("time", time);
|
||||
|
||||
JsonArray ingredientsArray = new JsonArray();
|
||||
getRebornIngredients().stream().map(RebornIngredient::witeToJson).forEach(ingredientsArray::add);
|
||||
jsonObject.add("ingredients", ingredientsArray);
|
||||
|
||||
JsonArray resultsArray = new JsonArray();
|
||||
for (ItemStack stack : outputs) {
|
||||
JsonObject stackObject = new JsonObject();
|
||||
stackObject.addProperty("item", Registry.ITEM.getId(stack.getItem()).toString());
|
||||
if (stack.getCount() > 1) {
|
||||
stackObject.addProperty("count", stack.getCount());
|
||||
}
|
||||
if (stack.hasNbt()) {
|
||||
stackObject.add("nbt", Dynamic.convert(NbtOps.INSTANCE, JsonOps.INSTANCE, stack.getNbt()));
|
||||
}
|
||||
resultsArray.add(stackObject);
|
||||
}
|
||||
jsonObject.add("results", resultsArray);
|
||||
public RebornRecipe(RebornRecipeType<?> type, Identifier name) {
|
||||
this(type, name, List.of(new DummyIngredient()), Collections.emptyList(), Integer.MAX_VALUE, Integer.MAX_VALUE);
|
||||
this.dummy = true;
|
||||
}
|
||||
|
||||
public void serialize(PacketByteBuf byteBuf) {
|
||||
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void deserialize(PacketByteBuf byteBuf) {
|
||||
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -162,7 +117,7 @@ public class RebornRecipe implements Recipe<Inventory>, CustomOutputRecipe {
|
|||
return ingredients.stream().map(RebornIngredient::getPreview).collect(DefaultedListCollector.toList());
|
||||
}
|
||||
|
||||
public DefaultedList<RebornIngredient> getRebornIngredients() {
|
||||
public List<RebornIngredient> getRebornIngredients() {
|
||||
return ingredients;
|
||||
}
|
||||
|
||||
|
@ -241,15 +196,10 @@ public class RebornRecipe implements Recipe<Inventory>, CustomOutputRecipe {
|
|||
return true;
|
||||
}
|
||||
|
||||
private boolean isDummy() {
|
||||
public boolean isDummy() {
|
||||
return dummy;
|
||||
}
|
||||
|
||||
void makeDummy() {
|
||||
this.ingredients.add(new DummyIngredient());
|
||||
this.dummy = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Item> getOutputItems() {
|
||||
List<Item> items = new ArrayList<>();
|
||||
|
|
|
@ -33,13 +33,13 @@ import net.minecraft.util.Identifier;
|
|||
import net.minecraft.util.JsonHelper;
|
||||
import net.minecraft.world.World;
|
||||
import reborncore.RebornCore;
|
||||
import reborncore.common.crafting.serde.RecipeSerde;
|
||||
import reborncore.common.util.serialization.SerializationUtil;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
public record RebornRecipeType<R extends RebornRecipe>(
|
||||
BiFunction<RebornRecipeType<R>, Identifier, R> recipeFunction,
|
||||
RecipeSerde<R> recipeSerde,
|
||||
Identifier name) implements RecipeType, RecipeSerializer {
|
||||
|
||||
@Override
|
||||
|
@ -50,22 +50,18 @@ public record RebornRecipeType<R extends RebornRecipe>(
|
|||
}
|
||||
|
||||
try {
|
||||
R recipe = newRecipe(recipeId);
|
||||
R recipe = newRecipe(json, recipeId);
|
||||
|
||||
if (!ConditionManager.shouldLoadRecipe(json)) {
|
||||
recipe.makeDummy();
|
||||
return recipe;
|
||||
return recipeSerde.createDummy(this, recipeId);
|
||||
}
|
||||
|
||||
recipe.deserialize(json);
|
||||
return recipe;
|
||||
} catch (Throwable t) {
|
||||
RebornCore.LOGGER.error("Failed to read recipe: " + recipeId, t);
|
||||
// Make a new recipe - don't reuse the existing recipe object because it might be in an invalid state if an
|
||||
// exception was thrown in the middle of its deserialization.
|
||||
R recipe = newRecipe(recipeId);
|
||||
recipe.makeDummy();
|
||||
return recipe;
|
||||
return recipeSerde.createDummy(this, recipeId);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -73,7 +69,7 @@ public record RebornRecipeType<R extends RebornRecipe>(
|
|||
JsonObject jsonObject = new JsonObject();
|
||||
jsonObject.addProperty("type", name.toString());
|
||||
|
||||
recipe.serialize(jsonObject);
|
||||
recipeSerde.toJson(recipe, jsonObject);
|
||||
|
||||
return jsonObject;
|
||||
}
|
||||
|
@ -82,8 +78,8 @@ public record RebornRecipeType<R extends RebornRecipe>(
|
|||
return read(recipeType, json);
|
||||
}
|
||||
|
||||
R newRecipe(Identifier recipeId) {
|
||||
return recipeFunction.apply(this, recipeId);
|
||||
private R newRecipe(JsonObject jsonObject, Identifier recipeId) {
|
||||
return recipeSerde.fromJson(jsonObject, this, recipeId);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -34,6 +34,7 @@ import net.minecraft.util.registry.Registry;
|
|||
import net.minecraft.world.World;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import reborncore.common.crafting.ingredient.RebornIngredient;
|
||||
import reborncore.common.crafting.serde.RecipeSerde;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
@ -45,11 +46,11 @@ public class RecipeManager {
|
|||
|
||||
private static final Map<Identifier, RebornRecipeType<?>> recipeTypes = new HashMap<>();
|
||||
|
||||
public static <R extends RebornRecipe> RebornRecipeType<R> newRecipeType(BiFunction<RebornRecipeType<R>, Identifier, R> recipeFunction, Identifier name) {
|
||||
public static <R extends RebornRecipe> RebornRecipeType<R> newRecipeType(RecipeSerde<R> recipeSerde, Identifier name) {
|
||||
if (recipeTypes.containsKey(name)) {
|
||||
throw new RuntimeException("RebornRecipe type with this name already registered");
|
||||
}
|
||||
RebornRecipeType<R> type = new RebornRecipeType<>(recipeFunction, name);
|
||||
RebornRecipeType<R> type = new RebornRecipeType<>(recipeSerde, name);
|
||||
recipeTypes.put(name, type);
|
||||
|
||||
Registry.register(Registry.RECIPE_SERIALIZER, name, (RecipeSerializer<?>) type);
|
||||
|
|
|
@ -25,16 +25,18 @@
|
|||
package reborncore.common.crafting.ingredient;
|
||||
|
||||
import net.minecraft.tag.Tag;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class SimpleTag<T> implements Tag<T> {
|
||||
|
||||
public class SimpleTag<T> implements Tag.Identified<T> {
|
||||
private final List<T> entries;
|
||||
private final Identifier identifier;
|
||||
|
||||
public SimpleTag(List<T> entries) {
|
||||
public SimpleTag(List<T> entries, Identifier identifier) {
|
||||
this.entries = entries;
|
||||
this.identifier = identifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -46,4 +48,9 @@ public class SimpleTag<T> implements Tag<T> {
|
|||
public List<T> values() {
|
||||
return Collections.unmodifiableList(entries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Identifier getId() {
|
||||
return identifier;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,6 +38,7 @@ import net.minecraft.util.Identifier;
|
|||
import net.minecraft.util.JsonHelper;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
@ -49,22 +50,23 @@ public class StackIngredient extends RebornIngredient {
|
|||
private final List<ItemStack> stacks;
|
||||
|
||||
private final Optional<Integer> count;
|
||||
private final Optional<NbtCompound> tag;
|
||||
private final boolean requireEmptyTag;
|
||||
private final Optional<NbtCompound> nbt;
|
||||
private final boolean requireEmptyNbt;
|
||||
|
||||
public StackIngredient(List<ItemStack> stacks, Optional<Integer> count, Optional<NbtCompound> tag, boolean requireEmptyTag) {
|
||||
public StackIngredient(List<ItemStack> stacks, Optional<Integer> count, Optional<NbtCompound> nbt, boolean requireEmptyNbt) {
|
||||
super(IngredientManager.STACK_RECIPE_TYPE);
|
||||
this.stacks = stacks;
|
||||
this.count = count;
|
||||
this.tag = tag;
|
||||
this.requireEmptyTag = requireEmptyTag;
|
||||
this.nbt = nbt;
|
||||
this.requireEmptyNbt = requireEmptyNbt;
|
||||
Validate.isTrue(stacks.size() == 1, "stack size must 1");
|
||||
}
|
||||
|
||||
public StackIngredient(List<ItemStack> stacks, int count, @Nullable NbtCompound nbt, boolean requireEmptyNbt) {
|
||||
this(stacks, count > 1 ? Optional.of(count) : Optional.empty(), Optional.ofNullable(nbt), requireEmptyNbt);
|
||||
}
|
||||
|
||||
public static RebornIngredient deserialize(JsonObject json) {
|
||||
if (!json.has("item")) {
|
||||
System.out.println("nope");
|
||||
}
|
||||
Identifier identifier = new Identifier(JsonHelper.getString(json, "item"));
|
||||
Item item = Registry.ITEM.getOrEmpty(identifier).orElseThrow(() -> new JsonSyntaxException("Unknown item '" + identifier + "'"));
|
||||
|
||||
|
@ -101,7 +103,7 @@ public class StackIngredient extends RebornIngredient {
|
|||
if (count.isPresent() && count.get() > itemStack.getCount()) {
|
||||
return false;
|
||||
}
|
||||
if (tag.isPresent()) {
|
||||
if (nbt.isPresent()) {
|
||||
if (!itemStack.hasNbt()) {
|
||||
return false;
|
||||
}
|
||||
|
@ -113,11 +115,11 @@ public class StackIngredient extends RebornIngredient {
|
|||
JsonElement jsonElement = Dynamic.convert(NbtOps.INSTANCE, JsonOps.INSTANCE, compoundTag);
|
||||
compoundTag = (NbtCompound) Dynamic.convert(JsonOps.INSTANCE, NbtOps.INSTANCE, jsonElement);
|
||||
|
||||
if (!tag.get().equals(compoundTag)) {
|
||||
if (!nbt.get().equals(compoundTag)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return !requireEmptyTag || !itemStack.hasNbt();
|
||||
return !requireEmptyNbt || !itemStack.hasNbt();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -131,7 +133,7 @@ public class StackIngredient extends RebornIngredient {
|
|||
stacks.stream()
|
||||
.map(ItemStack::copy)
|
||||
.peek(itemStack -> itemStack.setCount(count.orElse(1)))
|
||||
.peek(itemStack -> itemStack.setNbt(tag.orElse(null)))
|
||||
.peek(itemStack -> itemStack.setNbt(nbt.orElse(null)))
|
||||
.collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
|
@ -142,10 +144,10 @@ public class StackIngredient extends RebornIngredient {
|
|||
jsonObject.addProperty("item", Registry.ITEM.getId(stacks.get(0).getItem()).toString());
|
||||
count.ifPresent(integer -> jsonObject.addProperty("count", integer));
|
||||
|
||||
if (requireEmptyTag) {
|
||||
if (requireEmptyNbt) {
|
||||
jsonObject.addProperty("nbt", "empty");
|
||||
} else {
|
||||
tag.ifPresent(compoundTag -> jsonObject.add("nbt", Dynamic.convert(NbtOps.INSTANCE, JsonOps.INSTANCE, compoundTag)));
|
||||
nbt.ifPresent(compoundTag -> jsonObject.add("nbt", Dynamic.convert(NbtOps.INSTANCE, JsonOps.INSTANCE, compoundTag)));
|
||||
}
|
||||
|
||||
return jsonObject;
|
||||
|
|
|
@ -26,6 +26,7 @@ package reborncore.common.crafting.ingredient;
|
|||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonSyntaxException;
|
||||
import net.fabricmc.fabric.api.tag.TagFactory;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
|
@ -43,18 +44,19 @@ import java.util.Optional;
|
|||
import java.util.stream.Collectors;
|
||||
|
||||
public class TagIngredient extends RebornIngredient {
|
||||
|
||||
private final Identifier tagIdentifier;
|
||||
private final Tag<Item> tag;
|
||||
private final Tag.Identified<Item> tag;
|
||||
private final Optional<Integer> count;
|
||||
|
||||
public TagIngredient(Identifier tagIdentifier, Tag<Item> tag, Optional<Integer> count) {
|
||||
public TagIngredient(Tag.Identified<Item> tag, Optional<Integer> count) {
|
||||
super(IngredientManager.TAG_RECIPE_TYPE);
|
||||
this.tagIdentifier = tagIdentifier;
|
||||
this.tag = tag;
|
||||
this.count = count;
|
||||
}
|
||||
|
||||
public TagIngredient(Tag.Identified<Item> tag, int count) {
|
||||
this(tag, count > 1 ? Optional.of(count) : Optional.empty());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(ItemStack itemStack) {
|
||||
if (count.isPresent() && count.get() > itemStack.getCount()) {
|
||||
|
@ -88,16 +90,17 @@ public class TagIngredient extends RebornIngredient {
|
|||
Validate.isTrue(item != Items.AIR, "item cannot be air");
|
||||
items.add(item);
|
||||
}
|
||||
return new TagIngredient(tagIdent, new SimpleTag<>(items), count);
|
||||
return new TagIngredient(new SimpleTag<>(items, tagIdent), count);
|
||||
}
|
||||
|
||||
Identifier identifier = new Identifier(JsonHelper.getString(json, "tag"));
|
||||
|
||||
Tag<Item> tag = ServerTagManagerHolder.getTagManager().getOrCreateTagGroup(Registry.ITEM_KEY).getTag(identifier);
|
||||
Tag.Identified<Item> tag = TagFactory.of(() -> ServerTagManagerHolder.getTagManager().getOrCreateTagGroup(Registry.ITEM_KEY)).create(identifier);
|
||||
if (tag == null) {
|
||||
throw new JsonSyntaxException("Unknown item tag '" + identifier + "'");
|
||||
}
|
||||
return new TagIngredient(identifier, tag, count);
|
||||
|
||||
return new TagIngredient(tag, count);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -113,7 +116,7 @@ public class TagIngredient extends RebornIngredient {
|
|||
}
|
||||
|
||||
count.ifPresent(integer -> jsonObject.addProperty("count", integer));
|
||||
jsonObject.addProperty("tag_identifier", tagIdentifier.toString());
|
||||
jsonObject.addProperty("tag_identifier", tag.getId().toString());
|
||||
return jsonObject;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,101 @@
|
|||
package reborncore.common.crafting.serde;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.serialization.Dynamic;
|
||||
import com.mojang.serialization.JsonOps;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NbtOps;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.JsonHelper;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
import reborncore.common.crafting.RebornRecipe;
|
||||
import reborncore.common.crafting.RebornRecipeType;
|
||||
import reborncore.common.crafting.RecipeUtils;
|
||||
import reborncore.common.crafting.ingredient.IngredientManager;
|
||||
import reborncore.common.crafting.ingredient.RebornIngredient;
|
||||
import reborncore.common.util.DefaultedListCollector;
|
||||
import reborncore.common.util.serialization.SerializationUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class AbstractRecipeSerde<R extends RebornRecipe> implements RecipeSerde<R> {
|
||||
@Override
|
||||
public void writeToPacket(PacketByteBuf buffer, R recipe) {
|
||||
final JsonObject jsonObject = new JsonObject();
|
||||
toJson(recipe, jsonObject);
|
||||
|
||||
final String jsonStr = SerializationUtil.GSON_FLAT.toJson(jsonObject);
|
||||
|
||||
buffer.writeInt(jsonStr.length());
|
||||
buffer.writeString(jsonStr);
|
||||
|
||||
recipe.serialize(buffer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public R fromPacket(PacketByteBuf buffer, RebornRecipeType<R> type) {
|
||||
final Identifier identifier = new Identifier(buffer.readString(buffer.readInt()));
|
||||
final String input = buffer.readString(buffer.readInt());
|
||||
final JsonObject jsonObject = SerializationUtil.GSON_FLAT.fromJson(input, JsonObject.class);
|
||||
|
||||
final R r = fromJson(jsonObject, type, identifier);
|
||||
r.deserialize(buffer);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
protected int getPower(JsonObject jsonObject) {
|
||||
return JsonHelper.getInt(jsonObject, "power");
|
||||
}
|
||||
|
||||
protected int getTime(JsonObject jsonObject) {
|
||||
return JsonHelper.getInt(jsonObject, "time");
|
||||
}
|
||||
|
||||
protected List<RebornIngredient> getIngredients(JsonObject jsonObject) {
|
||||
return SerializationUtil.stream(JsonHelper.getArray(jsonObject, "ingredients"))
|
||||
.map(IngredientManager::deserialize)
|
||||
.collect(DefaultedListCollector.toList());
|
||||
}
|
||||
|
||||
protected List<ItemStack> getOutputs(JsonObject jsonObject) {
|
||||
final JsonArray resultsJson = JsonHelper.getArray(jsonObject, "results");
|
||||
return RecipeUtils.deserializeItems(resultsJson);
|
||||
}
|
||||
|
||||
protected void writeIngredients(R recipe, JsonObject jsonObject) {
|
||||
final JsonArray ingredientsArray = new JsonArray();
|
||||
recipe.getRebornIngredients().stream().map(RebornIngredient::witeToJson).forEach(ingredientsArray::add);
|
||||
jsonObject.add("ingredients", ingredientsArray);
|
||||
}
|
||||
|
||||
protected void writeOutputs(R recipe, JsonObject jsonObject) {
|
||||
final JsonArray resultsArray = new JsonArray();
|
||||
|
||||
for (ItemStack stack : recipe.getOutputs()) {
|
||||
final JsonObject stackObject = new JsonObject();
|
||||
stackObject.addProperty("item", Registry.ITEM.getId(stack.getItem()).toString());
|
||||
|
||||
if (stack.getCount() > 1) {
|
||||
stackObject.addProperty("count", stack.getCount());
|
||||
}
|
||||
|
||||
if (stack.hasNbt()) {
|
||||
stackObject.add("nbt", Dynamic.convert(NbtOps.INSTANCE, JsonOps.INSTANCE, stack.getNbt()));
|
||||
}
|
||||
resultsArray.add(stackObject);
|
||||
}
|
||||
|
||||
jsonObject.add("results", resultsArray);
|
||||
}
|
||||
|
||||
protected void writePower(R recipe, JsonObject jsonObject) {
|
||||
jsonObject.addProperty("power", recipe.getPower());
|
||||
}
|
||||
|
||||
protected void writeTime(R recipe, JsonObject jsonObject) {
|
||||
jsonObject.addProperty("time", recipe.getTime());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
package reborncore.common.crafting.serde;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import net.minecraft.fluid.Fluid;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.JsonHelper;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import reborncore.common.crafting.RebornFluidRecipe;
|
||||
import reborncore.common.crafting.RebornRecipeType;
|
||||
import reborncore.common.crafting.ingredient.RebornIngredient;
|
||||
import reborncore.common.fluid.FluidValue;
|
||||
import reborncore.common.fluid.container.FluidInstance;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class RebornFluidRecipeSerde<R extends RebornFluidRecipe> extends RebornRecipeSerde<R> {
|
||||
protected abstract R fromJson(JsonObject jsonObject, RebornRecipeType<R> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time, @Nullable FluidInstance fluidInstance);
|
||||
|
||||
@Override
|
||||
protected final R fromJson(JsonObject jsonObject, RebornRecipeType<R> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time) {
|
||||
final JsonObject tank = JsonHelper.getObject(jsonObject, "tank");
|
||||
final Identifier identifier = new Identifier(JsonHelper.getString(tank, "fluid"));
|
||||
final Fluid fluid = Registry.FLUID.get(identifier);
|
||||
|
||||
FluidValue value = FluidValue.BUCKET;
|
||||
if(tank.has("amount")){
|
||||
value = FluidValue.parseFluidValue(tank.get("amount"));
|
||||
}
|
||||
|
||||
FluidInstance fluidInstance = new FluidInstance(fluid, value);
|
||||
|
||||
return fromJson(jsonObject, type, name, ingredients, outputs, power, time, fluidInstance);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toJson(R recipe, JsonObject jsonObject) {
|
||||
super.toJson(recipe, jsonObject);
|
||||
|
||||
final JsonObject tankObject = new JsonObject();
|
||||
tankObject.addProperty("fluid", Registry.FLUID.getId(recipe.getFluidInstance().getFluid()).toString());
|
||||
tankObject.addProperty("value", recipe.getFluidInstance().getAmount().getRawValue());
|
||||
|
||||
jsonObject.add("tank", tankObject);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
package reborncore.common.crafting.serde;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.Identifier;
|
||||
import reborncore.common.crafting.RebornRecipe;
|
||||
import reborncore.common.crafting.RebornRecipeType;
|
||||
import reborncore.common.crafting.ingredient.RebornIngredient;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class RebornRecipeSerde<R extends RebornRecipe> extends AbstractRecipeSerde<R> {
|
||||
public static final RebornRecipeSerde<RebornRecipe> BASIC = new RebornRecipeSerde<>() {
|
||||
@Override
|
||||
protected RebornRecipe fromJson(JsonObject jsonObject, RebornRecipeType<RebornRecipe> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time) {
|
||||
return new RebornRecipe(type, name, ingredients, outputs, power, time);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RebornRecipe createDummy(RebornRecipeType<RebornRecipe> type, Identifier name) {
|
||||
return new RebornRecipe(type, name);
|
||||
}
|
||||
};
|
||||
|
||||
protected abstract R fromJson(JsonObject jsonObject, RebornRecipeType<R> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time);
|
||||
|
||||
@Override
|
||||
public final R fromJson(JsonObject jsonObject, RebornRecipeType<R> type, Identifier name) {
|
||||
if (jsonObject.has("dummy")) {
|
||||
return createDummy(type, name);
|
||||
}
|
||||
|
||||
final int power = getPower(jsonObject);
|
||||
final int time = getTime(jsonObject);
|
||||
final List<RebornIngredient> ingredients = getIngredients(jsonObject);
|
||||
final List<ItemStack> outputs = getOutputs(jsonObject);
|
||||
|
||||
return fromJson(jsonObject, type, name, ingredients, outputs, power, time);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toJson(R recipe, JsonObject jsonObject) {
|
||||
if (recipe.isDummy()) {
|
||||
jsonObject.addProperty("dummy", true);
|
||||
return;
|
||||
}
|
||||
|
||||
writePower(recipe, jsonObject);
|
||||
writeTime(recipe, jsonObject);
|
||||
writeIngredients(recipe, jsonObject);
|
||||
writeOutputs(recipe, jsonObject);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package reborncore.common.crafting.serde;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.util.Identifier;
|
||||
import reborncore.common.crafting.RebornRecipe;
|
||||
import reborncore.common.crafting.RebornRecipeType;
|
||||
|
||||
public interface RecipeSerde<R extends RebornRecipe> {
|
||||
R fromJson(JsonObject jsonObject, RebornRecipeType<R> type, Identifier name);
|
||||
|
||||
void toJson(R recipe, JsonObject jsonObject);
|
||||
|
||||
void writeToPacket(PacketByteBuf buffer, R recipe);
|
||||
|
||||
R fromPacket(PacketByteBuf buffer, RebornRecipeType<R> type);
|
||||
|
||||
R createDummy(RebornRecipeType<R> type, Identifier name);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue