Jump to content

[1.12.2] Need help with packets in a machine GUI


MayusYT

Recommended Posts

HI! I started Forge modding a few weeks ago and I'm stuck at understanding the packets I have to use when e.g. clicking on a button on a GUI of a block. Let's choose an enable/disable button for this example. The button will change its texture whether the machine is enabled or not. So I understand that I have to send a packet from the GUI click "listener" that has to change my boolean "enabled" in my tile class. But when you open the GUI, you should see whether the machine is enabled or not. How do I do the communication between the server and the client? I heard that sending a packet is unnecessary.

 

 

Thank you very much in advance!

Link to comment
Share on other sites

15 hours ago, MayusYT said:

HI! I started Forge modding a few weeks ago and I'm stuck at understanding the packets I have to use when e.g. clicking on a button on a GUI of a block. Let's choose an enable/disable button for this example. The button will change its texture whether the machine is enabled or not. So I understand that I have to send a packet from the GUI click "listener" that has to change my boolean "enabled" in my tile class. But when you open the GUI, you should see whether the machine is enabled or not. How do I do the communication between the server and the client? I heard that sending a packet is unnecessary.

 

 

Thank you very much in advance!

Ive just used my container class to get the tile entity into the gui. Using:

container.tileEntity.variables

 I just grab the variables I need straight from the tile entity. Not sure if this is the most correct way to do it but it works on both logical and physical servers with no issue.

  • Like 1
Link to comment
Share on other sites

Thanks for your answers!

2 hours ago, diesieben07 said:

You can use the vanilla container mechanics for simple values (number 0-65535), look at e.g. ContainerFurnace for example.

Otherwise you need to send your own packets from server to client as well.

Do you mean detectAndSendChanges()?

A dev of EnderCore gave me this snippet: https://github.com/SleepyTrousers/EnderCore/blob/1.12/src/main/java/com/enderio/core/common/ContainerEnderCap.java#L260

 

I copied the code into my container class but it still doesnt work. 

 

thanks!

 

PS: I distinguish the guis by checking whether the boolean in the tileentity class is true or false.

 

EDIT: Here is my code, might help:

Folder of my block (contains the important files):

https://github.com/MayusYT/ZPM-Mod/tree/master/src/main/java/mayus/zpmmod/blockControllerLarge

(the click handler is in guicontrollerlarge)

Edited by MayusYT
Link to comment
Share on other sites

6 minutes ago, diesieben07 said:

That snippet is not a magic fix for all your problems. In general, please don't just copy pieces of code without understanding what they do.

 

You can send two short values in Container#detectAndSendChanges using IContainerListener#sendWindowProperty, one named varToUpdate, one named newValue. Both can be whatever value you want, they will arrive as-is on the client in Container#updateProgressBar.

Look at ContainerFurnace for an example.

 

Alternatively you can send whatever packet you want in detectAndSendChanges.

Thanks for your answer. I‘ll have a look at ContainerFurnace but I think sending my own packet would be better (and easier) because I want toupdate multiple Values in the future.

 

I‘ll keep you updated!

 

thanks again!

Edited by MayusYT
Link to comment
Share on other sites

4 hours ago, diesieben07 said:

The vanilla system can handle multiple values just fine. In fact, ContainerFurnace does just that.

I added a second value but it doesn't seem to work anymore. This is my current code:
 

/**
     * A bit of a hack, but with Container#updateProgressBar you don't have to send a custom packet
     */
    @Override
    public void updateProgressBar(int id, int data) {
        if(id == 5) {
            isEnabled = data != 0;
        }
        if(id == 6) {
            redstoneBehaviour = data;
        }
    }

    @Override
    public void detectAndSendChanges() {
        super.detectAndSendChanges();

        for (IContainerListener containerListener : listeners) {
            if (containerListener instanceof EntityPlayerMP) {
                containerListener.sendWindowProperty(this, 5, te.isEnabled ? 1 : 0);
                containerListener.sendWindowProperty(this, 6, te.redstoneBehaviour);
            }
        }
    }

 

