Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

bigbaddevil6

Members
  • Posts

    87
  • Joined

  • Last visited

Posts posted by bigbaddevil6

  1. Ok I was having issues trying to get my TileEntity to always be checking to make sure if the item is there.It is always checking the craftMatrix but not the tileEntity for updates when it calls the recipe. It will do fine when you first try the recipe, but I can still take a tool back out and since there isnt a listener for the item being there or not, it allows the crafting recipe until the craftMatrix updates again to make the call to check the slots of the tileEntity. At the moment im studying more java concepts outside of MC.

  2. The are both of the same inventory its for a 5x5 crafting table that has 4 Tile entity slots the rest is just like a normal crafting table, share the same container. Unless there is a piece to this I am missing I would believed they are already linked because it need to add the TileEntity slots to the container so it can use its logic along with its crafting counter part. Their constructors both grab the same location from the Gui Handler.

  3. Yea, thats what I'm trying to do is get it so the recipe can check the appropriate TileEntity. Obviously I don't have it setup properly. I understand the idea that its checking some tileEntity that isn't linked to it because it is just a recipe checker that take data from the crafting manager and tell the crafting manager if it was valid or not and that is it. it doesn't know where it is. What if instead of doing it the way I been trying to do it, because even I think it seems like a stupid idea the more I think of it. What if I do the check in the FindMatchingRecipe() of the craftingManager since its already passed the current inventory and world, or even in that matter do it in the container since they are already linked and have it checked there during the craftResult. 

     

    By the way I bet you are raging at me, but I do much appreciate your time. Not often will people sit and explain why of what you are doing is wrong.

  4. Ok, so what would I have to do to properly make an instance of the class. I realized my error when I made mine because the one I looked at was in the main method, when you make an instance of your mod, that has annotations, and that I created the variable entityInstance but never assigned anything to it, so its null. I agree that is basic Java. I was in a rush when I did that and didn't stop to look at what I had done. So with that in mind and stopping to think about it for a while. Wouldn't I pass the itself into that variable once it has been gotten from the world. Then I would take that and be able to get information from it.

  5. is it basic java? I've done two college classes specializing in Java beginner and advanced, and they have never mentioned stuff like this. Only how to use interfaces, inheritance, queues, stacks, and all the lesser stuff how making objects and general java rules... Where would you suggest I learn more about these issues, besides the Java trails. I know you say you can't learn programming from modding and understand why, I use it as a way to put into action what skills I do have. In return Minecraft beats the hell out of me for trying it seems.

    I always hear people say learn basic Java and I for the most part think I do know basic Java. I was able to do bukkit/spigot plugins in Java for a while without much hassle. Is it more of a "How to Develop a game" that I should learn? More of the rules of java? Find a better college because this one doesn't have a higher Java class to take and the one I did take doesn't seem valuable. I don't know. Kind of at a loss here.

  6.  

     

    public boolean hasToolInSlot(){
            if(items[0] != null) {
                if (items[0].getItem().equals(Items.diamond)) {
                    return true;
                }
            }
            return false;
        }
    

     

     

     

    That is the updated method for the HasToolInSlot(). I am having this method get called in Shaped Recipe class. I can't make this method static because of items[] not being able to be static. So I always thought if you have to reference a non static variable or method to make a instance of the class that contains them and pass that along with what ever you need. So I did and threw another null pointer....

     

     

     

    ---- Minecraft Crash Report ----

    // Hey, that tickles! Hehehe!

     

    Time: 5/31/15 9:34 AM

    Description: Ticking memory connection

     

    java.lang.NullPointerException: Ticking memory connection

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.checkMatch(ProtoTableShapedRecipe.java:74)

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.matches(ProtoTableShapedRecipe.java:46)

    at com.bigbaddevil7.rustic.crafting.ProtoTableCraftingManager.findMatchingRecipe(ProtoTableCraftingManager.java:196)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.onCraftMatrixChanged(ProtoTableContainer.java:64)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.<init>(ProtoTableContainer.java:55)

    at com.bigbaddevil7.rustic.handler.GuiHandler.getServerGuiElement(GuiHandler.java:25)

    at cpw.mods.fml.common.network.NetworkRegistry.getRemoteGuiContainer(NetworkRegistry.java:243)

    at cpw.mods.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:75)

    at com.bigbaddevil7.rustic.blocks.BlockProtoTable.onBlockActivated(BlockProtoTable.java:28)

    at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:409)

    at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)

    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)

    at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)

    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)

    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)

    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)

    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)

    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)

     

     

    A detailed walkthrough of the error, its code path and all known details is as follows:

    ---------------------------------------------------------------------------------------

     

    -- Head --

    Stacktrace:

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.checkMatch(ProtoTableShapedRecipe.java:74)

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.matches(ProtoTableShapedRecipe.java:46)

    at com.bigbaddevil7.rustic.crafting.ProtoTableCraftingManager.findMatchingRecipe(ProtoTableCraftingManager.java:196)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.onCraftMatrixChanged(ProtoTableContainer.java:64)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.<init>(ProtoTableContainer.java:55)

    at com.bigbaddevil7.rustic.handler.GuiHandler.getServerGuiElement(GuiHandler.java:25)

    at cpw.mods.fml.common.network.NetworkRegistry.getRemoteGuiContainer(NetworkRegistry.java:243)

    at cpw.mods.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:75)

    at com.bigbaddevil7.rustic.blocks.BlockProtoTable.onBlockActivated(BlockProtoTable.java:28)

    at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:409)

    at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)

    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)

     

    -- Ticking connection --

    Details:

    Connection: net.minecraft.network.NetworkManager@7de0e803

    Stacktrace:

    at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)

    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)

    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)

    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)

    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)

    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)

     

    -- System Details --

    Details:

    Minecraft Version: 1.7.10

    Operating System: Windows 8.1 (amd64) version 6.3

    Java Version: 1.7.0_71, Oracle Corporation

    Java VM Version: Java HotSpot 64-Bit Server VM (mixed mode), Oracle Corporation

    Memory: 696318400 bytes (664 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB)

    JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M

    AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used

    IntCache: cache: 0, tcache: 0, allocated: 12, tallocated: 94

    FML: MCP v9.05 FML v7.10.99.99 Minecraft Forge 10.13.3.1408 4 mods loaded, 4 mods active

    mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    FML{7.10.99.99} [Forge Mod Loader] (forgeSrc-1.7.10-10.13.3.1408-1.7.10.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    Forge{10.13.3.1408} [Minecraft Forge] (forgeSrc-1.7.10-10.13.3.1408-1.7.10.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    rustic{1.7.10-1.0} [Rustic] (Rustic 1.7.10) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.

    Profiler Position: N/A (disabled)

    Vec3 Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used

    Player Count: 1 / 8; [EntityPlayerMP['Player984'/371, l='New World', x=-96.45, y=79.00, z=287.42]]

    Type: Integrated Server (map_client.txt)

    Is Modded: Definitely; Client brand changed to 'fml,forge'

     

     

     

    updated Shaped Recipe class

     

     

    package com.bigbaddevil7.rustic.crafting;
    
    import com.bigbaddevil7.rustic.blocks.tileentities.TileEntityProtoTable;
    import net.minecraft.inventory.InventoryCrafting;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.crafting.IRecipe;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.world.World;
    
    /**
    * Created by bigbaddevil7 on 11/15/2014.
    */
    public class ProtoTableShapedRecipe implements IRecipe {
        /** How many horizontal slots this recipe is wide. */
        public final int recipeWidth;
        /** How many vertical slots this recipe uses. */
        public final int recipeHeight;
        /** Is a array of ItemStack that composes the recipe. */
        public final ItemStack[] recipeItems;
        /** Is the ItemStack that you get when craft the recipe. */
        private ItemStack recipeOutput;
        private boolean field_92101_f;
    
        public ProtoTableShapedRecipe(int p_i1917_1_, int p_i1917_2_, ItemStack[] p_i1917_3_, ItemStack p_i1917_4_)
        {
            this.recipeWidth = p_i1917_1_;
            this.recipeHeight = p_i1917_2_;
            this.recipeItems = p_i1917_3_;
            this.recipeOutput = p_i1917_4_;
        }
    
        public ItemStack getRecipeOutput()
        {
            return this.recipeOutput;
        }
    
        /**
         * Used to check if a recipe matches current crafting inventory
         */
        public boolean matches(InventoryCrafting p_77569_1_, World p_77569_2_)
        {
            for (int i = 0; i <= 5 - this.recipeWidth; ++i)
            {
                for (int j = 0; j <= 5 - this.recipeHeight; ++j)
                {
                    if (this.checkMatch(p_77569_1_, i, j, true))
                    {
                        return true;
                    }
    
                    if (this.checkMatch(p_77569_1_, i, j, false))
                    {
                        return true;
                    }
                }
            }
    
            return false;
        }
    
        /**
         * Checks if the region of a crafting inventory is match for the recipe.
         */
        private boolean checkMatch(InventoryCrafting p_77573_1_, int p_77573_2_, int p_77573_3_, boolean p_77573_4_)
        {
            for (int k = 0; k < 5; ++k)
            {
                for (int l = 0; l < 5; ++l)
                {
                    int i1 = k - p_77573_2_;
                    int j1 = l - p_77573_3_;
                    ItemStack itemstack = null;
    
                    if(!TileEntityProtoTable.entityInstance.hasToolInSlot()){
                        return false;
                    }
    
                    if (i1 >= 0 && j1 >= 0 && i1 < this.recipeWidth && j1 < this.recipeHeight)
                    {
                        if (p_77573_4_)
                        {
                            itemstack = this.recipeItems[this.recipeWidth - i1 - 1 + j1 * this.recipeWidth];
                        }
                        else
                        {
                            itemstack = this.recipeItems[i1 + j1 * this.recipeWidth];
                        }
                    }
    
                    ItemStack itemstack1 = p_77573_1_.getStackInRowAndColumn(k, l);
    
                    if (itemstack1 != null || itemstack != null)
                    {
                        if (itemstack1 == null && itemstack != null || itemstack1 != null && itemstack == null)
                        {
                            return false;
                        }
    
                        if (itemstack.getItem() != itemstack1.getItem())
                        {
                            return false;
                        }
    
                        if (itemstack.getItemDamage() != 32767 && itemstack.getItemDamage() != itemstack1.getItemDamage())
                        {
                            return false;
                        }
                    }
                }
            }
    
            return true;
        }
    
        /**
         * Returns an Item that is the result of this recipe
         */
        public ItemStack getCraftingResult(InventoryCrafting p_77572_1_)
        {
            ItemStack itemstack = this.getRecipeOutput().copy();
    
            if (this.field_92101_f)
            {
                for (int i = 0; i < p_77572_1_.getSizeInventory(); ++i)
                {
                    ItemStack itemstack1 = p_77572_1_.getStackInSlot(i);
    
                    if (itemstack1 != null && itemstack1.hasTagCompound())
                    {
                        itemstack.setTagCompound((NBTTagCompound)itemstack1.stackTagCompound.copy());
                    }
                }
            }
    
            return itemstack;
        }
    
        /**
         * Returns the size of the recipe area
         */
        public int getRecipeSize()
        {
            return this.recipeWidth * this.recipeHeight;
        }
    
    }
    
    

     

     

     

    The check in the Shaped Recipe

    if(!TileEntityProtoTable.entityInstance.hasToolInSlot()){
                        return false;
                    }
    

     

    Instance line in TileEntity

    public static TileEntityProtoTable entityInstance;
    

  7. so basically its throwing a null before it can check for null, since I'm calling .getItem() on the slot and nothing is there to even grab a comparison.

     

    Edit: I made a check to see if items[0] is null. Now I got to redo my check because I found out that you can't make items[] a static variable because something else messes with it if you do and wont let you split the stack properly. So I got to redo how my hasToolInSlot works...

  8. Oops thought I added the crash log

     

     

    ---- Minecraft Crash Report ----

    // I just don't know what went wrong :(

     

    Time: 5/31/15 8:54 AM

    Description: Ticking memory connection

     

    java.lang.NullPointerException: Ticking memory connection

    at com.bigbaddevil7.rustic.blocks.tileentities.TileEntityProtoTable.hasToolInSlot(TileEntityProtoTable.java:138)

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.checkMatch(ProtoTableShapedRecipe.java:74)

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.matches(ProtoTableShapedRecipe.java:46)

    at com.bigbaddevil7.rustic.crafting.ProtoTableCraftingManager.findMatchingRecipe(ProtoTableCraftingManager.java:196)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.onCraftMatrixChanged(ProtoTableContainer.java:64)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.<init>(ProtoTableContainer.java:55)

    at com.bigbaddevil7.rustic.handler.GuiHandler.getServerGuiElement(GuiHandler.java:25)

    at cpw.mods.fml.common.network.NetworkRegistry.getRemoteGuiContainer(NetworkRegistry.java:243)

    at cpw.mods.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:75)

    at com.bigbaddevil7.rustic.blocks.BlockProtoTable.onBlockActivated(BlockProtoTable.java:28)

    at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:409)

    at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)

    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)

    at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)

    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)

    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)

    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)

    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)

    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)

     

     

    A detailed walkthrough of the error, its code path and all known details is as follows:

    ---------------------------------------------------------------------------------------

     

    -- Head --

    Stacktrace:

    at com.bigbaddevil7.rustic.blocks.tileentities.TileEntityProtoTable.hasToolInSlot(TileEntityProtoTable.java:138)

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.checkMatch(ProtoTableShapedRecipe.java:74)

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.matches(ProtoTableShapedRecipe.java:46)

    at com.bigbaddevil7.rustic.crafting.ProtoTableCraftingManager.findMatchingRecipe(ProtoTableCraftingManager.java:196)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.onCraftMatrixChanged(ProtoTableContainer.java:64)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.<init>(ProtoTableContainer.java:55)

    at com.bigbaddevil7.rustic.handler.GuiHandler.getServerGuiElement(GuiHandler.java:25)

    at cpw.mods.fml.common.network.NetworkRegistry.getRemoteGuiContainer(NetworkRegistry.java:243)

    at cpw.mods.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:75)

    at com.bigbaddevil7.rustic.blocks.BlockProtoTable.onBlockActivated(BlockProtoTable.java:28)

    at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:409)

    at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)

    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)

     

    -- Ticking connection --

    Details:

    Connection: net.minecraft.network.NetworkManager@7f965f33

    Stacktrace:

    at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)

    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)

    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)

    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)

    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)

    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)

     

    -- System Details --

    Details:

    Minecraft Version: 1.7.10

    Operating System: Windows 8.1 (amd64) version 6.3

    Java Version: 1.7.0_71, Oracle Corporation

    Java VM Version: Java HotSpot 64-Bit Server VM (mixed mode), Oracle Corporation

    Memory: 694883944 bytes (662 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB)

    JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M

    AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used

    IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 95

    FML: MCP v9.05 FML v7.10.99.99 Minecraft Forge 10.13.3.1408 4 mods loaded, 4 mods active

    mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    FML{7.10.99.99} [Forge Mod Loader] (forgeSrc-1.7.10-10.13.3.1408-1.7.10.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    Forge{10.13.3.1408} [Minecraft Forge] (forgeSrc-1.7.10-10.13.3.1408-1.7.10.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    rustic{1.7.10-1.0} [Rustic] (Rustic 1.7.10) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.

    Profiler Position: N/A (disabled)

    Vec3 Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used

    Player Count: 1 / 8; [EntityPlayerMP['Player937'/405, l='New World', x=-96.45, y=79.00, z=287.42]]

    Type: Integrated Server (map_client.txt)

    Is Modded: Definitely; Client brand changed to 'fml,forge'

     

     

     

    The call for the method is in the checkMatch() within the Shaped Recipe class line 74 in my IDE.

  9. So I was debating if I should alter the recipe manager, but then thought that it wasn't necessary since they only just need to be there and not in any specific order or anything.

    The whole Idea is that when I do a crafting event, I want to check to see if there are the right tools that would be an instance of ModTool. The ModTool class hasn't been made yet otherwise I would post it with my other code. Once the crafting was finished it would take damage. This is for a 5x5 crafting table that has 4 TileEntity slots. The crafting works and the TileEntity portion saves the items like it suppose to, but when I go to check to see if the item in the slot is valid, it throws a null pointer. I check for a null as well. So must be something I'm missing

     

     

    TileEntity

     

     

    package com.bigbaddevil7.rustic.blocks.tileentities;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.init.Items;
    import net.minecraft.inventory.IInventory;
    import net.minecraft.item.ItemStack;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.nbt.NBTTagList;
    import net.minecraft.tileentity.TileEntity;
    
    /**
    * Created by bigbaddevil7 on 5/28/2015.
    */
    public class TileEntityProtoTable extends TileEntity implements IInventory {
    
        public static ItemStack[] items;
    
        public TileEntityProtoTable(){
            items = new ItemStack[4];
        }
    
        @Override
        public int getSizeInventory() {
            return 4;
        }
    
        @Override
        public ItemStack getStackInSlot(int slot) {
            return items[slot];
        }
    
        @Override
        public ItemStack decrStackSize(int i, int j) {
            ItemStack itemStack = getStackInSlot(i);
    
            if(itemStack != null){
                if(itemStack.stackSize <= j){
                    setInventorySlotContents(i,null);
                }else{
                    itemStack = itemStack.splitStack(j);
                    this.markDirty();
                }
            }
    
            return itemStack;
        }
    
        @Override
        public ItemStack getStackInSlotOnClosing(int i) {
            ItemStack item = getStackInSlot(i);
            setInventorySlotContents(i, null);
            return item;
        }
    
        @Override
        public void setInventorySlotContents(int i, ItemStack itemStack) {
            items[i] = itemStack;
    
            if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()){
                itemStack.stackSize = getInventoryStackLimit();
            }
    
            this.markDirty();
        }
    
        @Override
        public String getInventoryName() {
            return null;
        }
    
        @Override
        public boolean hasCustomInventoryName() {
            return false;
        }
    
        @Override
        public int getInventoryStackLimit() {
            return 1;
        }
    
        @Override
        public boolean isUseableByPlayer(EntityPlayer player) {
            return player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) <= 64;
        }
    
        @Override
        public void openInventory() {
    
        }
    
        @Override
        public void closeInventory() {
    
        }
    
        @Override
        public boolean isItemValidForSlot(int i, ItemStack stack) {
            return true;
        }
    
        @Override
        public void writeToNBT(NBTTagCompound compound){
            super.writeToNBT(compound);
    
            NBTTagList items = new NBTTagList();
    
            for(int i = 0; i < getSizeInventory(); i++){
                ItemStack stack = getStackInSlot(i);
    
                if(stack != null){
                    NBTTagCompound item = new NBTTagCompound();
                    item.setByte("Slot", (byte)i);
                    stack.writeToNBT(item);
                    items.appendTag(item);
                }
            }
    
            compound.setTag("Items", items);
        }
    
        @Override
        public void readFromNBT(NBTTagCompound compound){
            super.readFromNBT(compound);
    
            NBTTagList items = compound.getTagList("Items", 10);
    
            for(int i = 0; i < items.tagCount(); i++){
                NBTTagCompound item = (NBTTagCompound)items.getCompoundTagAt(i);
                int slot = item.getByte("Slot");
    
                if(slot >= 0 && slot < getSizeInventory()) {
                    setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(item));
                }
            }
        }
    
        public static boolean hasToolInSlot(){
            if(items[0].getItem() != null && items[0].getItem().equals(Items.diamond)){
                return true;
            }else {
                return false;
            }
        }
    }
    
    

     

     

     

    Container

     

     

     

    
    package com.bigbaddevil7.rustic.blocks.container;
    
    import com.bigbaddevil7.rustic.blocks.tileentities.SlotTool;
    import com.bigbaddevil7.rustic.blocks.tileentities.TileEntityProtoTable;
    import com.bigbaddevil7.rustic.crafting.ProtoTableCraftingManager;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.InventoryPlayer;
    import net.minecraft.init.Items;
    import net.minecraft.inventory.*;
    import net.minecraft.item.ItemStack;
    import net.minecraft.world.World;
    
    /**
    * Created by bigbaddevil7 on 5/28/2015.
    */
    public class ProtoTableContainer extends Container {
    
        public InventoryCrafting craftMatrix;
        public IInventory craftResult;
        private World worldObj;
    
        public static TileEntityProtoTable table;
    
        public ProtoTableContainer(InventoryPlayer inventoryPlayer, World word,TileEntityProtoTable table){
            this.worldObj = word;
            this.table = table;
            craftMatrix = new InventoryCrafting(this, 5,5);
            craftResult = new InventoryCraftResult();
    
            this.addSlotToContainer(new SlotCrafting(inventoryPlayer.player, craftMatrix, craftResult, 0 , 141, 11));
    
            for(int i = 0; i < 2; i++){
                for(int k = 0; k < 2; k++){
                    this.addSlotToContainer(new SlotTool(table, k + i * 2, 115  + k * 18 * 2, 43 + i * 18 * 2));
                }
            }
    
    
            for(int i = 0; i < 5; i++){
                for(int k = 0; k < 5; k++){
                    this.addSlotToContainer(new Slot(craftMatrix, k + i * 5, 8 + k * 18, 7 + i * 18));
                }
            }
    
            for(int i = 0; i < 3; i++){
                for(int k  = 0; k < 9; k++){
                    this.addSlotToContainer(new Slot(inventoryPlayer, k + i * 9 + 9, 8 + k * 18, 106 + i * 18));
                }
            }
    
            for(int i = 0; i < 9; i++){
                this.addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 164));
            }
    
            onCraftMatrixChanged(craftMatrix);
        }
    
        @Override
        public boolean canInteractWith(EntityPlayer player) {
            return table.isUseableByPlayer(player);
        }
    
        public void onCraftMatrixChanged(IInventory inventory){
            craftResult.setInventorySlotContents(0 , ProtoTableCraftingManager.getInstance().findMatchingRecipe(craftMatrix, worldObj));
        }
    
        @Override
        public ItemStack transferStackInSlot(EntityPlayer player, int i){
            return null;
        }
    
        @Override
        public void onContainerClosed(EntityPlayer player){
            super.onContainerClosed(player);
    
            if (!this.worldObj.isRemote){
                for (int i = 0; i < 25; ++i)
                {
                    ItemStack itemstack = this.craftMatrix.getStackInSlotOnClosing(i);
    
                    if (itemstack != null)
                    {
                        player.dropPlayerItemWithRandomChoice(itemstack, false);
                    }
                }
            }
        }
    }
    

     

     

     

     

    Crafting Manager

     

     

    package com.bigbaddevil7.rustic.crafting;
    
    import com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer;
    import com.bigbaddevil7.rustic.blocks.tileentities.TileEntityProtoTable;
    import net.minecraft.block.Block;
    import net.minecraft.init.Items;
    import net.minecraft.inventory.InventoryCrafting;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.crafting.*;
    import net.minecraft.world.World;
    
    import java.util.*;
    
    /**
    * Created by bigbaddevil7 on 11/15/2014.
    */
    public class ProtoTableCraftingManager {
    
        /** The static instance of this class */
        private static final ProtoTableCraftingManager instance = new ProtoTableCraftingManager();
        /** A list of all the recipes added */
        private List recipes = new ArrayList();
    
        /**
         * Returns the static instance of this class
         */
        public static final ProtoTableCraftingManager getInstance()
        {
            /** The static instance of this class */
            return instance;
        }
    
        private ProtoTableCraftingManager()
        {
                this.addRecipe(new ItemStack(Items.diamond), new Object[]{"XXXXX", "XXXXX", "XXXXX", "XXXXX", "XXXXX", 'X', Items.stick});
                //this.addTableShapelessRecipe(new ItemStack(ModItems.itemWand), Items.stick, Items.stick, Items.diamond);
                Collections.sort(this.recipes, new ProtoTableRecipeSorter(this));
        }
    
        public ProtoTableShapedRecipe addRecipe(ItemStack stack, Object ... varargs)
        {
            String s = "";
            int i = 0;
            int j = 0;
            int k = 0;
    
            if (varargs[i] instanceof String[])
            {
                String[] astring = (String[])((String[])varargs[i++]);
    
                for (int l = 0; l < astring.length; ++l)
                {
                    String s1 = astring[l];
                    ++k;
                    j = s1.length();
                    s = s + s1;
                }
            }
            else
            {
                while (varargs[i] instanceof String)//checks to see if it is a string
                {
                    String s2 = (String)varargs[i++];//gets the string at index i then adds 1
                    ++k;//k = 1
                    j = s2.length();//j = 5
                    s = s + s2;// s = s + 5
                }
            }
    
            HashMap hashmap;
    
            for (hashmap = new HashMap(); i < varargs.length; i += 2)
            {
                Character character = (Character)varargs[i];
                ItemStack itemstack1 = null;
    
                if (varargs[i + 1] instanceof Item)
                {
                    itemstack1 = new ItemStack((Item)varargs[i + 1]);
                }
                else if (varargs[i + 1] instanceof Block)
                {
                    itemstack1 = new ItemStack((Block)varargs[i + 1], 1, 32767);
                }
                else if (varargs[i + 1] instanceof ItemStack)
                {
                    itemstack1 = (ItemStack)varargs[i + 1];
                }
    
                hashmap.put(character, itemstack1);
            }
    
            ItemStack[] aitemstack = new ItemStack[j * k];
    
            for (int i1 = 0; i1 < j * k; ++i1)
            {
                char c0 = s.charAt(i1);
    
                if (hashmap.containsKey(Character.valueOf(c0)))
                {
                    aitemstack[i1] = ((ItemStack)hashmap.get(Character.valueOf(c0))).copy();
                }
                else
                {
                    aitemstack[i1] = null;
                }
            }
    
            ProtoTableShapedRecipe shapedrecipes = new ProtoTableShapedRecipe(j, k, aitemstack, stack);
            this.recipes.add(shapedrecipes);
            return shapedrecipes;
        }
    
        public void addTableShapelessRecipe(ItemStack p_77596_1_, Object ... p_77596_2_)
        {
            ArrayList arraylist = new ArrayList();
            Object[] aobject = p_77596_2_;
            int i = p_77596_2_.length;
    
            for (int j = 0; j < i; ++j)
            {
                Object object1 = aobject[j];
    
                if (object1 instanceof ItemStack)
                {
                    arraylist.add(((ItemStack)object1).copy());
                }
                else if (object1 instanceof Item)
                {
                    arraylist.add(new ItemStack((Item)object1));
                }
                else
                {
                    if (!(object1 instanceof Block))
                    {
                        throw new RuntimeException("Invalid shapeless recipy!");
                    }
    
                    arraylist.add(new ItemStack((Block)object1));
                }
            }
    
            this.recipes.add(new ProtoTableShapelessRecipe(p_77596_1_, arraylist));
        }
    
        public ItemStack findMatchingRecipe(InventoryCrafting inv, World world)
        {
            int i = 0;
            ItemStack itemstack = null;
            ItemStack itemstack1 = null;
            int j;
    
            for (j = 0; j < inv.getSizeInventory(); ++j)
            {
    
                ItemStack itemstack2 = inv.getStackInSlot(j);
    
                if (itemstack2 != null)
                {
                    if (i == 0)
                    {
                        itemstack = itemstack2;
                    }
    
                    if (i == 1)
                    {
                        itemstack1 = itemstack2;
                    }
    
                    ++i;
                }
            }
    
            if (i == 2 && itemstack.getItem() == itemstack1.getItem() && itemstack.stackSize == 1 && itemstack1.stackSize == 1 && itemstack.getItem().isRepairable())
            {
                Item item = itemstack.getItem();
                int j1 = item.getMaxDamage() - itemstack.getItemDamageForDisplay();
                int k = item.getMaxDamage() - itemstack1.getItemDamageForDisplay();
                int l = j1 + k + item.getMaxDamage() * 5 / 100;
                int i1 = item.getMaxDamage() - l;
    
                if (i1 < 0)
                {
                    i1 = 0;
                }
    
                return new ItemStack(itemstack.getItem(), 1, i1);
            }
            else
            {
                for (j = 0; j < this.recipes.size(); ++j)
                {
                    IRecipe irecipe = (IRecipe)this.recipes.get(j);
    
                    if (irecipe.matches(inv, world))
                    {
                        return irecipe.getCraftingResult(inv);
                    }
                }
    
                return null;
            }
        }
    
        /**
         * returns the List<> of all recipes
         */
        public List getRecipeList()
        {
            return this.recipes;
        }
    }
    

     

     

     

    Shaped Recipe that has the check in it for the hasToolInSlot

     

     

    
    package com.bigbaddevil7.rustic.crafting;
    
    import com.bigbaddevil7.rustic.blocks.tileentities.TileEntityProtoTable;
    import net.minecraft.inventory.InventoryCrafting;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.crafting.IRecipe;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.world.World;
    
    /**
    * Created by bigbaddevil7 on 11/15/2014.
    */
    public class ProtoTableShapedRecipe implements IRecipe {
        /** How many horizontal slots this recipe is wide. */
        public final int recipeWidth;
        /** How many vertical slots this recipe uses. */
        public final int recipeHeight;
        /** Is a array of ItemStack that composes the recipe. */
        public final ItemStack[] recipeItems;
        /** Is the ItemStack that you get when craft the recipe. */
        private ItemStack recipeOutput;
        private boolean field_92101_f;
    
        public ProtoTableShapedRecipe(int p_i1917_1_, int p_i1917_2_, ItemStack[] p_i1917_3_, ItemStack p_i1917_4_)
        {
            this.recipeWidth = p_i1917_1_;
            this.recipeHeight = p_i1917_2_;
            this.recipeItems = p_i1917_3_;
            this.recipeOutput = p_i1917_4_;
        }
    
        public ItemStack getRecipeOutput()
        {
            return this.recipeOutput;
        }
    
        /**
         * Used to check if a recipe matches current crafting inventory
         */
        public boolean matches(InventoryCrafting p_77569_1_, World p_77569_2_)
        {
            for (int i = 0; i <= 5 - this.recipeWidth; ++i)
            {
                for (int j = 0; j <= 5 - this.recipeHeight; ++j)
                {
                    if (this.checkMatch(p_77569_1_, i, j, true))
                    {
                        return true;
                    }
    
                    if (this.checkMatch(p_77569_1_, i, j, false))
                    {
                        return true;
                    }
                }
            }
    
            return false;
        }
    
        /**
         * Checks if the region of a crafting inventory is match for the recipe.
         */
        private boolean checkMatch(InventoryCrafting p_77573_1_, int p_77573_2_, int p_77573_3_, boolean p_77573_4_)
        {
            for (int k = 0; k < 5; ++k)
            {
                for (int l = 0; l < 5; ++l)
                {
                    int i1 = k - p_77573_2_;
                    int j1 = l - p_77573_3_;
                    ItemStack itemstack = null;
    
                    if(!TileEntityProtoTable.hasToolInSlot()){
                        return false;
                    }
    
                    if (i1 >= 0 && j1 >= 0 && i1 < this.recipeWidth && j1 < this.recipeHeight)
                    {
                        if (p_77573_4_)
                        {
                            itemstack = this.recipeItems[this.recipeWidth - i1 - 1 + j1 * this.recipeWidth];
                        }
                        else
                        {
                            itemstack = this.recipeItems[i1 + j1 * this.recipeWidth];
                        }
                    }
    
                    ItemStack itemstack1 = p_77573_1_.getStackInRowAndColumn(k, l);
    
                    if (itemstack1 != null || itemstack != null)
                    {
                        if (itemstack1 == null && itemstack != null || itemstack1 != null && itemstack == null)
                        {
                            return false;
                        }
    
                        if (itemstack.getItem() != itemstack1.getItem())
                        {
                            return false;
                        }
    
                        if (itemstack.getItemDamage() != 32767 && itemstack.getItemDamage() != itemstack1.getItemDamage())
                        {
                            return false;
                        }
                    }
                }
            }
    
            return true;
        }
    
        /**
         * Returns an Item that is the result of this recipe
         */
        public ItemStack getCraftingResult(InventoryCrafting p_77572_1_)
        {
            ItemStack itemstack = this.getRecipeOutput().copy();
    
            if (this.field_92101_f)
            {
                for (int i = 0; i < p_77572_1_.getSizeInventory(); ++i)
                {
                    ItemStack itemstack1 = p_77572_1_.getStackInSlot(i);
    
                    if (itemstack1 != null && itemstack1.hasTagCompound())
                    {
                        itemstack.setTagCompound((NBTTagCompound)itemstack1.stackTagCompound.copy());
                    }
                }
            }
    
            return itemstack;
        }
    
        /**
         * Returns the size of the recipe area
         */
        public int getRecipeSize()
        {
            return this.recipeWidth * this.recipeHeight;
        }
    
    }
    
    
    

     

     

     

     

    Crash Log

     

     

    ---- Minecraft Crash Report ----

    // I just don't know what went wrong :(

     

    Time: 5/31/15 8:54 AM

    Description: Ticking memory connection

     

    java.lang.NullPointerException: Ticking memory connection

    at com.bigbaddevil7.rustic.blocks.tileentities.TileEntityProtoTable.hasToolInSlot(TileEntityProtoTable.java:138)

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.checkMatch(ProtoTableShapedRecipe.java:74)

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.matches(ProtoTableShapedRecipe.java:46)

    at com.bigbaddevil7.rustic.crafting.ProtoTableCraftingManager.findMatchingRecipe(ProtoTableCraftingManager.java:196)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.onCraftMatrixChanged(ProtoTableContainer.java:64)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.<init>(ProtoTableContainer.java:55)

    at com.bigbaddevil7.rustic.handler.GuiHandler.getServerGuiElement(GuiHandler.java:25)

    at cpw.mods.fml.common.network.NetworkRegistry.getRemoteGuiContainer(NetworkRegistry.java:243)

    at cpw.mods.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:75)

    at com.bigbaddevil7.rustic.blocks.BlockProtoTable.onBlockActivated(BlockProtoTable.java:28)

    at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:409)

    at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)

    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)

    at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)

    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)

    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)

    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)

    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)

    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)

     

     

    A detailed walkthrough of the error, its code path and all known details is as follows:

    ---------------------------------------------------------------------------------------

     

    -- Head --

    Stacktrace:

    at com.bigbaddevil7.rustic.blocks.tileentities.TileEntityProtoTable.hasToolInSlot(TileEntityProtoTable.java:138)

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.checkMatch(ProtoTableShapedRecipe.java:74)

    at com.bigbaddevil7.rustic.crafting.ProtoTableShapedRecipe.matches(ProtoTableShapedRecipe.java:46)

    at com.bigbaddevil7.rustic.crafting.ProtoTableCraftingManager.findMatchingRecipe(ProtoTableCraftingManager.java:196)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.onCraftMatrixChanged(ProtoTableContainer.java:64)

    at com.bigbaddevil7.rustic.blocks.container.ProtoTableContainer.<init>(ProtoTableContainer.java:55)

    at com.bigbaddevil7.rustic.handler.GuiHandler.getServerGuiElement(GuiHandler.java:25)

    at cpw.mods.fml.common.network.NetworkRegistry.getRemoteGuiContainer(NetworkRegistry.java:243)

    at cpw.mods.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:75)

    at com.bigbaddevil7.rustic.blocks.BlockProtoTable.onBlockActivated(BlockProtoTable.java:28)

    at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:409)

    at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)

    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)

    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)

     

    -- Ticking connection --

    Details:

    Connection: net.minecraft.network.NetworkManager@7f965f33

    Stacktrace:

    at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)

    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)

    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)

    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)

    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)

    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)

     

    -- System Details --

    Details:

    Minecraft Version: 1.7.10

    Operating System: Windows 8.1 (amd64) version 6.3

    Java Version: 1.7.0_71, Oracle Corporation

    Java VM Version: Java HotSpot 64-Bit Server VM (mixed mode), Oracle Corporation

    Memory: 694883944 bytes (662 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB)

    JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M

    AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used

    IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 95

    FML: MCP v9.05 FML v7.10.99.99 Minecraft Forge 10.13.3.1408 4 mods loaded, 4 mods active

    mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    FML{7.10.99.99} [Forge Mod Loader] (forgeSrc-1.7.10-10.13.3.1408-1.7.10.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    Forge{10.13.3.1408} [Minecraft Forge] (forgeSrc-1.7.10-10.13.3.1408-1.7.10.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    rustic{1.7.10-1.0} [Rustic] (Rustic 1.7.10) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

    GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.

    Profiler Position: N/A (disabled)

    Vec3 Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used

    Player Count: 1 / 8; [EntityPlayerMP['Player937'/405, l='New World', x=-96.45, y=79.00, z=287.42]]

    Type: Integrated Server (map_client.txt)

    Is Modded: Definitely; Client brand changed to 'fml,forge'

     

     

  10. ??? I provided code in my last thread

    http://www.minecraftforge.net/forum/index.php/topic,25281.msg128794.html#msg128794

     

    before that code I had none to show. Just asking concept designs.

     

    Although I do admit I failed providing the code this time around.

     

    Here is the Container

     

     

    package com.bigbaddevil7.rustic.client.interfaces;
    
    
    import com.bigbaddevil7.rustic.init.ModBlocks;
    import com.bigbaddevil7.rustic.tileentity.TileEntityTable;
    import com.bigbaddevil7.rustic.utility.LogHelper;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.InventoryPlayer;
    import net.minecraft.inventory.Container;
    import net.minecraft.inventory.IInventory;
    import net.minecraft.inventory.InventoryCraftResult;
    import net.minecraft.inventory.InventoryCrafting;
    import net.minecraft.inventory.Slot;
    import net.minecraft.inventory.SlotCrafting;
    import net.minecraft.item.ItemStack;
    import net.minecraft.world.World;
    
    public class ContainerTable extends Container {
    
        public InventoryCrafting craftMatrix;
        //public static InventoryCrafting toolSlot;
        public IInventory craftResult;
        private static TileEntityTable toolSlot;
        private World worldObj;
        private int posX, posY, posZ;
    
        public ContainerTable(InventoryPlayer invPlayer, World world, int x, int y, int z){
            craftMatrix = new InventoryCrafting(this,5 ,5);
            toolSlot = new TileEntityTable(this, 2, 2);
            craftResult = new InventoryCraftResult();
            worldObj = world;
            posX = x;
            posY = y;
            posZ = z;
    
            this.addSlotToContainer(new SlotCrafting(invPlayer.player, craftMatrix, craftResult, 0, 141, 11));
    
    
            for(int i = 0; i < 4; i++){
                for(int k = 0; k < 4; k++){
                    this.addSlotToContainer(new SlotTool(toolSlot, k + i * 4, 115  + k * 18, 43 + i * 18));
                }
            }
    
    
    
            for(int i = 0; i < 5; i++){
                for(int k = 0; k < 5; k++){
                    this.addSlotToContainer(new Slot(craftMatrix, k + i * 5, 8 + k * 18, 7 + i * 18));
                }
            }
    
            for(int i = 0; i < 3; i++){
                for(int k  = 0; k < 9; k++){
                    this.addSlotToContainer(new Slot(invPlayer, k + i * 9 + 9, 8 + k * 18, 106 + i * 18));
                }
            }
    
            for(int i = 0; i < 9; i++){
                this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 164));
            }
    
            onCraftMatrixChanged(craftMatrix);
        }
    
        public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
        {
            ItemStack itemstack = null;
            Slot slot = (Slot)this.inventorySlots.get(par2);
    
            if (slot != null && slot.getHasStack())
            {
                ItemStack itemstack1 = slot.getStack();
                itemstack = itemstack1.copy();
    
                if (par2 == 0)
                {
                    if (!this.mergeItemStack(itemstack1, 10, 46, true))
                    {
                        return null;
                    }
    
                    slot.onSlotChange(itemstack1, itemstack);
                }
                else if (par2 >= 10 && par2 < 37)
                {
                    if (!this.mergeItemStack(itemstack1, 37, 46, false))
                    {
                        return null;
                    }
                }
                else if (par2 >= 37 && par2 < 46)
                {
                    if (!this.mergeItemStack(itemstack1, 10, 37, false))
                    {
                        return null;
                    }
                }
                else if (!this.mergeItemStack(itemstack1, 10, 46, false))
                {
                    return null;
                }
    
                if (itemstack1.stackSize == 0)
                {
                    slot.putStack((ItemStack)null);
                }
                else
                {
                    slot.onSlotChanged();
                }
    
                if (itemstack1.stackSize == itemstack.stackSize)
                {
                    return null;
                }
    
                slot.onPickupFromSlot(par1EntityPlayer, itemstack1);
            }
    
            return itemstack;
        }
    
        public void onContainerClosed(EntityPlayer par1EntityPlayer)
        {
            //super.onContainerClosed(par1EntityPlayer);
    
            if (!this.worldObj.isRemote)
            {
                for (int i = 0; i < 25; ++i)
                {
                    ItemStack itemstack = this.craftMatrix.getStackInSlotOnClosing(i);
    
                    if (itemstack != null)
                    {
                        par1EntityPlayer.dropPlayerItemWithRandomChoice(itemstack, false);
                    }
                }
                /*for(int i = 0; i < 4; i++) {
                    ItemStack itemStack2 = this.toolSlot.getStackInSlotOnClosing(i);
                    if (itemStack2 != null) {
                        par1EntityPlayer.dropPlayerItemWithRandomChoice(itemStack2, false);
                    }
                }*/
            }
        }
    
        public void onCraftMatrixChanged(IInventory inventory){
            craftResult.setInventorySlotContents(0, CraftingManagerTable.getInstance().findMatchingRecipe(craftMatrix, worldObj));
        }
    
    
        @Override
        public boolean canInteractWith(EntityPlayer player) {
            if(worldObj.getBlock(posX, posY, posZ) != ModBlocks.blockTable){
                return false;
            }else{
                return player.getDistanceSq((double)posX + 0.5D, (double)posY + 0.5D, (double)posZ + 0.5D) <= 64.0D;
            }
        }
    
        public static boolean toolInSlot(){
            boolean hasItem = true;
            for(int i = 0; i < 4; i++) {
                ItemStack slot = toolSlot.getStackInSlot(i);
                if (slot == null) {
                    hasItem = false;
                }
            }
            return hasItem;
        }
    }
    

     

     

     

    Here is the TileEntity that acts for the slots

     

     

    package com.bigbaddevil7.rustic.tileentity;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.inventory.Container;
    import net.minecraft.inventory.IInventory;
    import net.minecraft.inventory.ISidedInventory;
    import net.minecraft.item.ItemStack;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.nbt.NBTTagList;
    import net.minecraft.tileentity.TileEntity;
    
    /**
    * Created by bigbaddevil7 on 11/15/2014.
    */
    public class TileEntityTable extends TileEntity implements IInventory {
    
        private ItemStack[] stackList;
        private int inventoryWidth;
        private static Container eventHandler;
    
        public TileEntityTable(){};
    
        public TileEntityTable(Container container, int x, int y){
            int k = x * y;
            this.stackList = new ItemStack[k];
            this.eventHandler = container;
            this.inventoryWidth = x;
        }
    
        @Override
        public int getSizeInventory() {
            return this.stackList.length;
        }
    
        @Override
        public ItemStack getStackInSlot(int slot) {
            return slot >= this.getSizeInventory() ? null : this.stackList[slot];
        }
    
    
        /**
         * Returns the itemstack in the slot specified (Top left is 0, 0). Args: row, column
         */
        public ItemStack getStackInRowAndColumn(int par1, int par2)
        {
            if (par1 >= 0 && par1 < this.inventoryWidth)
            {
                int k = par1 + par2 * this.inventoryWidth;
                return this.getStackInSlot(k);
            }
            else
            {
                return null;
            }
        }
    
    
        @Override
        public ItemStack decrStackSize(int par1, int par2)
        {
            if (this.stackList[par1] != null)
            {
                ItemStack itemstack;
    
                if (this.stackList[par1].stackSize <= par2)
                {
                    itemstack = this.stackList[par1];
                    this.stackList[par1] = null;
                    this.eventHandler.onCraftMatrixChanged(this);
                    return itemstack;
                }
                else
                {
                    itemstack = this.stackList[par1].splitStack(par2);
    
                    if (this.stackList[par1].stackSize == 0)
                    {
                        this.stackList[par1] = null;
                    }
    
                    this.eventHandler.onCraftMatrixChanged(this);
                    return itemstack;
                }
            }
            else
            {
                return null;
            }
        }
    
        @Override
        public ItemStack getStackInSlotOnClosing(int par1) {
            if (this.stackList[par1] != null)
            {
                ItemStack itemstack = this.stackList[par1];
                this.stackList[par1] = null;
                return itemstack;
            }
            else
            {
                return null;
            }
        }
    
        @Override
        public void writeToNBT(NBTTagCompound compound) {
            super.writeToNBT(compound);
    
            NBTTagList items = new NBTTagList();
    
            for(int i = 0; i < getSizeInventory(); i++){
                ItemStack stack = getStackInSlot(i);
    
                if(stack != null){
                    NBTTagCompound item = new NBTTagCompound();
                    item.setByte("Slot", (byte)i);
                    stack.writeToNBT(item);
                    items.appendTag(item);
                }
            }
    
            compound.setTag("Items", items);
        }
    
    
        @Override
        public void readFromNBT(NBTTagCompound compound) {
            super.readFromNBT(compound);
    
            NBTTagList items = compound.getTagList("Items", 10);
    
            for(int i = 0; i < items.tagCount(); i++){
                NBTTagCompound item = (NBTTagCompound)items.getCompoundTagAt(i);
                int slot = item.getByte("Slot");
    
                if(slot >= 0 && slot <getSizeInventory()){
                    setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(item));
                }
            }
        }
    
        @Override
        public void setInventorySlotContents(int par1, ItemStack itemStack) {
            this.stackList[par1] = itemStack;
            this.eventHandler.onCraftMatrixChanged(this);
    
        }
    
        @Override
        public String getInventoryName() {
            return "container.prototyping table";
        }
    
        @Override
        public boolean hasCustomInventoryName() {
            return false;
        }
    
        @Override
        public int getInventoryStackLimit() {
            return 64;
        }
    
        @Override
        public boolean isUseableByPlayer(EntityPlayer var1) {
            return true;
        }
    
        @Override
        public void openInventory() {}
    
        @Override
        public void closeInventory() {}
    
        @Override
        public boolean isItemValidForSlot(int var1, ItemStack var2) {
            return false;
        }
    }
    [/spoiler]
    

     

  11. Yea, I got the slots and I made my own version of Slot called SlotTool(mainly to make sure that only instances of my tool can go into it). I did have it where all items took damage but didn't like the concept. I would like to have it where you add the tools to the recipe as such:

    this.addRecipe(new ItemStack(ModItems.goggles), new Object[]{"     ", " G G ", "GPLPG", " G G ", "     ", "SW", PH", 'G', Items.gold_ingot, 'P', Blocks.glass_pane 'L', Items.leather, 'S', ModItems.screwdriver, 'W', ModItems.saw, 'P', ModItems.pliers, 'H', ModItems.hammer});
    

     

    The "SW" and "PH" refer to the bottom right 4 slots. That way I can easily determine what tools are needed for what recipe. The issue is I'm not sure how to point the findMatchingRecipe() to search those 4 slots for the tools.

     

    This is currently how the slots are defined. At the moment ignore that they are not in a for loop. Mainly making sure this all works before optimizing it. Would it be better to add them to the craft matrix slots or keep them separate like how they are.

     

     

     

    package com.bigbaddevil7.rustic.client.interfaces;
    
    import com.bigbaddevil7.rustic.Rustic;
    
    import com.bigbaddevil7.rustic.init.ModBlocks;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.InventoryPlayer;
    import net.minecraft.inventory.Container;
    import net.minecraft.inventory.IInventory;
    import net.minecraft.inventory.InventoryCraftResult;
    import net.minecraft.inventory.InventoryCrafting;
    import net.minecraft.inventory.Slot;
    import net.minecraft.inventory.SlotCrafting;
    import net.minecraft.item.ItemStack;
    import net.minecraft.world.World;
    
    public class ContainerTable extends Container {
    
        public InventoryCrafting craftMatrix;
        public static InventoryCrafting toolSlot;
        public IInventory craftResult;
        private World worldObj;
        private int posX, posY, posZ;
    
        public ContainerTable(InventoryPlayer invPlayer, World world, int x, int y, int z){
            craftMatrix = new InventoryCrafting(this,5 ,5);
            toolSlot = new InventoryCrafting(this, 2, 2);
            craftResult = new InventoryCraftResult();
            worldObj = world;
            posX = x;
            posY = y;
            posZ = z;
    
            this.addSlotToContainer(new SlotCrafting(invPlayer.player, craftMatrix, craftResult, 0, 141, 11));
    
    
            this.addSlotToContainer(new SlotTool(toolSlot, 0, 115, 43));
            this.addSlotToContainer(new SlotTool(toolSlot, 1, 115, 79));
            this.addSlotToContainer(new SlotTool(toolSlot, 2, 151, 43));
            this.addSlotToContainer(new SlotTool(toolSlot, 3, 151, 79));
    
    
            for(int i = 0; i < 5; i++){
                for(int k = 0; k < 5; k++){
                    this.addSlotToContainer(new Slot(craftMatrix, k + i * 5, 8 + k * 18, 7 + i * 18));
                }
            }
    
            for(int i = 0; i < 3; i++){
                for(int k  = 0; k < 9; k++){
                    this.addSlotToContainer(new Slot(invPlayer, k + i * 9 + 9, 8 + k * 18, 106 + i * 18));
                }
            }
    
            for(int i = 0; i < 9; i++){
                this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 164));
            }
    
            onCraftMatrixChanged(craftMatrix);
        }
    
        public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
        {
            ItemStack itemstack = null;
            Slot slot = (Slot)this.inventorySlots.get(par2);
    
            if (slot != null && slot.getHasStack())
            {
                ItemStack itemstack1 = slot.getStack();
                itemstack = itemstack1.copy();
    
                if (par2 == 0)
                {
                    if (!this.mergeItemStack(itemstack1, 10, 46, true))
                    {
                        return null;
                    }
    
                    slot.onSlotChange(itemstack1, itemstack);
                }
                else if (par2 >= 10 && par2 < 37)
                {
                    if (!this.mergeItemStack(itemstack1, 37, 46, false))
                    {
                        return null;
                    }
                }
                else if (par2 >= 37 && par2 < 46)
                {
                    if (!this.mergeItemStack(itemstack1, 10, 37, false))
                    {
                        return null;
                    }
                }
                else if (!this.mergeItemStack(itemstack1, 10, 46, false))
                {
                    return null;
                }
    
                if (itemstack1.stackSize == 0)
                {
                    slot.putStack((ItemStack)null);
                }
                else
                {
                    slot.onSlotChanged();
                }
    
                if (itemstack1.stackSize == itemstack.stackSize)
                {
                    return null;
                }
    
                slot.onPickupFromSlot(par1EntityPlayer, itemstack1);
            }
    
            return itemstack;
        }
    
        public void onContainerClosed(EntityPlayer par1EntityPlayer)
        {
            super.onContainerClosed(par1EntityPlayer);
    
            if (!this.worldObj.isRemote)
            {
                for (int i = 0; i < 25; ++i)
                {
                    ItemStack itemstack = this.craftMatrix.getStackInSlotOnClosing(i);
    
                    if (itemstack != null)
                    {
                        par1EntityPlayer.dropPlayerItemWithRandomChoice(itemstack, false);
                    }
                }
                ItemStack itemStack2 = this.toolSlot.getStackInSlot(0);
                    if(itemStack2 != null){
                        par1EntityPlayer.dropPlayerItemWithRandomChoice(itemStack2, false);
                    }
            }
        }
    
        public void onCraftMatrixChanged(IInventory inventory){
            craftResult.setInventorySlotContents(0, CraftingManagerTable.getInstance().findMatchingRecipe(craftMatrix, worldObj));
        }
    
    
        @Override
        public boolean canInteractWith(EntityPlayer player) {
            if(worldObj.getBlock(posX, posY, posZ) != ModBlocks.blockTable){
                return false;
            }else{
                return player.getDistanceSq((double)posX + 0.5D, (double)posY + 0.5D, (double)posZ + 0.5D) <= 64.0D;
            }
        }
    
        public static boolean toolInSlot(){
                ItemStack itemStack = toolSlot.getStackInSlot(0);
                if(itemStack != null){
                    return true;
                }else{
                    return false;
                }
        }
    }
    

     

     

  12. I have been working on a Prototyping table(A 5x5 crafting bench with 4 tool slots). I have an issue, plus trying to figure out if I want to continue it this way.

     

    1. How do I get it so that the 4 separate slots act as TileEntity slots so that the 4 tools can go in there and stay there but are needed to do a recipe that will have them take damage. Kinda like how the Thaumcraft Crafting table does with its wand.

     

    2. Since it seems like it may be a hassle to split between a Container and TileEntity like asked above, What would be the appropriate way to make the whole table a 5x5 crafting TileEntity where it just keeps all items in there.

     

    Like I said above, I'm deciding to keep it like I have it in question 1, or to learn how to change it to act differently entirely.

     

    Here is an idea of what the Table looks like to get a better idea:

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.