Jump to content

[1.12] Some GUI buttons not showing up.


WaningMatrix

Recommended Posts

So I'm making a nested GUI kind of a thing where user is in the first page of a gui and he clicks an option say "Settings" a new gui shows up and shows the option inside of "Settings". However whatever I do in the Settings menu(2nd screen) only one gui button is shown I add more and it just doesn't appear. Here is the working I did,

*User Opens GUI*

*There are 3 options available on the main screen* (All 3 buttons are shown over here and one of them is Settings)

*User clicks Settings*

*Only 1 option inside Settings is shown not the others*

Main home screen of the GUI.

Spoiler

public class GuiSettings1 extends GuiScreen {

    private Minecraft mc = Minecraft.getMinecraft();
    private GuiTextField NameField;  // Add text field.
    private ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();	
    // This class is the main home screen of the GUI.			

    @Override
    public void initGui() {
        Mouse.setGrabbed(false);
        this.SetupMainScreen();
        super.initGui();
    }

    public void SetupMainScreen() {
        this.buttonList.add(new GuiButton(0, width / 2, height / 2 - 80, 140, 20, "Add")); // Text inside coords
        this.buttonList.get(0).xPosition = (width / 2 - 70); // Text field coords
        this.buttonList.add(new GuiButton(1, width / 2, height / 2 - 50, 140, 20, "Remove"));
        this.buttonList.get(1).xPosition = (width / 2 - 70);
        this.buttonList.add(new GuiButton(2, width / 2, height / 2 - 20, 140, 20, "Settings"));
        this.buttonList.get(2).xPosition = (width / 2 - 70);
        NameField = new GuiTextField(5, fontRendererObj, width / 2 - 70, height - (height - 55), 140, 20);

    }

    @Override
    public void drawScreen(int mouseX, int mouseY, float partialTicks) {
        drawDefaultBackground();
        NameField.drawTextBox();
        this.drawCenteredString(mc.fontRendererObj, EnumChatFormatting.GREEN + "Anti-Cheater Mod", width / 2, height - (height - 15), Color.MAGENTA.getRGB());
        super.drawScreen(mouseX, mouseY, partialTicks);
    }

    @Override
    protected void actionPerformed(GuiButton button) throws IOException {
        if (button.id == 2) {
            // Settings menu
            // To open the Settins option inside the main screen
            Runnable rn = () -> {
                mc.displayGuiScreen(new GuiSettings2());
            };
            service.schedule(rn, 50, TimeUnit.MILLISECONDS);
        }
        if (button.id == 0) {
            // add button
            // does something
        }        
        if (button.id == 1) {
            // Remove button
            // does something
        }
        super.actionPerformed(button);
    }

    @Override
    public boolean doesGuiPauseGame() {
        return false;
    }

    @Override
    public void updateScreen() {
        super.updateScreen();
        this.NameField.updateCursorCounter();
    }

    @Override
    protected void keyTyped(char par1, int par2) throws IOException {
        super.keyTyped(par1, par2);
        this.NameField.textboxKeyTyped(par1, par2);
    }

    @Override
    protected void mouseClicked(int x, int y, int btn) throws IOException {
        super.mouseClicked(x, y, btn);
        this.NameField.mouseClicked(x, y, btn);
    }
}

 

This is the next gui class which I want to open (Settings Menu inside the GUI)

Spoiler

public class GuiSettings2 extends GuiScreen {

    // This class contains all the usages of the Settings option inside the GUI.

    private Minecraft mc = Minecraft.getMinecraft();

    public void SettingsScreenButtons() {
        this.buttonList.add(new GuiButton(3, width / 2 - 70, height / 2 - 20, 140, 20, "Back"));
        this.buttonList.get(3).xPosition = (width / 2 - 70);
        this.buttonList.add(new GuiButton(100, width / 2 - 70, height / 2 - 50, 140, 20, "Button"));
        this.buttonList.get(100).xPosition = (width / 2 - 70);
    }

    @Override
    public void initGui() {
        Mouse.setGrabbed(false);
        this.SettingsScreenButtons();

        super.initGui();
    }

