diff --git a/build.gradle b/build.gradle index 62f48724c..36187218e 100755 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,7 @@ sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = co minecraft { mappings channel: 'snapshot', version: '20190719-1.14.3' + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') runs { client { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/ClientSetup.java b/src/main/java/com/raoulvdberge/refinedstorage/ClientSetup.java index e12613808..f71f7bdb9 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/ClientSetup.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/ClientSetup.java @@ -12,6 +12,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -38,6 +39,11 @@ public class ClientSetup { new ResourceLocation(RS.ID, "block/grid/cutouts/front_connected") )); + bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "crafting_grid"), (base, registry) -> new FullbrightBakedModel( + base, + new ResourceLocation(RS.ID, "block/grid/cutouts/crafting_front_connected") + )); + bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "disk_drive"), (base, registry) -> new FullbrightBakedModel( new DiskDriveBakedModel( base, @@ -65,7 +71,8 @@ public class ClientSetup { ScreenManager.registerFactory(RSContainers.DISK_DRIVE, DiskDriveScreen::new); ScreenManager.registerFactory(RSContainers.GRID, new GridScreenFactory()); - RSKeyBindings.init(); + ClientRegistry.registerKeyBinding(RSKeyBindings.FOCUS_SEARCH_BAR); + ClientRegistry.registerKeyBinding(RSKeyBindings.CLEAR_GRID_CRAFTING_MATRIX); } @SubscribeEvent diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RS.java b/src/main/java/com/raoulvdberge/refinedstorage/RS.java index 91f2f2546..4ccb260fc 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RS.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RS.java @@ -4,7 +4,7 @@ import com.raoulvdberge.refinedstorage.api.network.grid.GridType; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeListener; -import com.raoulvdberge.refinedstorage.apiimpl.network.grid.GridFactoryGridBlock; +import com.raoulvdberge.refinedstorage.apiimpl.network.grid.factory.GridBlockGridFactory; import com.raoulvdberge.refinedstorage.apiimpl.network.node.CableNetworkNode; import com.raoulvdberge.refinedstorage.apiimpl.network.node.GridNetworkNode; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode; @@ -94,8 +94,9 @@ public final class RS { API.instance().getNetworkNodeRegistry().add(DiskDriveNetworkNode.ID, (tag, world, pos) -> readAndReturn(tag, new DiskDriveNetworkNode(world, pos))); API.instance().getNetworkNodeRegistry().add(CableNetworkNode.ID, (tag, world, pos) -> readAndReturn(tag, new CableNetworkNode(world, pos))); API.instance().getNetworkNodeRegistry().add(GridNetworkNode.ID, (tag, world, pos) -> readAndReturn(tag, new GridNetworkNode(world, pos, GridType.NORMAL))); + API.instance().getNetworkNodeRegistry().add(GridNetworkNode.CRAFTING_ID, (tag, world, pos) -> readAndReturn(tag, new GridNetworkNode(world, pos, GridType.CRAFTING))); - API.instance().getGridManager().add(GridFactoryGridBlock.ID, new GridFactoryGridBlock()); + API.instance().getGridManager().add(GridBlockGridFactory.ID, new GridBlockGridFactory()); } private INetworkNode readAndReturn(CompoundNBT tag, NetworkNode node) { @@ -118,26 +119,17 @@ public final class RS { e.getRegistry().register(new CableBlock()); e.getRegistry().register(new DiskDriveBlock()); e.getRegistry().register(new GridBlock(GridType.NORMAL)); + e.getRegistry().register(new GridBlock(GridType.CRAFTING)); } @SubscribeEvent public void onRegisterTiles(RegistryEvent.Register> e) { - e.getRegistry().register(registerTileDataParameters( - TileEntityType.Builder.create(() -> new ControllerTile(ControllerBlock.Type.NORMAL), RSBlocks.CONTROLLER).build(null).setRegistryName(RS.ID, "controller") - )); - - e.getRegistry().register(registerTileDataParameters( - TileEntityType.Builder.create(() -> new ControllerTile(ControllerBlock.Type.CREATIVE), RSBlocks.CREATIVE_CONTROLLER).build(null).setRegistryName(RS.ID, "creative_controller") - )); - + e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(() -> new ControllerTile(ControllerBlock.Type.NORMAL), RSBlocks.CONTROLLER).build(null).setRegistryName(RS.ID, "controller"))); + e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(() -> new ControllerTile(ControllerBlock.Type.CREATIVE), RSBlocks.CREATIVE_CONTROLLER).build(null).setRegistryName(RS.ID, "creative_controller"))); e.getRegistry().register(TileEntityType.Builder.create(CableTile::new, RSBlocks.CABLE).build(null).setRegistryName(RS.ID, "cable")); - e.getRegistry().register(registerTileDataParameters( - TileEntityType.Builder.create(DiskDriveTile::new, RSBlocks.DISK_DRIVE).build(null).setRegistryName(RS.ID, "disk_drive") - )); - - e.getRegistry().register(registerTileDataParameters( - TileEntityType.Builder.create(() -> new GridTile(GridType.NORMAL), RSBlocks.GRID).build(null).setRegistryName(RS.ID, "grid") - )); + e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(DiskDriveTile::new, RSBlocks.DISK_DRIVE).build(null).setRegistryName(RS.ID, "disk_drive"))); + e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(() -> new GridTile(GridType.NORMAL), RSBlocks.GRID).build(null).setRegistryName(RS.ID, "grid"))); + e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(() -> new GridTile(GridType.CRAFTING), RSBlocks.CRAFTING_GRID).build(null).setRegistryName(RS.ID, "crafting_grid"))); } private TileEntityType registerTileDataParameters(TileEntityType t) { @@ -206,6 +198,7 @@ public final class RS { e.getRegistry().register(BlockUtils.createBlockItemFor(RSBlocks.CABLE)); e.getRegistry().register(BlockUtils.createBlockItemFor(RSBlocks.DISK_DRIVE)); e.getRegistry().register(BlockUtils.createBlockItemFor(RSBlocks.GRID)); + e.getRegistry().register(BlockUtils.createBlockItemFor(RSBlocks.CRAFTING_GRID)); } /* TODO diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSBlocks.java b/src/main/java/com/raoulvdberge/refinedstorage/RSBlocks.java index e121b998a..1b14e9515 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSBlocks.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSBlocks.java @@ -44,6 +44,8 @@ public final class RSBlocks { @ObjectHolder(RS.ID + ":grid") public static final GridBlock GRID = null; + @ObjectHolder(RS.ID + ":crafting_grid") + public static final GridBlock CRAFTING_GRID = null; public static final BlockStorageMonitor STORAGE_MONITOR = new BlockStorageMonitor(); public static final BlockPortableGrid PORTABLE_GRID = new BlockPortableGrid(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSKeyBindings.java b/src/main/java/com/raoulvdberge/refinedstorage/RSKeyBindings.java index 0ddde537c..8ca06cc2f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSKeyBindings.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSKeyBindings.java @@ -3,28 +3,37 @@ package com.raoulvdberge.refinedstorage; import net.minecraft.client.settings.KeyBinding; import net.minecraft.client.util.InputMappings; import net.minecraftforge.client.settings.KeyConflictContext; -import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.client.settings.KeyModifier; import org.lwjgl.glfw.GLFW; public final class RSKeyBindings { /* - public static final KeyBinding CLEAR_GRID_CRAFTING_MATRIX = new KeyBinding("key.refinedstorage.clearGridCraftingMatrix", KeyConflictContext.GUI, KeyModifier.CONTROL, Keyboard.KEY_X, "Refined Storage"); public static final KeyBinding OPEN_WIRELESS_GRID = new KeyBinding("key.refinedstorage.openWirelessGrid", KeyConflictContext.IN_GAME, 0, "Refined Storage"); public static final KeyBinding OPEN_WIRELESS_FLUID_GRID = new KeyBinding("key.refinedstorage.openWirelessFluidGrid", KeyConflictContext.IN_GAME, 0, "Refined Storage"); public static final KeyBinding OPEN_PORTABLE_GRID = new KeyBinding("key.refinedstorage.openPortableGrid", KeyConflictContext.IN_GAME, 0, "Refined Storage"); public static final KeyBinding OPEN_WIRELESS_CRAFTING_MONITOR = new KeyBinding("key.refinedstorage.openWirelessCraftingMonitor", KeyConflictContext.IN_GAME, 0, "Refined Storage"); public static void init() { - ClientRegistry.registerKeyBinding(CLEAR_GRID_CRAFTING_MATRIX); ClientRegistry.registerKeyBinding(OPEN_WIRELESS_GRID); ClientRegistry.registerKeyBinding(OPEN_WIRELESS_FLUID_GRID); ClientRegistry.registerKeyBinding(OPEN_PORTABLE_GRID); ClientRegistry.registerKeyBinding(OPEN_WIRELESS_CRAFTING_MONITOR); }*/ - public static final KeyBinding FOCUS_SEARCH_BAR = new KeyBinding("key.refinedstorage.focusSearchBar", KeyConflictContext.GUI, InputMappings.Type.KEYSYM, GLFW.GLFW_KEY_TAB, "Refined Storage"); + public static final KeyBinding FOCUS_SEARCH_BAR = new KeyBinding( + "key.refinedstorage.focusSearchBar", + KeyConflictContext.GUI, + InputMappings.Type.KEYSYM, + GLFW.GLFW_KEY_TAB, + "Refined Storage" + ); - public static void init() { - ClientRegistry.registerKeyBinding(FOCUS_SEARCH_BAR); - } + public static final KeyBinding CLEAR_GRID_CRAFTING_MATRIX = new KeyBinding( + "key.refinedstorage.clearGridCraftingMatrix", + KeyConflictContext.GUI, + KeyModifier.CONTROL, + InputMappings.Type.KEYSYM, + GLFW.GLFW_KEY_X, + "Refined Storage" + ); } \ No newline at end of file diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSOldConfig.java b/src/main/java/com/raoulvdberge/refinedstorage/RSOldConfig.java index 099bc4397..856635499 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSOldConfig.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSOldConfig.java @@ -19,7 +19,6 @@ public class RSOldConfig { public int storageUsage; public int fluidStorageUsage; public int wirelessTransmitterUsage; - public int craftingGridUsage; public int patternGridUsage; public int fluidGridUsage; public int networkTransmitterUsage; @@ -111,7 +110,6 @@ public class RSOldConfig { storageUsage = config.getInt("storage", ENERGY, 1, 0, Integer.MAX_VALUE, "The energy used by Storage Blocks"); fluidStorageUsage = config.getInt("fluidStorage", ENERGY, 1, 0, Integer.MAX_VALUE, "The energy used by Fluid Storage Blocks"); wirelessTransmitterUsage = config.getInt("wirelessTransmitter", ENERGY, 8, 0, Integer.MAX_VALUE, "The energy used by Wireless Transmitters"); - craftingGridUsage = config.getInt("craftingGrid", ENERGY, 4, 0, Integer.MAX_VALUE, "The energy used by Crafting Grids"); patternGridUsage = config.getInt("patternGrid", ENERGY, 3, 0, Integer.MAX_VALUE, "The energy used by Pattern Grids"); fluidGridUsage = config.getInt("fluidGrid", ENERGY, 2, 0, Integer.MAX_VALUE, "The energy used by Fluid Grids"); networkTransmitterUsage = config.getInt("networkTransmitter", ENERGY, 64, 0, Integer.MAX_VALUE, "The energy used by Network Transmitters"); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSTiles.java b/src/main/java/com/raoulvdberge/refinedstorage/RSTiles.java index 5a1598203..3780278ea 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSTiles.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSTiles.java @@ -44,6 +44,8 @@ public class RSTiles { @ObjectHolder(RS.ID + ":grid") public static final TileEntityType GRID = null; + @ObjectHolder(RS.ID + ":crafting_grid") + public static final TileEntityType CRAFTING_GRID = null; //@ObjectHolder(RS.ID + ":importer") public static final TileEntityType IMPORTER = null; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java index 1bb9e67bc..ce2f2cb5e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java @@ -8,6 +8,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRe import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskReadException; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingRequestInfo; import com.raoulvdberge.refinedstorage.api.network.INetwork; +import com.raoulvdberge.refinedstorage.api.network.grid.ICraftingGridBehavior; import com.raoulvdberge.refinedstorage.api.network.grid.IGridManager; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeManager; @@ -121,6 +122,12 @@ public interface IRSAPI { @Nonnull IGridManager getGridManager(); + /** + * @return the default crafting grid behavior + */ + @Nonnull + ICraftingGridBehavior getCraftingGridBehavior(); + /** * @return the storage disk registry */ diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/ICraftingGridBehavior.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/ICraftingGridBehavior.java new file mode 100644 index 000000000..4f19fa16c --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/ICraftingGridBehavior.java @@ -0,0 +1,26 @@ +package com.raoulvdberge.refinedstorage.api.network.grid; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.crafting.ICraftingRecipe; + +/** + * Defines default behavior of crafting grids. + */ +public interface ICraftingGridBehavior { + /** + * Default logic for regular crafting. + * + * @param grid the grid + * @param recipe the recipe + * @param player the player + */ + void onCrafted(IGridNetworkAware grid, ICraftingRecipe recipe, PlayerEntity player); + + /** + * Default logic for crafting with shift click (mass crafting). + * + * @param grid the grid + * @param player the layer + */ + void onCraftedShift(IGridNetworkAware grid, PlayerEntity player); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGridCraftingListener.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/ICraftingGridListener.java similarity index 71% rename from src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGridCraftingListener.java rename to src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/ICraftingGridListener.java index 2d1f26872..8913bbae3 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGridCraftingListener.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/ICraftingGridListener.java @@ -3,10 +3,11 @@ package com.raoulvdberge.refinedstorage.api.network.grid; /** * A crafting listener for the grid. */ -public interface IGridCraftingListener { +public interface ICraftingGridListener { /** * Called when the crafting matrix was changed. * Usually you'd send slot updates for the crafting slots (and output slot) here, so that all clients get an actual view. + * This listener exists so the crafting result slot is only calculated on the server. */ void onCraftingMatrixChanged(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java index 372d4ecf2..9a530b603 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java @@ -77,13 +77,13 @@ public interface IGrid { /** * @param listener the listener */ - default void addCraftingListener(IGridCraftingListener listener) { + default void addCraftingListener(ICraftingGridListener listener) { } /** * @param listener the listener */ - default void removeCraftingListener(IGridCraftingListener listener) { + default void removeCraftingListener(ICraftingGridListener listener) { } /** @@ -205,6 +205,11 @@ public interface IGrid { */ void onCrafted(PlayerEntity player); + /** + * Called when the clear button is pressed in the pattern grid or crafting grid. + */ + void onClear(PlayerEntity player); + /** * Called when an item is crafted with shift click (up to 64 items) in a crafting grid. * diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java index b1cdf18de..c67c1225d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java @@ -9,6 +9,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRe import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskReadException; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingRequestInfo; import com.raoulvdberge.refinedstorage.api.network.INetwork; +import com.raoulvdberge.refinedstorage.api.network.grid.ICraftingGridBehavior; import com.raoulvdberge.refinedstorage.api.network.grid.IGridManager; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeManager; @@ -33,6 +34,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPrev import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskRegistry; import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeManager; import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeRegistry; +import com.raoulvdberge.refinedstorage.apiimpl.network.grid.CraftingGridBehavior; import com.raoulvdberge.refinedstorage.apiimpl.network.grid.GridManager; import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterChannel; import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerRegistry; @@ -60,18 +62,19 @@ import java.util.*; public class API implements IRSAPI { private static final IRSAPI INSTANCE = new API(); - private IComparer comparer = new Comparer(); - private IQuantityFormatter quantityFormatter = new QuantityFormatter(); - private INetworkNodeRegistry networkNodeRegistry = new NetworkNodeRegistry(); - private ICraftingTaskRegistry craftingTaskRegistry = new CraftingTaskRegistry(); - private ICraftingMonitorElementRegistry craftingMonitorElementRegistry = new CraftingMonitorElementRegistry(); - private ICraftingPreviewElementRegistry craftingPreviewElementRegistry = new CraftingPreviewElementRegistry(); - private IReaderWriterHandlerRegistry readerWriterHandlerRegistry = new ReaderWriterHandlerRegistry(); - private IGridManager gridManager = new GridManager(); - private IStorageDiskRegistry storageDiskRegistry = new StorageDiskRegistry(); - private IStorageDiskSync storageDiskSync = new StorageDiskSync(); - private Map> externalStorageProviders = new HashMap<>(); - private List patternRenderHandlers = new LinkedList<>(); + private final IComparer comparer = new Comparer(); + private final IQuantityFormatter quantityFormatter = new QuantityFormatter(); + private final INetworkNodeRegistry networkNodeRegistry = new NetworkNodeRegistry(); + private final ICraftingTaskRegistry craftingTaskRegistry = new CraftingTaskRegistry(); + private final ICraftingMonitorElementRegistry craftingMonitorElementRegistry = new CraftingMonitorElementRegistry(); + private final ICraftingPreviewElementRegistry craftingPreviewElementRegistry = new CraftingPreviewElementRegistry(); + private final IReaderWriterHandlerRegistry readerWriterHandlerRegistry = new ReaderWriterHandlerRegistry(); + private final IGridManager gridManager = new GridManager(); + private final ICraftingGridBehavior craftingGridBehavior = new CraftingGridBehavior(); + private final IStorageDiskRegistry storageDiskRegistry = new StorageDiskRegistry(); + private final IStorageDiskSync storageDiskSync = new StorageDiskSync(); + private final Map> externalStorageProviders = new HashMap<>(); + private final List patternRenderHandlers = new LinkedList<>(); public static IRSAPI instance() { return INSTANCE; @@ -175,6 +178,12 @@ public class API implements IRSAPI { return gridManager; } + @Nonnull + @Override + public ICraftingGridBehavior getCraftingGridBehavior() { + return craftingGridBehavior; + } + @Nonnull @Override public IStorageDiskRegistry getStorageDiskRegistry() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java index 2b894b22f..d7c305813 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java @@ -11,7 +11,6 @@ import net.minecraft.inventory.CraftingInventory; import net.minecraft.inventory.container.Container; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.ICraftingRecipe; -import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeType; import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.NonNullList; @@ -20,6 +19,7 @@ import net.minecraftforge.fluids.FluidStack; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class CraftingPattern implements ICraftingPattern { private ICraftingPatternContainer container; @@ -27,7 +27,7 @@ public class CraftingPattern implements ICraftingPattern { private boolean processing; private boolean oredict; private boolean valid; - private IRecipe recipe; + private ICraftingRecipe recipe; private List> inputs = new ArrayList<>(); private NonNullList outputs = NonNullList.create(); private NonNullList byproducts = NonNullList.create(); @@ -108,34 +108,30 @@ public class CraftingPattern implements ICraftingPattern { } } - // TODO: better way of collecting recipes - for (ICraftingRecipe r : world.getRecipeManager().getRecipes(IRecipeType.CRAFTING, inv, world)) { - if (r.matches(inv, world)) { - this.recipe = r; + Optional potentialRecipe = world.getRecipeManager().getRecipe(IRecipeType.CRAFTING, inv, world); + if (potentialRecipe.isPresent()) { + this.recipe = potentialRecipe.get(); - this.byproducts = recipe.getRemainingItems(inv); + this.byproducts = recipe.getRemainingItems(inv); - ItemStack output = recipe.getCraftingResult(inv); + ItemStack output = recipe.getCraftingResult(inv); - if (!output.isEmpty()) { - this.valid = true; + if (!output.isEmpty()) { + this.valid = true; - outputs.add(output); + outputs.add(output); - if (oredict) { - if (recipe.getIngredients().size() > 0) { - inputs.clear(); + if (oredict) { + if (recipe.getIngredients().size() > 0) { + inputs.clear(); - for (int i = 0; i < recipe.getIngredients().size(); ++i) { - inputs.add(i, NonNullList.from(ItemStack.EMPTY, ((Ingredient) recipe.getIngredients().get(i)).getMatchingStacks())); - } - } else { - this.valid = false; + for (int i = 0; i < recipe.getIngredients().size(); ++i) { + inputs.add(i, NonNullList.from(ItemStack.EMPTY, ((Ingredient) recipe.getIngredients().get(i)).getMatchingStacks())); } + } else { + this.valid = false; } } - - break; } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/CraftingGridBehavior.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/CraftingGridBehavior.java new file mode 100644 index 000000000..83032f607 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/CraftingGridBehavior.java @@ -0,0 +1,101 @@ +package com.raoulvdberge.refinedstorage.apiimpl.network.grid; + +import com.raoulvdberge.refinedstorage.api.network.INetwork; +import com.raoulvdberge.refinedstorage.api.network.grid.ICraftingGridBehavior; +import com.raoulvdberge.refinedstorage.api.network.grid.IGridNetworkAware; +import com.raoulvdberge.refinedstorage.api.util.Action; +import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.util.StackUtils; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ICraftingRecipe; +import net.minecraft.util.NonNullList; +import net.minecraftforge.fml.hooks.BasicEventHooks; +import net.minecraftforge.items.ItemHandlerHelper; + +import java.util.ArrayList; +import java.util.List; + +public class CraftingGridBehavior implements ICraftingGridBehavior { + @Override + public void onCrafted(IGridNetworkAware grid, ICraftingRecipe recipe, PlayerEntity player) { + NonNullList remainder = recipe.getRemainingItems(grid.getCraftingMatrix()); + + INetwork network = grid.getNetwork(); + + CraftingInventory matrix = grid.getCraftingMatrix(); + + for (int i = 0; i < grid.getCraftingMatrix().getSizeInventory(); ++i) { + ItemStack slot = matrix.getStackInSlot(i); + + // Do we have a remainder? + if (i < remainder.size() && !remainder.get(i).isEmpty()) { + // If there is no space for the remainder, dump it in the player inventory. + if (!slot.isEmpty() && slot.getCount() > 1) { + if (!player.inventory.addItemStackToInventory(remainder.get(i).copy())) { // If there is no space in the player inventory, try to dump it in the network. + ItemStack remainderStack = network == null ? remainder.get(i).copy() : network.insertItem(remainder.get(i).copy(), remainder.get(i).getCount(), Action.PERFORM); + + // If there is no space in the network, just dump it in the world. + if (remainderStack != null) { + InventoryHelper.spawnItemStack(player.getEntityWorld(), player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), remainderStack); + } + } + + matrix.decrStackSize(i, 1); + } else { + matrix.setInventorySlotContents(i, remainder.get(i).copy()); + } + } else if (!slot.isEmpty()) { // We don't have a remainder, but the slot is not empty. + if (slot.getCount() == 1 && network != null) { // Attempt to refill the slot with the same item from the network, only if we have a network and only if it's the last item. + ItemStack refill = StackUtils.nullToEmpty(network.extractItem(slot, 1, Action.PERFORM)); + + matrix.setInventorySlotContents(i, refill); + + if (!refill.isEmpty()) { + network.getItemStorageTracker().changed(player, refill.copy()); + } + } else { // We don't have a network, or, the slot still has more than 1 items in it. Just decrement then. + matrix.decrStackSize(i, 1); + } + } + } + + grid.onCraftingMatrixChanged(); + } + + @Override + public void onCraftedShift(IGridNetworkAware grid, PlayerEntity player) { + List craftedItemsList = new ArrayList<>(); + int amountCrafted = 0; + ItemStack crafted = grid.getCraftingResult().getStackInSlot(0); + + // Do while the item is still craftable (aka is the result slot still the same as the original item?) and we don't exceed the max stack size. + do { + grid.onCrafted(player); + + craftedItemsList.add(crafted.copy()); + + amountCrafted += crafted.getCount(); + } while (API.instance().getComparer().isEqual(crafted, grid.getCraftingResult().getStackInSlot(0)) && amountCrafted + crafted.getCount() < crafted.getMaxStackSize()); + + INetwork network = grid.getNetwork(); + + for (ItemStack craftedItem : craftedItemsList) { + if (!player.inventory.addItemStackToInventory(craftedItem.copy())) { + ItemStack remainder = network == null ? craftedItem : network.insertItem(craftedItem, craftedItem.getCount(), Action.PERFORM); + + if (remainder != null) { + InventoryHelper.spawnItemStack(player.getEntityWorld(), player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), remainder); + } + } + } + + // @Volatile: This is some logic copied from CraftingResultSlot#onCrafting. We call this manually for shift clicking because + // otherwise it's not being called. + // For regular crafting, this is already called in ResultCraftingGridSlot#onTake -> onCrafting(stack) + crafted.onCrafting(player.world, player, amountCrafted); + BasicEventHooks.firePlayerCraftingEvent(player, ItemHandlerHelper.copyStackWithSize(crafted, amountCrafted), grid.getCraftingMatrix()); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryGridBlock.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/GridBlockGridFactory.java similarity index 91% rename from src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryGridBlock.java rename to src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/GridBlockGridFactory.java index dd0781092..4fd49fbd2 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryGridBlock.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/GridBlockGridFactory.java @@ -1,4 +1,4 @@ -package com.raoulvdberge.refinedstorage.apiimpl.network.grid; +package com.raoulvdberge.refinedstorage.apiimpl.network.grid.factory; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.network.grid.GridFactoryType; @@ -14,7 +14,7 @@ import net.minecraft.world.World; import javax.annotation.Nullable; -public class GridFactoryGridBlock implements IGridFactory { +public class GridBlockGridFactory implements IGridFactory { public static final ResourceLocation ID = new ResourceLocation(RS.ID, "grid"); @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryPortableGridBlock.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/PortableGridBlockGridFactory.java similarity index 89% rename from src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryPortableGridBlock.java rename to src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/PortableGridBlockGridFactory.java index 440578129..1e02eac27 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryPortableGridBlock.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/PortableGridBlockGridFactory.java @@ -1,4 +1,4 @@ -package com.raoulvdberge.refinedstorage.apiimpl.network.grid; +package com.raoulvdberge.refinedstorage.apiimpl.network.grid.factory; import com.raoulvdberge.refinedstorage.api.network.grid.GridFactoryType; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; @@ -12,7 +12,7 @@ import net.minecraft.world.World; import javax.annotation.Nullable; -public class GridFactoryPortableGridBlock implements IGridFactory { +public class PortableGridBlockGridFactory implements IGridFactory { @Override @Nullable public IGrid createFromStack(PlayerEntity player, ItemStack stack) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryPortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/PortableGridGridFactory.java similarity index 88% rename from src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryPortableGrid.java rename to src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/PortableGridGridFactory.java index 5f0b36988..9403bb89c 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryPortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/PortableGridGridFactory.java @@ -1,4 +1,4 @@ -package com.raoulvdberge.refinedstorage.apiimpl.network.grid; +package com.raoulvdberge.refinedstorage.apiimpl.network.grid.factory; import com.raoulvdberge.refinedstorage.api.network.grid.GridFactoryType; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; @@ -12,7 +12,7 @@ import net.minecraft.world.World; import javax.annotation.Nullable; -public class GridFactoryPortableGrid implements IGridFactory { +public class PortableGridGridFactory implements IGridFactory { @Nullable @Override public IGrid createFromStack(PlayerEntity player, ItemStack stack) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryWirelessFluidGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/WirelessFluidGridGridFactory.java similarity index 88% rename from src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryWirelessFluidGrid.java rename to src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/WirelessFluidGridGridFactory.java index 7cb087864..18981e5fd 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryWirelessFluidGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/WirelessFluidGridGridFactory.java @@ -1,4 +1,4 @@ -package com.raoulvdberge.refinedstorage.apiimpl.network.grid; +package com.raoulvdberge.refinedstorage.apiimpl.network.grid.factory; import com.raoulvdberge.refinedstorage.api.network.grid.GridFactoryType; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; @@ -12,7 +12,7 @@ import net.minecraft.world.World; import javax.annotation.Nullable; -public class GridFactoryWirelessFluidGrid implements IGridFactory { +public class WirelessFluidGridGridFactory implements IGridFactory { @Nullable @Override public IGrid createFromStack(PlayerEntity player, ItemStack stack) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryWirelessGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/WirelessGridGridFactory.java similarity index 88% rename from src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryWirelessGrid.java rename to src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/WirelessGridGridFactory.java index 4dac15904..bfb1f37d2 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridFactoryWirelessGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/factory/WirelessGridGridFactory.java @@ -1,4 +1,4 @@ -package com.raoulvdberge.refinedstorage.apiimpl.network.grid; +package com.raoulvdberge.refinedstorage.apiimpl.network.grid.factory; import com.raoulvdberge.refinedstorage.api.network.grid.GridFactoryType; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; @@ -12,7 +12,7 @@ import net.minecraft.world.World; import javax.annotation.Nullable; -public class GridFactoryWirelessGrid implements IGridFactory { +public class WirelessGridGridFactory implements IGridFactory { @Nullable @Override public IGrid createFromStack(PlayerEntity player, ItemStack stack) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/FluidGridHandlerPortable.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableFluidGridHandler.java similarity index 97% rename from src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/FluidGridHandlerPortable.java rename to src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableFluidGridHandler.java index ca3e6fcc2..8932d749b 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/FluidGridHandlerPortable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableFluidGridHandler.java @@ -19,10 +19,10 @@ import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nullable; import java.util.UUID; -public class FluidGridHandlerPortable implements IFluidGridHandler { +public class PortableFluidGridHandler implements IFluidGridHandler { private IPortableGrid portableGrid; - public FluidGridHandlerPortable(IPortableGrid portableGrid) { + public PortableFluidGridHandler(IPortableGrid portableGrid) { this.portableGrid = portableGrid; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/ItemGridHandlerPortable.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableItemGridHandler.java similarity index 98% rename from src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/ItemGridHandlerPortable.java rename to src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableItemGridHandler.java index 94637f73b..92fbb80fc 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/ItemGridHandlerPortable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableItemGridHandler.java @@ -18,11 +18,11 @@ import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nullable; import java.util.UUID; -public class ItemGridHandlerPortable implements IItemGridHandler { +public class PortableItemGridHandler implements IItemGridHandler { private IPortableGrid portableGrid; private IGrid grid; - public ItemGridHandlerPortable(IPortableGrid portableGrid, IGrid grid) { + public PortableItemGridHandler(IPortableGrid portableGrid, IGrid grid) { this.portableGrid = portableGrid; this.grid = grid; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java index 2ab15e98c..81424c979 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java @@ -31,14 +31,12 @@ import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.inventory.CraftResultInventory; import net.minecraft.inventory.CraftingInventory; import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryHelper; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.ContainerType; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ICraftingRecipe; import net.minecraft.item.crafting.IRecipeType; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; @@ -61,6 +59,7 @@ import java.util.Set; public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, IType { public static final ResourceLocation ID = new ResourceLocation(RS.ID, "grid"); + public static final ResourceLocation CRAFTING_ID = new ResourceLocation(RS.ID, "crafting_grid"); public static final String NBT_VIEW_TYPE = "ViewType"; public static final String NBT_SORTING_DIRECTION = "SortingDirection"; @@ -87,13 +86,13 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I } } }; - private IRecipe currentRecipe; + private ICraftingRecipe currentRecipe; private CraftingInventory matrix = new CraftingInventory(craftingContainer, 3, 3); private CraftResultInventory result = new CraftResultInventory(); private ItemHandlerBase processingMatrix = new ItemHandlerBase(9 * 2, new ListenerNetworkNode(this)); private FluidInventory processingMatrixFluids = new FluidInventory(9 * 2, FluidAttributes.BUCKET_VOLUME * 64, new ListenerNetworkNode(this)); - private Set craftingListeners = new HashSet<>(); + private Set craftingListeners = new HashSet<>(); private ItemHandlerBase patterns = new ItemHandlerBase(2, new ListenerNetworkNode(this), new ItemValidatorBasic(RSItems.PATTERN)) { @Override @@ -146,7 +145,7 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I private List tabs = new ArrayList<>(); private ItemHandlerFilter filter = new ItemHandlerFilter(filters, tabs, new ListenerNetworkNode(this)); - private GridType type; + private final GridType type; private int viewType = VIEW_TYPE_NORMAL; private int sortingDirection = SORTING_DIRECTION_DESCENDING; @@ -161,21 +160,19 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I private boolean processingPattern = false; private int processingType = IType.ITEMS; - private final GridType gridType; - - public GridNetworkNode(World world, BlockPos pos, GridType gridType) { + public GridNetworkNode(World world, BlockPos pos, GridType type) { super(world, pos); - this.gridType = gridType; + this.type = type; } @Override public int getEnergyUsage() { - switch (getGridType()) { + switch (type) { case NORMAL: - return RS.SERVER_CONFIG.getGrid().getUsage(); + return RS.SERVER_CONFIG.getGrid().getGridUsage(); case CRAFTING: - return 0; + return RS.SERVER_CONFIG.getGrid().getCraftingGridUsage(); case PATTERN: return 0; case FLUID: @@ -231,18 +228,18 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I @Override public GridType getGridType() { - return gridType; + return type; } @Override public IStorageCacheListener createListener(ServerPlayerEntity player) { - return getGridType() == GridType.FLUID ? new FluidGridStorageCacheListener(player, network) : new ItemGridStorageCacheListener(player, network); + return type == GridType.FLUID ? new FluidGridStorageCacheListener(player, network) : new ItemGridStorageCacheListener(player, network); } @Nullable @Override public IStorageCache getStorageCache() { - return network != null ? (getGridType() == GridType.FLUID ? network.getFluidStorageCache() : network.getItemStorageCache()) : null; + return network != null ? (type == GridType.FLUID ? network.getFluidStorageCache() : network.getItemStorageCache()) : null; } @Nullable @@ -258,19 +255,17 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I } @Override - public void addCraftingListener(IGridCraftingListener listener) { + public void addCraftingListener(ICraftingGridListener listener) { craftingListeners.add(listener); } @Override - public void removeCraftingListener(IGridCraftingListener listener) { + public void removeCraftingListener(ICraftingGridListener listener) { craftingListeners.remove(listener); } @Override public ITextComponent getTitle() { - GridType type = getGridType(); - switch (type) { case CRAFTING: return new TranslationTextComponent("gui.refinedstorage.crafting_grid"); @@ -323,7 +318,7 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I @Override public void onCraftingMatrixChanged() { if (currentRecipe == null || !currentRecipe.matches(matrix, world)) { - currentRecipe = world.getRecipeManager().getRecipe(IRecipeType.CRAFTING, matrix, world).orElse(null); // TODO: does this work? + currentRecipe = world.getRecipeManager().getRecipe(IRecipeType.CRAFTING, matrix, world).orElse(null); } if (currentRecipe == null) { @@ -332,7 +327,7 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I result.setInventorySlotContents(0, currentRecipe.getCraftingResult(matrix)); } - craftingListeners.forEach(IGridCraftingListener::onCraftingMatrixChanged); + craftingListeners.forEach(ICraftingGridListener::onCraftingMatrixChanged); markDirty(); } @@ -457,88 +452,29 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I @Override public void onCrafted(PlayerEntity player) { - onCrafted(this, world, player); + API.instance().getCraftingGridBehavior().onCrafted(this, currentRecipe, player); } - public static void onCrafted(IGridNetworkAware grid, World world, PlayerEntity player) { - // TODO: NonNullList remainder = CraftingManager.getRemainingItems(grid.getCraftingMatrix(), world); - NonNullList remainder = NonNullList.create(); + @Override + public void onClear(PlayerEntity player) { + if (type == GridType.CRAFTING && network != null && network.getSecurityManager().hasPermission(Permission.INSERT, player)) { + for (int i = 0; i < matrix.getSizeInventory(); ++i) { + ItemStack slot = matrix.getStackInSlot(i); - INetwork network = grid.getNetwork(); + if (!slot.isEmpty()) { + matrix.setInventorySlotContents(i, StackUtils.nullToEmpty(network.insertItem(slot, slot.getCount(), Action.PERFORM))); - CraftingInventory matrix = grid.getCraftingMatrix(); - - for (int i = 0; i < grid.getCraftingMatrix().getSizeInventory(); ++i) { - ItemStack slot = matrix.getStackInSlot(i); - - if (i < remainder.size() && !remainder.get(i).isEmpty()) { - // If there is no space for the remainder, dump it in the player inventory - if (!slot.isEmpty() && slot.getCount() > 1) { - if (!player.inventory.addItemStackToInventory(remainder.get(i).copy())) { - ItemStack remainderStack = network == null ? remainder.get(i).copy() : network.insertItem(remainder.get(i).copy(), remainder.get(i).getCount(), Action.PERFORM); - - if (remainderStack != null) { - InventoryHelper.spawnItemStack(player.getEntityWorld(), player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), remainderStack); - } - } - - matrix.decrStackSize(i, 1); - } else { - matrix.setInventorySlotContents(i, remainder.get(i).copy()); - } - } else if (!slot.isEmpty()) { - if (slot.getCount() == 1 && network != null) { - ItemStack refill = StackUtils.nullToEmpty(network.extractItem(slot, 1, Action.PERFORM)); - - matrix.setInventorySlotContents(i, refill); - - if (!refill.isEmpty()) { - network.getItemStorageTracker().changed(player, refill.copy()); - } - } else { - matrix.decrStackSize(i, 1); + network.getItemStorageTracker().changed(player, slot.copy()); } } + } else if (type == GridType.PATTERN) { + clearMatrix(); } - - grid.onCraftingMatrixChanged(); } @Override public void onCraftedShift(PlayerEntity player) { - onCraftedShift(this, player); - } - - public static void onCraftedShift(IGridNetworkAware grid, PlayerEntity player) { - List craftedItemsList = new ArrayList<>(); - int craftedItems = 0; - ItemStack crafted = grid.getCraftingResult().getStackInSlot(0); - - while (true) { - grid.onCrafted(player); - - craftedItemsList.add(crafted.copy()); - - craftedItems += crafted.getCount(); - - if (!API.instance().getComparer().isEqual(crafted, grid.getCraftingResult().getStackInSlot(0)) || craftedItems + crafted.getCount() > crafted.getMaxStackSize()) { - break; - } - } - - INetwork network = grid.getNetwork(); - - for (ItemStack craftedItem : craftedItemsList) { - if (!player.inventory.addItemStackToInventory(craftedItem.copy())) { - ItemStack remainder = network == null ? craftedItem : network.insertItem(craftedItem, craftedItem.getCount(), Action.PERFORM); - - if (remainder != null) { - InventoryHelper.spawnItemStack(player.getEntityWorld(), player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), remainder); - } - } - } - - // TODO FMLCommonHandler.instance().firePlayerCraftingEvent(player, ItemHandlerHelper.copyStackWithSize(crafted, craftedItems), grid.getCraftingMatrix()); + API.instance().getCraftingGridBehavior().onCraftedShift(this, player); } public void onCreatePattern() { @@ -753,7 +689,7 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I @Override public ResourceLocation getId() { - return ID; + return type == GridType.NORMAL ? ID : CRAFTING_ID; } @Override @@ -828,7 +764,7 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I @Override public IItemHandler getDrops() { - switch (getGridType()) { + switch (type) { case CRAFTING: return new CombinedInvWrapper(filter, new InvWrapper(matrix)); case PATTERN: diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/GridBlock.java b/src/main/java/com/raoulvdberge/refinedstorage/block/GridBlock.java index 68676d069..d2c72d7af 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/GridBlock.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/GridBlock.java @@ -3,7 +3,7 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.network.grid.GridType; import com.raoulvdberge.refinedstorage.apiimpl.API; -import com.raoulvdberge.refinedstorage.apiimpl.network.grid.GridFactoryGridBlock; +import com.raoulvdberge.refinedstorage.apiimpl.network.grid.factory.GridBlockGridFactory; import com.raoulvdberge.refinedstorage.block.info.BlockDirection; import com.raoulvdberge.refinedstorage.tile.grid.GridTile; import com.raoulvdberge.refinedstorage.util.BlockUtils; @@ -62,7 +62,7 @@ public class GridBlock extends NodeBlock { @SuppressWarnings("deprecation") public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { if (!worldIn.isRemote) { - return NetworkUtils.attemptModify(worldIn, pos, hit.getFace(), player, () -> API.instance().getGridManager().openGrid(GridFactoryGridBlock.ID, (ServerPlayerEntity) player, pos)); + return NetworkUtils.attemptModify(worldIn, pos, hit.getFace(), player, () -> API.instance().getGridManager().openGrid(GridBlockGridFactory.ID, (ServerPlayerEntity) player, pos)); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java b/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java index 389f591dc..003978eb9 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/config/ServerConfig.java @@ -119,18 +119,24 @@ public class ServerConfig { } public class Grid { - private final ForgeConfigSpec.IntValue usage; + private final ForgeConfigSpec.IntValue gridUsage; + private final ForgeConfigSpec.IntValue craftingGridUsage; public Grid() { builder.push("grid"); - usage = builder.comment("The energy used by Grids").defineInRange("usage", 2, 0, Integer.MAX_VALUE); + gridUsage = builder.comment("The energy used by Grids").defineInRange("gridUsage", 2, 0, Integer.MAX_VALUE); + craftingGridUsage = builder.comment("The energy used by Crafting Grids").defineInRange("craftingGridUsage", 4, 0, Integer.MAX_VALUE); builder.pop(); } - public int getUsage() { - return usage.get(); + public int getGridUsage() { + return gridUsage.get(); + } + + public int getCraftingGridUsage() { + return craftingGridUsage.get(); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/GridContainer.java b/src/main/java/com/raoulvdberge/refinedstorage/container/GridContainer.java index 33588a28e..acabe3e40 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/GridContainer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/GridContainer.java @@ -2,8 +2,8 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.RSContainers; import com.raoulvdberge.refinedstorage.api.network.grid.GridType; +import com.raoulvdberge.refinedstorage.api.network.grid.ICraftingGridListener; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; -import com.raoulvdberge.refinedstorage.api.network.grid.IGridCraftingListener; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.storage.cache.IStorageCache; @@ -31,9 +31,8 @@ import net.minecraft.network.play.server.SSetSlotPacket; import net.minecraftforge.items.SlotItemHandler; import javax.annotation.Nullable; -import java.util.ArrayList; -public class GridContainer extends BaseContainer implements IGridCraftingListener { +public class GridContainer extends BaseContainer implements ICraftingGridListener { private IGrid grid; private IStorageCache cache; private IStorageCacheListener listener; @@ -56,7 +55,7 @@ public class GridContainer extends BaseContainer implements IGridCraftingListene public void initSlots() { this.inventorySlots.clear(); - // this.inventoryItemStacks.clear(); // TODO at + this.inventoryItemStacks.clear(); this.transferManager.clearTransfers(); @@ -215,8 +214,8 @@ public class GridContainer extends BaseContainer implements IGridCraftingListene Slot slot = inventorySlots.get(i); if (slot instanceof CraftingGridSlot || slot == craftingResultSlot || slot == patternResultSlot) { - for (IContainerListener listener : new ArrayList()) { // TODO AT for listeners - // @Volatile: We can't use IContainerListener#sendSlotContents since ServerPlayerEntity blocks SlotCrafting changes... + for (IContainerListener listener : listeners) { + // @Volatile: We can't use IContainerListener#sendSlotContents since ServerPlayerEntity blocks CraftingResultSlot changes... if (listener instanceof ServerPlayerEntity) { ((ServerPlayerEntity) listener).connection.sendPacket(new SSetSlotPacket(windowId, i, slot.getStack())); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/slot/grid/ResultCraftingGridSlot.java b/src/main/java/com/raoulvdberge/refinedstorage/container/slot/grid/ResultCraftingGridSlot.java index 3d3a40083..1932e898f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/slot/grid/ResultCraftingGridSlot.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/slot/grid/ResultCraftingGridSlot.java @@ -16,6 +16,7 @@ public class ResultCraftingGridSlot extends CraftingResultSlot { this.grid = grid; } + // @Volatile: Overriding logic from the super onTake method for Grid behaviors like refilling stacks from the network @Override @Nonnull public ItemStack onTake(PlayerEntity player, @Nonnull ItemStack stack) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/FilterUpdateMessage.java b/src/main/java/com/raoulvdberge/refinedstorage/network/FilterUpdateMessage.java index 0ce3f82d3..7f9ed7a64 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/FilterUpdateMessage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/FilterUpdateMessage.java @@ -42,17 +42,18 @@ public class FilterUpdateMessage { } public static void handle(FilterUpdateMessage message, Supplier ctx) { - ctx.get().enqueueWork(() -> { - PlayerEntity player = ctx.get().getSender(); + PlayerEntity player = ctx.get().getSender(); - if (player != null && player.openContainer instanceof FilterContainer) { + if (player != null && player.openContainer instanceof FilterContainer) { + ctx.get().enqueueWork(() -> { FilterItem.setCompare(((FilterContainer) player.openContainer).getStack(), message.compare); FilterItem.setMode(((FilterContainer) player.openContainer).getStack(), message.mode); FilterItem.setModFilter(((FilterContainer) player.openContainer).getStack(), message.modFilter); FilterItem.setName(((FilterContainer) player.openContainer).getStack(), message.name); FilterItem.setType(((FilterContainer) player.openContainer).getStack(), message.type); - } - }); + }); + } + ctx.get().setPacketHandled(true); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridClear.java.off b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridClear.java.off deleted file mode 100644 index 11342b924..000000000 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridClear.java.off +++ /dev/null @@ -1,55 +0,0 @@ -package com.raoulvdberge.refinedstorage.network; - -import com.raoulvdberge.refinedstorage.api.network.grid.GridType; -import com.raoulvdberge.refinedstorage.api.network.grid.IGridNetworkAware; -import com.raoulvdberge.refinedstorage.api.network.security.Permission; -import com.raoulvdberge.refinedstorage.api.util.Action; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeGrid; -import com.raoulvdberge.refinedstorage.container.GridContainer; -import com.raoulvdberge.refinedstorage.util.StackUtils; -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; - -public class MessageGridClear extends MessageHandlerPlayerToServer implements IMessage { - public MessageGridClear() { - } - - @Override - public void fromBytes(ByteBuf buf) { - // NO OP - } - - @Override - public void toBytes(ByteBuf buf) { - // NO OP - } - - @Override - public void handle(MessageGridClear message, ServerPlayerEntity player) { - Container container = player.openContainer; - - if (container instanceof ContainerGrid && ((ContainerGrid) container).getGrid() instanceof IGridNetworkAware) { - IGridNetworkAware grid = (IGridNetworkAware) ((ContainerGrid) container).getGrid(); - - if (grid.getGridType() == GridType.CRAFTING && grid.getNetwork() != null && grid.getNetwork().getSecurityManager().hasPermission(Permission.INSERT, player)) { - InventoryCrafting matrix = grid.getCraftingMatrix(); - - for (int i = 0; i < matrix.getSizeInventory(); ++i) { - ItemStack slot = matrix.getStackInSlot(i); - - if (!slot.isEmpty()) { - matrix.setInventorySlotContents(i, StackUtils.nullToEmpty(grid.getNetwork().insertItem(slot, slot.getCount(), Action.PERFORM))); - - grid.getNetwork().getItemStorageTracker().changed(player, slot.copy()); - } - } - } else if (grid.getGridType() == GridType.PATTERN) { - ((NetworkNodeGrid) grid).clearMatrix(); - } - } - } -} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/NetworkHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/network/NetworkHandler.java index dc5c2cce5..7473747be 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/NetworkHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/NetworkHandler.java @@ -3,10 +3,7 @@ package com.raoulvdberge.refinedstorage.network; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.network.disk.StorageDiskSizeRequestMessage; import com.raoulvdberge.refinedstorage.network.disk.StorageDiskSizeResponseMessage; -import com.raoulvdberge.refinedstorage.network.grid.GridItemDeltaMessage; -import com.raoulvdberge.refinedstorage.network.grid.GridItemInsertHeldMessage; -import com.raoulvdberge.refinedstorage.network.grid.GridItemPullMessage; -import com.raoulvdberge.refinedstorage.network.grid.GridItemUpdateMessage; +import com.raoulvdberge.refinedstorage.network.grid.*; import com.raoulvdberge.refinedstorage.network.tiledata.TileDataParameterMessage; import com.raoulvdberge.refinedstorage.network.tiledata.TileDataParameterUpdateMessage; import net.minecraft.entity.player.ServerPlayerEntity; @@ -38,6 +35,7 @@ public class NetworkHandler { handler.registerMessage(id++, GridItemDeltaMessage.class, GridItemDeltaMessage::encode, GridItemDeltaMessage::decode, GridItemDeltaMessage::handle); handler.registerMessage(id++, GridItemPullMessage.class, GridItemPullMessage::encode, GridItemPullMessage::decode, GridItemPullMessage::handle); handler.registerMessage(id++, GridItemInsertHeldMessage.class, GridItemInsertHeldMessage::encode, GridItemInsertHeldMessage::decode, GridItemInsertHeldMessage::handle); + handler.registerMessage(id++, GridClearMessage.class, GridClearMessage::encode, GridClearMessage::decode, GridClearMessage::handle); } public void sendToServer(Object message) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/grid/GridClearMessage.java b/src/main/java/com/raoulvdberge/refinedstorage/network/grid/GridClearMessage.java new file mode 100644 index 000000000..49c23897d --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/grid/GridClearMessage.java @@ -0,0 +1,35 @@ +package com.raoulvdberge.refinedstorage.network.grid; + +import com.raoulvdberge.refinedstorage.container.GridContainer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.container.Container; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.network.NetworkEvent; + +import java.util.function.Supplier; + +public class GridClearMessage { + public static GridClearMessage decode(PacketBuffer buf) { + return new GridClearMessage(); + } + + public static void encode(GridClearMessage message, PacketBuffer buf) { + // NO OP + } + + public static void handle(GridClearMessage message, Supplier ctx) { + PlayerEntity player = ctx.get().getSender(); + + if (player != null) { + ctx.get().enqueueWork(() -> { + Container container = player.openContainer; + + if (container instanceof GridContainer) { + ((GridContainer) container).getGrid().onClear(player); + } + }); + } + + ctx.get().setPacketHandled(true); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/grid/GridItemInsertHeldMessage.java b/src/main/java/com/raoulvdberge/refinedstorage/network/grid/GridItemInsertHeldMessage.java index 009ddb70f..a60dd275a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/grid/GridItemInsertHeldMessage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/grid/GridItemInsertHeldMessage.java @@ -27,8 +27,8 @@ public class GridItemInsertHeldMessage { public static void handle(GridItemInsertHeldMessage message, Supplier ctx) { ServerPlayerEntity player = ctx.get().getSender(); - ctx.get().enqueueWork(() -> { - if (player != null) { + if (player != null) { + ctx.get().enqueueWork(() -> { Container container = player.openContainer; if (container instanceof GridContainer) { @@ -38,8 +38,8 @@ public class GridItemInsertHeldMessage { grid.getItemHandler().onInsertHeldItem(player, message.single); } } - } - }); + }); + } ctx.get().setPacketHandled(true); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/grid/GridItemPullMessage.java b/src/main/java/com/raoulvdberge/refinedstorage/network/grid/GridItemPullMessage.java index 44f64963b..ee81b3c41 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/grid/GridItemPullMessage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/grid/GridItemPullMessage.java @@ -31,8 +31,8 @@ public class GridItemPullMessage { public static void handle(GridItemPullMessage message, Supplier ctx) { ServerPlayerEntity player = ctx.get().getSender(); - ctx.get().enqueueWork(() -> { - if (player != null) { + if (player != null) { + ctx.get().enqueueWork(() -> { Container container = player.openContainer; if (container instanceof GridContainer) { @@ -42,8 +42,9 @@ public class GridItemPullMessage { grid.getItemHandler().onExtract(player, message.id, message.flags); } } - } - }); + }); + } + ctx.get().setPacketHandled(true); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/BaseScreen.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/BaseScreen.java index 8ab111b3c..4a2ed4044 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/BaseScreen.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/BaseScreen.java @@ -8,9 +8,12 @@ import com.raoulvdberge.refinedstorage.render.FluidRenderer; import com.raoulvdberge.refinedstorage.screen.widget.CheckBoxWidget; import com.raoulvdberge.refinedstorage.screen.widget.sidebutton.SideButton; import com.raoulvdberge.refinedstorage.util.RenderUtils; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.widget.Widget; import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.util.InputMappings; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.Slot; @@ -324,6 +327,12 @@ public abstract class BaseScreen extends ContainerScreen // NO OP } + public static boolean isKeyDown(KeyBinding keybinding) { + return InputMappings.isKeyDown(Minecraft.getInstance().mainWindow.getHandle(), keybinding.getKey().getKeyCode()) && + keybinding.getKeyConflictContext().isActive() && + keybinding.getKeyModifier().isActive(keybinding.getKeyConflictContext()); + } + public abstract void onPostInit(int x, int y); public abstract void tick(int x, int y); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/FilterScreen.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/FilterScreen.java index 6f1ec224d..3f6d5f56a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/FilterScreen.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/FilterScreen.java @@ -91,6 +91,8 @@ public class FilterScreen extends BaseScreen { public boolean keyPressed(int key, int scanCode, int modifiers) { if (key == GLFW.GLFW_KEY_ESCAPE) { minecraft.player.closeScreen(); + + return true; } if (nameField.keyPressed(key, scanCode, modifiers) || nameField.func_212955_f()) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/GuiCrafterManager.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/GuiCrafterManager.java index 04d78a5b1..4008e4712 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/GuiCrafterManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/GuiCrafterManager.java @@ -115,7 +115,7 @@ public class GuiCrafterManager extends BaseScreen imple if (searchField == null) { searchField = new SearchWidget(font, sx, sy, 88 - 6); - searchField.addListener(() -> container.initSlots(null)); + searchField.func_212954_a(value -> container.initSlots(null)); searchField.setMode(crafterManager.getSearchBoxMode()); } else { searchField.x = sx; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/GridScreen.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/GridScreen.java index bbf46575c..28d520c1e 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/GridScreen.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/grid/GridScreen.java @@ -3,13 +3,14 @@ package com.raoulvdberge.refinedstorage.screen.grid; import com.google.common.collect.Lists; import com.mojang.blaze3d.platform.GlStateManager; import com.raoulvdberge.refinedstorage.RS; +import com.raoulvdberge.refinedstorage.RSKeyBindings; import com.raoulvdberge.refinedstorage.api.network.grid.GridType; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; -import com.raoulvdberge.refinedstorage.api.network.grid.IGridNetworkAware; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler; import com.raoulvdberge.refinedstorage.apiimpl.network.node.GridNetworkNode; import com.raoulvdberge.refinedstorage.apiimpl.render.ElementDrawers; import com.raoulvdberge.refinedstorage.container.GridContainer; +import com.raoulvdberge.refinedstorage.network.grid.GridClearMessage; import com.raoulvdberge.refinedstorage.network.grid.GridItemInsertHeldMessage; import com.raoulvdberge.refinedstorage.network.grid.GridItemPullMessage; import com.raoulvdberge.refinedstorage.screen.BaseScreen; @@ -40,6 +41,7 @@ import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraftforge.fml.client.config.GuiCheckBox; +import org.lwjgl.glfw.GLFW; import java.util.LinkedList; import java.util.List; @@ -104,7 +106,7 @@ public class GridScreen extends BaseScreen implements IScreenInfo if (searchField == null) { searchField = new SearchWidget(font, sx, sy, 88 - 6); - searchField.addListener(() -> { + searchField.func_212954_a(value -> { this.getView().sort(); // Use getter since this view can be replaced. }); searchField.setMode(grid.getSearchBoxMode()); @@ -171,6 +173,10 @@ public class GridScreen extends BaseScreen implements IScreenInfo view.sort(); } + if (isKeyDown(RSKeyBindings.CLEAR_GRID_CRAFTING_MATRIX)) { + RS.NETWORK_HANDLER.sendToServer(new GridClearMessage()); + } + tabs.update(); } @@ -429,12 +435,16 @@ public class GridScreen extends BaseScreen implements IScreenInfo if (clickedCreatePattern) { BlockPos gridPos = ((GridNetworkNode) grid).getPos(); + minecraft.getSoundHandler().play(SimpleSound.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + // @TODO RS.INSTANCE.network.sendToServer(new MessageGridPatternCreate(gridPos.getX(), gridPos.getY(), gridPos.getZ())); return true; } else if (grid.isActive()) { - if (clickedClear && grid instanceof IGridNetworkAware) { - // @TODO RS.INSTANCE.network.sendToServer(new MessageGridClear()); + if (clickedClear) { + RS.NETWORK_HANDLER.sendToServer(new GridClearMessage()); + + minecraft.getSoundHandler().play(SimpleSound.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); return true; } @@ -442,10 +452,10 @@ public class GridScreen extends BaseScreen implements IScreenInfo ItemStack held = container.getPlayer().inventory.getItemStack(); if (isOverSlotArea(mouseX - guiLeft, mouseY - guiTop) && !held.isEmpty() && (clickedButton == 0 || clickedButton == 1)) { - if (grid.getGridType() == GridType.NORMAL) { - RS.NETWORK_HANDLER.sendToServer(new GridItemInsertHeldMessage(clickedButton == 1)); - } else if (grid.getGridType() == GridType.FLUID) { + if (grid.getGridType() == GridType.FLUID) { // @TODO RS.INSTANCE.network.sendToServer(new MessageGridFluidInsertHeld()); + } else { + RS.NETWORK_HANDLER.sendToServer(new GridItemInsertHeldMessage(clickedButton == 1)); } return true; @@ -485,12 +495,6 @@ public class GridScreen extends BaseScreen implements IScreenInfo } } - if (clickedClear || clickedCreatePattern) { - minecraft.getSoundHandler().play(SimpleSound.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - - return true; - } - return super.mouseClicked(mouseX, mouseY, clickedButton); } @@ -511,8 +515,23 @@ public class GridScreen extends BaseScreen implements IScreenInfo return this.scrollbar.mouseScrolled(x, y, delta) || super.mouseScrolled(x, y, delta); } + @Override + public boolean charTyped(char p_charTyped_1_, int p_charTyped_2_) { + if (searchField.charTyped(p_charTyped_1_, p_charTyped_2_)) { + return true; + } + + return super.charTyped(p_charTyped_1_, p_charTyped_2_); + } + @Override public boolean keyPressed(int key, int scanCode, int modifiers) { + if (key == GLFW.GLFW_KEY_ESCAPE) { + minecraft.player.closeScreen(); + + return true; + } + if (searchField.keyPressed(key, scanCode, modifiers) || searchField.func_212955_f()) { return true; } @@ -520,16 +539,6 @@ public class GridScreen extends BaseScreen implements IScreenInfo return super.keyPressed(key, scanCode, modifiers); } - /* TODO - @Override - protected void keyTyped(char character, int keyCode) throws IOException { - if (keyCode == RSKeyBindings.CLEAR_GRID_CRAFTING_MATRIX.getKeyCode()) { - RS.INSTANCE.network.sendToServer(new MessageGridClear()); - } else { - super.keyTyped(character, keyCode); - } - }*/ - public SearchWidget getSearchField() { return searchField; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/SearchWidget.java b/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/SearchWidget.java index acaf23daf..51c2c9e63 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/SearchWidget.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/screen/widget/SearchWidget.java @@ -2,13 +2,12 @@ package com.raoulvdberge.refinedstorage.screen.widget; import com.raoulvdberge.refinedstorage.RSKeyBindings; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; +import com.raoulvdberge.refinedstorage.screen.BaseScreen; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import org.lwjgl.glfw.GLFW; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; public class SearchWidget extends TextFieldWidget { @@ -17,8 +16,6 @@ public class SearchWidget extends TextFieldWidget { private int mode; private int historyIndex = -1; - private List listeners = new LinkedList<>(); - public SearchWidget(FontRenderer fontRenderer, int x, int y, int width) { super(fontRenderer, x, y, width, fontRenderer.FONT_HEIGHT, ""); @@ -33,23 +30,17 @@ public class SearchWidget extends TextFieldWidget { });*/ } - public void addListener(Runnable listener) { - listeners.add(listener); - } - @Override public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { boolean wasFocused = isFocused(); boolean result = super.mouseClicked(mouseX, mouseY, mouseButton); - boolean flag = mouseX >= this.x && mouseX < this.x + this.width && mouseY >= this.y && mouseY < this.y + this.height; + boolean clickedWidget = mouseX >= this.x && mouseX < this.x + this.width && mouseY >= this.y && mouseY < this.y + this.height; - if (flag && mouseButton == 1) { + if (clickedWidget && mouseButton == 1) { setText(""); setFocused(true); - - listeners.forEach(Runnable::run); } else if (wasFocused != isFocused()) { saveHistory(); } @@ -59,17 +50,15 @@ public class SearchWidget extends TextFieldWidget { @Override public boolean keyPressed(int keyCode, int scanCode, int modifier) { - @SuppressWarnings("deprecation") boolean canLoseFocus = ObfuscationReflectionHelper.getPrivateValue(TextFieldWidget.class, this, 6); - boolean result = super.keyPressed(keyCode, scanCode, modifier); if (isFocused()) { if (keyCode == GLFW.GLFW_KEY_UP) { - updateSearchHistory(-1); + updateHistory(-1); result = true; } else if (keyCode == GLFW.GLFW_KEY_DOWN) { - updateSearchHistory(1); + updateHistory(1); result = true; } else if (keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_KP_ENTER) { @@ -83,7 +72,7 @@ public class SearchWidget extends TextFieldWidget { } } - if (keyCode == RSKeyBindings.FOCUS_SEARCH_BAR.getKey().getKeyCode() && canLoseFocus) { + if (BaseScreen.isKeyDown(RSKeyBindings.FOCUS_SEARCH_BAR) && canLoseFocus) { setFocused(!isFocused()); saveHistory(); @@ -91,14 +80,10 @@ public class SearchWidget extends TextFieldWidget { result = true; } - if (result) { - listeners.forEach(Runnable::run); - } - return result; } - private void updateSearchHistory(int delta) { + private void updateHistory(int delta) { if (HISTORY.isEmpty()) { return; } @@ -117,15 +102,11 @@ public class SearchWidget extends TextFieldWidget { if (delta == 1) { setText(""); - listeners.forEach(Runnable::run); - return; } } setText(HISTORY.get(historyIndex)); - - listeners.forEach(Runnable::run); } private void saveHistory() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/GridTile.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/GridTile.java index fb94f58d2..9762890e3 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/GridTile.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/GridTile.java @@ -76,7 +76,7 @@ public class GridTile extends NetworkNodeTile { private final GridType gridType; public GridTile(GridType gridType) { - super(RSTiles.GRID); + super(gridType == GridType.NORMAL ? RSTiles.GRID : RSTiles.CRAFTING_GRID); this.gridType = gridType; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessFluidGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessFluidGrid.java index b4611e6c2..9d1607bc0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessFluidGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessFluidGrid.java @@ -130,12 +130,12 @@ public class WirelessFluidGrid implements IGridNetworkAware { } @Override - public void addCraftingListener(IGridCraftingListener listener) { + public void addCraftingListener(ICraftingGridListener listener) { // NO OP } @Override - public void removeCraftingListener(IGridCraftingListener listener) { + public void removeCraftingListener(ICraftingGridListener listener) { // NO OP } @@ -278,6 +278,11 @@ public class WirelessFluidGrid implements IGridNetworkAware { // NO OP } + @Override + public void onClear(PlayerEntity player) { + // NO OP + } + @Override public void onCraftedShift(PlayerEntity player) { // NO OP diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java index 258a42089..02291264c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java @@ -131,12 +131,12 @@ public class WirelessGrid implements IGridNetworkAware { } @Override - public void addCraftingListener(IGridCraftingListener listener) { + public void addCraftingListener(ICraftingGridListener listener) { // NO OP } @Override - public void removeCraftingListener(IGridCraftingListener listener) { + public void removeCraftingListener(ICraftingGridListener listener) { // NO OP } @@ -283,6 +283,11 @@ public class WirelessGrid implements IGridNetworkAware { // NO OP } + @Override + public void onClear(PlayerEntity player) { + // NO OP + } + @Override public void onCraftedShift(PlayerEntity player) { // NO OP diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java index e4fb9e196..8d69dc00a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java @@ -2,8 +2,8 @@ package com.raoulvdberge.refinedstorage.tile.grid.portable; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.network.grid.GridType; +import com.raoulvdberge.refinedstorage.api.network.grid.ICraftingGridListener; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; -import com.raoulvdberge.refinedstorage.api.network.grid.IGridCraftingListener; import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler; @@ -16,8 +16,8 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskContainerCon import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider; import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.apiimpl.API; -import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.FluidGridHandlerPortable; -import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.ItemGridHandlerPortable; +import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.PortableFluidGridHandler; +import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.PortableItemGridHandler; import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.DiskDriveNetworkNode; import com.raoulvdberge.refinedstorage.apiimpl.storage.cache.PortableFluidStorageCache; import com.raoulvdberge.refinedstorage.apiimpl.storage.cache.PortableItemStorageCache; @@ -61,8 +61,8 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer @Nullable private IStorageCache cache; - private ItemGridHandlerPortable itemHandler = new ItemGridHandlerPortable(this, this); - private FluidGridHandlerPortable fluidHandler = new FluidGridHandlerPortable(this); + private PortableItemGridHandler itemHandler = new PortableItemGridHandler(this, this); + private PortableFluidGridHandler fluidHandler = new PortableFluidGridHandler(this); private PlayerEntity player; private ItemStack stack; @@ -240,12 +240,12 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer } @Override - public void addCraftingListener(IGridCraftingListener listener) { + public void addCraftingListener(ICraftingGridListener listener) { // NO OP } @Override - public void removeCraftingListener(IGridCraftingListener listener) { + public void removeCraftingListener(ICraftingGridListener listener) { // NO OP } @@ -398,6 +398,11 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer // NO OP } + @Override + public void onClear(PlayerEntity player) { + // NO OP + } + @Override public void onCraftedShift(PlayerEntity player) { // NO OP diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java index 65fb97d6d..acf496bfa 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java @@ -4,8 +4,8 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSTiles; import com.raoulvdberge.refinedstorage.api.network.grid.GridType; +import com.raoulvdberge.refinedstorage.api.network.grid.ICraftingGridListener; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; -import com.raoulvdberge.refinedstorage.api.network.grid.IGridCraftingListener; import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler; @@ -19,8 +19,8 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider; import com.raoulvdberge.refinedstorage.api.storage.tracker.IStorageTracker; import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.apiimpl.API; -import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.FluidGridHandlerPortable; -import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.ItemGridHandlerPortable; +import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.PortableFluidGridHandler; +import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.PortableItemGridHandler; import com.raoulvdberge.refinedstorage.apiimpl.network.node.GridNetworkNode; import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.DiskDriveNetworkNode; import com.raoulvdberge.refinedstorage.apiimpl.storage.cache.PortableFluidStorageCache; @@ -155,8 +155,8 @@ public class TilePortableGrid extends BaseTile implements IGrid, IPortableGrid, @Nullable private IStorageCache cache; - private ItemGridHandlerPortable itemHandler = new ItemGridHandlerPortable(this, this); - private FluidGridHandlerPortable fluidHandler = new FluidGridHandlerPortable(this); + private PortableItemGridHandler itemHandler = new PortableItemGridHandler(this, this); + private PortableFluidGridHandler fluidHandler = new PortableFluidGridHandler(this); private PortableGridDiskState diskState = PortableGridDiskState.NONE; private boolean connected; @@ -344,12 +344,12 @@ public class TilePortableGrid extends BaseTile implements IGrid, IPortableGrid, } @Override - public void addCraftingListener(IGridCraftingListener listener) { + public void addCraftingListener(ICraftingGridListener listener) { // NO OP } @Override - public void removeCraftingListener(IGridCraftingListener listener) { + public void removeCraftingListener(ICraftingGridListener listener) { // NO OP } @@ -504,6 +504,11 @@ public class TilePortableGrid extends BaseTile implements IGrid, IPortableGrid, // NO OP } + @Override + public void onClear(PlayerEntity player) { + // NO OP + } + @Override public void onCraftedShift(PlayerEntity player) { // NO OP diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 000000000..07ac216e2 --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,3 @@ +protected net.minecraft.inventory.container.Container field_75153_a # inventoryItemStacks +protected net.minecraft.inventory.container.Container field_75149_d # listeners +protected net.minecraft.client.gui.widget.TextFieldWidget field_146212_n # canLoseFocus diff --git a/src/main/resources/assets/refinedstorage/blockstates/crafting_grid.json b/src/main/resources/assets/refinedstorage/blockstates/crafting_grid.json new file mode 100644 index 000000000..4d96cf2ef --- /dev/null +++ b/src/main/resources/assets/refinedstorage/blockstates/crafting_grid.json @@ -0,0 +1,36 @@ +{ + "variants": { + "connected=true,direction=north": { + "model": "refinedstorage:block/grid/crafting/connected", + "y": 0 + }, + "connected=true,direction=east": { + "model": "refinedstorage:block/grid/crafting/connected", + "y": 90 + }, + "connected=true,direction=south": { + "model": "refinedstorage:block/grid/crafting/connected", + "y": 180 + }, + "connected=true,direction=west": { + "model": "refinedstorage:block/grid/crafting/connected", + "y": 270 + }, + "connected=false,direction=north": { + "model": "refinedstorage:block/grid/crafting/disconnected", + "y": 0 + }, + "connected=false,direction=east": { + "model": "refinedstorage:block/grid/crafting/disconnected", + "y": 90 + }, + "connected=false,direction=south": { + "model": "refinedstorage:block/grid/crafting/disconnected", + "y": 180 + }, + "connected=false,direction=west": { + "model": "refinedstorage:block/grid/crafting/disconnected", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/models/block/grid/crafting/connected.json b/src/main/resources/assets/refinedstorage/models/block/grid/crafting/connected.json new file mode 100644 index 000000000..d96b336bd --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/block/grid/crafting/connected.json @@ -0,0 +1,13 @@ +{ + "parent": "refinedstorage:block/cube_north_cutout", + "textures": { + "particle": "refinedstorage:block/side", + "east": "refinedstorage:block/grid/left", + "south": "refinedstorage:block/grid/back", + "west": "refinedstorage:block/grid/right", + "up": "refinedstorage:block/grid/top", + "down": "refinedstorage:block/bottom", + "north": "refinedstorage:block/grid/front", + "cutout": "refinedstorage:block/grid/cutouts/crafting_front_connected" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/models/block/grid/crafting/disconnected.json b/src/main/resources/assets/refinedstorage/models/block/grid/crafting/disconnected.json new file mode 100644 index 000000000..79a833fd2 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/block/grid/crafting/disconnected.json @@ -0,0 +1,13 @@ +{ + "parent": "refinedstorage:block/cube_north_cutout", + "textures": { + "particle": "refinedstorage:block/side", + "east": "refinedstorage:block/grid/left", + "south": "refinedstorage:block/grid/back", + "west": "refinedstorage:block/grid/right", + "up": "refinedstorage:block/grid/top", + "down": "refinedstorage:block/bottom", + "north": "refinedstorage:block/grid/front", + "cutout": "refinedstorage:block/grid/cutouts/crafting_front_disconnected" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/models/item/crafting_grid.json b/src/main/resources/assets/refinedstorage/models/item/crafting_grid.json new file mode 100644 index 000000000..5574eba10 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/crafting_grid.json @@ -0,0 +1,3 @@ +{ + "parent": "refinedstorage:block/grid/crafting/disconnected" +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/recipes/crafting_grid.json b/src/main/resources/assets/refinedstorage/recipes/crafting_grid.json deleted file mode 100644 index a1dd7dfe4..000000000 --- a/src/main/resources/assets/refinedstorage/recipes/crafting_grid.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "item": "refinedstorage:grid", - "data": 0 - }, - { - "item": "#advanced_processor" - }, - { - "type": "forge:ore_dict", - "ore": "workbench" - } - ], - "result": { - "item": "refinedstorage:grid", - "data": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/refinedstorage/loot_tables/blocks/crafting_grid.json b/src/main/resources/data/refinedstorage/loot_tables/blocks/crafting_grid.json new file mode 100644 index 000000000..23babdc59 --- /dev/null +++ b/src/main/resources/data/refinedstorage/loot_tables/blocks/crafting_grid.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage:crafting_grid" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/refinedstorage/loot_tables/blocks/grid.json b/src/main/resources/data/refinedstorage/loot_tables/blocks/grid.json new file mode 100644 index 000000000..7d2177c5b --- /dev/null +++ b/src/main/resources/data/refinedstorage/loot_tables/blocks/grid.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "refinedstorage:grid" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/refinedstorage/recipes/crafting_grid.json b/src/main/resources/data/refinedstorage/recipes/crafting_grid.json new file mode 100644 index 000000000..095b12718 --- /dev/null +++ b/src/main/resources/data/refinedstorage/recipes/crafting_grid.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "refinedstorage:grid" + }, + { + "item": "refinedstorage:advanced_processor" + }, + { + "tag": "refinedstorage:crafting_tables" + } + ], + "result": { + "item": "refinedstorage:crafting_grid" + } +} \ No newline at end of file