Finish
This commit is contained in:
parent
8863ea30b3
commit
3eb91f255c
36 changed files with 409 additions and 396 deletions
|
@ -48,7 +48,6 @@ import net.minecraft.text.LiteralText;
|
|||
import net.minecraft.util.registry.Registry;
|
||||
import net.minecraft.world.chunk.ChunkStatus;
|
||||
import reborncore.client.ItemStackRenderManager;
|
||||
import reborncore.common.crafting.RecipeManager;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
@ -79,17 +78,6 @@ public class RebornCoreCommands {
|
|||
dispatcher.register(
|
||||
literal("reborncore")
|
||||
|
||||
.then(
|
||||
literal("recipes")
|
||||
.then(literal("validate")
|
||||
.requires(source -> source.hasPermissionLevel(3))
|
||||
.executes(ctx -> {
|
||||
RecipeManager.validateRecipes(ctx.getSource().getWorld());
|
||||
return Command.SINGLE_SUCCESS;
|
||||
})
|
||||
)
|
||||
)
|
||||
|
||||
.then(
|
||||
literal("generate")
|
||||
.requires(source -> source.hasPermissionLevel(3))
|
||||
|
|
|
@ -27,27 +27,19 @@ package reborncore.common.crafting;
|
|||
import net.minecraft.block.entity.BlockEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.collection.DefaultedList;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import reborncore.common.crafting.ingredient.RebornIngredient;
|
||||
import reborncore.common.fluid.container.FluidInstance;
|
||||
import reborncore.common.util.Tank;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class RebornFluidRecipe extends RebornRecipe {
|
||||
|
||||
@NotNull
|
||||
private FluidInstance fluidInstance = FluidInstance.EMPTY;
|
||||
private final FluidInstance fluidInstance;
|
||||
|
||||
public RebornFluidRecipe(RebornRecipeType<?> type, Identifier name) {
|
||||
super(type, name);
|
||||
}
|
||||
|
||||
public RebornFluidRecipe(RebornRecipeType<?> type, Identifier name, DefaultedList<RebornIngredient> ingredients, DefaultedList<ItemStack> outputs, int power, int time) {
|
||||
public RebornFluidRecipe(RebornRecipeType<?> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time, @NotNull FluidInstance fluidInstance) {
|
||||
super(type, name, ingredients, outputs, power, time);
|
||||
}
|
||||
|
||||
public RebornFluidRecipe(RebornRecipeType<?> type, Identifier name, DefaultedList<RebornIngredient> ingredients, DefaultedList<ItemStack> outputs, int power, int time, FluidInstance fluidInstance) {
|
||||
this(type, name, ingredients, outputs, power, time);
|
||||
this.fluidInstance = fluidInstance;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,33 +24,20 @@
|
|||
|
||||
package reborncore.common.crafting;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
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;
|
||||
import net.minecraft.nbt.NbtOps;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.recipe.Ingredient;
|
||||
import net.minecraft.recipe.Recipe;
|
||||
import net.minecraft.recipe.RecipeSerializer;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.JsonHelper;
|
||||
import net.minecraft.util.collection.DefaultedList;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
import net.minecraft.world.World;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import reborncore.api.recipe.IRecipeCrafterProvider;
|
||||
import reborncore.common.crafting.ingredient.DummyIngredient;
|
||||
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.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
@ -58,7 +45,6 @@ import java.util.Collections;
|
|||
import java.util.List;
|
||||
|
||||
public class RebornRecipe implements Recipe<Inventory>, CustomOutputRecipe {
|
||||
|
||||
private final RebornRecipeType<?> type;
|
||||
private final Identifier name;
|
||||
|
||||
|
@ -67,8 +53,6 @@ public class RebornRecipe implements Recipe<Inventory>, CustomOutputRecipe {
|
|||
protected final int power;
|
||||
protected final int time;
|
||||
|
||||
protected boolean dummy = false;
|
||||
|
||||
public RebornRecipe(RebornRecipeType<?> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time) {
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
|
@ -78,19 +62,6 @@ public class RebornRecipe implements Recipe<Inventory>, CustomOutputRecipe {
|
|||
this.time = time;
|
||||
}
|
||||
|
||||
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
|
||||
public Identifier getId() {
|
||||
return name;
|
||||
|
@ -138,9 +109,6 @@ public class RebornRecipe implements Recipe<Inventory>, CustomOutputRecipe {
|
|||
* @return if true the recipe will craft, if false it will not
|
||||
*/
|
||||
public boolean canCraft(BlockEntity blockEntity) {
|
||||
if (isDummy()) {
|
||||
return false;
|
||||
}
|
||||
if (blockEntity instanceof IRecipeCrafterProvider) {
|
||||
return ((IRecipeCrafterProvider) blockEntity).canCraft(this);
|
||||
}
|
||||
|
@ -179,7 +147,7 @@ public class RebornRecipe implements Recipe<Inventory>, CustomOutputRecipe {
|
|||
@Deprecated
|
||||
@Override
|
||||
public ItemStack getOutput() {
|
||||
if (isDummy() || outputs.isEmpty()) {
|
||||
if (outputs.isEmpty()) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
return outputs.get(0);
|
||||
|
@ -196,10 +164,6 @@ public class RebornRecipe implements Recipe<Inventory>, CustomOutputRecipe {
|
|||
return true;
|
||||
}
|
||||
|
||||
public boolean isDummy() {
|
||||
return dummy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Item> getOutputItems() {
|
||||
List<Item> items = new ArrayList<>();
|
||||
|
|
|
@ -26,13 +26,11 @@ package reborncore.common.crafting;
|
|||
|
||||
import com.google.gson.JsonObject;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.recipe.Recipe;
|
||||
import net.minecraft.recipe.RecipeSerializer;
|
||||
import net.minecraft.recipe.RecipeType;
|
||||
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;
|
||||
|
||||
|
@ -40,7 +38,7 @@ import java.util.List;
|
|||
|
||||
public record RebornRecipeType<R extends RebornRecipe>(
|
||||
RecipeSerde<R> recipeSerde,
|
||||
Identifier name) implements RecipeType, RecipeSerializer {
|
||||
Identifier name) implements RecipeType<R>, RecipeSerializer<R> {
|
||||
|
||||
@Override
|
||||
public R read(Identifier recipeId, JsonObject json) {
|
||||
|
@ -49,19 +47,10 @@ public record RebornRecipeType<R extends RebornRecipe>(
|
|||
throw new RuntimeException("RebornRecipe type not supported!");
|
||||
}
|
||||
|
||||
try {
|
||||
R recipe = newRecipe(json, recipeId);
|
||||
|
||||
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.
|
||||
return recipeSerde.createDummy(this, recipeId);
|
||||
}
|
||||
return recipeSerde.fromJson(json, this, recipeId);
|
||||
}
|
||||
|
||||
public JsonObject toJson(R recipe) {
|
||||
private JsonObject toJson(R recipe) {
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
jsonObject.addProperty("type", name.toString());
|
||||
|
||||
|
@ -70,29 +59,17 @@ public record RebornRecipeType<R extends RebornRecipe>(
|
|||
return jsonObject;
|
||||
}
|
||||
|
||||
public R fromJson(Identifier recipeType, JsonObject json) {
|
||||
return read(recipeType, json);
|
||||
}
|
||||
|
||||
private R newRecipe(JsonObject jsonObject, Identifier recipeId) {
|
||||
return recipeSerde.fromJson(jsonObject, this, recipeId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public R read(Identifier recipeId, PacketByteBuf buffer) {
|
||||
String input = buffer.readString(buffer.readInt());
|
||||
R r = read(recipeId, SerializationUtil.GSON_FLAT.fromJson(input, JsonObject.class));
|
||||
r.deserialize(buffer);
|
||||
return r;
|
||||
String jsonSize = buffer.readString(buffer.readInt());
|
||||
return read(recipeId, SerializationUtil.GSON_FLAT.fromJson(jsonSize, JsonObject.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(PacketByteBuf buffer, Recipe recipe) {
|
||||
JsonObject jsonObject = toJson((R) recipe);
|
||||
String output = SerializationUtil.GSON_FLAT.toJson(jsonObject);
|
||||
public void write(PacketByteBuf buffer, R recipe) {
|
||||
String output = SerializationUtil.GSON_FLAT.toJson(toJson(recipe));
|
||||
buffer.writeInt(output.length());
|
||||
buffer.writeString(output);
|
||||
((R) recipe).serialize(buffer);
|
||||
}
|
||||
|
||||
public List<R> getRecipes(World world) {
|
||||
|
|
|
@ -24,28 +24,25 @@
|
|||
|
||||
package reborncore.common.crafting;
|
||||
|
||||
import io.netty.buffer.Unpooled;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.recipe.Recipe;
|
||||
import net.minecraft.recipe.RecipeSerializer;
|
||||
import net.minecraft.util.Identifier;
|
||||
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.RebornRecipeSerde;
|
||||
import reborncore.common.crafting.serde.RecipeSerde;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class RecipeManager {
|
||||
|
||||
private static final Map<Identifier, RebornRecipeType<?>> recipeTypes = new HashMap<>();
|
||||
|
||||
public static RebornRecipeType<reborncore.common.crafting.RebornRecipe> newRecipeType(Identifier name) {
|
||||
return newRecipeType(RebornRecipeSerde.BASIC, 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");
|
||||
|
@ -68,64 +65,4 @@ public class RecipeManager {
|
|||
public static List<RebornRecipeType> getRecipeTypes(String namespace) {
|
||||
return recipeTypes.values().stream().filter(rebornRecipeType -> rebornRecipeType.name().getNamespace().equals(namespace)).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static void validateRecipes(World world) {
|
||||
//recipeTypes.forEach((key, value) -> validate(value, world));
|
||||
|
||||
System.out.println("Validating recipes");
|
||||
world.getRecipeManager().keys().forEach(identifier -> {
|
||||
try {
|
||||
Recipe recipe = world.getRecipeManager().get(identifier).get();
|
||||
RecipeSerializer recipeSerializer = recipe.getSerializer();
|
||||
PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer());
|
||||
recipeSerializer.write(buf, recipe);
|
||||
|
||||
Recipe readback = recipeSerializer.read(identifier, buf);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Failed to read " + identifier, e);
|
||||
}
|
||||
});
|
||||
System.out.println("Done");
|
||||
}
|
||||
|
||||
private static <R extends RebornRecipe> void validate(RebornRecipeType<R> rebornRecipeType, World world) {
|
||||
List<R> recipes = rebornRecipeType.getRecipes(world);
|
||||
|
||||
for (RebornRecipe recipe1 : recipes) {
|
||||
for (RebornRecipe recipe2 : recipes) {
|
||||
if (recipe1 == recipe2) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Validate.isTrue(recipe1.getRebornIngredients().size() > 0, recipe1.getId() + " has no inputs");
|
||||
Validate.isTrue(recipe2.getRebornIngredients().size() > 0, recipe2.getId() + " has no inputs");
|
||||
Validate.isTrue(recipe1.getOutputs().size() > 0, recipe1.getId() + " has no outputs");
|
||||
Validate.isTrue(recipe2.getOutputs().size() > 0, recipe2.getId() + " has no outputs");
|
||||
|
||||
boolean hasAll = true;
|
||||
|
||||
for (RebornIngredient recipe1Input : recipe1.getRebornIngredients()) {
|
||||
boolean matches = false;
|
||||
for (ItemStack testStack : recipe1Input.getPreviewStacks()) {
|
||||
for (RebornIngredient recipe2Input : recipe2.getRebornIngredients()) {
|
||||
if (recipe2Input.test(testStack)) {
|
||||
matches = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!matches) {
|
||||
hasAll = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasAll) {
|
||||
System.out.println(recipe1.getId() + " conflicts with " + recipe2.getId());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -28,11 +28,13 @@ import com.google.gson.JsonElement;
|
|||
import com.google.gson.JsonObject;
|
||||
import com.mojang.serialization.Dynamic;
|
||||
import com.mojang.serialization.JsonOps;
|
||||
import net.minecraft.inventory.Inventory;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.nbt.NbtCompound;
|
||||
import net.minecraft.nbt.NbtOps;
|
||||
import net.minecraft.recipe.Recipe;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.JsonHelper;
|
||||
import net.minecraft.util.collection.DefaultedList;
|
||||
|
@ -42,15 +44,17 @@ import reborncore.common.util.DefaultedListCollector;
|
|||
import reborncore.common.util.serialization.SerializationUtil;
|
||||
import reborncore.mixin.common.AccessorRecipeManager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class RecipeUtils {
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T extends RebornRecipe> List<T> getRecipes(World world, RebornRecipeType<?> type) {
|
||||
AccessorRecipeManager accessorRecipeManager = (AccessorRecipeManager) world.getRecipeManager();
|
||||
public static <T extends RebornRecipe> List<T> getRecipes(World world, RebornRecipeType<T> type) {
|
||||
final AccessorRecipeManager accessorRecipeManager = (AccessorRecipeManager) world.getRecipeManager();
|
||||
final Collection<Recipe<Inventory>> recipes = accessorRecipeManager.getAll(type).values();
|
||||
//noinspection unchecked
|
||||
return new ArrayList<>(accessorRecipeManager.getAll(type).values());
|
||||
return Collections.unmodifiableList((List<T>) (Object) recipes);
|
||||
}
|
||||
|
||||
public static DefaultedList<ItemStack> deserializeItems(JsonElement jsonObject) {
|
||||
|
|
|
@ -1,3 +1,27 @@
|
|||
/*
|
||||
* This file is part of TechReborn, licensed under the MIT License (MIT).
|
||||
*
|
||||
* Copyright (c) 2020 TechReborn
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package reborncore.common.crafting.serde;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
|
@ -6,12 +30,9 @@ 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;
|
||||
|
@ -21,31 +42,6 @@ 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");
|
||||
}
|
||||
|
|
|
@ -1,3 +1,27 @@
|
|||
/*
|
||||
* This file is part of TechReborn, licensed under the MIT License (MIT).
|
||||
*
|
||||
* Copyright (c) 2020 TechReborn
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package reborncore.common.crafting.serde;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
|
@ -6,7 +30,7 @@ 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 org.jetbrains.annotations.NotNull;
|
||||
import reborncore.common.crafting.RebornFluidRecipe;
|
||||
import reborncore.common.crafting.RebornRecipeType;
|
||||
import reborncore.common.crafting.ingredient.RebornIngredient;
|
||||
|
@ -16,7 +40,7 @@ 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);
|
||||
protected abstract R fromJson(JsonObject jsonObject, RebornRecipeType<R> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time, @NotNull FluidInstance fluidInstance);
|
||||
|
||||
@Override
|
||||
protected final R fromJson(JsonObject jsonObject, RebornRecipeType<R> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time) {
|
||||
|
@ -35,13 +59,24 @@ public abstract class RebornFluidRecipeSerde<R extends RebornFluidRecipe> extend
|
|||
}
|
||||
|
||||
@Override
|
||||
public void toJson(R recipe, JsonObject jsonObject) {
|
||||
super.toJson(recipe, jsonObject);
|
||||
|
||||
public void collectJsonData(R recipe, JsonObject 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);
|
||||
}
|
||||
|
||||
public static <R extends RebornFluidRecipe> RebornFluidRecipeSerde<R> create(SimpleFluidRecipeFactory<R> factory) {
|
||||
return new RebornFluidRecipeSerde<>() {
|
||||
@Override
|
||||
protected R fromJson(JsonObject jsonObject, RebornRecipeType<R> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time, @NotNull FluidInstance fluidInstance) {
|
||||
return factory.create(type, name, ingredients, outputs, power, time, fluidInstance);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public interface SimpleFluidRecipeFactory<R extends RebornFluidRecipe> {
|
||||
R create(RebornRecipeType<R> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time, @NotNull FluidInstance fluidInstance);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,27 @@
|
|||
/*
|
||||
* This file is part of TechReborn, licensed under the MIT License (MIT).
|
||||
*
|
||||
* Copyright (c) 2020 TechReborn
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package reborncore.common.crafting.serde;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
|
@ -10,26 +34,12 @@ 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);
|
||||
}
|
||||
};
|
||||
public static final RebornRecipeSerde<RebornRecipe> BASIC = create(RebornRecipe::new);
|
||||
|
||||
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);
|
||||
|
@ -38,16 +48,32 @@ public abstract class RebornRecipeSerde<R extends RebornRecipe> extends Abstract
|
|||
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;
|
||||
}
|
||||
protected abstract void collectJsonData(R recipe, JsonObject jsonObject);
|
||||
|
||||
@Override
|
||||
public final void toJson(R recipe, JsonObject jsonObject) {
|
||||
writePower(recipe, jsonObject);
|
||||
writeTime(recipe, jsonObject);
|
||||
writeIngredients(recipe, jsonObject);
|
||||
writeOutputs(recipe, jsonObject);
|
||||
|
||||
collectJsonData(recipe, jsonObject);
|
||||
}
|
||||
|
||||
public static <R extends RebornRecipe> RebornRecipeSerde<R> create(SimpleRecipeFactory<R> factory) {
|
||||
return new RebornRecipeSerde<R>() {
|
||||
@Override
|
||||
protected R fromJson(JsonObject jsonObject, RebornRecipeType<R> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time) {
|
||||
return factory.create(type, name, ingredients, outputs, power, time);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void collectJsonData(R recipe, JsonObject jsonObject) {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public interface SimpleRecipeFactory<R extends RebornRecipe> {
|
||||
R create(RebornRecipeType<R> type, Identifier name, List<RebornIngredient> ingredients, List<ItemStack> outputs, int power, int time);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,30 @@
|
|||
/*
|
||||
* This file is part of TechReborn, licensed under the MIT License (MIT).
|
||||
*
|
||||
* Copyright (c) 2020 TechReborn
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
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;
|
||||
|
@ -10,10 +33,4 @@ 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