Jump to content

[1.7.10] How to put a button in player hud


Thornack

Recommended Posts

Hi Everyone,

 

I am trying to put a series of buttons in the player hud where they can be clicked on after the player clicks the enable mouse key that I have registered using a keyhandler.

I already know how to add buttons to a regular gui but the hud seems different. Any ideas as to where to start?

 

I know that for a regular gui (lets say for a tile entity gui) you have to do the following to give it buttons

 

 

 

@SideOnly(Side.CLIENT)
public class ExampleGUI extends GuiScreen
{

    private int BUTTON_DONE_ID = 1; // YOU NEED TO GIVE YOUR BUTTON AN ID
   private TileEntityCustom customTE;

    private GuiButton doneBtn; // YOU NEED TO CREATE A VARIABLE FOR YOUR BUTTON
    
   //whether initGui() was called.
    private boolean wasInitialized = false;

    public ExampleGUI(TileEntityCustom custom){
        this.customTE = custom;
    }

    /**
     * Adds the buttons (and other controls) to the screen in question.
     */
    @Override
    public void initGui()
    {
    	this.buttonList.clear(); // YOU NEED TO CLEAR THE BUTTON LIST ON INIT
        this.doneBtn = new GuiButton(BUTTON_DONE_ID, 20, this.height - 40, I18n.format("Apply", new Object[0])); // YOU NEED TO CREATE THE BUTTON
        this.doneBtn.width = 160; // YOU NEED TO GIVE THE BUTTON A WIDTH
        
        
        this.buttonList.add(this.doneBtn); // YOU NEED TO ADD THE BUTTON TO THE BUTTON LIST
      
        
        //it seems like initGui() is called every time this.mc.displayGuiScreen() is used.
    	if(this.wasInitialized)
        	return;
        this.wasInitialized = true;
        
         }

    /**
     * Called when the screen is unloaded. Used to disable keyboard repeat events
     */
    @Override
    public void onGuiClosed(){
    	
    }

    /**
     * Called from the main game loop to update the screen.
     */
    @Override
    public void updateScreen(){
         }

    @Override
    protected void actionPerformed(GuiButton button){
        if (button.enabled){
            if (button.id == BUTTON_DONE_ID){ // YOU NEED TO MAKE THE BUTTON DO STUFF
            	//DO STUFF YOU WANT WHEN BUTTON IS CLICKED
            }
         }
    }
    
    @Override
    protected void mouseClicked(int x, int y, int event){
        if(event != 0){
            super.mouseClicked(x, y, event);
        }
    }
    
    @Override
    protected void mouseMovedOrUp(int mouseX, int mouseY, int event){
        if (event != 0){
            super.mouseMovedOrUp(mouseX, mouseY, event);
        }
    }
    
    @Override
protected void keyTyped(char key, int event){
    	super.keyTyped(key, event);
    	}

    /**
     * Draws the screen and all the components in it.
     */
    @Override
    public void drawScreen(int mouseX, int mouseY, float p_73863_3_){
        //DRAW YOUR GUI
      }
}

 

 

 

But to render anything in the player hud I know you have to render everything using this event.

@SubscribeEvent(priority=EventPriority.NORMAL)
public void RenderBattleGUI(RenderGameOverlayEvent.Post event) {
}

 

I cant seem to figure it out. I want the button to render in the hud the whole time the player is in survival mode and only when my custom key is pressed that enables the mouse can the player "click" on the button to activate it. I understand the mouse stuff i think but the buttons are giving me trouble.

Link to comment
Share on other sites

Should buttons be clickable when e.g looking at inventory? Or when book is opened, or even in-game menu?

 

Or just when you are on main in-game screen (the one with cross-hairs and health and all other stuff)?

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

Since buttons are per-client you can simply store them in static field, since you are placing them in GuiIngame screen you can do something like this:

 

