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

WaningMatrix

Members
  • Joined

  • Last visited

Posts posted by WaningMatrix

  1. I'm trying to build something like.. (please dont bully me for the picture im not good at drawing stuff lol)

    unknown.png

     

    So like a gui page which has two different rows and where it shows a list like say each element of a List linewise on both sides. It should have a scrollable bar if there are more elements in the list which can't be shown on the page. I'm not getting how do I make this scrollable thing, can anyone help me?

  2. I just simply want to remove the words from a Gui textfield, is there some simple way to do that or I have to redraw the text field?

    like say

    if (!TextField.isEmpty){
      System.out.println("You have run this part!");
      if(TextField.getText == "some invalid thing"){
        TextField.clear();  // How do I clear the text already written inside this text field.
      }
      else{
        System.out.println("Do the stuff you wanted to run");  
      }
    }

    unknown.png

    intelliJ shows this deleteWords in all the available things, but is this what I need? If yes what is p_146177_1_ int type here?

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

  4. ·

    Edited by WaningMatrix

    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?

  5. ·

    Edited by WaningMatrix

    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.

  6. ·

    Edited by WaningMatrix

    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.

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

  8. ·

    Edited by WaningMatrix

    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

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

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

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

  12. private static final ExecutorService SERVICE = Executors.newFixedThreadPool(50, Thread::new);
    
        public static void runAsync(Runnable task) {
    
            ThreadedCommmand.SERVICE.execute(task);
        }

    Ok so I wrote this and now whenever I need the call the thing I do 

    ThreadedCommmand.runAsync(() -> { ... });

    and it works but I have a small question. All this will have effect on the Client side only right? Cause I don't want it to trigger some cheat response or something on the server side. Just want to make it sure. Thanks.

  13. ·

    Edited by WaningMatrix

    So I wrote this method to find the UUID of a player..

    public static String getUniqueID(String username) {
            String url = "https://api.mojang.com/users/profiles/minecraft/" + username;
    
            try {
                String json = IOUtils.toString(new URL(url));
                JsonElement element = new JsonParser().parse(json);
                JsonObject object = element.getAsJsonObject();
    
                return object.get("id").getAsString();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "";
        }

    However whenever the method is run, the game freezes for like 1 or 2 seconds and sometimes even more. Is there any other way to remove this freeze thing from happening or another method to get the UUID of a player? I thought about the  getProfile.getId() but I don't exactly know how do I do that or whether it'll fix the problem or not. As of I know how to use getProfile.getId() it works only if the player in their game server. Let me know if I am wrong along with the corrected way. For Client side.

    Thanks.

  14. I want a statement like as soon as there is a particular message send in the minecraft chat it does something. I don't really understand in 1 line answer so please give it in like a if statement kind of a thing. Say if a user enter in chat "He is WaningMatrix" and it checks if name is in the chat  like "WaningMatrix" and does something like if(chat.contains("waningMatrix")) do this else blabla

    How do I do it? Please write it in code form it is easy to understand. I'm on 1.12 and this is for client side.

  15. So whenever I Run the Minecraft Client the client launches successfully but as soon as I run my command like /command , mc freezes and intelliJ shows this in the debug screen

    unknown.png?width=812&height=382

    and the main console shows this

    unknown.png?width=812&height=376

    Here is my ProcessCommand 

    public void processCommand(ICommandSender sender, String[] args) throws CommandException {
            if (args.length == 0) {
                // do this
            } 
      else if (args[0].equalsIgnoreCase("add")) {
                    // do this
            } 
      else if (args[0].equalsIgnoreCase("remove")) {
                    // do this
            } 
      else if (args[0].equalsIgnoreCase("list")) {
                    // do this
             }
      else if (args[0].equalsIgnoreCase("flush")) {
                    //do this
            } 
      else  {
                    sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Error: Wrong command usage"));
            }
    }

    What am I doing wrong in here?

  16. ·

    Edited by WaningMatrix

    Just read the title.

    I'm on 1.12 and this is for client side.

    I wrote a method for converting it but it doesnt work can someone tell me whats wrong or maybe some other way of how to do it?

    public String getUserName(String UUID){
            String Url = "https://api.mojang.com/user/profiles/"+UUID.replace("-", "")+"/names";
            try {
                String Json = IOUtils.toString(new URL(Url));
                JsonElement Element = new JsonParser().parse(Json);
                JsonObject Object = Element.getAsJsonObject();
    
                return Object.get("name").getAsString();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            return "";
        }

    I want it to return the latest username of a person.

  17. ·

    Edited by WaningMatrix

    Alright so I'm a beginner to Minecraft Modding, so can you explain me like I'm 5 and how will I use this player.ConnectionInfo if Im writing a mod. I have wrote this but can you let me know whether this is correct or not? 

    @SubscribeEvent
        public void EntityJoinsNewWorld(EntityJoinWorldEvent event){
            for (NetworkPlayerInfo p : Minecraft.getMinecraft().getNetHandler().getPlayerInfoMap()) {
                if (Settings.SniperList.get().contains(p.getGameProfile().getName())) {
                    Minecraft.getMinecraft().thePlayer.sendChatMessage("/lobby");
                    Minecraft.getMinecraft().thePlayer.sendChatMessage("/p warp");
                }
            }
        }

    SniperList is just an ArrayList and it executes the if statement if there any player joins the world whose name in the ArrayList.

    If this is wrong let me know how will it be corrected and also do I need anything else to include in the Main class other than this. 

Important Information

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

Account

Navigation

Search

Search

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.