@‘robin4002’:
Pas de problème ici, il faut le code du bloc, du tile entity, et du container.
Voila voila et merci pour le coup de mains
:::
Block
| package be.hydroen.chimicraft.blocks; |
| |
| import be.hydroen.chimicraft.common.ModChimiCraft; |
| import be.hydroen.chimicraft.tileentity.TileEntityComposer; |
| import be.hydroen.chimicraft.tileentity.TileEntityDecomposer; |
| import net.minecraft.block.Block; |
| import net.minecraft.block.BlockContainer; |
| import net.minecraft.block.material.Material; |
| import net.minecraft.entity.EntityLivingBase; |
| import net.minecraft.entity.item.EntityItem; |
| import net.minecraft.entity.player.EntityPlayer; |
| import net.minecraft.inventory.IInventory; |
| import net.minecraft.item.ItemStack; |
| import net.minecraft.nbt.NBTTagCompound; |
| import net.minecraft.tileentity.TileEntity; |
| import net.minecraft.world.World; |
| |
| public class BlockDecomposer extends BlockContainer |
| { |
| |
| public BlockDecomposer(Material material) |
| { |
| super(Material.rock); |
| this.setResistance(8.0F); |
| this.setHarvestLevel("pickaxe", 1); |
| this.setBlockTextureName(ModChimiCraft.MODID + ":decomposer"); |
| this.setCreativeTab(ModChimiCraft.creativeTabsChimiCraft); |
| } |
| |
| @Override |
| public TileEntity createNewTileEntity(World world, int metadata) |
| { |
| if(metadata == 1) |
| { |
| return new TileEntityDecomposer(); |
| } |
| |
| return null; |
| } |
| |
| @Override |
| public boolean hasTileEntity(int metadata) |
| { |
| return true; |
| } |
| |
| public boolean onBlockActived(World world, int x, int y, int z, EntityPlayer player, int side, float hitx, float hity, float hitz) |
| { |
| if(world.isRemote) |
| { |
| return true; |
| } |
| else |
| { |
| player.openGui(ModChimiCraft.instance, 1, world, x, y, z); |
| return true; |
| } |
| } |
| |
| public void breakBlock(World world, int x, int y, int z, Block block, int metadata) |
| { |
| TileEntity tileentity = world.getTileEntity(x, y, z); |
| |
| if (tileentity instanceof IInventory) |
| { |
| IInventory inv = (IInventory)tileentity; |
| |
| for (int i1 = 0; i1 < inv.getSizeInventory(); ++i1) |
| { |
| ItemStack itemstack = inv.getStackInSlot(i1); |
| |
| if (itemstack != null) |
| { |
| float f = world.rand.nextFloat() * 0.8F + 0.1F; |
| float f1 = world.rand.nextFloat() * 0.8F + 0.1F; |
| EntityItem entityitem; |
| |
| for (float f2 = world.rand.nextFloat() * 0.8F + 0.1F; itemstack.stackSize > 0; world.spawnEntityInWorld(entityitem)) |
| { |
| int j1 = world.rand.nextInt(21) + 10; |
| |
| if (j1 > itemstack.stackSize) |
| { |
| j1 = itemstack.stackSize; |
| } |
| |
| itemstack.stackSize -= j1; |
| entityitem = new EntityItem(world, (double)((float)x + f), (double)((float)y + f1), (double)((float)z + f2), new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); |
| float f3 = 0.05F; |
| entityitem.motionX = (double)((float)world.rand.nextGaussian() * f3); |
| entityitem.motionY = (double)((float)world.rand.nextGaussian() * f3 + 0.2F); |
| entityitem.motionZ = (double)((float)world.rand.nextGaussian() * f3); |
| |
| if (itemstack.hasTagCompound()) |
| { |
| entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); |
| } |
| } |
| } |
| } |
| |
| world.func_147453_f(x, y, z, block); |
| } |
| |
| super.breakBlock(world, x, y, z, block, metadata); |
| } |
| |
| public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack) |
| { |
| TileEntity tile = world.getTileEntity(x, y, z); |
| if(tile instanceof TileEntityComposer) |
| { |
| if(stack.hasDisplayName()) |
| { |
| ((TileEntityComposer)tile).setCustomName(stack.getDisplayName()); |
| } |
| } |
| } |
| } |
| |
TileEntity
| package be.hydroen.chimicraft.tileentity; |
| |
| import be.hydroen.chimicraft.recipes.DecomposerRecipes; |
| import net.minecraft.entity.player.EntityPlayer; |
| 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; |
| |
| public class TileEntityDecomposer extends TileEntity implements IInventory |
| { |
| private ItemStack[] contents = new ItemStack[4]; |
| |
| private int workingTime = 0; |
| private int workingTimeNeeded = 200 ; |
| |
| @Override |
| public void writeToNBT(NBTTagCompound compound) |
| { |
| super.writeToNBT(compound); |
| |
| NBTTagList nbttaglist = new NBTTagList(); |
| |
| for(int i = 0; i < this.contents.length; ++i) |
| { |
| if(this.contents* != null) |
| { |
| NBTTagCompound nbttagcompound1 = new NBTTagCompound(); |
| nbttagcompound1.setByte("Slot", (byte)i); |
| this.contents*.writeToNBT(nbttagcompound1); |
| nbttaglist.appendTag(nbttagcompound1); |
| } |
| } |
| |
| compound.setTag("Items", nbttaglist); |
| compound.setShort("workingTime", (short)this.workingTime); |
| compound.setShort("workingTimeNeeded", (short)this.workingTimeNeeded); |
| } |
| |
| @Override |
| public void readFromNBT(NBTTagCompound compound) |
| { |
| super.readFromNBT(compound); |
| |
| NBTTagList nbttaglist = compound.getTagList("Items", 10); |
| this.contents = new ItemStack[this.getSizeInventory()]; |
| |
| for(int i = 0; i < nbttaglist.tagCount(); ++i) |
| { |
| NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); |
| int j = nbttagcompound1.getByte("Slot") & 255; |
| |
| if(j >= 0 && j < this.contents.length) |
| { |
| this.contents[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1); |
| } |
| } |
| |
| this.workingTime = compound.getShort("workingTime"); |
| this.workingTimeNeeded = compound.getShort("workingTimeNeeded"); |
| } |
| |
| @Override |
| public int getSizeInventory() |
| { |
| return this.contents.length; |
| } |
| |
| @Override |
| public ItemStack getStackInSlot(int slotIndex) |
| { |
| return this.contents[slotIndex]; |
| } |
| |
| @Override |
| public ItemStack decrStackSize(int slotIndex, int amount) |
| { |
| if (this.contents[slotIndex] != null) |
| { |
| ItemStack itemstack; |
| |
| if (this.contents[slotIndex].stackSize <= amount) |
| { |
| itemstack = this.contents[slotIndex]; |
| this.contents[slotIndex] = null; |
| this.markDirty(); |
| |
| return itemstack; |
| } |
| else |
| { |
| itemstack = this.contents[slotIndex].splitStack(amount); |
| |
| if (this.contents[slotIndex].stackSize == 0) |
| { |
| this.contents[slotIndex] = null; |
| } |
| |
| this.markDirty(); |
| |
| return itemstack; |
| } |
| } |
| else |
| { |
| return null; |
| } |
| } |
| |
| @Override |
| public ItemStack getStackInSlotOnClosing(int slotIndex) |
| { |
| if (this.contents[slotIndex] != null) |
| { |
| ItemStack itemstack = this.contents[slotIndex]; |
| this.contents[slotIndex] = null; |
| return itemstack; |
| } |
| else |
| { |
| return null; |
| } |
| } |
| |
| @Override |
| public void setInventorySlotContents(int slotIndex, ItemStack stack) |
| { |
| this.contents[slotIndex] = stack; |
| |
| if (stack != null && stack.stackSize > this.getInventoryStackLimit()) |
| { |
| stack.stackSize = this.getInventoryStackLimit(); |
| } |
| |
| this.markDirty(); |
| } |
| |
| @Override |
| public String getInventoryName() |
| { |
| return "tile.decomposer"; |
| } |
| |
| @Override |
| public boolean hasCustomInventoryName() |
| { |
| return false; |
| } |
| |
| @Override |
| public int getInventoryStackLimit() |
| { |
| return 64; |
| } |
| |
| @Override |
| public boolean isUseableByPlayer(EntityPlayer player) |
| { |
| return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : player.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D; |
| } |
| |
| @Override |
| public void openInventory() |
| { |
| |
| } |
| |
| @Override |
| public void closeInventory() |
| { |
| |
| } |
| |
| @Override |
| public boolean isItemValidForSlot(int slot, ItemStack stack) |
| { |
| return slot == 3 ? false : true; |
| } |
| |
| public boolean isBurning() |
| { |
| return this.workingTime > 0; |
| } |
| |
| private boolean canSmelt() |
| { |
| if (this.contents[0] == null || this.contents[1] == null || this.contents[2] == null) |
| { |
| return false; |
| } |
| else |
| { |
| ItemStack itemstack = DecomposerRecipes.smelting().getSmeltingResult(new ItemStack[]{this.contents[0], this.contents[1], this.contents[2]}); |
| if (itemstack == null) return false; |
| if (this.contents[3] == null) return true; |
| if (!this.contents[3].isItemEqual(itemstack)) return false; |
| int result = contents[3].stackSize + itemstack.stackSize; |
| return result <= getInventoryStackLimit() && result <= this.contents[3].getMaxStackSize(); |
| } |
| } |
| |
| @Override |
| public void updateEntity() |
| { |
| if(this.isBurning() && this.canSmelt()) |
| { |
| ++this.workingTime; |
| } |
| if(this.canSmelt() && !this.isBurning()) |
| { |
| this.workingTime = 1; |
| } |
| if(this.canSmelt() && this.workingTime == this.workingTimeNeeded) |
| { |
| this.smeltItem(); |
| this.workingTime = 0; |
| } |
| if(!this.canSmelt()) |
| { |
| this.workingTime= 0; |
| } |
| } |
| |
| public void smeltItem() |
| { |
| if (this.canSmelt()) |
| { |
| ItemStack itemstack = DecomposerRecipes.smelting().getSmeltingResult(new ItemStack[]{this.contents[0], this.contents[1], this.contents[2]}); |
| if (this.contents[3] == null) |
| { |
| this.contents[3] = itemstack.copy(); |
| } |
| else if (this.contents[3].getItem() == itemstack.getItem()) |
| { |
| this.contents[3].stackSize += itemstack.stackSize; |
| } |
| |
| –this.contents[0].stackSize; |
| –this.contents[1].stackSize; |
| –this.contents[2].stackSize; |
| |
| if (this.contents[0].stackSize <= 0) |
| { |
| this.contents[0] = null; |
| } |
| if (this.contents[1].stackSize <= 0) |
| { |
| this.contents[1] = null; |
| } |
| if (this.contents[2].stackSize <= 0) |
| { |
| this.contents[2] = null; |
| } |
| } |
| } |
| } |
Container
| package be.hydroen.chimicraft.container; |
| |
| import be.hydroen.chimicraft.tileentity.TileEntityDecomposer; |
| import net.minecraft.entity.player.EntityPlayer; |
| import net.minecraft.entity.player.InventoryPlayer; |
| import net.minecraft.inventory.Container; |
| import net.minecraft.inventory.Slot; |
| import net.minecraft.item.ItemStack; |
| |
| public class ContainerDecomposer extends Container |
| { |
| private TileEntityDecomposer tileDecomposer; |
| |
| public ContainerDecomposer(TileEntityDecomposer tile, InventoryPlayer inventory) |
| { |
| this.tileDecomposer = tile; |
| this.addSlotToContainer(new Slot(tile, 0, 49, 75)); |
| this.addSlotToContainer(new Slot(tile, 1, 89, 75)); |
| this.addSlotToContainer(new Slot(tile, 2, 129, 75)); |
| this.addSlotToContainer(new SlotResult(tile, 3, 89, 135)); |
| this.bindPlayerInventory(inventory); |
| } |
| |
| private void bindPlayerInventory(InventoryPlayer inventory) |
| { |
| int i; |
| |
| for (i = 0; i < 3; ++i) |
| { |
| for (int j = 0; j < 9; ++j) |
| { |
| this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 17 + j * 18, 171 + i * 18)); |
| } |
| } |
| |
| for (i = 0; i < 9; ++i) |
| { |
| this.addSlotToContainer(new Slot(inventory, i, 17 + i * 18, 229)); |
| } |
| } |
| |
| public ItemStack transferStackInSlot(EntityPlayer player, int quantity) |
| { |
| ItemStack itemstack = null; |
| Slot slot = (Slot)this.inventorySlots.get(quantity); |
| |
| if (slot != null && slot.getHasStack()) |
| { |
| ItemStack itemstack1 = slot.getStack(); |
| itemstack = itemstack1.copy(); |
| |
| if (quantity < this.tileDecomposer.getSizeInventory()) |
| { |
| if (!this.mergeItemStack(itemstack1, this.tileDecomposer.getSizeInventory(), this.inventorySlots.size(), true)) |
| { |
| return null; |
| } |
| } |
| else if (!this.mergeItemStack(itemstack1, 0, this.tileDecomposer.getSizeInventory(), false)) |
| { |
| return null; |
| } |
| |
| if (itemstack1.stackSize == 0) |
| { |
| slot.putStack((ItemStack)null); |
| } |
| else |
| { |
| slot.onSlotChanged(); |
| } |
| } |
| |
| return itemstack; |
| } |
| |
| public void onContainerClosed(EntityPlayer player) |
| { |
| super.onContainerClosed(player); |
| this.tileDecomposer.closeInventory(); |
| } |
| |
| @Override |
| public boolean canInteractWith(EntityPlayer player) |
| { |
| return this.tileDecomposer.isUseableByPlayer(player); |
| } |
| } |
| |
:::