Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[SOLVED] [1.10.2] Sending a packet from server to client to open a GUI

Featured Replies

Posted

I am creating my custom GUI for a quiz mod and have run into some trouble.

When I right click my block to open up the quiz GUI, it opens nicely.

However when I try to open it using a command, it does not work.

After some googling, I have found that it is required to send a packet from the server to the client to inform it to open the GUI.

 

As such, I have implemented a SimpleNetworkWrapper as found in this tutorial.

 

I initialize my network wrapper within the FMLPreInitializationEvent with:

 

network = NetworkRegistry.INSTANCE.newSimpleChannel("GUIChannel");
network.registerMessage(MyMessage.Handler.class, MyMessage.class, 0, Side.SERVER);

 

Then from my command, I send the packet:

 

@Override
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
Main.network.sendTo(new MyMessage("ASDF"), (EntityPlayerMP) sender);

 

My Handler class attempts to open the gui:

 

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

        @Override
        public IMessage onMessage(MyMessage message, MessageContext ctx) {

            EntityPlayer player = ctx.getServerHandler().playerEntity;

            player.openGui(Main.INSTANCE, GUIHandler.TUTGUID, player.getEntityWorld(), player.getPosition().getX(),
                    player.getPosition().getY(), player.getPosition().getZ());

            return null; 
        }

}

 

This does not seem to open the GUI and I'm not quite sure what I'm doing wrong.

How do I modify this to make it functional via a command? Thanks.

  • Author

Wherever you found out that a packet is needed to open a GUI that source is wrong. As long as you have a

Container

with your GUI you should in fact only call

openGui

on the server, FML will handle the networking for you.

If you do not have a container

IGuiHandler

(and thereby

openGui

) is the wrong tool. In that case you want a custom packet indeed and then just open the GUI directly (using

Minecraft::displayGuiScreen

) on the client.

 

Oh, I must've been looking up the wrong examples.

Calling Minecraft::displayGuiScreen has opened it up.

Thanks for your help.

  • Author

Sorry for bumping the thread, I thought it was working but it was only working in single player mode.

 

Wherever you found out that a packet is needed to open a GUI that source is wrong. As long as you have a

Container

with your GUI you should in fact only call

openGui

on the server, FML will handle the networking for you.

If you do not have a container

IGuiHandler

(and thereby

openGui

) is the wrong tool. In that case you want a custom packet indeed and then just open the GUI directly (using

Minecraft::displayGuiScreen

) on the client.

 

It is a container-less GUI so I'm trying to get it working by sending a custom packet from the server to the client and calling "Minecraft::displayGuiScreen" but it seems to crash the server during startup phase.

 

I've made the following changes:

 

In my message handler:

 

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

        @Override
        public IMessage onMessage(OpenGUI message, MessageContext ctx) {

            /*
            EntityPlayerMP player = ctx.getServerHandler().playerEntity;
            World world = player.worldObj;
            if(!world.isRemote){
                Minecraft.getMinecraft().displayGuiScreen(new TutorialGUI());
            }
            */
            System.out.println("MESSAGE");


            return null;
        }
    }

 

The command to open the GUI on the client:

 

    @Override
    public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
        if(args.length > 0){
            throw new WrongUsageException(getCommandUsage(sender));
        } else {

            World world = sender.getEntityWorld();

            if(world.isRemote){
                EntityPlayerMP player = (EntityPlayerMP) sender;
                Main.network.sendTo(new OpenGUI(), player);

            }
            
        }
    }

 

Printing a message is delivered to the client but as soon as I try to call "Minecraft::displayGuiScreen", it crashes. Is there something that I'm doing wrong?

 

Also, I noticed a previous post http://www.minecraftforge.net/forum/index.php?topic=25821.msg131607#msg131607 where it says "You need to redirect any code that contains client references through your client proxy."

 

How do I go about doing that?

 

  • Author

Finally got it working on the server and client thanks to your posts (both on this and previous answers!)

Thanks for all your help.

  • 1 year later...

HI i'm from future (1.12.2)

 

Now we can walk around client-only method problem by passing empty IMessageHandler instance at server side (CommonProxy)

I'm not sure when registerMessage started to take instance of IMessageHandler.

 

CommonProxy.java

	public void registerPacketHandler() {
		HungryAnimals.simpleChannel.registerMessage(HandlerServerDGEditInt.class, PacketServerDGEditInt.class, 0, Side.SERVER);
		HungryAnimals.simpleChannel.registerMessage(HandlerServerDGEditDouble.class, PacketServerDGEditDouble.class, 1, Side.SERVER);
		HungryAnimals.simpleChannel.registerMessage(HandlerServerDGSet.class, PacketServerDGSet.class, 2, Side.SERVER);
		HungryAnimals.simpleChannel.registerMessage((message, ctx)->{return null;}, PacketClientSpawnParticle.class, 3, Side.CLIENT);
		HungryAnimals.simpleChannel.registerMessage((message, ctx)->{return null;}, PacketClientSyncTamable.class, 4, Side.CLIENT);
		HungryAnimals.simpleChannel.registerMessage((message, ctx)->{return null;}, PacketClientSyncHungry.class, 5, Side.CLIENT);
		HungryAnimals.simpleChannel.registerMessage((message, ctx)->{return null;}, PacketClientSyncProducingFluid.class, 6, Side.CLIENT);
		HungryAnimals.simpleChannel.registerMessage((message, ctx)->{return null;}, PacketClientSyncProducingInteraction.class, 7, Side.CLIENT);
	}

 

ClientProxy.java

	@Override
	public void registerPacketHandler() {
		HungryAnimals.simpleChannel.registerMessage(HandlerServerDGEditInt.class, PacketServerDGEditInt.class, 0, Side.SERVER);
		HungryAnimals.simpleChannel.registerMessage(HandlerServerDGEditDouble.class, PacketServerDGEditDouble.class, 1, Side.SERVER);
		HungryAnimals.simpleChannel.registerMessage(HandlerServerDGSet.class, PacketServerDGSet.class, 2, Side.SERVER);
		HungryAnimals.simpleChannel.registerMessage(HandlerClientSpawnParticle.class, PacketClientSpawnParticle.class, 3, Side.CLIENT);
		HungryAnimals.simpleChannel.registerMessage(HandlerClientSyncTamable.class, PacketClientSyncTamable.class, 4, Side.CLIENT);
		HungryAnimals.simpleChannel.registerMessage(HandlerClientSyncHungry.class, PacketClientSyncHungry.class, 5, Side.CLIENT);
		HungryAnimals.simpleChannel.registerMessage(HandlerClientSyncProducingFluid.class, PacketClientSyncProducingFluid.class, 6, Side.CLIENT);
		HungryAnimals.simpleChannel.registerMessage(HandlerClientSyncProducingInteraction.class, PacketClientSyncProducingInteraction.class, 7, Side.CLIENT);
	}

 

 

 

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

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.