-
Posts
119 -
Joined
-
Last visited
Everything posted by meee39
-
Oops. For some reason Forge Forums resent the last message. The real one was: "It still doesn't work"
-
There is no error. Also does the packet need to be registered on both client and server side?
-
There is no error. Also does the packet need to be registered on both client and server side?
-
I just realised that the packet I was sending was a client packet, but being sent on the server side. I wrote this packet: package com.leo.mobsuppressors.network; import com.leo.mobsuppressors.tileentity.TileEntitySuppressionAltarCore; import com.leo.mobsuppressors.tileentity.TileEntitySuppressionPedestal; import com.leo.mobsuppressors.tileentity.TileEntitySuppressionTower; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; public class PacketAltarCraft implements IMessage { public static class Handler implements IMessageHandler<PacketAltarCraft, IMessage> { @Override public PacketUpdatePedestal onMessage(PacketAltarCraft message, MessageContext ctx) { Minecraft.getMinecraft().addScheduledTask(() -> { TileEntitySuppressionTower te = (TileEntitySuppressionTower)Minecraft.getMinecraft().world.getTileEntity(message.pos); te.itemStackHandler.setStackInSlot(0, message.stack); System.out.println(te.itemStackHandler.getStackInSlot(0)); te.lastChangeTime = message.lastChangeTime; System.out.println(message.stack + "handler"); }); return null; } } private BlockPos pos; private ItemStack stack; private long lastChangeTime; public PacketAltarCraft(BlockPos pos, ItemStack itemStack, long lastChangeTime) { this.pos = pos; this.stack = itemStack; this.lastChangeTime = lastChangeTime; } public PacketAltarCraft(TileEntitySuppressionTower te, ItemStack stack) { this(te.getPos(), stack, te.lastChangeTime); System.out.println(stack + "constructor"); } public PacketAltarCraft() { } @Override public void toBytes(ByteBuf buf) { buf.writeLong(pos.toLong()); ByteBufUtils.writeItemStack(buf, stack); buf.writeLong(lastChangeTime); } @Override public void fromBytes(ByteBuf buf) { pos = BlockPos.fromLong(buf.readLong()); stack = ByteBufUtils.readItemStack(buf); lastChangeTime = buf.readLong(); } } hoping that it would work, but I still have the same problem as before.
-
I stepped through with the debugger and I found that the itemstack doesn't actually change. When the success part of the function was reached it sent a packet to update the inventory and that also made the TESR think that the inventory was updated, but in reality it didn't change at all. I think there is a problem with my packet then: package com.leo.mobsuppressors.network; import com.leo.mobsuppressors.tileentity.TileEntitySuppressionPedestal; import com.leo.mobsuppressors.tileentity.TileEntitySuppressionTower; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; public class PacketUpdateTower implements IMessage { public static class Handler implements IMessageHandler<PacketUpdateTower, IMessage> { @Override public IMessage onMessage(PacketUpdateTower message, MessageContext ctx) { Minecraft.getMinecraft().addScheduledTask(() -> { TileEntitySuppressionTower te = (TileEntitySuppressionTower)Minecraft.getMinecraft().world.getTileEntity(message.pos); te.itemStackHandler.setStackInSlot(0, message.stack); System.out.println(te.itemStackHandler.getStackInSlot(0)); te.lastChangeTime = message.lastChangeTime; }); return null; } } private BlockPos pos; private ItemStack stack; private long lastChangeTime; public PacketUpdateTower(BlockPos pos, ItemStack stack, long lastChangeTime) { this.pos = pos; this.stack = stack; this.lastChangeTime = lastChangeTime; } public PacketUpdateTower(TileEntitySuppressionTower te) { this(te.getPos(), te.itemStackHandler.getStackInSlot(0), te.lastChangeTime); } public PacketUpdateTower() { } @Override public void toBytes(ByteBuf buf) { buf.writeLong(pos.toLong()); ByteBufUtils.writeItemStack(buf, stack); buf.writeLong(lastChangeTime); } @Override public void fromBytes(ByteBuf buf) { pos = BlockPos.fromLong(buf.readLong()); stack = ByteBufUtils.readItemStack(buf); lastChangeTime = buf.readLong(); } }
-
When the craft was complete it showed that the correct item was in the inventory, but when I took it out I didn't get that item.
-
What is the event for zombies breaking down doors?
meee39 replied to meee39's topic in Modder Support
No, what I mean is a block that looks at all zombies around it, if they try to break a door it will stop them. -
I need to make a block that stops them from doing that. Also I need the event for slimes splitting into smaller ones.
-
In my multiblock crafting structure the final result is placed inside the inventory of a block. It is possible to see through the TESR and System.out.println() that the item does become the final result, but when it is taken out of the inventory it changes back into what was originally put in the block. package com.leo.mobsuppressors.tileentity; import com.leo.mobsuppressors.EnumAltarRecipes; import com.leo.mobsuppressors.MobSuppressors; import com.leo.mobsuppressors.network.PacketUpdateTower; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.items.CapabilityItemHandler; public class TileEntitySuppressionAltarCore extends TileEntity implements ITickable { public TileEntitySuppressionAltarCore() { } @Override public void update() { attemptCraft(); } public boolean attemptCraft() { if (!(world.getTileEntity(new BlockPos(getPos().getX(), getPos().getY() + 1, getPos().getZ())) instanceof TileEntitySuppressionTower)) { return false; } TileEntitySuppressionTower tower; //Check structure BlockPos[] positions = { //Edges new BlockPos(getPos().getX() + 1, getPos().getY(), getPos().getZ()), new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ() + 1 ), new BlockPos(getPos().getX() -1, getPos().getY(), getPos().getZ()), new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ() - 1), //Corners new BlockPos(getPos().getX() + 1, getPos().getY(), getPos().getZ() + 1), new BlockPos(getPos().getX() + 1, getPos().getY(), getPos().getZ() - 1), new BlockPos(getPos().getX() - 1, getPos().getY(), getPos().getZ() - 1), new BlockPos(getPos().getX() - 1, getPos().getY(), getPos().getZ() + 1) }; tower = (TileEntitySuppressionTower)world.getTileEntity(new BlockPos(getPos().getX(), getPos().getY() + 1, getPos().getZ())); for (BlockPos position: positions) { if (!(world.getTileEntity(position) instanceof TileEntitySuppressionPedestal)) { return false; } } for (EnumAltarRecipes recipe: EnumAltarRecipes.values()) { if (tower.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).getStackInSlot(0).getItem() == recipe.inputs[4]) { //Check edges if (((TileEntitySuppressionPedestal)world.getTileEntity(positions[0])).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).getStackInSlot(0).getItem() == recipe.inputs[1] && ((TileEntitySuppressionPedestal)world.getTileEntity(positions[1])).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).getStackInSlot(0).getItem() == recipe.inputs[1] && ((TileEntitySuppressionPedestal)world.getTileEntity(positions[2])).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).getStackInSlot(0).getItem() == recipe.inputs[1] && ((TileEntitySuppressionPedestal)world.getTileEntity(positions[3])).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).getStackInSlot(0).getItem() == recipe.inputs[1]) { //Check corners if (((TileEntitySuppressionPedestal)world.getTileEntity(positions[4])).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).getStackInSlot(0).getItem() == recipe.inputs[0] && ((TileEntitySuppressionPedestal)world.getTileEntity(positions[5])).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).getStackInSlot(0).getItem() == recipe.inputs[0] && ((TileEntitySuppressionPedestal)world.getTileEntity(positions[6])).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).getStackInSlot(0).getItem() == recipe.inputs[0] && ((TileEntitySuppressionPedestal)world.getTileEntity(positions[7])).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).getStackInSlot(0).getItem() == recipe.inputs[0]) { if (tower.netherStarUsesLeft > 0) { tower.netherStarUsesLeft -= 1; tower.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).extractItem(0, 64, false); tower.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).insertItem(0, new ItemStack(recipe.output, 1), false); MobSuppressors.network.sendToAllAround(new PacketUpdateTower(tower), new NetworkRegistry.TargetPoint(world.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 64)); world.addWeatherEffect(new EntityLightningBolt(world, pos.getX(), pos.getY(), pos.getZ(), false)); for (BlockPos position: positions) { ((TileEntitySuppressionPedestal)world.getTileEntity(position)).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH).extractItem(0, 1, false); } } } } } } return true; } }
-
What about as an ItemSkull?
-
How do you check the type of an ItemSkull or BlockSkull? For example like in a mulitblock structure like creating The Wither, or only a specific type of skull in a recipe like Ender IO's Splicer.
-
I have been debugging the code with breakpoints and I have discovered what the problem is this time. The problem is that the handler code is never reached so the field is never actually set in the TE. I just changed the packet registry to be client side and now it works. Thanks for your help because I was being very reliant on you and not finding the solutions by myself. I'll try to be not so annoying in the future :).
-
The field isn't updating and so it won't show up in the TESR. TESR: package com.leo.mobsuppressors.tileentity; import org.lwjgl.opengl.GL11; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraftforge.client.ForgeHooksClient; public class TESRSuppressionTower extends TileEntitySpecialRenderer<TileEntitySuppressionTower> { @Override public void renderTileEntityAt(TileEntitySuppressionTower te, double x, double y, double z, float partialTicks, int destroyStage) { GlStateManager.enableRescaleNormal(); GlStateManager.alphaFunc(GL11.GL_GREATER, 0.1f); GlStateManager.enableBlend(); RenderHelper.enableStandardItemLighting(); GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0); ItemStack stack = te.itemStackHandler.getStackInSlot(0); if (!stack.isEmpty()) { GlStateManager.pushMatrix(); GlStateManager.translate(x + 0.5, y + 0.15, z + 0.5); GlStateManager.rotate((te.getWorld().getTotalWorldTime() + partialTicks) * 4, 0, 1, 0); IBakedModel model = Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(stack, te.getWorld(), null); model = ForgeHooksClient.handleCameraTransforms(model, ItemCameraTransforms.TransformType.GROUND, false); Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); Minecraft.getMinecraft().getRenderItem().renderItem(stack, model); GlStateManager.popMatrix(); } System.out.println(te.hasNetherStar); if (te.hasNetherStar) { GlStateManager.pushMatrix(); GlStateManager.translate(x + 0.45, y + 0.5, z + 0.55); GlStateManager.scale(0.75, 0.75, 0.75); GlStateManager.rotate(90, 0, 0, 0); IBakedModel netherStarModel = Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(new ItemStack(Items.NETHER_STAR), te.getWorld(), null); Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); Minecraft.getMinecraft().getRenderItem().renderItem(new ItemStack(Items.NETHER_STAR, 1), netherStarModel); GlStateManager.popMatrix(); } GlStateManager.disableRescaleNormal(); GlStateManager.disableBlend(); } } Updated Packet: package com.leo.mobsuppressors.network; import com.leo.mobsuppressors.tileentity.TileEntitySuppressionTower; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; public class PacketUpdateTowerHasNetherStar implements IMessage { public static class Handler implements IMessageHandler<PacketUpdateTowerHasNetherStar, IMessage> { @Override public IMessage onMessage(PacketUpdateTowerHasNetherStar message, MessageContext ctx) { Minecraft.getMinecraft().addScheduledTask(() -> { TileEntitySuppressionTower te = (TileEntitySuppressionTower)Minecraft.getMinecraft().world.getTileEntity(message.pos); te.hasNetherStar = message.hasNetherStar; te.lastChangeTime = message.lastChangeTime; }); return null; } } public boolean hasNetherStar; public BlockPos pos; public long lastChangeTime; public PacketUpdateTowerHasNetherStar(boolean hasNetherStar, BlockPos pos, long lastChangeTime) { this.pos = pos; this.lastChangeTime = lastChangeTime; } public PacketUpdateTowerHasNetherStar(TileEntitySuppressionTower te, boolean hasNetherStar) { this(hasNetherStar, te.getPos(), te.lastChangeTime); } public PacketUpdateTowerHasNetherStar() { } @Override public void toBytes(ByteBuf buf) { buf.writeBoolean(hasNetherStar); buf.writeLong(pos.toLong()); buf.writeLong(lastChangeTime); } @Override public void fromBytes(ByteBuf buf) { hasNetherStar = buf.readBoolean(); pos = BlockPos.fromLong(buf.readLong()); lastChangeTime = buf.readLong(); } }
-
The packet still doesn't work though.
-
I made a new packet for updating hasNetherStar, but when called it creates an error in the fromBytes() method. Jun 25, 2017 11:20:24 AM io.netty.channel.embedded.EmbeddedChannel recordException WARNING: More than one exception was raised. Will report only the first one and log others. io.netty.handler.codec.EncoderException: java.lang.IndexOutOfBoundsException: readerIndex(1) + length(8) exceeds writerIndex(1): UnpooledHeapByteBuf(ridx: 1, widx: 1, cap: 256) at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:107) at io.netty.handler.codec.MessageToMessageCodec.write(MessageToMessageCodec.java:116) at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:658) at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:716) at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:706) at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:741) at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:895) at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:240) at net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper.sendToAllAround(SimpleNetworkWrapper.java:268) at com.leo.mobsuppressors.blocks.BlockSuppressionTower.onBlockActivated(BlockSuppressionTower.java:85) at net.minecraft.server.management.PlayerInteractionManager.processRightClickBlock(PlayerInteractionManager.java:473) at net.minecraft.network.NetHandlerPlayServer.processTryUseItemOnBlock(NetHandlerPlayServer.java:712) at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:68) at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:13) at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:21) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at net.minecraft.util.Util.runTask(Util.java:29) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:754) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:699) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:548) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.IndexOutOfBoundsException: readerIndex(1) + length(8) exceeds writerIndex(1): UnpooledHeapByteBuf(ridx: 1, widx: 1, cap: 256) at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1175) at io.netty.buffer.AbstractByteBuf.readLong(AbstractByteBuf.java:632) at net.minecraft.network.PacketBuffer.readLong(PacketBuffer.java:832) at com.leo.mobsuppressors.network.PacketUpdateTowerHasNetherStar.toBytes(PacketUpdateTowerHasNetherStar.java:54) at net.minecraftforge.fml.common.network.simpleimpl.SimpleIndexedCodec.encodeInto(SimpleIndexedCodec.java:30) at net.minecraftforge.fml.common.network.simpleimpl.SimpleIndexedCodec.encodeInto(SimpleIndexedCodec.java:26) at net.minecraftforge.fml.common.network.FMLIndexedMessageToMessageCodec.encode(FMLIndexedMessageToMessageCodec.java:73) at io.netty.handler.codec.MessageToMessageCodec$1.encode(MessageToMessageCodec.java:67) at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89) ... 22 more package com.leo.mobsuppressors.tileentity; import javax.annotation.Nullable; import com.leo.mobsuppressors.MobSuppressors; import com.leo.mobsuppressors.network.PacketRequestUpdateTower; import com.leo.mobsuppressors.network.PacketUpdateTower; import com.leo.mobsuppressors.network.PacketUpdateTowerHasNetherStar; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.ItemStackHandler; public class TileEntitySuppressionTower extends TileEntity { public ItemStackHandler itemStackHandler = new ItemStackHandler(1) { @Override protected void onContentsChanged(int slot) { if (!world.isRemote) { lastChangeTime = world.getTotalWorldTime(); MobSuppressors.network.sendToAllAround(new PacketUpdateTower(TileEntitySuppressionTower.this), new NetworkRegistry.TargetPoint(world.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 64)); } } }; public boolean hasNetherStar; public int netherStarUsesLeft; public long lastChangeTime; public TileEntitySuppressionTower() { this.hasNetherStar = false; this.netherStarUsesLeft = 0; } public void setHasNetherStar() { MobSuppressors.network.sendToAllAround(new PacketUpdateTowerHasNetherStar(this, true), new NetworkRegistry.TargetPoint(world.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 64)); } @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { compound.setTag("inventory", itemStackHandler.serializeNBT()); compound.setLong("lastChangeTime", lastChangeTime); compound.setBoolean("hasNetherStar", hasNetherStar); compound.setInteger("netherStarUsesLeft", netherStarUsesLeft); return super.writeToNBT(compound); } @Override public void readFromNBT(NBTTagCompound compound) { itemStackHandler.deserializeNBT(compound.getCompoundTag("inventory")); lastChangeTime = compound.getLong("lastChangeTime"); hasNetherStar = compound.getBoolean("hasNetherStar"); netherStarUsesLeft = compound.getInteger("netherStarUsesLeft"); super.readFromNBT(compound); } @Override public void onLoad() { if (world.isRemote) { MobSuppressors.network.sendToServer(new PacketRequestUpdateTower(this)); } } @Override public AxisAlignedBB getRenderBoundingBox() { return new AxisAlignedBB(getPos(), getPos().add(1, 2, 1)); } @Override public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) { return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing); } @Nullable @Override public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) { return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY ? (T)itemStackHandler : super.getCapability(capability, facing); } } package com.leo.mobsuppressors.network; import com.leo.mobsuppressors.tileentity.TileEntitySuppressionTower; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; public class PacketUpdateTowerHasNetherStar implements IMessage { public static class Handler implements IMessageHandler<PacketUpdateTowerHasNetherStar, IMessage> { @Override public IMessage onMessage(PacketUpdateTowerHasNetherStar message, MessageContext ctx) { Minecraft.getMinecraft().addScheduledTask(() -> { TileEntitySuppressionTower te = (TileEntitySuppressionTower)Minecraft.getMinecraft().world.getTileEntity(message.pos); te.hasNetherStar = message.hasNetherStar; te.lastChangeTime = message.lastChangeTime; }); return null; } } public boolean hasNetherStar; public BlockPos pos; public long lastChangeTime; public PacketUpdateTowerHasNetherStar(boolean hasNetherStar, BlockPos pos, long lastChangeTime) { this.pos = pos; this.lastChangeTime = lastChangeTime; } public PacketUpdateTowerHasNetherStar(TileEntitySuppressionTower te, boolean hasNetherStar) { this(hasNetherStar, te.getPos(), te.lastChangeTime); } public PacketUpdateTowerHasNetherStar() { } @Override public void fromBytes(ByteBuf buf) { buf.writeBoolean(hasNetherStar); buf.writeLong(pos.toLong()); buf.writeLong(lastChangeTime); } @Override public void toBytes(ByteBuf buf) { hasNetherStar = buf.readBoolean(); pos = BlockPos.fromLong(buf.readLong()); lastChangeTime = buf.readLong(); } } package com.leo.mobsuppressors.blocks; import com.leo.mobsuppressors.CreativeTab; import com.leo.mobsuppressors.tileentity.TileEntitySuppressionTower; import net.minecraft.block.Block; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; public class BlockSuppressionTower extends Block implements ITileEntityProvider { public BlockSuppressionTower(String unlocalisedName, String registryName) { super(Material.ROCK); this.setHardness(2); this.setUnlocalizedName(unlocalisedName); this.setRegistryName(registryName); this.setCreativeTab(CreativeTab.mobSuppressorCreativeTab); } public BlockSuppressionTower(Material materialIn) { super(materialIn); } @Override public boolean isOpaqueCube(IBlockState state) { return false; } @Override public boolean isFullCube(IBlockState state) { return false; } @Override public boolean isFullyOpaque(IBlockState state) { return false; } @Override public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntitySuppressionTower(); } @Override public void breakBlock(World world, BlockPos pos, IBlockState state) { super.breakBlock(world, pos, state); world.removeTileEntity(pos); TileEntitySuppressionTower tile = (TileEntitySuppressionTower)world.getTileEntity(pos); IItemHandler itemHandler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.NORTH); ItemStack stack = itemHandler.getStackInSlot(0); if (!stack.isEmpty()) { EntityItem item = new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), stack); world.spawnEntity(item); } } @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { TileEntitySuppressionTower TEST = (TileEntitySuppressionTower)world.getTileEntity(pos); IItemHandler itemHandler = TEST.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side); if (player.getHeldItem(hand).isEmpty()) { player.setHeldItem(hand, itemHandler.extractItem(0, 64, false)); } else if (player.getHeldItem(hand).getItem() == Items.NETHER_STAR) { if (!TEST.hasNetherStar) { player.getHeldItem(hand).shrink(1); TEST.setHasNetherStar(); } } else { player.setHeldItem(hand, itemHandler.insertItem(0, player.getHeldItem(hand), false)); } TEST.markDirty(); } return true; } }
-
But the Nether Star isn't part of the inventory, it is stored as a boolean. Are you saying that I should be storing the Star in an inventory slot?
-
Could you point me to a tutorial for using IModel?
-
Block models can't be dynamic. I need a TESR because there is no way of knowing what item will be in the pedestal.
-
How else will I render 3d items?
-
package com.leo.mobsuppressors.network; import com.leo.mobsuppressors.tileentity.TileEntitySuppressionTower; import io.netty.buffer.ByteBuf; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; public class PacketRequestUpdateTower implements IMessage { public static class Handler implements IMessageHandler<PacketRequestUpdateTower, PacketUpdateTower> { @Override public PacketUpdateTower onMessage(PacketRequestUpdateTower message, MessageContext ctx) { World world = FMLCommonHandler.instance().getMinecraftServerInstance().worldServerForDimension(message.dimension); TileEntitySuppressionTower te = (TileEntitySuppressionTower)world.getTileEntity(message.pos); if (te != null) { return new PacketUpdateTower(te); } else { return null; } } } private BlockPos pos; private int dimension; public PacketRequestUpdateTower(BlockPos pos, int dimension) { this.pos = pos; this.dimension = dimension; } public PacketRequestUpdateTower(TileEntitySuppressionTower te) { this(te.getPos(), te.getWorld().provider.getDimension()); } public PacketRequestUpdateTower() { } @Override public void toBytes(ByteBuf buf) { buf.writeLong(pos.toLong()); buf.writeInt(dimension); } @Override public void fromBytes(ByteBuf buf) { pos = BlockPos.fromLong(buf.readLong()); dimension = buf.readInt(); } } package com.leo.mobsuppressors.network; import com.leo.mobsuppressors.tileentity.TileEntitySuppressionPedestal; import com.leo.mobsuppressors.tileentity.TileEntitySuppressionTower; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; public class PacketUpdateTower implements IMessage { public static class Handler implements IMessageHandler<PacketUpdateTower, IMessage> { @Override public IMessage onMessage(PacketUpdateTower message, MessageContext ctx) { Minecraft.getMinecraft().addScheduledTask(() -> { TileEntitySuppressionTower te = (TileEntitySuppressionTower)Minecraft.getMinecraft().world.getTileEntity(message.pos); te.itemStackHandler.setStackInSlot(0, message.stack); te.lastChangeTime = message.lastChangeTime; }); return null; } } private BlockPos pos; private ItemStack stack; private long lastChangeTime; public PacketUpdateTower(BlockPos pos, ItemStack stack, long lastChangeTime) { this.pos = pos; this.stack = stack; this.lastChangeTime = lastChangeTime; } public PacketUpdateTower(TileEntitySuppressionTower te) { this(te.getPos(), te.itemStackHandler.getStackInSlot(0), te.lastChangeTime); } public PacketUpdateTower() { } @Override public void toBytes(ByteBuf buf) { buf.writeLong(pos.toLong()); ByteBufUtils.writeItemStack(buf, stack); buf.writeLong(lastChangeTime); } @Override public void fromBytes(ByteBuf buf) { pos = BlockPos.fromLong(buf.readLong()); stack = ByteBufUtils.readItemStack(buf); lastChangeTime = buf.readLong(); } }
-
Do I need to use a separate packet to the one that syncs the inventory?