Table of Contents
HP Bar (Icon)
Finished Product
UI Design
Script
local UI_ID = nil local HEART_TEXT_ID = nil local FULL_HEART = "◆" local EMPTY_HEART = "◇" local function UpdateHeartText(e) local pid = e.eventobjid local attr = e.playerattr if attr == PLAYERATTR.CUR_HP then local _, cur = Player:getAttr(pid, PLAYERATTR.CUR_HP) local _, max = Player:getAttr(pid, PLAYERATTR.MAX_HP) if max <= 0 then max = 1 end local percent = cur / max local hearts = math.floor(percent * 10 + 0.0001) local text = "" for i = 1, 10 do if i <= hearts then text = text .. FULL_HEART else text = text .. EMPTY_HEART end end Customui:setText(pid, UI_ID, HEART_TEXT_ID, text) end end ScriptSupportEvent:registerEvent("Game.AnyPlayer.EnterGame", UpdateHeartText) ScriptSupportEvent:registerEvent("Player.ChangeAttr", UpdateHeartText)
Explanation
Global Variables:
local UI_ID = nil local HEART_TEXT_ID = nil
These variables are placeholders for the custom UI components:
- UI_ID: The ID of the custom UI interface.
- HEART_TEXT_ID: The ID of the text component within the UI that will display the health bar.
Heart Representation (Text-based):
local FULL_HEART = "◆" local EMPTY_HEART = "◇"
These are just visual symbols to represent health:
- FULL_HEART: Symbol for full/active health.
- EMPTY_HEART: Symbol for missing/empty health.
Function: UpdateHeartText(e)
This function updates the UI text based on the player's current health.
1. Extract player information from event:
local pid = e.eventobjid local attr = e.playerattr
- pid: The ID of the player whose data is changing.
- attr: The specific attribute that changed (like health).
2. Only proceed if the attribute is current health:
if attr == PLAYERATTR.CUR_HP then
Ensures this logic runs only when health has changed.
3. Fetch current and max HP:
local _, cur = Player:getAttr(pid, PLAYERATTR.CUR_HP) local _, max = Player:getAttr(pid, PLAYERATTR.MAX_HP)
Retrieves the player's current and maximum health values.
if max <= 0 then max = 1 end
Prevents division by zero in case max HP is 0 or invalid.
4. Calculate percentage and number of full hearts:
local percent = cur / max local hearts = math.floor(percent * 10 + 0.0001)
Calculates the ratio of current health to maximum health.
Scales it to a 10-point scale (like 10 hearts).
The + 0.0001 helps prevent rounding errors.
5. Build the heart bar as a text string:
local text = "" for i = 1, 10 do if i <= hearts then text = text .. FULL_HEART else text = text .. EMPTY_HEART end end
Loops through 10 positions:
Adds a full heart if the player has that much health.
Otherwise, adds an empty heart.
Update the UI:
Customui:setText(pid, UI_ID, HEART_TEXT_ID, text)
Displays the generated text (heart bar) on the player's custom UI.
Event Registration:
ScriptSupportEvent:registerEvent("Game.AnyPlayer.EnterGame", UpdateHeartText) ScriptSupportEvent:registerEvent("Player.ChangeAttr", UpdateHeartText)
These lines ensure that the UpdateHeartText function is called:
When any player enters the game.
When a player's attributes change (like losing or gaining health).
If you have any questions about Developer Tools, feel free to join our official discord server Mini World Global DEV discord