User Tools

Site Tools


developer_center:developer_editor:hp_icon

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

developer_center/developer_editor/hp_icon.txt · Last modified: 2025/07/25 07:49 by don