Jump to content

TilEntity won't save my Information


Stjubit

Recommended Posts

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:

 

0aOKFP6.png

 

 

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

Link to comment
Share on other sites

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 :)

Link to comment
Share on other sites

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..

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.