JimiIT92 Posted December 11, 2015 Share Posted December 11, 2015 For example, i have a crafting recipe like this how can i return in result of the crafting a chest but with already the item in the central slot inside, so when the chest is placed down it has this item inside? Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 11, 2015 Author Share Posted December 11, 2015 mmm, so i've looked how the craftings for banners works, and so i do this package mw.craftings; import mw.core.MWBlocks; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntityBanner; import net.minecraft.world.World; public class CraftingGifts { public void func_179534_a(CraftingManager manager) { manager.addRecipe(new ItemStack(MWBlocks.gift, 1), new Object[] {"###", "# #", "###", '#', new ItemStack(Item.getItemFromBlock(Blocks.wool), 1)}); manager.addRecipe(new CraftingGifts.AddItemToGift(null)); } public static class AddItemToGift implements IRecipe { private AddItemToGift() {} /** * Used to check if a recipe matches current crafting inventory */ public boolean matches(InventoryCrafting inventory, World worldIn) { boolean flag = false; for (int i = 0; i < inventory.getSizeInventory(); ++i) { ItemStack itemstack = inventory.getStackInSlot(i); if (itemstack != null && itemstack.getItem() == Item.getItemFromBlock(MWBlocks.gift)) { if (flag) { return false; } flag = true; } } return flag; } /** * Returns an Item that is the result of this recipe */ public ItemStack getCraftingResult(InventoryCrafting inventory) { ItemStack itemstack = null; for (int i = 0; i < inventory.getSizeInventory(); ++i) { ItemStack itemstack1 = inventory.getStackInSlot(i); if (itemstack1 != null && itemstack1.getItem() == Item.getItemFromBlock(MWBlocks.gift)) { itemstack = itemstack1.copy(); itemstack.stackSize = 1; break; } } int k = 0; ItemStack itemstack2; for (int j = 0; j < inventory.getSizeInventory(); ++j) { itemstack2 = inventory.getStackInSlot(j); if (itemstack2 != null) { k = itemstack2.getMetadata(); break; } } NBTTagCompound nbttagcompound1 = itemstack.getSubCompound("BlockEntityTag", true); itemstack2 = null; NBTTagList nbttaglist; nbttaglist = new NBTTagList(); nbttagcompound1.setTag("Items", nbttaglist); NBTTagCompound nbttagcompound = new NBTTagCompound(); nbttagcompound.setByte("Sloy", (byte)0); nbttaglist.appendTag(nbttagcompound); return itemstack; } /** * Returns the size of the recipe area */ public int getRecipeSize() { return 10; } public ItemStack getRecipeOutput() { return null; } public ItemStack[] getRemainingItems(InventoryCrafting p_179532_1_) { ItemStack[] aitemstack = new ItemStack[p_179532_1_.getSizeInventory()]; for (int i = 0; i < aitemstack.length; ++i) { ItemStack itemstack = p_179532_1_.getStackInSlot(i); aitemstack[i] = net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack); } return aitemstack; } private TileEntityBanner.EnumBannerPattern func_179533_c(InventoryCrafting p_179533_1_) { TileEntityBanner.EnumBannerPattern[] aenumbannerpattern = TileEntityBanner.EnumBannerPattern.values(); int i = aenumbannerpattern.length; for (int j = 0; j < i; ++j) { TileEntityBanner.EnumBannerPattern enumbannerpattern = aenumbannerpattern[j]; if (enumbannerpattern.hasValidCrafting()) { boolean flag = true; int i1; if (enumbannerpattern.hasCraftingStack()) { boolean flag1 = false; boolean flag2 = false; for (i1 = 0; i1 < p_179533_1_.getSizeInventory() && flag; ++i1) { ItemStack itemstack1 = p_179533_1_.getStackInSlot(i1); if (itemstack1 != null && itemstack1.getItem() != Items.banner) { if (itemstack1.getItem() == Items.dye) { if (flag2) { flag = false; break; } flag2 = true; } else { if (flag1 || !itemstack1.isItemEqual(enumbannerpattern.getCraftingStack())) { flag = false; break; } flag1 = true; } } } if (!flag1) { flag = false; } } else if (p_179533_1_.getSizeInventory() != enumbannerpattern.getCraftingLayers().length * enumbannerpattern.getCraftingLayers()[0].length()) { flag = false; } else { int k = -1; for (int l = 0; l < p_179533_1_.getSizeInventory() && flag; ++l) { i1 = l / 3; int j1 = l % 3; ItemStack itemstack = p_179533_1_.getStackInSlot(l); if (itemstack != null && itemstack.getItem() != Items.banner) { if (itemstack.getItem() != Items.dye) { flag = false; break; } if (k != -1 && k != itemstack.getMetadata()) { flag = false; break; } if (enumbannerpattern.getCraftingLayers()[i1].charAt(j1) == 32) { flag = false; break; } k = itemstack.getMetadata(); } else if (enumbannerpattern.getCraftingLayers()[i1].charAt(j1) != 32) { flag = false; break; } } } if (flag) { return enumbannerpattern; } } } return null; } AddItemToGift(Object p_i45780_1_) { this(); } } } but nothing changes, i get the chest (the gift) in result of normal crafting but when i add an item in the middle of the crafting table i get nothing in result of crafting Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 11, 2015 Author Share Posted December 11, 2015 yes, i've readed it, but i'm sorry because i've never worked with nbt tags So far i know that i should do this ItemStack stack = new ItemStack(MWBlocks.gift); NBTTagCompound nbttag = new NBTTagCompound(); stack.setTagCompound(nbttag); but what i don't know is how to set the chest content (if any). Because the crafting should give in result an empty chest if no item/block is in the middle, a chest with the entire stack of the items/blocks in the middle if there are (so for example, if there are 32 diamonds in the middle slot it should return a chest with 32 diamonds inside) and it should work with any items (so i don't know before wich items should go in the middle slot) Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 11, 2015 Author Share Posted December 11, 2015 I've looked into the TileEntityChest class and see how the writeToNBT function works. So just for test i've tried doing this, to give a chest filled with a diamond shovel in result of crafting ItemStack stack = new ItemStack(MWBlocks.gift); ItemStack shovel = new ItemStack(Items.diamond_shovel); NBTTagCompound compound = new NBTTagCompound(); NBTTagList nbttaglist = new NBTTagList(); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)0); shovel.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); compound.setTag("Items", nbttaglist); stack.setTagCompound(compound); GameRegistry.addRecipe(stack, new Object[] {this.recipePattern[0], 'X', Blocks.wool}); using F3+H it says that the chest given in result has 1 nbt tag but when placed down is empty Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 11, 2015 Author Share Posted December 11, 2015 Quick update: for the recipe i come to this ItemStack result = new ItemStack(MWBlocks.gift); manager.addRecipe(new ItemStack(MWBlocks.gift), new Object[] {"###", "# #", "###", '#', Blocks.wool}); for(int i = 0; i < list.size(); i++) { NBTTagCompound compound = new NBTTagCompound(); NBTTagList nbttaglist = new NBTTagList(); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)0); new ItemStack(list.get(i)).writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); compound.setTag("Items", nbttaglist); result.setTagCompound(compound); manager.addRecipe(result, new Object[] {"###", "#I#", "###", '#', Blocks.wool, 'I', list.get(i)}); } so i've got 2 recipes, one for the standard chest and one including the additional item or block, and it works, execpt for the fact that the item isn't in the chest when placed down Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 12, 2015 Author Share Posted December 12, 2015 Ok, i've changed that to this NBTTagCompound compound = result.getSubCompound("BlockEntityTag", true); NBTTagList nbttaglist = new NBTTagList(); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)0); new ItemStack(list.get(i)).writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); compound.setTag("Items", nbttaglist); result.setTagCompound(compound); but still doesn't work Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 12, 2015 Author Share Posted December 12, 2015 Sooo... should i do this? NBTTagCompound compound = result.getSubCompound("BlockEntityTag", true); NBTTagList nbttaglist = new NBTTagList(); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)0); new ItemStack(list.get(i)).writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); nbttagcompound1.setTag("Items", nbttaglist); result.setTagCompound(nbttagcompound1); Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 12, 2015 Author Share Posted December 12, 2015 Not too much As i said i'm really new to nbt tags so i'm not sure how to use them Anyway i removed that line, so i now have this for(int i = 0; i < list.size(); i++) { NBTTagCompound compound = result.getSubCompound("BlockEntityTag", true); NBTTagList nbttaglist = new NBTTagList(); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)0); new ItemStack(list.get(i)).writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); nbttagcompound1.setTag("Items", nbttaglist); manager.addRecipe(result, new Object[] {"###", "#I#", "###", '#', Blocks.wool, 'I', new ItemStack(list.get(i))}); } And what the crafting result give is this so an nbt tag is applied but is not the nbt tag that i want since the chest is still empty Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 12, 2015 Author Share Posted December 12, 2015 I've just payed more attention at how banners are created and adapted that code to work with the chest and it worked So now i can create a chest with whatever i want inside, even a chest with another filled chest in it You're right, it wasn't hard, but just a little tricky to understand in the beginning Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 12, 2015 Author Share Posted December 12, 2015 Strange thing: the code works for normal chest but not for my custom chest This is the code used for the craftings package mw.craftings; import java.util.List; import com.google.common.collect.ImmutableList; import mw.core.MWBlocks; import net.minecraft.block.Block; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentFireAspect; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.RecipesBanners; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntityBanner; import net.minecraft.world.World; public class CraftingGifts { public CraftingGifts(CraftingManager manager) { manager.addRecipe(new CraftingGifts.RecipeAddItem(null)); } public static class RecipeAddItem implements IRecipe { private RecipeAddItem() {} /** * Used to check if a recipe matches current crafting inventory */ public boolean matches(InventoryCrafting craftingInv, World worldIn) { boolean flag = false; int num = 0; for (int i = 0; i < craftingInv.getSizeInventory(); ++i) { ItemStack itemstack = craftingInv.getStackInSlot(i); if (itemstack != null && itemstack.getItem() == Item.getItemFromBlock(Blocks.wool) && i != 4) { if (num == 7) { flag = true; num = 0; break; } num++; } } return flag; } /** * Returns an Item that is the result of this recipe */ public ItemStack getCraftingResult(InventoryCrafting crafting) { ItemStack itemstack = null; ItemStack chestitem = null; int num = 0; for (int i = 0; i < crafting.getSizeInventory(); ++i) { ItemStack itemstack1 = crafting.getStackInSlot(i); if (itemstack1 != null && itemstack1.getItem() == Item.getItemFromBlock(Blocks.wool) && i != 4) { if (num == 7) { itemstack = new ItemStack(MWBlocks.gift); itemstack.stackSize = 1; num = 0; chestitem = crafting.getStackInSlot(4); break; } num++; } } if(chestitem != null) { NBTTagCompound nbttagcompound1 = itemstack.getSubCompound("BlockEntityTag", true); NBTTagList nbttaglist; nbttaglist = new NBTTagList(); nbttagcompound1.setTag("Items", nbttaglist); NBTTagCompound nbttagcompound = new NBTTagCompound(); nbttagcompound.setByte("Slot", (byte)0); chestitem.writeToNBT(nbttagcompound); nbttaglist.appendTag(nbttagcompound); } return itemstack; } /** * Returns the size of the recipe area */ public int getRecipeSize() { return 10; } public ItemStack getRecipeOutput() { return null; } public ItemStack[] getRemainingItems(InventoryCrafting crafting) { ItemStack[] aitemstack = new ItemStack[crafting.getSizeInventory()]; for (int i = 0; i < aitemstack.length; ++i) { ItemStack itemstack = crafting.getStackInSlot(i); aitemstack[i] = net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack); } crafting.setInventorySlotContents(4, null); return aitemstack; } RecipeAddItem(Object par1) { this(); } } } and if instead of MWBlocks.gift i place Blocks.chest everything works fine, the stack in the middle slot of the crafting table are correctly placed in the chest. So maybe it could be a problem with the tile entity? This is its class package mw.entities.tileentity; import java.util.Iterator; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.BlockChest; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryLargeChest; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.server.gui.IUpdatePlayerListBox; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityLockable; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class TileEntityGift extends TileEntityLockable implements IUpdatePlayerListBox, IInventory { private ItemStack[] chestContents = new ItemStack[9]; /** Determines if the check for adjacent chests has taken place. */ public boolean adjacentChestChecked; /** Contains the chest tile located adjacent to this one (if any) */ public TileEntityGift adjacentChestZNeg; /** Contains the chest tile located adjacent to this one (if any) */ public TileEntityGift adjacentChestXPos; /** Contains the chest tile located adjacent to this one (if any) */ public TileEntityGift adjacentChestXNeg; /** Contains the chest tile located adjacent to this one (if any) */ public TileEntityGift adjacentChestZPos; /** The current angle of the lid (between 0 and 1) */ public float lidAngle; /** The angle of the lid last tick */ public float prevLidAngle; /** The number of players currently using this chest */ public int numPlayersUsing; /** Server sync counter (once per 20 ticks) */ private int ticksSinceSync; private int cachedChestType; private String customName; public TileEntityGift() { this.cachedChestType = -1; } @SideOnly(Side.CLIENT) public TileEntityGift(int chestType) { this.cachedChestType = chestType; } /** * Returns the number of slots in the inventory. */ public int getSizeInventory() { return 9; } /** * Returns the stack in slot i */ public ItemStack getStackInSlot(int index) { return this.chestContents[index]; } /** * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a * new stack. */ public ItemStack decrStackSize(int index, int count) { if (this.chestContents[index] != null) { ItemStack itemstack; if (this.chestContents[index].stackSize <= count) { itemstack = this.chestContents[index]; this.chestContents[index] = null; this.markDirty(); return itemstack; } else { itemstack = this.chestContents[index].splitStack(count); if (this.chestContents[index].stackSize == 0) { this.chestContents[index] = null; } this.markDirty(); return itemstack; } } else { return null; } } /** * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem - * like when you close a workbench GUI. */ public ItemStack getStackInSlotOnClosing(int index) { if (this.chestContents[index] != null) { ItemStack itemstack = this.chestContents[index]; this.chestContents[index] = null; return itemstack; } else { return null; } } /** * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections). */ public void setInventorySlotContents(int index, ItemStack stack) { this.chestContents[index] = stack; if (stack != null && stack.stackSize > this.getInventoryStackLimit()) { stack.stackSize = this.getInventoryStackLimit(); } this.markDirty(); } /** * Gets the name of this command sender (usually username, but possibly "Rcon") */ public String getName() { return this.hasCustomName() ? this.customName : "container.gift"; } /** * Returns true if this thing is named */ public boolean hasCustomName() { return this.customName != null && this.customName.length() > 0; } public void setCustomName(String name) { this.customName = name; } public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); NBTTagList nbttaglist = compound.getTagList("Items", 10); this.chestContents = new ItemStack[this.getSizeInventory()]; if (compound.hasKey("CustomName", ) { this.customName = compound.getString("CustomName"); } for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); int j = nbttagcompound1.getByte("Slot") & 255; if (j >= 0 && j < this.chestContents.length) { this.chestContents[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1); } } } public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.chestContents.length; ++i) { if (this.chestContents[i] != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)i); this.chestContents[i].writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } compound.setTag("Items", nbttaglist); if (this.hasCustomName()) { compound.setString("CustomName", this.customName); } } /** * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't * this more of a set than a get?* */ public int getInventoryStackLimit() { return 64; } /** * Do not make give this method the name canInteractWith because it clashes with Container */ public boolean isUseableByPlayer(EntityPlayer player) { return this.worldObj.getTileEntity(this.pos) != this ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D; } public void updateContainingBlockInfo() { super.updateContainingBlockInfo(); this.adjacentChestChecked = false; } private void func_174910_a(TileEntityGift entity, EnumFacing side) { if (entity.isInvalid()) { this.adjacentChestChecked = false; } else if (this.adjacentChestChecked) { switch (TileEntityGift.SwitchEnumFacing.field_177366_a[side.ordinal()]) { case 1: if (this.adjacentChestZNeg != entity) { this.adjacentChestChecked = false; } break; case 2: if (this.adjacentChestZPos != entity) { this.adjacentChestChecked = false; } break; case 3: if (this.adjacentChestXPos != entity) { this.adjacentChestChecked = false; } break; case 4: if (this.adjacentChestXNeg != entity) { this.adjacentChestChecked = false; } } } } /** * Performs the check for adjacent chests to determine if this chest is double or not. */ public void checkForAdjacentChests() { if (!this.adjacentChestChecked) { this.adjacentChestChecked = true; this.adjacentChestXNeg = this.func_174911_a(EnumFacing.WEST); this.adjacentChestXPos = this.func_174911_a(EnumFacing.EAST); this.adjacentChestZNeg = this.func_174911_a(EnumFacing.NORTH); this.adjacentChestZPos = this.func_174911_a(EnumFacing.SOUTH); } } protected TileEntityGift func_174911_a(EnumFacing side) { BlockPos blockpos = this.pos.offset(side); if (this.func_174912_b(blockpos)) { TileEntity tileentity = this.worldObj.getTileEntity(blockpos); if (tileentity instanceof TileEntityGift) { TileEntityGift tileentitychest = (TileEntityGift)tileentity; tileentitychest.func_174910_a(this, side.getOpposite()); return tileentitychest; } } return null; } private boolean func_174912_b(BlockPos pos) { if (this.worldObj == null) { return false; } else { Block block = this.worldObj.getBlockState(pos).getBlock(); return block instanceof BlockChest && ((BlockChest)block).chestType == this.getChestType(); } } /** * Updates the JList with a new model. */ public void update() { this.checkForAdjacentChests(); int i = this.pos.getX(); int j = this.pos.getY(); int k = this.pos.getZ(); ++this.ticksSinceSync; float f; if (!this.worldObj.isRemote && this.numPlayersUsing != 0 && (this.ticksSinceSync + i + j + k) % 200 == 0) { this.numPlayersUsing = 0; f = 5.0F; List list = this.worldObj.getEntitiesWithinAABB(EntityPlayer.class, new AxisAlignedBB((double)((float)i - f), (double)((float)j - f), (double)((float)k - f), (double)((float)(i + 1) + f), (double)((float)(j + 1) + f), (double)((float)(k + 1) + f))); Iterator iterator = list.iterator(); while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer)iterator.next(); if (entityplayer.openContainer instanceof ContainerChest) { IInventory iinventory = ((ContainerChest)entityplayer.openContainer).getLowerChestInventory(); if (iinventory == this || iinventory instanceof InventoryLargeChest && ((InventoryLargeChest)iinventory).isPartOfLargeChest(this)) { ++this.numPlayersUsing; } } } } this.prevLidAngle = this.lidAngle; f = 0.1F; double d2; if (this.numPlayersUsing > 0 && this.lidAngle == 0.0F && this.adjacentChestZNeg == null && this.adjacentChestXNeg == null) { double d1 = (double)i + 0.5D; d2 = (double)k + 0.5D; if (this.adjacentChestZPos != null) { d2 += 0.5D; } if (this.adjacentChestXPos != null) { d1 += 0.5D; } this.worldObj.playSoundEffect(d1, (double)j + 0.5D, d2, "random.chestopen", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); } if (this.numPlayersUsing == 0 && this.lidAngle > 0.0F || this.numPlayersUsing > 0 && this.lidAngle < 1.0F) { float f1 = this.lidAngle; if (this.numPlayersUsing > 0) { this.lidAngle += f; } else { this.lidAngle -= f; } if (this.lidAngle > 1.0F) { this.lidAngle = 1.0F; } float f2 = 0.5F; if (this.lidAngle < f2 && f1 >= f2 && this.adjacentChestZNeg == null && this.adjacentChestXNeg == null) { d2 = (double)i + 0.5D; double d0 = (double)k + 0.5D; if (this.adjacentChestZPos != null) { d0 += 0.5D; } if (this.adjacentChestXPos != null) { d2 += 0.5D; } this.worldObj.playSoundEffect(d2, (double)j + 0.5D, d0, "random.chestclosed", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); } if (this.lidAngle < 0.0F) { this.lidAngle = 0.0F; } } } public boolean receiveClientEvent(int id, int type) { if (id == 1) { this.numPlayersUsing = type; return true; } else { return super.receiveClientEvent(id, type); } } public void openInventory(EntityPlayer player) { if (!player.isSpectator()) { if (this.numPlayersUsing < 0) { this.numPlayersUsing = 0; } ++this.numPlayersUsing; this.worldObj.addBlockEvent(this.pos, this.getBlockType(), 1, this.numPlayersUsing); this.worldObj.notifyNeighborsOfStateChange(this.pos, this.getBlockType()); this.worldObj.notifyNeighborsOfStateChange(this.pos.down(), this.getBlockType()); } } public void closeInventory(EntityPlayer player) { if (!player.isSpectator() && this.getBlockType() instanceof BlockChest) { --this.numPlayersUsing; this.worldObj.addBlockEvent(this.pos, this.getBlockType(), 1, this.numPlayersUsing); this.worldObj.notifyNeighborsOfStateChange(this.pos, this.getBlockType()); this.worldObj.notifyNeighborsOfStateChange(this.pos.down(), this.getBlockType()); } } /** * Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot. */ public boolean isItemValidForSlot(int index, ItemStack stack) { return true; } /** * invalidates a tile entity */ public void invalidate() { super.invalidate(); this.updateContainingBlockInfo(); this.checkForAdjacentChests(); } public int getChestType() { if (this.cachedChestType == -1) { if (this.worldObj == null || !(this.getBlockType() instanceof BlockChest)) { return 0; } this.cachedChestType = ((BlockChest)this.getBlockType()).chestType; } return this.cachedChestType; } public String getGuiID() { return "minecraft:chest"; } public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) { return new ContainerChest(playerInventory, this, playerIn); } public int getField(int id) { return 0; } public void setField(int id, int value) {} public int getFieldCount() { return 0; } public void clear() { for (int i = 0; i < this.chestContents.length; ++i) { this.chestContents[i] = null; } } static final class SwitchEnumFacing { static final int[] field_177366_a = new int[EnumFacing.values().length]; static { try { field_177366_a[EnumFacing.NORTH.ordinal()] = 1; } catch (NoSuchFieldError var4) { ; } try { field_177366_a[EnumFacing.SOUTH.ordinal()] = 2; } catch (NoSuchFieldError var3) { ; } try { field_177366_a[EnumFacing.EAST.ordinal()] = 3; } catch (NoSuchFieldError var2) { ; } try { field_177366_a[EnumFacing.WEST.ordinal()] = 4; } catch (NoSuchFieldError var1) { ; } } } } wich is a barley copy/paste of the TileEntityChest class but with an inventory reduced to 9 slots The tile entity is registered in the init method by doing this GameRegistry.registerTileEntity(TileEntityGift.class, "tileEntityGift"); EDIT: i confirm, is a problem with the tile entity, because giving the block the vanilla TileEntityChest cause no problem Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 12, 2015 Author Share Posted December 12, 2015 Any idea? Doing some debug i see that the nbt is correctly assigned Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 12, 2015 Author Share Posted December 12, 2015 I placed a breakpoint in the read and write to nbt functions in the tile entity class and they are called. Also the block is correctly linked to the tile entity (infact there are no problem if it works like a normal chest). Anyway if needs this is also the block class package mw.blocks; import java.util.Iterator; import java.util.List; import java.util.Random; import mw.core.utils.Utils; import mw.entities.tileentity.TileEntityGift; import net.minecraft.block.Block; import net.minecraft.block.BlockChest; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityOcelot; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.inventory.InventoryLargeChest; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.EnumFacing; import net.minecraft.util.MathHelper; import net.minecraft.util.StatCollector; import net.minecraft.world.IBlockAccess; import net.minecraft.world.ILockableContainer; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.GameRegistry; public class BlockGift extends BlockChest { public BlockGift() { super(0); this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH)); Utils.setChestBlockInfo(this, "gift", 0.2F, Block.soundTypeCloth); GameRegistry.registerBlock(this, "gift"); } /*public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ) { return true; }*/ public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) { EnumFacing enumfacing = EnumFacing.getHorizontal(MathHelper.floor_double((double)(placer.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3).getOpposite(); state = state.withProperty(FACING, enumfacing); BlockPos blockpos1 = pos.north(); BlockPos blockpos2 = pos.south(); BlockPos blockpos3 = pos.west(); BlockPos blockpos4 = pos.east(); boolean flag = this == worldIn.getBlockState(blockpos1).getBlock(); boolean flag1 = this == worldIn.getBlockState(blockpos2).getBlock(); boolean flag2 = this == worldIn.getBlockState(blockpos3).getBlock(); boolean flag3 = this == worldIn.getBlockState(blockpos4).getBlock(); if (!flag && !flag1 && !flag2 && !flag3) { worldIn.setBlockState(pos, state, 3); } else if (enumfacing.getAxis() == EnumFacing.Axis.X && (flag || flag1)) { if (flag) { worldIn.setBlockState(blockpos1, state, 3); } else { worldIn.setBlockState(blockpos2, state, 3); } worldIn.setBlockState(pos, state, 3); } else if (enumfacing.getAxis() == EnumFacing.Axis.Z && (flag2 || flag3)) { if (flag2) { worldIn.setBlockState(blockpos3, state, 3); } else { worldIn.setBlockState(blockpos4, state, 3); } worldIn.setBlockState(pos, state, 3); } TileEntity tileentity = worldIn.getTileEntity(pos); if (stack.hasDisplayName()) { if (tileentity instanceof TileEntityGift) { ((TileEntityGift)tileentity).setCustomName(stack.getDisplayName()); } } } @Override public Item getItemDropped(IBlockState state, Random rand, int fortune) { return null; } public ILockableContainer getLockableContainer(World worldIn, BlockPos pos) { TileEntity tileentity = worldIn.getTileEntity(pos); if (!(tileentity instanceof TileEntityGift)) { return null; } else { Object object = (TileEntityGift)tileentity; if (this.isBlocked(worldIn, pos)) { return null; } else { Iterator iterator = EnumFacing.Plane.HORIZONTAL.iterator(); while (iterator.hasNext()) { EnumFacing enumfacing = (EnumFacing)iterator.next(); BlockPos blockpos1 = pos.offset(enumfacing); Block block = worldIn.getBlockState(blockpos1).getBlock(); if (block == this) { if (this.isBlocked(worldIn, blockpos1)) { return null; } TileEntity tileentity1 = worldIn.getTileEntity(blockpos1); if (tileentity1 instanceof TileEntityGift) { if (enumfacing != EnumFacing.WEST && enumfacing != EnumFacing.NORTH) { object = new InventoryLargeChest("container.gift", (ILockableContainer)object, (TileEntityGift)tileentity1); } else { object = new InventoryLargeChest("container.gift", (TileEntityGift)tileentity1, (ILockableContainer)object); } } } } return (ILockableContainer)object; } } } /** * Returns a new instance of a block's tile entity class. Called on placing the block. */ public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityGift(); } private boolean isBlocked(World worldIn, BlockPos pos) { return this.isBelowSolidBlock(worldIn, pos) || this.isOcelotSittingOnChest(worldIn, pos); } private boolean isBelowSolidBlock(World worldIn, BlockPos pos) { return worldIn.isSideSolid(pos.up(), EnumFacing.DOWN, false); } private boolean isOcelotSittingOnChest(World worldIn, BlockPos pos) { Iterator iterator = worldIn.getEntitiesWithinAABB(EntityOcelot.class, new AxisAlignedBB((double)pos.getX(), (double)(pos.getY() + 1), (double)pos.getZ(), (double)(pos.getX() + 1), (double)(pos.getY() + 2), (double)(pos.getZ() + 1))).iterator(); EntityOcelot entityocelot; do { if (!iterator.hasNext()) { return false; } Entity entity = (Entity)iterator.next(); entityocelot = (EntityOcelot)entity; } while (!entityocelot.isSitting()); return true; } /*@Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean Adva){ list.add(EnumChatFormatting.YELLOW + StatCollector.translateToLocal( "tooltip.open_chests") + " " + chest + " " + StatCollector.translateToLocal( "tooltip.chests")); } */ } Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 12, 2015 Author Share Posted December 12, 2015 doing some debug what the game does is -apply normal nbt tags -copy stack nbt tags to the standard one -apply the tile entity to the block going step-by-step appearently there is no problem since the stack nbt tags are readed and applied correctly to the tile entity, the chest content is updated as well, so i really don't understand why if the chest content is correctly modified the chest is empty (and it only happens with the custom chest since with a vanilla chest it has no problem) Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 12, 2015 Author Share Posted December 12, 2015 In fact i do not want the player to open it. The only way to get it's content is to broken the chest. But for now i have commented the "onBlockActivated" function because it is inherited from the superclass BlockChest Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
JimiIT92 Posted December 12, 2015 Author Share Posted December 12, 2015 Mmm, thinking again i was wrong everything In fact right now i have a simple block with a tile entity that stores one single item stack and when this block is break then the stack stored in the tile entity comes out EDIT: if any is interested, this is the code i use Block class package mw.blocks; import mw.core.MWTabs; import mw.entities.tileentity.TileEntityGift; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryHelper; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.GameRegistry; public class BlockGift extends BlockContainer { public BlockGift() { super(Material.cloth); this.setCreativeTab(MWTabs.tabDecorations); this.setUnlocalizedName("gift"); GameRegistry.registerBlock(this, "gift"); } @Override public boolean hasTileEntity() { return true; } @Override public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityGift(); } public int getRenderType() { return 3; } public void breakBlock(World worldIn, BlockPos pos, IBlockState state) { TileEntity tileentity = worldIn.getTileEntity(pos); if (tileentity instanceof IInventory) { InventoryHelper.dropInventoryItems(worldIn, pos, (IInventory)tileentity); worldIn.updateComparatorOutputLevel(pos, this); } super.breakBlock(worldIn, pos, state); } } TileEntity class package mw.entities.tileentity; import java.util.Iterator; import java.util.List; import mw.blocks.BlockGift; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryLargeChest; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.server.gui.IUpdatePlayerListBox; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityLockable; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class TileEntityGift extends TileEntityLockable { private ItemStack content; @Override public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) { return null; } @Override public String getGuiID() { return null; } @Override public String getName() { return null; } @Override public boolean hasCustomName() { return false; } @Override public int getSizeInventory() { return 1; } @Override public ItemStack getStackInSlot(int index) { return this.content; } @Override public ItemStack decrStackSize(int index, int count) { return null; } @Override public ItemStack getStackInSlotOnClosing(int index) { return null; } @Override public void setInventorySlotContents(int index, ItemStack stack) { } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer player) { return false; } @Override public void openInventory(EntityPlayer player) { } @Override public void closeInventory(EntityPlayer player) { } @Override public boolean isItemValidForSlot(int index, ItemStack stack) { return false; } @Override public int getField(int id) { return 0; } @Override public void setField(int id, int value) { } @Override public int getFieldCount() { return 0; } @Override public void clear() { } public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); NBTTagList nbttaglist = compound.getTagList("Items", 10); this.content = null; for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); int j = nbttagcompound1.getByte("Gift") & 255; if (j == 0) { this.content = ItemStack.loadItemStackFromNBT(nbttagcompound1); } } } public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); NBTTagList nbttaglist = new NBTTagList(); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Gift", (byte)0); if(this.content != null) this.content.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); compound.setTag("Items", nbttaglist); } } Quote Don't blame me if i always ask for your help. I just want to learn to be better Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.