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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • For hours I have been trying to just instal Mr. Crayfish's Refurbished Furniture Mod, but each step to fix the error codes, the more problems arise. The farthest I got through the steps was getting to the Forge Installer, but once I had selected the file, an error saying "The directory is missing a launcher profile. Please run the minecraft launcher first". At this point I don;'t know what more I can do. Please help.
    • I create my mod pack,yesterday my mod pack is fine but i add one mod and error. I'm delete this mmod but minecraft is still stop on CONFIG_LOAD then I tried to delete config and restart it but again. If you can pleace help me. https://imgur.com/ngZBzuv
    • game crashes before even opening (log:https://mclo.gs/M8xvX7c)
    • I have created a custom entity that extends "TamableAnimal", but I am wanting to have it spawn in the ocean. I have it spawning right now, but it spawns way too frequently even with weight set to 1. I am guessing it is because it is rolling in the spawn pool of land animals since TameableAnimal extends Animal and is different than WaterAnimal, and since no land animals spawn in the ocean it just fills every inch up with my custom entity. I have followed basic tutorials for spawning entities with Forge, but I feel like I am missing something about how to change what spawn pool this custom entity ends up in. Is it possible to change that or do I need to refactor it to be based off of WaterAnimal to get those spawn? My biome modifier JSON file: { "type": "forge:add_spawns", "biomes": "#minecraft:is_ocean", "spawners": { "type": "darwinsmysticalmounts:water_animal", "weight": 20, "minCount": 1, "maxCount": 1 } } My client event: event.register(ModEntityTypes.WATER_ANIMAL.get(), SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, WaterWyvernEntity::checkCustomWaterAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); And the actual custom spawn rule that makes it spawn in the water: public static boolean checkCustomWaterAnimalSpawnRules(EntityType<WaterAnimalEntity> pAnimal, LevelAccessor pLevel, MobSpawnType pSpawnType, BlockPos pPos, RandomSource pRandom) { return pPos.getY() > pLevel.getSeaLevel() - 16 && pLevel.getFluidState(pPos.below()).is(FluidTags.WATER); }  
    • Starting today, I am unable to load my modded minecraft world. Forge crash log initially said it was a specific mod called Doggy Talents, which I disabled. Then it blamed JEI, and when that was disabled it blamed another mod so I assume it's something more than a specific mod. Minecraft launcher log claims "Exit Code 1". Nothing had changed since last night when it was working fine Forge Log: https://pastebin.com/S1GiBGVJ Client Log: https://pastebin.com/aLwuGUNL  
  • Topics

×
×
  • Create New...

Important Information

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