    @Override
    public void drawScreen(int mouseX, int mouseY, float partialTicks) {
        drawDefaultBackground();
        this.drawCenteredString(mc.fontRendererObj, EnumChatFormatting.GREEN + "Settings Menu", width / 2, height - (height - 15), Color.MAGENTA.getRGB());

        super.drawScreen(mouseX, mouseY, partialTicks);
    }

    @Override
    protected void actionPerformed(GuiButton button) throws IOException {
        switch (button.id) {
            case 3: {
                // back button
                mc.displayGuiScreen(new GuiSettings1());
                break;
            }
            case 100: {
                mc.thePlayer.addChatComponentMessage(new ChatComponentText("This command literally does nothing lol"));
                break;
            }
        }
        super.actionPerformed(button);
    }

    @Override
    public boolean doesGuiPauseGame() {
        return false;
    }
}

 

In the SettingsScreenButton() only one option is shown at a time like if I run it just like this only the Back button will be shown and if I delete the back statement out then the next "Button" button starts to appear. I tried debugging this a lot but I couldn't got a solution. Can someone lemme know whats wrong along with the fix?

Also ignore some of the timed functions I just started to test it out whether it fixes them or not, because it fixed my other problem related to GUIs before.

I also am getting the same problem which is described in this thread but there are no solutions which worked for me( I did that Mouse.setGrabbed(false); ). Help with this problem will also be greatly appreciated.

Thanks.

Link to comment
Share on other sites

15 minutes ago, diesieben07 said:

How this does not crash is beyond me. The list is 1 element long at this point, the only valid index is 0.

Why are you doing it this way? Use local variables for your buttons. Or, just don't do this at all, since you already set the x position one line above, where you create the button.

 

You cannot do this. You can only interact with most of Minecraft from the main thread.

Thanks for the quick reply. I added that Runnable just to like seem if it works for not. I really tend to like try everything out when something doesn't work. :P

 

btw do you have any solution to that other problem? this one?

Link to comment
Share on other sites

25 minutes ago, diesieben07 said:

No. Fix the problems I explained, then we can tackle that one, if it still exists.

Yeah I fixed that Gui button not showing up problem. Thanks for that.

 

I'm asking whether you have the solution to this one? When I open the gui i have no rendered cursor, it only shows up when i move my mouse outside of the minecraft window and move it back in.

Link to comment
Share on other sites

10 minutes ago, diesieben07 said:

Please post updated code. Does this only happen for your GUIs? How exactly are you opening GuiSettings1?

Yeah it happens only for GUI. I open GuiSettings1 by using a command which does this

else if (args[0].equalsIgnoreCase("gui")) {
                Runnable rn = () -> Minecraft.getMinecraft().displayGuiScreen(new GuiSettings1());
                service.schedule(rn, 50, TimeUnit.MILLISECONDS);
            }

had to open it after 1 tick otherwise it won't open and yes it happens only with Guis. When I move the cursor out of the window and move it back it it starts to appear. However I don't really think mouse rendering thing is related to it whatsoever but I might be wrong. @diesieben07

Edited by WaningMatrix
Link to comment
Share on other sites

2 minutes ago, diesieben07 said:

Again, you can only interact with Minecraft from the main thread. You said you fixed this, when in fact no, you did not fix this.

You say command, is this a server side command? In that case you cannot just open a GUI from there, that is known as reaching across logical sides. It will cause strange problems like the one you are experiencing and crash outright when run on a dedicated server.

If you want to open a GUI from a server-side command you must send a packet.

Uhm no I started to rename the buttonId starting by 0, 1 and so on and that fixed the problem. And I'm doing all this on client side, I just removed the Runnable thing now while opening the GUI and it works fine. Correct me if I am wrong although the program seems to run fine. When opening the GUI the first time I do Runnable a add a tick to open the GUI so to not crash but later on as I'm jumping from screen to screen it does not do that.

 

And can you reply a solution to this as well along with your reply to this reply, "When I open the gui i have no rendered cursor, it only shows up when i move my mouse outside of the minecraft window and move it back in. Fix for this. @diesieben07"

Link to comment
Share on other sites

25 minutes ago, diesieben07 said:

Which problem?

The main problem I made this thread for, that is some gui buttons show up and some do not.