Link to comment
Share on other sites

Just now, diesieben07 said:
  • With your current behavior you are sending the values every tick, regardless of if they have changed or not. You need to compare them, like ContainerFurnace does.
  • Define "doesn't seem to work".
  • ok, I'm going to change that.
  • The value is set to a different value but is reset every time I click the button again.
Link to comment
Share on other sites

 

40 minutes ago, diesieben07 said:
  • With your current behavior you are sending the values every tick, regardless of if they have changed or not. You need to compare them, like ContainerFurnace does.
  • Define "doesn't seem to work".

 

By the way, this is the packet I send to the server:

public class PacketSetEnabled implements IMessage {

    // A default constructor is always required
    public PacketSetEnabled(){}

    @Override public void toBytes(ByteBuf buf) {}

    @Override public void fromBytes(ByteBuf buf) {}

    public static class Handler implements IMessageHandler<PacketSetEnabled, IMessage> {

        @Override public IMessage onMessage(PacketSetEnabled message, MessageContext ctx) {
            // This is the player the packet was sent to the server from
            EntityPlayerMP serverPlayer = ctx.getServerHandler().player;

            serverPlayer.getServerWorld().addScheduledTask(() -> {

                if (serverPlayer.openContainer instanceof ContainerControllerLarge) {
                    ContainerControllerLarge openContainer = (ContainerControllerLarge) serverPlayer.openContainer;
                    openContainer.te.isEnabled = openContainer.isEnabled;

                    if (openContainer.redstoneBehaviour == 0) {
                        openContainer.te.redstoneBehaviour = 1;
                    } else if (openContainer.redstoneBehaviour == 1) {
                        openContainer.te.redstoneBehaviour = 2;
                    } else {
                        openContainer.te.redstoneBehaviour = 0;
                    }
                    openContainer.te.markDirty();
                }
            });
            // No response packet
            return null;
        }
    }
}

 