public class EventsClient
{
private List<GuiButton> screenButtons = new ArrayList<GuiButton>();
private int x = 0;
private int y = 0;

public EventsClient()
{
	this.screenButtons.add(new GuiButton(...));
	...and so on, add them.
}

@SubscribeEvent
public void onRenderOvelay(RenderGameOverlayEvent.Pre event)
{
	for (int k = 0; k < this.screenButtons.size(); ++k)
		((GuiButton)this.screenButtons.get(k)).drawButton(Minecraft.getMinecraft(), x, y);
}

@SubscribeEvent
public void onMouseEvent(MouseEvent event)
{
	this.x = event.x;
	this.y = event.y;
	if (check that you are in screen == null - which mean you are in GuiIngame)
	if (check that mouse has been clicked)
	if (check clicked x/y and test if there is a button in that position - positions you can get from you screenButtons)
	//successfully clicked on button, now perform some action here - yes, literally here in this event.
}

 

Basically you update x/y all the time in every screen possible, and when you enable your mouse (you said you did that, I have no idea how that affects rest of game, isn't it breaking other things?) you can start "clicking" on them. Setting x/y in MouseEvent allows your buttons to receive info that mouse is over them (since RenderGameOverlayEvent doesn't have mouse pos on it's own) to display them highlighted. Then if clicked pos is a button, perform action.

 

EDIT: NOTE:

What you are doing is VERY bad and seems very uncomfortable, cosider using keybindings with some shift-activation (or other button ofc).

 

Disclaimer: This is totally "it SHOULD work", not "it WILL work".

 

Note 2: You can save mouse position of last time when you enabled it (seems useful to me, my guess is you are doing spell-buttons, ay?)

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

What do you mean by 'it is pretty complex and breaks alot of stuff'? Need some specification for that part.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

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.



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • When opening I am directed to a log called ´´forge-1.20.1-47.2.20-installer.jar.log´´ below the following error is written: JVM info: Oracle Corporation - 21.0.2 - 21.0.2+13- LTS-58 java.net.preferIPv4Stack=true Current Time: 02/27/2024 16:58:33 Host: files.minecraftforge.net [51.79.83.165] Host: maven.minecraftforge.net [51.79.83.165] Host: libraries.minecraft.net [13.107.246.33, 13.107.213.33] Host: launchermeta.mojang.com [13.107.246.33, 13.107.213.33] Host: piston-meta.mojang.com [13.107.246.33, 13.107.213.33] java.net.UnknownHostException: This host is not known (authserver.mojang.com) at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:52) at java.base/java.net.InetAddress$PlatformResolver.lookupByName(InetAddress.java:1211) at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1828) at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:1139) at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1818) at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1688) at net.minecraftforge.installer.DownloadUtils.getIps(DownloadUtils.java:290) at net.minecraftforge.installer.SimpleInstaller.main(SimpleInstaller.java:120) Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.stream()" because the return value of "net.minecraftforge.installer.DownloadUtils.getIps(String)" is null at net.minecraftforge.installer.SimpleInstaller.main(SimpleInstaller.java:120)
    • I have downloaded forge version 1.20.4 and I have Java 17 installed but my .jar will not open and the error log text file below is created     JVM info: Oracle Corporation - 17.0.10 - 17.0.10+11-LTS-240 java.net.preferIPv4Stack=true Current Time: 27/02/2024 19:43:19 Host: files.minecraftforge.net [51.79.83.165, 2607:5300:203:65a5:0:0:0:0] Host: maven.minecraftforge.net [51.79.83.165, 2607:5300:203:65a5:0:0:0:0] Host: libraries.minecraft.net [13.107.246.64, 13.107.213.64, 2620:1ec:46:0:0:0:0:64, 2620:1ec:bdf:0:0:0:0:64] Host: launchermeta.mojang.com [13.107.213.64, 13.107.246.64, 2620:1ec:bdf:0:0:0:0:64, 2620:1ec:46:0:0:0:0:64] Host: piston-meta.mojang.com [13.107.213.64, 13.107.246.64, 2620:1ec:46:0:0:0:0:64, 2620:1ec:bdf:0:0:0:0:64] java.net.UnknownHostException: No such host is known (authserver.mojang.com)     at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)     at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:933)     at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1543)     at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:852)     at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1532)     at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1384)     at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1305)     at net.minecraftforge.installer.DownloadUtils.getIps(DownloadUtils.java:290)     at net.minecraftforge.installer.SimpleInstaller.main(SimpleInstaller.java:120) Exception in thread "main"  java.lang.NullPointerException: Cannot invoke "java.util.List.stream()" because the return value of "net.minecraftforge.installer.DownloadUtils.getIps(String)" is null     at net.minecraftforge.installer.SimpleInstaller.main(SimpleInstaller.java:120)  
    • we tried both versions and both cant run on her laptop for some reason idk what to do  
    • Okay so we tried both versions and both cant run on her pc for some reason!  
    • Well. Make sure you installed a correct jdk for your forge mdk version. Make sure your JAVA_HOME and %PATH% environment-variables are setup correctly. (If you're on windows)   I downloaded an example forge mdk for my version and extracted the contents to a folder I'm working in Using Eclipse, I opened Eclipse and imported an existing gradle Project (with its root directory in the folder directory which I previously extracted my contents to). Waited for Eclipse to do its thing After it having finished, I ran genEclipseRuns, setupDecompWorkspace and setupDevWorkspace (Gradle Tasks > your mod name here > forgegradle)    If it still didn't work (and you're using Eclipse) run cleanEclipse and, in a command prompt  Also If I recall correctly, someone, somewhere said that the way you setup your workspace changes depending on your Minecraft Version. I did this in 1.8.9.
  • Topics

×
×
  • Create New...

Important Information

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