25 minutes ago, diesieben07 said:

 

  • So you are using ClientCommandHandler for your command?
  • You say "I just removed the Runnable thing" and then you say "the first time I do a Runnable...". Please clarify. Post updated code, ideally.
  • Yes, I am using ClientCommandHandler to run my command.
  • So when I run the command /commandname gui I use Runnable to run the command at first(that is to open the main screen GuiSettings1()) and add 1 tick for it to run because Minecraft crashes if I do not add that tick/Runnable. Now when the GuiSettings1() is open I click on "Settings" option(Refer to code) which opens GuiSettings2() which contains some other buttons and stuff. This second time(clicking on "settings") when I am running GuiSettings2() I removed the Runnable thing from here. Even i am not sure why not adding a tick doesn't crash the game here but does in the first time opening the GUI.

Here is the Code:
I am opening the whole thing with the same command I said before /commandname gui { opens GuiSettings1 } (scroll up and see that).

Updated GuiSettings1:

Spoiler

public class GuiSettings1 extends GuiScreen {

    private Minecraft mc = Minecraft.getMinecraft();
    private GuiTextField NameField;  // Add text field.
    private ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

    @Override
    public void initGui() {
        Mouse.setGrabbed(false);
        this.SetupMainScreen();
        super.initGui();
    }

    public void SetupMainScreen() {
        this.buttonList.add(new GuiButton(0, width / 2, height / 2 - 80, 140, 20, "Add")); // Text inside coords
        this.buttonList.get(0).xPosition = (width / 2 - 70); // Text field coords
        this.buttonList.add(new GuiButton(1, width / 2, height / 2 - 50, 140, 20, "Remove"));
        this.buttonList.get(1).xPosition = (width / 2 - 70);
        this.buttonList.add(new GuiButton(2, width / 2, height / 2 + 10, 140, 20, "Settings"));
        this.buttonList.get(2).xPosition = (width / 2 - 70);
        this.buttonList.add(new GuiButton(3, width / 2, height / 2 - 20, 140, 20, "List"));
        this.buttonList.get(3).xPosition = (width / 2 - 70);
        NameField = new GuiTextField(5, fontRendererObj, width / 2 - 70, height - (height - 55), 140, 20);

    }

    @Override
    public void drawScreen(int mouseX, int mouseY, float partialTicks) {
        drawDefaultBackground();
        NameField.drawTextBox();
        this.drawCenteredString(mc.fontRendererObj, EnumChatFormatting.GREEN + "Anti-Cheater Mod", width / 2, height - (height - 15), Color.MAGENTA.getRGB());
        super.drawScreen(mouseX, mouseY, partialTicks);
    }

    @Override
    protected void actionPerformed(GuiButton button) throws IOException {

        /*
        Button 0 -> Add button
        Button 1 -> Remove button
        Button 2 -> Go back button
        Button 3 -> List button
        */

        switch (button.id) {
            case 2: {
                // Settings menu
				// Opening GuiSettings2() from here
                mc.displayGuiScreen(new GuiSettings2());
                break;
            }
        }

        super.actionPerformed(button);
    }

    @Override
    public boolean doesGuiPauseGame() {
        return false;
    }

    @Override
    public void updateScreen() {
        super.updateScreen();
        this.NameField.updateCursorCounter();
    }

    @Override
    protected void keyTyped(char par1, int par2) throws IOException {
        super.keyTyped(par1, par2);
        this.NameField.textboxKeyTyped(par1, par2);
    }

    @Override
    protected void mouseClicked(int x, int y, int btn) throws IOException {
        super.mouseClicked(x, y, btn);
        this.NameField.mouseClicked(x, y, btn);
    }

}

 

GuiSettings2 updated

Spoiler

public class GuiSettings2 extends GuiScreen {
    private Minecraft mc = Minecraft.getMinecraft();

    public void SettingsScreenButtons() {
        this.buttonList.add(new GuiButton(0, width / 2 - 70, height / 2 + 10, 140, 20, "Back"));
        this.buttonList.get(0).xPosition = (width / 2 - 70);
        this.buttonList.add(new GuiButton(1, width / 2 - 70, height / 2 - 50, 140, 20, "Button"));
        this.buttonList.get(1).xPosition = (width / 2 - 70);
    }

