Posted December 5, 201410 yr hi, I'm adding a button to my furnace which has functionality to act as an activator (such as a button on and off), however as the gui is in the client side I have no way to get the server TileEntity to change it, I do not know how I can do this by client, already tried using Conteiner.detectAndSendChanges () to try to update the TileEntity on 2 sides did not have more success (it seems that only works the server to the client not the reverse). follows my code of gui and container: package teste; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.inventory.SlotFurnace; import net.minecraft.item.ItemStack; public class InductionFurnaceContainer extends Container { private InductionFurnaceTileEntity tileEntity; public int lastBurnTime; public int lastItemBurnTime; public int[] lastCookTime = new int[5]; // the flag of my button control public int lastPowerFlag; public InductionFurnaceContainer(InventoryPlayer ivPlayer, InductionFurnaceTileEntity tileEntity) { this.tileEntity = tileEntity; // cria os slots em relação do numero do slot com a sua posição na gui // 0-4 - stocks // 5-9 - place // 11-4 - result for (int i = 0; i < 5; i++) { addSlotToContainer(new Slot(tileEntity, InductionFurnaceTileEntity.INGREDIENT_STOCK[i], 42, 25 + (18 * i))); addSlotToContainer(new InductionFurnaceLockedSlot(tileEntity, InductionFurnaceTileEntity.INGREDIENT_PLACE[i], 120, 25 + (18 * i))); addSlotToContainer(new SlotFurnace(ivPlayer.player, tileEntity, InductionFurnaceTileEntity.RESULT[i], 198, 25 + (18 * i))); } // 15 - fuel addSlotToContainer(new Slot(tileEntity, InductionFurnaceTileEntity.FUEL_PLACE, 120, 135)); // 16-43 Player inventory back // 44-52 Player inventory hand int i; for (i = 0; i < 3; ++i) { for (int j = 0; j < 9; ++j) { this.addSlotToContainer(new Slot(ivPlayer, j + (i * 9) + 9, 48 + (18 * j), 175 + (18 * i))); } } for (i = 0; i < 9; ++i) { this.addSlotToContainer(new Slot(ivPlayer, i, 48 + (18 * i), 233)); } } // ids : // 0-4 cookTime[] // 5 burnTime; // 6 currentItemBurnTime @Override public void addCraftingToCrafters(ICrafting iCraftting) { System.out.println("add"); super.addCraftingToCrafters(iCraftting); for (int i = 0; i < 5; i++) { iCraftting.sendProgressBarUpdate(this, i, tileEntity.cookTime[i]); } iCraftting.sendProgressBarUpdate(this, 5, tileEntity.burnTime); iCraftting.sendProgressBarUpdate(this, 6, tileEntity.currentItemBurnTime); iCraftting.sendProgressBarUpdate(this, 7, tileEntity.powerFlag ? 1 : 0); } // public void addPowerFlagToCraftters(ICrafting iCraftting) { // super.addCraftingToCrafters(iCraftting); // iCraftting.sendProgressBarUpdate(this, 7, tileEntity.powerFlag ? 1 : 0); // } @Override // quanda a gui ativada, constantemente detecta mudança e caso haja alguma, // chama update no client public void detectAndSendChanges() { super.detectAndSendChanges(); System.out.println("detect :" + tileEntity.powerFlag); // eu acho que se refere a cada player que tem ativo o bloco for (int ic = 0; ic < crafters.size(); ic++) { ICrafting iCraftting = (ICrafting) crafters.get(ic); for (int i = 0; i < 5; i++) { if (lastCookTime[i] != tileEntity.cookTime[i]) { iCraftting.sendProgressBarUpdate(this, i, tileEntity.cookTime[i]); } } if (lastBurnTime != tileEntity.burnTime) { iCraftting.sendProgressBarUpdate(this, 5, tileEntity.burnTime); } if (lastItemBurnTime != tileEntity.currentItemBurnTime) { iCraftting.sendProgressBarUpdate(this, 6, tileEntity.currentItemBurnTime); } boolean b = lastPowerFlag == 1 ? true : false; if (b != tileEntity.powerFlag) { iCraftting.sendProgressBarUpdate(this, 7, tileEntity.powerFlag ? 1 : 0); } } lastCookTime = tileEntity.cookTime.clone(); lastBurnTime = tileEntity.burnTime; lastItemBurnTime = tileEntity.currentItemBurnTime; lastPowerFlag = tileEntity.powerFlag ? 1 : 0; } // no client e recebidos os valores atualizados do tileentity do server @Override public void updateProgressBar(int varId, int newValue) { System.out.println("update"); if (varId >= 0 && varId <= 4) { tileEntity.cookTime[varId] = newValue; } if (varId == 5) tileEntity.burnTime = newValue; if (varId == 6) tileEntity.currentItemBurnTime = newValue; if (varId == 7) tileEntity.powerFlag = newValue == 1 ? true : false; } @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot) { return null; } @Override public boolean canInteractWith(EntityPlayer player) { return tileEntity.isUseableByPlayer(player); } } package teste; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; public class InductionFurnaceGui extends GuiContainer { public static final ResourceLocation texture = new ResourceLocation( testemod.MODID, "textures/gui/InductionFurnaceGui.png"); public static final ResourceLocation addons = new ResourceLocation( testemod.MODID, "textures/gui/InductionFurnaceAddons.png"); public InductionFurnaceTileEntity tileEntity; // public InductionFurnaceContainer container; public InductionFurnaceGui(InventoryPlayer ivPlayer, InductionFurnaceTileEntity tileEntity) { super(new InductionFurnaceContainer(ivPlayer, tileEntity)); this.tileEntity = tileEntity; this.xSize = 256; this.ySize = 256; } @Override protected void drawGuiContainerForegroundLayer(int par1, int par2) { String name = tileEntity.isInvNameLocalized() ? tileEntity.getInvName() : I18n.format(tileEntity.getInvName(), new Object[0]); String inventoryName = I18n .format("container.inventory", new Object[0]); fontRendererObj.drawString(name, xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 13, 4210752); fontRendererObj.drawString(inventoryName, xSize / 2 - this.fontRendererObj.getStringWidth(inventoryName) / 2, 163 - 8, 4210752); } @Override protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1F, 1F, 1F, 1F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); Minecraft.getMinecraft().getTextureManager().bindTexture(addons); if (tileEntity.isBurning()) { drawTexturedModalRect(guiLeft + 120, guiTop + 25, 0, 0, 16, 88); int k = this.tileEntity.getBurnTimeRemainingScaled(29); drawTexturedModalRect(guiLeft + 114, guiTop + 119, 16, 0, k + 1, 10); } for (int i = 0; i < 5; i++) { int k = tileEntity.getCookProgressScaled(10, i); drawTexturedModalRect(guiLeft + 137, guiTop + 38 + (18 * i) - (k + 1), 16, 20 - (k + 1), 1, k + 1); } } public void initGui() { super.initGui(); this.buttonList.add(new customButton(0, guiLeft + 15, guiTop + 15, 16, 16, "no use")); } @Override protected void actionPerformed(GuiButton button) { switch (button.id) { case 0: System.out.println("clique detect"); tileEntity.powerFlag = !tileEntity.powerFlag; inventorySlots.detectAndSendChanges(); } } }
December 5, 201410 yr The container is only used to synchronise the client with the server. For buttons you will need a packet handler. Its very easy to set one up just follow this tutorial. http://www.minecraftforge.net/forum/index.php/topic,20135.0.html I am the author of Draconic Evolution
December 5, 201410 yr Author hey, had no idea that there was this feature, I will try to develop something with it and say if able, thank you for help friend = b.
December 5, 201410 yr Author hello again, follow the tutorial that showed me and creates a code but I'm having trouble, he is returning me excpetion. below is the code and the result of the console: IMessage package teste; import io.netty.buffer.ByteBuf; import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.common.network.simpleimpl.IMessage; public class InductionFurnacePowerPacket implements IMessage { public static final String POWER_SWITCH_MSG = "0"; public String text; public InductionFurnacePowerPacket(String text) { this.text = text; } @Override public void fromBytes(ByteBuf buf) { text = ByteBufUtils.readUTF8String(buf); } @Override public void toBytes(ByteBuf buf) { ByteBufUtils.writeUTF8String(buf, text); } } IMessageHandler (its my TileEntity so i will show onMessage) : @Override public IMessage onMessage(InductionFurnacePowerPacket message, MessageContext ctx) { System.out.println(String.format("Received %s from %s", message.text, ctx.getServerHandler().playerEntity.getDisplayName())); if (message.text == InductionFurnacePowerPacket.POWER_SWITCH_MSG) { powerFlag = !powerFlag; } return null; } init() networkWrapper = NetworkRegistry.INSTANCE.newSimpleChannel("myChannel"); networkWrapper.registerMessage(InductionFurnaceTileEntity.class, InductionFurnacePowerPacket.class, 0, Side.SERVER); actionPerformed (send packet): @Override protected void actionPerformed(GuiButton button) { switch (button.id) { case 0: System.out.println("clique detect"); testemod.networkWrapper .sendToServer(new InductionFurnacePowerPacket( InductionFurnacePowerPacket.POWER_SWITCH_MSG)); } } the exception [02:25:29] [server thread/ERROR] [FML]: FMLIndexedMessageCodec exception caught io.netty.handler.codec.DecoderException: java.lang.InstantiationException: teste.InductionFurnacePowerPacket at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?] at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?] at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?] at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?] at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?] at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) [integratedServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?] Caused by: java.lang.InstantiationException: teste.InductionFurnacePowerPacket at java.lang.Class.newInstance(Unknown Source) ~[?:1.7.0_45] at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:75) ~[FMLIndexedMessageToMessageCodec.class:?] at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17) ~[FMLIndexedMessageToMessageCodec.class:?] at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:?] at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:?] ... 13 more [02:25:29] [server thread/ERROR] [FML]: SimpleChannelHandlerWrapper exception io.netty.handler.codec.DecoderException: java.lang.InstantiationException: teste.InductionFurnacePowerPacket at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?] at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?] at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?] at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?] at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?] at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) [integratedServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?] Caused by: java.lang.InstantiationException: teste.InductionFurnacePowerPacket at java.lang.Class.newInstance(Unknown Source) ~[?:1.7.0_45] at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:75) ~[FMLIndexedMessageToMessageCodec.class:?] at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17) ~[FMLIndexedMessageToMessageCodec.class:?] at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:?] at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:?] ... 13 more [02:25:29] [server thread/ERROR] [FML]: There was a critical exception handling a packet on channel myChannel io.netty.handler.codec.DecoderException: java.lang.InstantiationException: teste.InductionFurnacePowerPacket at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?] at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) ~[DefaultChannelPipeline.class:?] at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) ~[EmbeddedChannel.class:?] at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?] at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?] at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) [integratedServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?] Caused by: java.lang.InstantiationException: teste.InductionFurnacePowerPacket at java.lang.Class.newInstance(Unknown Source) ~[?:1.7.0_45] at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:75) ~[FMLIndexedMessageToMessageCodec.class:?] at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17) ~[FMLIndexedMessageToMessageCodec.class:?] at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:?] at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:?] ... 13 more what am I doing wrong?
December 5, 201410 yr Your IMessage implantation needs to have a no-args constructor. BEFORE ASKING FOR HELP READ THE EAQ! I'll help if I can. Apologies if I do something obviously stupid. If you don't know basic Java yet, go and follow these tutorials.
December 5, 201410 yr Author exact, before I was using TileEntity to implement iMessage, but he has a constructor with arguments, then i made following the example of the inner class and got = b. thanks for listening
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.