Edited by MayusYT
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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I have no idea how a UI mod crashed a whole world but HUGE props to you man, just saved me +2 months of progress!  
    • So i know for a fact this has been asked before but Render stuff troubles me a little and i didnt find any answer for recent version. I have a custom nausea effect. Currently i add both my nausea effect and the vanilla one for the effect. But the problem is that when I open the inventory, both are listed, while I'd only want mine to show up (both in the inv and on the GUI)   I've arrived to the GameRender (on joined/net/minecraft/client) and also found shaders on client-extra/assets/minecraft/shaders/post and client-extra/assets/minecraft/shaders/program but I'm lost. I understand that its like a regular screen, where I'd render stuff "over" the game depending on data on the server, but If someone could point to the right client and server classes that i can read to see how i can manage this or any tip would be apreciated
    • Let me try and help you with love spells, traditional healing, native healing, fortune telling, witchcraft, psychic readings, black magic, voodoo, herbalist healing, or any other service your may desire within the realm of african native healing, the spirits and the ancestors. I am a sangoma and healer. I could help you to connect with the ancestors , interpret dreams, diagnose illness through divination with bones, and help you heal both physical and spiritual illness. We facilitate the deepening of your relationship to the spirit world and the ancestors. Working in partnership with one\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\’s ancestors is a gift representing a close link with the spirit realm as a mediator between the worlds.*   Witchdoctors, or sorcerers, are often purveyors of mutis and charms that cause harm to people. we believe that we are here for only one purpose, to heal through love and compassion.*   African people share a common understanding of the importance of ancestors in daily life. When they have lost touch with their ancestors, illness may result or bad luck. Then a traditional healer, or sangoma, is sought out who may prescribe herbs, changes in lifestyle, a career change, or changes in relationships. The client may also be told to perform a ceremony or purification ritual to appease the ancestors.*   Let us solve your problems using powerful African traditional methods. We believe that our ancestors and spirits give us enlightenment, wisdom, divine guidance, enabling us to overcome obstacles holding your life back. Our knowledge has been passed down through centuries, being refined along the way from generation to generation. We believe in the occult, the paranormal, the spirit world, the mystic world.*   The services here are based on the African Tradition Value system/religion,where we believe the ancestors and spirits play a very important role in society. The ancestors and spirits give guidance and counsel in society. They could enable us to see into the future and give solutions to the problems affecting us. We use rituals, divination, spells, chants and prayers to enable us tackle the task before us.*   I have experience in helping and guiding many people from all over the world. My psychic abilities may help you answer and resolve many unanswered questions
    • Let me try and help you with love spells, traditional healing, native healing, fortune telling, witchcraft, psychic readings, black magic, voodoo, herbalist healing, or any other service your may desire within the realm of african native healing, the spirits and the ancestors. I am a sangoma and healer. I could help you to connect with the ancestors , interpret dreams, diagnose illness through divination with bones, and help you heal both physical and spiritual illness. We facilitate the deepening of your relationship to the spirit world and the ancestors. Working in partnership with one\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\’s ancestors is a gift representing a close link with the spirit realm as a mediator between the worlds.*   Witchdoctors, or sorcerers, are often purveyors of mutis and charms that cause harm to people. we believe that we are here for only one purpose, to heal through love and compassion.*   African people share a common understanding of the importance of ancestors in daily life. When they have lost touch with their ancestors, illness may result or bad luck. Then a traditional healer, or sangoma, is sought out who may prescribe herbs, changes in lifestyle, a career change, or changes in relationships. The client may also be told to perform a ceremony or purification ritual to appease the ancestors.*   Let us solve your problems using powerful African traditional methods. We believe that our ancestors and spirits give us enlightenment, wisdom, divine guidance, enabling us to overcome obstacles holding your life back. Our knowledge has been passed down through centuries, being refined along the way from generation to generation. We believe in the occult, the paranormal, the spirit world, the mystic world.*   The services here are based on the African Tradition Value system/religion,where we believe the ancestors and spirits play a very important role in society. The ancestors and spirits give guidance and counsel in society. They could enable us to see into the future and give solutions to the problems affecting us. We use rituals, divination, spells, chants and prayers to enable us tackle the task before us.*   I have experience in helping and guiding many people from all over the world. My psychic abilities may help you answer and resolve many unanswered questions
    • Let me try and help you with love spells, traditional healing, native healing, fortune telling, witchcraft, psychic readings, black magic, voodoo, herbalist healing, or any other service your may desire within the realm of african native healing, the spirits and the ancestors. I am a sangoma and healer. I could help you to connect with the ancestors , interpret dreams, diagnose illness through divination with bones, and help you heal both physical and spiritual illness. We facilitate the deepening of your relationship to the spirit world and the ancestors. Working in partnership with one\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\’s ancestors is a gift representing a close link with the spirit realm as a mediator between the worlds.*   Witchdoctors, or sorcerers, are often purveyors of mutis and charms that cause harm to people. we believe that we are here for only one purpose, to heal through love and compassion.*   African people share a common understanding of the importance of ancestors in daily life. When they have lost touch with their ancestors, illness may result or bad luck. Then a traditional healer, or sangoma, is sought out who may prescribe herbs, changes in lifestyle, a career change, or changes in relationships. The client may also be told to perform a ceremony or purification ritual to appease the ancestors.*   Let us solve your problems using powerful African traditional methods. We believe that our ancestors and spirits give us enlightenment, wisdom, divine guidance, enabling us to overcome obstacles holding your life back. Our knowledge has been passed down through centuries, being refined along the way from generation to generation. We believe in the occult, the paranormal, the spirit world, the mystic world.*   The services here are based on the African Tradition Value system/religion,where we believe the ancestors and spirits play a very important role in society. The ancestors and spirits give guidance and counsel in society. They could enable us to see into the future and give solutions to the problems affecting us. We use rituals, divination, spells, chants and prayers to enable us tackle the task before us.*   I have experience in helping and guiding many people from all over the world. My psychic abilities may help you answer and resolve many unanswered questions
  • Topics

×
×
  • Create New...

Important Information

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