    @Override
    public void initGui() {
        Mouse.setGrabbed(false);
        this.SettingsScreenButtons();

        super.initGui();
    }

    @Override
    public void drawScreen(int mouseX, int mouseY, float partialTicks) {
        drawDefaultBackground();
        this.drawCenteredString(mc.fontRendererObj, EnumChatFormatting.GREEN + "Settings Menu", width / 2, height - (height - 15), Color.MAGENTA.getRGB());

        super.drawScreen(mouseX, mouseY, partialTicks);
    }

    @Override
    protected void actionPerformed(GuiButton button) throws IOException {
        switch (button.id) {
            case 0: {
                // back button
                mc.displayGuiScreen(new GuiSettings1());
                break;
            }
            case 1: {
                mc.thePlayer.addChatComponentMessage(new ChatComponentText("This command literally does nothing lol"));

                break;
            }
        }
        super.actionPerformed(button);
    }

    @Override
    public boolean doesGuiPauseGame() {
        return false;
    }

}

 

Here is how I run the thing at first using the command.(remember that GuiSettings1() is like the main screen of the gui and GuiSettings2() is a inside the 1st gui thing)

else if (args[0].equalsIgnoreCase("gui")) {
                // used commandhandler player does /command gui and it does this.
                Runnable rn = () -> Minecraft.getMinecraft().displayGuiScreen(new GuiSettings1());
                service.schedule(rn, 50, TimeUnit.MILLISECONDS);
            }

 

25 minutes ago, diesieben07 said:

99% this is caused by you opening the GUI from a different thread than the client main thread.

Tell me how do I fix it over here then. In other words you mean like I have to remove the Runnable which is causing threading running this gui? cause it crashes if i dont add that 1 tick/Runnable to it.

Edited by WaningMatrix
Link to comment
Share on other sites

9 minutes ago, diesieben07 said:

Yes, you cannot open the GUI from your ScheduledExecutorService thread. It must happen from the main minecraft thread.

Show the crash that happens when you just open the GUI normally from your command.

Uhm its weird I might have confused some things up. Yeah it does not crash but nonetheless it does not open the gui at first anyways.

Here is the part where it is getting run from

else if (args[0].equalsIgnoreCase("gui")) {
                Minecraft.getMinecraft().displayGuiScreen(new GuiSettings1());
            }

So how do I get this to run from the main Minecraft thread with it actually opening the gui.

Edited by WaningMatrix
Link to comment
Share on other sites

24 minutes ago, diesieben07 said:

Since you are running this from a command, the chat window will close itself after command executing, so yes, you do have to schedule the GUI to open a tick later.

To do so, you can use ClientTickEvent, note however that this fires twice per tick, check TickEvent#phase.

ClientTickEvent in a SubscribeEvent? I mean I dont really get it how will I open it in a ClientCommandHandler block. Command class doesnt accept any annotations or anything.

Can you explain how will I use ClientTickEvent inside this Command ClientCommandHandler class?

Or do I have to use it in main class and call it from the command?

Edited by WaningMatrix
Link to comment
Share on other sites

2 hours ago, diesieben07 said:

Since you are running this from a command, the chat window will close itself after command executing, so yes, you do have to schedule the GUI to open a tick later.

To do so, you can use ClientTickEvent, note however that this fires twice per tick, check TickEvent#phase.

Update: I got that to work. Heres how I'm doing it, I made a method in the main class as follows


    @SubscribeEvent
    public void fireTick(TickEvent.ClientTickEvent event) {
        if (doGui == true) {
            if (event.phase == TickEvent.Phase.END) {
                Minecraft.getMinecraft().displayGuiScreen(new GuiSettings1());
                doGui = false;
            }
        }
    }

and doGui is false since start and when someone does /command gui it makes doGui variable to true and executes this line and makes that to work. I'm just writing this once more to make sure it is correct way of doing it. Though this shouldn't doesn't much impact on game performance though right? As I dont want it to slow the game down by a large factor.

Thanks @diesieben07 for the quick reply! Cheers.

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.