From 5364f3548f292f5172d3515eabfdf9fa766cfb94 Mon Sep 17 00:00:00 2001 From: lucsoft Date: Tue, 12 Jan 2021 15:16:23 +0100 Subject: [PATCH] Added HDD Crafting Recipe (NBT Crafting) --- src/main/java/li/cil/oc2/common/Main.java | 4 +- .../common/customrecipes/CustomRecipes.java | 18 +++ .../oc2/common/customrecipes/HDDRecipe.java | 108 ++++++++++++++++++ .../data/oc2/recipes/hard_drive.json | 3 + 4 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/main/java/li/cil/oc2/common/customrecipes/CustomRecipes.java create mode 100644 src/main/java/li/cil/oc2/common/customrecipes/HDDRecipe.java create mode 100644 src/main/resources/data/oc2/recipes/hard_drive.json diff --git a/src/main/java/li/cil/oc2/common/Main.java b/src/main/java/li/cil/oc2/common/Main.java index fa32de5e..8f370f5c 100644 --- a/src/main/java/li/cil/oc2/common/Main.java +++ b/src/main/java/li/cil/oc2/common/Main.java @@ -9,6 +9,7 @@ import li.cil.oc2.common.bus.device.data.BaseBlockDevices; import li.cil.oc2.common.bus.device.data.Firmwares; import li.cil.oc2.common.bus.device.provider.Providers; import li.cil.oc2.common.container.Containers; +import li.cil.oc2.common.customrecipes.CustomRecipes; import li.cil.oc2.common.item.Items; import li.cil.oc2.common.serialization.serializers.Serializers; import li.cil.oc2.common.tileentity.TileEntities; @@ -16,6 +17,7 @@ import li.cil.sedna.Sedna; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @Mod(API.MOD_ID) @@ -33,7 +35,7 @@ public final class Main { DeviceTypes.initialize(); BaseBlockDevices.initialize(); Firmwares.initialize(); - + CustomRecipes.initialize(); FMLJavaModLoadingContext.get().getModEventBus().register(CommonSetup.class); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FMLJavaModLoadingContext.get().getModEventBus().register(ClientSetup.class)); } diff --git a/src/main/java/li/cil/oc2/common/customrecipes/CustomRecipes.java b/src/main/java/li/cil/oc2/common/customrecipes/CustomRecipes.java new file mode 100644 index 00000000..d6c95276 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/customrecipes/CustomRecipes.java @@ -0,0 +1,18 @@ +package li.cil.oc2.common.customrecipes; + +import li.cil.oc2.api.API; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; + +public final class CustomRecipes { + private static final DeferredRegister> INITIALIZER = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, API.MOD_ID); + + public static final RegistryObject HDD_RECIPE = INITIALIZER.register("hard_drive", HDDRecipe.Serializer::new); + + public static void initialize() { + INITIALIZER.register(FMLJavaModLoadingContext.get().getModEventBus()); + } +} diff --git a/src/main/java/li/cil/oc2/common/customrecipes/HDDRecipe.java b/src/main/java/li/cil/oc2/common/customrecipes/HDDRecipe.java new file mode 100644 index 00000000..4423f997 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/customrecipes/HDDRecipe.java @@ -0,0 +1,108 @@ +package li.cil.oc2.common.customrecipes; + +import com.google.gson.JsonObject; +import li.cil.oc2.common.Constants; +import li.cil.oc2.common.item.HardDriveItem; +import li.cil.oc2.common.item.Items; +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.*; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.ForgeRegistryEntry; +import org.jetbrains.annotations.NotNull; + +public class HDDRecipe implements ICraftingRecipe { + private static final RegistryObject WRITTEN_BOOK = RegistryObject.of(new ResourceLocation("oc2:hard_drive"), ForgeRegistries.ITEMS); + + private final ResourceLocation id; + + public HDDRecipe(ResourceLocation idIn) { + id = idIn; + } + + @Override + public @NotNull ResourceLocation getId() { + return id; + } + + @Override + public @NotNull ItemStack getRecipeOutput() { + return new ItemStack(WRITTEN_BOOK.get()); + } + + @Override + public boolean matches(@NotNull CraftingInventory inv, @NotNull World worldIn) { + return craftingTemplateForTiers(inv) && creatingTiers(inv) != -1; + } + + @Override + public @NotNull ItemStack getCraftingResult(@NotNull CraftingInventory inv) { + boolean checkTemplate = craftingTemplateForTiers(inv); + + if(!checkTemplate) return ItemStack.EMPTY; + + int tier = creatingTiers(inv); + return (tier != -1) ? HardDriveItem.withCapacity(((int)Math.pow(2,tier)) * Constants.MEGABYTE) : ItemStack.EMPTY; + } + + @Override + public boolean canFit(int width, int height) { + return width * height >= 9; + } + + @Override + public @NotNull IRecipeSerializer getSerializer() { + return CustomRecipes.HDD_RECIPE.get(); + } + + public static class Serializer extends ForgeRegistryEntry> implements IRecipeSerializer { + @Override + public @NotNull HDDRecipe read(@NotNull ResourceLocation recipeId, @NotNull JsonObject json) { + return new HDDRecipe(recipeId); + } + + @Override + public HDDRecipe read(@NotNull ResourceLocation recipeId, @NotNull PacketBuffer buffer) { + return new HDDRecipe(recipeId); + } + + @Override + public void write(@NotNull PacketBuffer buffer, @NotNull HDDRecipe recipe) { + + } + } + private int creatingTiers(CraftingInventory inv) { + Item iron = net.minecraft.item.Items.IRON_INGOT; + Item gold = net.minecraft.item.Items.GOLD_INGOT; + Item diamond = net.minecraft.item.Items.DIAMOND; + Item first = inv.getStackInSlot(2).getItem(); + Item second = inv.getStackInSlot(8).getItem(); + boolean ironTemplate = first.equals(iron) && second.equals(iron); + boolean goldTemplate = first.equals(gold) && second.equals(gold); + boolean diamondTemplate = first.equals(diamond) && second.equals(diamond); + + if(ironTemplate) return 1; + else if(goldTemplate) return 2; + else if(diamondTemplate) return 3; + else return -1; + + } + + private boolean craftingTemplateForTiers(CraftingInventory inv) { + + Item slot5 = inv.getStackInSlot(5).getItem(); + + return inv.getStackInSlot(0).getItem().equals(Items.MICROCHIP_ITEM.get()) + && inv.getStackInSlot(1).getItem().equals(Items.DISK_PLATTER_ITEM.get()) + && inv.getStackInSlot(3).getItem().equals(Items.PCB_ITEM.get()) + && inv.getStackInSlot(4).getItem().equals(Items.DISK_PLATTER_ITEM.get()) + && (slot5.equals(net.minecraft.item.Items.PISTON) || slot5.equals(net.minecraft.item.Items.STICKY_PISTON)) + && inv.getStackInSlot(6).getItem().equals(Items.MICROCHIP_ITEM.get()) + && inv.getStackInSlot(7).getItem().equals(Items.DISK_PLATTER_ITEM.get()); + } +} \ No newline at end of file diff --git a/src/main/resources/data/oc2/recipes/hard_drive.json b/src/main/resources/data/oc2/recipes/hard_drive.json new file mode 100644 index 00000000..1dd97f3d --- /dev/null +++ b/src/main/resources/data/oc2/recipes/hard_drive.json @@ -0,0 +1,3 @@ +{ + "type": "oc2:hard_drive" +} \ No newline at end of file