October 12, 20168 yr That's not the problem, it's just a method name. The value returned by the method is eventually cast to GuiScreen , not GuiContainer . Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
October 12, 20168 yr Ok but I cant see where displayScreen is called too What do you mean? Set a breakpoint in Minecraft#displayScreen and remove your other breakpoints. It should be called once with your GUI and then called another time with a different GUI. Does this second call happen? If it does, post a screenshot/video of the debugger showing it. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
October 12, 20168 yr Author Ahhh now I understand...I see it the Mehtod will be called second time after mine. I am looking for it why.
October 12, 20168 yr Author Ok first time after I call it: this.gameController.displayGuiScreen(new GuiDownloadTerrain(this)); in: public void handleJoinGame(SPacketJoinGame packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.gameController); this.gameController.playerController = new PlayerControllerMP(this.gameController, this); this.clientWorldController = new WorldClient(this, new WorldSettings(0L, packetIn.getGameType(), false, packetIn.isHardcoreMode(), packetIn.getWorldType()), net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.get(getNetworkManager()).getOverrideDimension(packetIn), packetIn.getDifficulty(), this.gameController.mcProfiler); this.gameController.gameSettings.difficulty = packetIn.getDifficulty(); this.gameController.loadWorld(this.clientWorldController); this.gameController.thePlayer.dimension = packetIn.getDimension(); this.gameController.displayGuiScreen(new GuiDownloadTerrain(this)); this.gameController.thePlayer.setEntityId(packetIn.getPlayerId()); this.currentServerMaxPlayers = packetIn.getMaxPlayers(); this.gameController.thePlayer.setReducedDebug(packetIn.isReducedDebugInfo()); this.gameController.playerController.setGameType(packetIn.getGameType()); this.gameController.gameSettings.sendSettingsToServer(); this.netManager.sendPacket(new CPacketCustomPayload("MC|Brand", (new PacketBuffer(Unpooled.buffer())).writeString(ClientBrandRetriever.getClientModName()))); } Oh I found it here, this method: public void handlePlayerPosLook(SPacketPlayerPosLook packetIn) will be called after the first and the method do that: this.gameController.displayGuiScreen((GuiScreen)null); I think this is the problem
October 12, 20168 yr Ah, that makes sense. Minecraft#loadWorld spawns the client player in the world, firing EntityJoinWorldEvent and opening your GUI. The Minecraft#displayGuiScreen call after that replaces your GUI before you can see it, so it looks like it was never opened. This means that you'll need to show your GUI slightly later in the login process. I suggest subscribing to PlayerLoggedInEvent (fired on the server side) and checking if the player has built their character (i.e. finished with the character builder GUI). If they haven't, send a packet to the client to open the character builder GUI. This should be received after GuiDownloadTerrain has been hidden by the SPacketPlayerPosLook handler. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
October 12, 20168 yr Author Another problem: When I try to open the GUI screen with the PlayerLoggedInEvent nothing happens because its a server side event but my gui handler returns null: @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; }
October 12, 20168 yr How can I asked whether the GuiDownloadTerrain has been hidden? Minecraft#currentScreen contains the current GuiScreen , but you shouldn't need to check this; just display the GUI when you receive the packet. Another problem: When I try to open the GUI screen with the PlayerLoggedInEvent nothing happens because its a server side event but my gui handler returns null: @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } That's why I told you to send a packet rather than calling EntityPlayer#openGUI . Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
October 12, 20168 yr I never worked with Packets...How can I do that? Read the documentation. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
October 12, 20168 yr Author Ok I look in it and its not so difficulty. Its good that I worked with packets in the past when i coding plugins with the spigot api but one big question is open what i have to do you said i should send a packet that opens the the gui but which packet then you said i should do this after the spacketplayerpos hides the guidownloadterrain but how can i proof this? That would be fine when you can answer this
October 12, 20168 yr Author Ok I tried a little bit. Here my Packet: public class GuiScreenOpenPacket implements IMessage { public int gui_id; public GuiScreenOpenPacket(int gui_id) { this.gui_id = gui_id; } @Override public void fromBytes(ByteBuf buf) { gui_id = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { buf.writeInt(gui_id); } } And My Handler: public class GuiScreenOpenPacketHandler implements IMessageHandler<GuiScreenOpenPacket, IMessage> { @Override public IMessage onMessage(GuiScreenOpenPacket message, MessageContext ctx) { EntityPlayerMP player = ctx.getServerHandler().playerEntity; player.openGui(Main.getInstance(), message.gui_id, player.worldObj, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ()); return null; } } Is that right? And how can I open the Gui with the Packet now?
October 12, 20168 yr i but one big question is open what i have to do you said i should send a packet that opens the the gui but which packet Create your own. then you said i should do this after the spacketplayerpos hides the guidownloadterrain but how can i proof this? That would be fine when you can answer this PlayerLoggedInEvent is fired after SPacketPlayerPosLook is sent from the server, so a packet sent from the event handler should be received by the client after the vanilla packet. Ok I tried a little bit. Here my Packet: ... Is that right? And how can I open the Gui with the Packet now? Packet handlers are run on a separate thread, you must schedule a task to run on the main thread before you can safely interact with normal Minecraft classes. The Warning section of the documentation explains how to do this. This packet will be sent by the server and received by the client, so you can't use NetHandlerPlayServer or EntityPlayerMP in the handler. You need to open the GUI through the client player ( Minecraft#thePlayer ) instead. Sending the packet to a client will cause the client to open the GUI once it's been received. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
October 12, 20168 yr Author Packet handlers are run on a separate thread, you must schedule a task to run on the main thread before you can safely interact with normal Minecraft classes. The Warning section of the documentation explains how to do this. Is that right? @Override public IMessage onMessage(GuiScreenOpenPacket message, MessageContext ctx) { final GuiScreenOpenPacket msg = message; final EntityPlayer player = Minecraft.getMinecraft().thePlayer; Minecraft.getMinecraft().addScheduledTask(new Runnable() { @Override public void run() { player.openGui(Main.getInstance(), msg.gui_id, player.worldObj, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ()); } }); return null; }
October 12, 20168 yr Author Ok its working. I tried it and than first there was a big error in the console and minecraft crashed but the problem was that I only had the constructor with the guiid but you have to make another constructor without anything. Now it works big thanks to you Choonster that you helped me so long You should get the Mod Rank but yeah thank you very much
October 12, 20168 yr Is that right? The msg local variable is pointless, just use the message argument. The player variable should be moved inside the Runnable#run implementation to avoid potential thread safety issues. Other than that, what you have should work. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
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.