Posted June 17, 20178 yr In my mod I have a block that you put fuel inside to make it do what it is meant to do. I have it partially working in two different ways: package com.leo.mobsuppressors.tileentity; import java.util.Random; import com.leo.mobsuppressors.blocks.BlockEnderSuppressor; import jline.internal.Nullable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemEnderPearl; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.ITickable; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.ItemStackHandler; public class TileEntityEnderSuppressor extends TileEntity implements ITickable, IMobSuppressorTE { public static BlockEnderSuppressor block; public boolean isPublic; public static final int maxTicks = 300; public int powerTicksLeft = 0; public Random RNG = new Random(); public ItemStackHandler itemStackHandler = new ItemStackHandler(1) { @Override protected void onContentsChanged(int slot) { TileEntityEnderSuppressor.this.markDirty(); } }; public TileEntityEnderSuppressor() {} public TileEntityEnderSuppressor(BlockEnderSuppressor block) { this.block = block; this.isPublic = true; } @Override public void update() { if (!(world.getBlockState(getPos()).getBlock() instanceof BlockEnderSuppressor)) { return; } world.spawnParticle(EnumParticleTypes.PORTAL, RNG.nextFloat() + pos.getX(), RNG.nextFloat() + pos.getY(), RNG.nextFloat() + pos.getZ(), 0.1, 0.1, 0.1, 0); if (!world.isRemote) { world.setBlockState(this.getPos(), world.getBlockState(getPos()).withProperty(block.is_powered, true)); if (powerTicksLeft > 0) { powerTicksLeft--; sendUpdate(true); } else { if (itemStackHandler.getStackInSlot(0).isEmpty()) { world.setBlockState(this.getPos(), world.getBlockState(getPos()).withProperty(block.is_powered, false)); } else { if (itemStackHandler.getStackInSlot(0).getItem() instanceof ItemEnderPearl) { itemStackHandler.getStackInSlot(0).shrink(1); setFullPowerTicks(); sendUpdate(true); } } } } System.out.println(powerTicksLeft); } public void sendUpdate(boolean powered) { world.markBlockRangeForRenderUpdate(pos, pos); world.notifyBlockUpdate(pos, world.getBlockState(getPos()), world.getBlockState(getPos()).withProperty(block.is_powered, powered), 3); world.scheduleBlockUpdate(pos,this.getBlockType(),0,0); markDirty(); } @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setTag("items", itemStackHandler.serializeNBT()); compound.setBoolean("isPublic", isPublic); compound.setInteger("powerTicksLeft", powerTicksLeft); return compound; } @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); if (compound.hasKey("items")) { itemStackHandler.deserializeNBT((NBTTagCompound)compound.getTag("items")); } isPublic = compound.getBoolean("isPublic"); powerTicksLeft = compound.getInteger("powerTicksLeft"); } @Override @Nullable public SPacketUpdateTileEntity getUpdatePacket() { return new SPacketUpdateTileEntity(this.pos, 3, this.getUpdateTag()); } @Override public NBTTagCompound getUpdateTag() { return this.writeToNBT(new NBTTagCompound()); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { super.onDataPacket(net, pkt); handleUpdateTag(pkt.getNbtCompound()); } @Override public boolean isPublic() { return isPublic; } @Override public void setFullPowerTicks() { this.powerTicksLeft = maxTicks; } @Override public int getPowerTicksLeft() { return powerTicksLeft; } @Override public boolean hasCapability(Capability<?> capability, EnumFacing facing) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { return true; } return super.hasCapability(capability, facing); } @Override public <T> T getCapability(Capability<T> capability, EnumFacing facing) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { return (T) itemStackHandler; } return super.getCapability(capability, facing); } public boolean canInteractWith(EntityPlayer playerIn) { return !isInvalid() && playerIn.getDistanceSq(pos.add(0.5D, 0.5D, 0.5D)) <= 64D; } } In that way the fuel items look like they are consumed instantly by the block, but if you click on the slot again you will get the items back on your cursor. So the function of the block is not triggered because the fuel is not consumed. And when I get rid of the world.setBlock() and have the code like this: package com.leo.mobsuppressors.tileentity; import java.util.Random; import com.leo.mobsuppressors.blocks.BlockEnderSuppressor; import jline.internal.Nullable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemEnderPearl; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.ITickable; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.ItemStackHandler; public class TileEntityEnderSuppressor extends TileEntity implements ITickable, IMobSuppressorTE { public static BlockEnderSuppressor block; public boolean isPublic; public static final int maxTicks = 300; public int powerTicksLeft = 0; public Random RNG = new Random(); public ItemStackHandler itemStackHandler = new ItemStackHandler(1) { @Override protected void onContentsChanged(int slot) { TileEntityEnderSuppressor.this.markDirty(); } }; public TileEntityEnderSuppressor() {} public TileEntityEnderSuppressor(BlockEnderSuppressor block) { this.block = block; this.isPublic = true; } @Override public void update() { if (!(world.getBlockState(getPos()).getBlock() instanceof BlockEnderSuppressor)) { return; } world.spawnParticle(EnumParticleTypes.PORTAL, RNG.nextFloat() + pos.getX(), RNG.nextFloat() + pos.getY(), RNG.nextFloat() + pos.getZ(), 0.1, 0.1, 0.1, 0); if (!world.isRemote) { //world.setBlockState(this.getPos(), world.getBlockState(getPos()).withProperty(block.is_powered, true)); if (powerTicksLeft > 0) { powerTicksLeft--; sendUpdate(true); } else { if (itemStackHandler.getStackInSlot(0).isEmpty()) { world.setBlockState(this.getPos(), world.getBlockState(getPos()).withProperty(block.is_powered, false)); } else { if (itemStackHandler.getStackInSlot(0).getItem() instanceof ItemEnderPearl) { itemStackHandler.getStackInSlot(0).shrink(1); setFullPowerTicks(); sendUpdate(true); } } } } System.out.println(powerTicksLeft); } public void sendUpdate(boolean powered) { world.markBlockRangeForRenderUpdate(pos, pos); world.notifyBlockUpdate(pos, world.getBlockState(getPos()), world.getBlockState(getPos()).withProperty(block.is_powered, powered), 3); world.scheduleBlockUpdate(pos,this.getBlockType(),0,0); markDirty(); } @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setTag("items", itemStackHandler.serializeNBT()); compound.setBoolean("isPublic", isPublic); compound.setInteger("powerTicksLeft", powerTicksLeft); return compound; } @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); if (compound.hasKey("items")) { itemStackHandler.deserializeNBT((NBTTagCompound)compound.getTag("items")); } isPublic = compound.getBoolean("isPublic"); powerTicksLeft = compound.getInteger("powerTicksLeft"); } @Override @Nullable public SPacketUpdateTileEntity getUpdatePacket() { return new SPacketUpdateTileEntity(this.pos, 3, this.getUpdateTag()); } @Override public NBTTagCompound getUpdateTag() { return this.writeToNBT(new NBTTagCompound()); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { super.onDataPacket(net, pkt); handleUpdateTag(pkt.getNbtCompound()); } @Override public boolean isPublic() { return isPublic; } @Override public void setFullPowerTicks() { this.powerTicksLeft = maxTicks; } @Override public int getPowerTicksLeft() { return powerTicksLeft; } @Override public boolean hasCapability(Capability<?> capability, EnumFacing facing) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { return true; } return super.hasCapability(capability, facing); } @Override public <T> T getCapability(Capability<T> capability, EnumFacing facing) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { return (T) itemStackHandler; } return super.getCapability(capability, facing); } public boolean canInteractWith(EntityPlayer playerIn) { return !isInvalid() && playerIn.getDistanceSq(pos.add(0.5D, 0.5D, 0.5D)) <= 64D; } } The fuel gets consumed properly but the animation for the block doesn't play and so the function doesn't activate either. I understand why that happens (it's because I get rid of the world.setBlock()), although what I wonder is why having that line there seems to make the fuel not get consumed properly.
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.