Posted July 16, 201510 yr Hello, it's me again with another problem So, i startet a new project which can save and edit a frequency in a GUI. Here is a screenshot of it, so that you know what i'm doing here: In the game, everything works perfect. I can increase/decrease the frequency and when i close the GUI and open it again, the frequency is still there, but when I go out of the world (not the game) and go in again, the frequency is 0, again. However, the frequency is not getting saved or not getting load correctly. Here is my Block-class: public class WirelessReceiver extends Block implements ITileEntityProvider { public WirelessReceiver(Material material) { super(material); setBlockName("WirelessReceiver"); setCreativeTab(ControlCraft.ccTab); setBlockTextureName(Constants.MODID+":wireless_receiver"); setHardness(1.0f); } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer ep, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_) { if(world.isRemote) return true; TileEntity te = world.getTileEntity(x,y,z); if(te != null && te instanceof WirelessReceiverTileEntity) { ep.openGui(ControlCraft.INSTANCE,Constants.WIRELESS_RECEIVER_GUI_ID,world,x,y,z); } return true; } @Override public TileEntity createNewTileEntity(World world, int meta) { return new WirelessReceiverTileEntity(); } @Override public boolean hasTileEntity(int metadata) { return true; } Here is my TileEntity-class: public class WirelessReceiverTileEntity extends TileEntity { int frequency=0; public WirelessReceiverTileEntity() { } public void setFrequency(int frequency) { this.frequency = frequency; this.markForUpdate(); } public int getFrequency() { return frequency; } public void markForUpdate() { this.worldObj.markBlockForUpdate(xCoord,yCoord,zCoord); this.markDirty(); } @Override public void writeToNBT(NBTTagCompound nbtTagCompound) { super.writeToNBT(nbtTagCompound); nbtTagCompound.setInteger("Frequency",frequency); } @Override public void readFromNBT(NBTTagCompound nbtTagCompound) { super.readFromNBT(nbtTagCompound); frequency = nbtTagCompound.getInteger("Frequency"); } } Here is my GuiContainer: public class WirelessReceiverGuiContainer extends GuiContainer { ResourceLocation resourceLocation = new ResourceLocation(Constants.MODID+":textures/guis/wireless_receiver_gui_bg.png"); WirelessReceiverTileEntity wrte; // Widgets GuiTextField tfFrequency; GuiButton btIncreaseByOne; GuiButton btIncreaseByTen; GuiButton btIncreaseByHundred; GuiButton btDecreaseByOne; GuiButton btDecreaseByTen; GuiButton btDecreaseByHundred; GuiButton btSet; public WirelessReceiverGuiContainer(WirelessReceiverTileEntity wrte, EntityPlayer ep) { super(new WirelessReceiverContainer(wrte, ep)); this.wrte = wrte; xSize = 256; ySize = 57; } @Override public void initGui() { super.initGui(); // TextFields int tfWidth = 60; int tfHeight=20; int tfX = (xSize/2)-(tfWidth/2); int tfY = 7; tfFrequency = new GuiTextField(fontRendererObj, tfX, tfY,tfWidth,tfHeight); tfFrequency.setText(wrte.getFrequency()+""); tfFrequency.setFocused(true); tfFrequency.setMaxStringLength(4); Keyboard.enableRepeatEvents(true); // Buttons (id, x, y, w, h, txt) int btIncOneWidth = 20; int btIncTenWidth = 25; int btIncHundredWith = 30; int btDecOneWidth = 20; int btDecTenWidth = 25; int btDecHundredWidth = 30; int btnHeight = 20; int btnMargin = 5; int widthSum = btIncOneWidth+btIncTenWidth+btIncHundredWith+btDecOneWidth+btDecTenWidth+btDecHundredWidth+5*btnMargin; int btnY = (height/2-ySize/2)+btnMargin+tfHeight+btnMargin; int btDecHundredX = (width-widthSum)/2-(btDecHundredWidth/2); btDecreaseByHundred = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_HUNDRED_ID, btDecHundredX,btnY,btDecHundredWidth,btnHeight,"-100"); int btDecTenX = btDecHundredX+btDecHundredWidth+btnMargin; btDecreaseByTen = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_TEN_ID, btDecTenX,btnY,btDecTenWidth,btnHeight,"-10"); int btDecOneX = btDecTenX+btDecTenWidth+btnMargin; btDecreaseByOne = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_ONE_ID, btDecOneX,btnY,btDecOneWidth,btnHeight,"-1"); int btIncOneX = btDecOneX+btDecOneWidth+btnMargin; btIncreaseByOne = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_ONE_ID, btIncOneX,btnY,btIncOneWidth,btnHeight,"+1"); int btIncTenX = btIncOneX+btIncOneWidth+btnMargin; btIncreaseByTen = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_TEN_ID, btIncTenX,btnY,btIncTenWidth,btnHeight,"+10"); int btIncHundredX = btIncTenX+btIncTenWidth+btnMargin; btIncreaseByHundred = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_HUNDRED_ID, btIncHundredX,btnY,btIncHundredWith,btnHeight,"+100"); int btSetWidth = 30; int btSetMargin = 10; int btSetX = (width/2)+(xSize/2)-btSetWidth-btSetMargin; btSet = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_SET_ID,btSetX,btnY,btSetWidth,btnHeight,"Set"); buttonList.add(btIncreaseByOne); buttonList.add(btIncreaseByTen); buttonList.add(btIncreaseByHundred); buttonList.add(btDecreaseByOne); buttonList.add(btDecreaseByTen); buttonList.add(btDecreaseByHundred); buttonList.add(btSet); } @Override protected void keyTyped(char c, int keyCode) { if(c>=48 && c<=57 || c==8 || c==45 || c==43) { tfFrequency.textboxKeyTyped(c, keyCode); } super.keyTyped(c, keyCode); } @Override public void updateScreen() { tfFrequency.updateCursorCounter(); super.updateScreen(); } @Override protected void actionPerformed(GuiButton gb) { switch(gb.id) { case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_ONE_ID: increaseFrequency(1); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_TEN_ID: increaseFrequency(10); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_HUNDRED_ID: increaseFrequency(100); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_ONE_ID: increaseFrequency(-1); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_TEN_ID: increaseFrequency(-10); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_HUNDRED_ID: increaseFrequency(-100); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_SET_ID: onBtnSet(); } super.actionPerformed(gb); } /** * Increases or Decreases the Frequency-GuiTextField * @param amt Factor */ public void increaseFrequency(int amt) { String text = tfFrequency.getText(); if(text=="") { tfFrequency.setText(amt+""); } else { int zahl = Integer.parseInt(text)+amt; tfFrequency.setText(zahl+""); } } public void onBtnSet() { String text = tfFrequency.getText(); if(!text.equals("")) { int frequency = Integer.parseInt(text); wrte.setFrequency(frequency); this.mc.thePlayer.closeScreen(); } } @Override protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { mc.renderEngine.bindTexture(resourceLocation); GL11.glColor4f(1.0f,1.0f,1.0f,1.0f); int bgX = width/2-128; int bgY = height/2-28; this.drawTexturedModalRect(bgX, bgY, 0, 0, 256, 57); } @Override protected void drawGuiContainerForegroundLayer(int p_146979_1_, int p_146979_2_) { super.drawGuiContainerForegroundLayer(p_146979_1_, p_146979_2_); tfFrequency.drawTextBox(); } } Here is my GuiHandler: public class WirelessReceiverGuiContainer extends GuiContainer { ResourceLocation resourceLocation = new ResourceLocation(Constants.MODID+":textures/guis/wireless_receiver_gui_bg.png"); WirelessReceiverTileEntity wrte; // Widgets GuiTextField tfFrequency; GuiButton btIncreaseByOne; GuiButton btIncreaseByTen; GuiButton btIncreaseByHundred; GuiButton btDecreaseByOne; GuiButton btDecreaseByTen; GuiButton btDecreaseByHundred; GuiButton btSet; public WirelessReceiverGuiContainer(WirelessReceiverTileEntity wrte, EntityPlayer ep) { super(new WirelessReceiverContainer(wrte, ep)); this.wrte = wrte; xSize = 256; ySize = 57; } @Override public void initGui() { super.initGui(); // TextFields int tfWidth = 60; int tfHeight=20; int tfX = (xSize/2)-(tfWidth/2); int tfY = 7; tfFrequency = new GuiTextField(fontRendererObj, tfX, tfY,tfWidth,tfHeight); tfFrequency.setText(wrte.getFrequency()+""); tfFrequency.setFocused(true); tfFrequency.setMaxStringLength(4); Keyboard.enableRepeatEvents(true); // Buttons (id, x, y, w, h, txt) int btIncOneWidth = 20; int btIncTenWidth = 25; int btIncHundredWith = 30; int btDecOneWidth = 20; int btDecTenWidth = 25; int btDecHundredWidth = 30; int btnHeight = 20; int btnMargin = 5; int widthSum = btIncOneWidth+btIncTenWidth+btIncHundredWith+btDecOneWidth+btDecTenWidth+btDecHundredWidth+5*btnMargin; int btnY = (height/2-ySize/2)+btnMargin+tfHeight+btnMargin; int btDecHundredX = (width-widthSum)/2-(btDecHundredWidth/2); btDecreaseByHundred = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_HUNDRED_ID, btDecHundredX,btnY,btDecHundredWidth,btnHeight,"-100"); int btDecTenX = btDecHundredX+btDecHundredWidth+btnMargin; btDecreaseByTen = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_TEN_ID, btDecTenX,btnY,btDecTenWidth,btnHeight,"-10"); int btDecOneX = btDecTenX+btDecTenWidth+btnMargin; btDecreaseByOne = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_ONE_ID, btDecOneX,btnY,btDecOneWidth,btnHeight,"-1"); int btIncOneX = btDecOneX+btDecOneWidth+btnMargin; btIncreaseByOne = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_ONE_ID, btIncOneX,btnY,btIncOneWidth,btnHeight,"+1"); int btIncTenX = btIncOneX+btIncOneWidth+btnMargin; btIncreaseByTen = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_TEN_ID, btIncTenX,btnY,btIncTenWidth,btnHeight,"+10"); int btIncHundredX = btIncTenX+btIncTenWidth+btnMargin; btIncreaseByHundred = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_HUNDRED_ID, btIncHundredX,btnY,btIncHundredWith,btnHeight,"+100"); int btSetWidth = 30; int btSetMargin = 10; int btSetX = (width/2)+(xSize/2)-btSetWidth-btSetMargin; btSet = new GuiButton(Constants.WIRELESS_RECEIVER_GUI_BTN_SET_ID,btSetX,btnY,btSetWidth,btnHeight,"Set"); buttonList.add(btIncreaseByOne); buttonList.add(btIncreaseByTen); buttonList.add(btIncreaseByHundred); buttonList.add(btDecreaseByOne); buttonList.add(btDecreaseByTen); buttonList.add(btDecreaseByHundred); buttonList.add(btSet); } @Override protected void keyTyped(char c, int keyCode) { if(c>=48 && c<=57 || c==8 || c==45 || c==43) { tfFrequency.textboxKeyTyped(c, keyCode); } super.keyTyped(c, keyCode); } @Override public void updateScreen() { tfFrequency.updateCursorCounter(); super.updateScreen(); } @Override protected void actionPerformed(GuiButton gb) { switch(gb.id) { case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_ONE_ID: increaseFrequency(1); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_TEN_ID: increaseFrequency(10); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_INCR_HUNDRED_ID: increaseFrequency(100); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_ONE_ID: increaseFrequency(-1); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_TEN_ID: increaseFrequency(-10); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_DECR_HUNDRED_ID: increaseFrequency(-100); break; case Constants.WIRELESS_RECEIVER_GUI_BTN_SET_ID: onBtnSet(); } super.actionPerformed(gb); } /** * Increases or Decreases the Frequency-GuiTextField * @param amt Factor */ public void increaseFrequency(int amt) { String text = tfFrequency.getText(); if(text=="") { tfFrequency.setText(amt+""); } else { int zahl = Integer.parseInt(text)+amt; tfFrequency.setText(zahl+""); } } public void onBtnSet() { String text = tfFrequency.getText(); if(!text.equals("")) { int frequency = Integer.parseInt(text); wrte.setFrequency(frequency); this.mc.thePlayer.closeScreen(); } } @Override protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { mc.renderEngine.bindTexture(resourceLocation); GL11.glColor4f(1.0f,1.0f,1.0f,1.0f); int bgX = width/2-128; int bgY = height/2-28; this.drawTexturedModalRect(bgX, bgY, 0, 0, 256, 57); } @Override protected void drawGuiContainerForegroundLayer(int p_146979_1_, int p_146979_2_) { super.drawGuiContainerForegroundLayer(p_146979_1_, p_146979_2_); tfFrequency.drawTextBox(); } } Finally, here is my Container: (I don't know if I need this class, but i implemented it) public class WirelessReceiverContainer extends Container { public WirelessReceiverContainer(WirelessReceiverTileEntity wrte, EntityPlayer ep) { } @Override public boolean canInteractWith(EntityPlayer entityPlayer) { return true; } } I registered my TileEntity in my CommonProxy-class as followed: (registerTileEntities() gets called in the FMLInitializationEvent-method) public void registerTileEntites() { GameRegistry.registerTileEntity(WirelessReceiverTileEntity.class,"WirelessReceiverTileEntity"); } I hope that anybody takes the time to read through this. I would really appreciate this. Thanks, Julian
July 16, 201510 yr Author Thank you for your answer! This is how i made it for now: PacketHandler: public static class WirelessReceiverPacketHandler implements IMessageHandler<WirelessReceiverPacket, IMessage> { @Override public IMessage onMessage(WirelessReceiverPacket message, MessageContext ctx) { Container con = ctx.getServerHandler().playerEntity.openContainer; if(con != null && con instanceof WirelessReceiverContainer) { ((WirelessReceiverContainer)con).setFrequency(message.frequency); } return null; } } The frequency is now changed to the frequency I got from the packet, but it would be strange if I wouldn't have got another problem The next time I open my WirelessReceiverGUI, the frequency is 0 again. Could it be, that the TileEntity is created every time I do right-click on my WirelessReceiverBlock? Because then, I would need to store my frequency-variable anywhere else. PS: I removed the initialization =0 in the TileEntity-class. Would be nice if you could help me again
July 16, 201510 yr Author So I need to create a new ClientPacket like this: snw.registerMessage(WirelessReceiverGuiPacket.WirelessReceiverGuiPacketHandler.class,WirelessReceiverGuiPacket.class,1,Side.CLIENT); ...and implement it like this (more or less): package at.stjubit.ControlCraft.packets; import at.stjubit.ControlCraft.utilities.Constants; import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import io.netty.buffer.ByteBuf; /** * Created by kauju_000 on 16.07.2015. */ public class WirelessReceiverGuiPacket implements IMessage { int frequency; public WirelessReceiverGuiPacket() {} public WirelessReceiverGuiPacket(int frequency) { this.frequency = frequency; } @Override public void fromBytes(ByteBuf buf) { frequency = ByteBufUtils.readVarInt(buf, 4); } @Override public void toBytes(ByteBuf buf) { ByteBufUtils.writeVarInt(buf,frequency,4); } public static class WirelessReceiverGuiPacketHandler implements IMessageHandler<WirelessReceiverGuiPacket, IMessage> { @Override public IMessage onMessage(WirelessReceiverGuiPacket message, MessageContext ctx) { return null; } } } ...and open the GUI like this: ep.openGui(ControlCraft.INSTANCE,Constants.WIRELESS_RECEIVER_GUI_ID,world,x,y,z); ControlCraft.snw.sendTo(new WirelessReceiverGuiPacket(((WirelessReceiverTileEntity) te).getFrequency()), (EntityPlayerMP) ep); Next problem (of course): How can I get the GuiContainer to update the frequency in the onMessage()-method? I am stupid, sry..
July 16, 201510 yr Author Thank you sooooooooo much. I would like to give you more than a Thanks in this forum For everyone who has the same / will have the same problem like me, this is how i did it: Insert an empty method in your CommonProxy-class like this: public void updateWirelessReceiveGuiFrequency(int frequency) { } ...and overwrite the method in your ClientProxy like this: @Override public void updateWirelessReceiveGuiFrequency(int frequency) { super.updateWirelessReceiveGuiFrequency(frequency); GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen; if(guiScreen instanceof WirelessReceiverGuiContainer) { ((WirelessReceiverGuiContainer) guiScreen).updateFrequency(frequency); } } ...and call this method from your onMessage-method: @Override public IMessage onMessage(WirelessReceiverGuiPacket message, MessageContext ctx) { ControlCraft.PROXY.updateWirelessReceiveGuiFrequency(message.frequency); return null; } ...send the packet after your Gui has been opened: ControlCraft.snw.sendTo(new WirelessReceiverGuiPacket(((WirelessReceiverTileEntity) te).getFrequency()), (EntityPlayerMP) ep); That's all! I know diesieben07, that this question has been asked a few times to you, but I want to know it. How have you learned something like this? I haven't seen any Tutorials about things like that. Thanks for your help, Julian
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.