• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • 🏆 Hive's 6th HD Modeling Contest: Mechanical is now open! Design and model a mechanical creature, mechanized animal, a futuristic robotic being, or anything else your imagination can tinker with! 📅 Submissions close on June 30, 2024. Don't miss this opportunity to let your creativity shine! Enter now and show us your mechanical masterpiece! 🔗 Click here to enter!

Periodic Healing Text

Status
Not open for further replies.
Level 24
Joined
Aug 1, 2013
Messages
4,657
I use this system to control healing stuff:
JASS:
library aheHeal
    
    globals
        
                 real           udg_AHE_Event_Heal_Created
                 real           udg_AHE_Event_OnHeal_After
                 real           udg_AHE_Event_OnHeal_Before
        
        constant integer        udg_HEAL_TYPE_SPELL                   = 0
        constant integer        udg_HEAL_TYPE_HIDDEN                  = 1
        constant integer        udg_HEAL_TYPE_REGENERATION            = 2
        
                 integer        udg_AHE_Index                           = 0
                 integer        udg_AHE_NewIndex
                 real array     udg_AHE_Param_Amount
                 integer array  udg_AHE_Param_HealType
                 boolean array  udg_AHE_Param_Index_Exists
                 real array     udg_AHE_Param_Modifier
                 unit array     udg_AHE_Param_Source
                 unit array     udg_AHE_Param_Target
        
    endglobals
    
    function AHE_CreateNewIndex takes nothing returns integer
        set udg_AHE_NewIndex = 0
        
        loop
            exitwhen not udg_AHE_Param_Index_Exists[udg_AHE_NewIndex]
            set udg_AHE_NewIndex = udg_AHE_NewIndex + 1
        endloop
        set udg_AHE_Param_Index_Exists[udg_AHE_NewIndex] = true
        set udg_AHE_Param_Source[udg_AHE_NewIndex] = null
        set udg_AHE_Param_Target[udg_AHE_NewIndex] = null
        set udg_AHE_Param_Amount[udg_AHE_NewIndex] = 0
        set udg_AHE_Param_Modifier[udg_AHE_NewIndex] = 1
        set udg_AHE_Param_HealType[udg_AHE_NewIndex] = 0
        
        set udg_AHE_Event_Heal_Created = 1
        set udg_AHE_Event_Heal_Created = 0
        
        return udg_AHE_NewIndex
    endfunction
    
    function AHE_ApplyHeal takes integer index returns nothing
        local integer oldIndex = udg_AHE_Index
        
        set udg_AHE_Index = index
        
        set udg_AHE_Event_OnHeal_Before = 1
        set udg_AHE_Event_OnHeal_Before = 0
        
        set udg_AHE_Param_Amount[udg_AHE_Index] = udg_AHE_Param_Amount[udg_AHE_Index] * udg_AHE_Param_Modifier[udg_AHE_Index]
        
        call SetWidgetLife(udg_AHE_Param_Target[udg_AHE_Index], GetWidgetLife(udg_AHE_Param_Target[udg_AHE_Index]) + udg_AHE_Param_Amount[udg_AHE_Index])
        
        set udg_AHE_Event_OnHeal_After = 1
        set udg_AHE_Event_OnHeal_After = 0
        
        set udg_AHE_Param_Index_Exists[udg_AHE_Index] = false
        set udg_AHE_Param_Source[udg_AHE_Index] = null
        set udg_AHE_Param_Target[udg_AHE_Index] = null
        set udg_AHE_Param_Amount[udg_AHE_Index] = 0
        set udg_AHE_Param_Modifier[udg_AHE_Index] = 1
        set udg_AHE_Param_HealType[udg_AHE_Index] = 0
        
        set udg_AHE_Index = oldIndex
    endfunction
    
endlibrary

I have this function that runs every 0.1 seconds to regenerate unit's health:
JASS:
function Regeneration takes nothing returns nothing
    local unit FoG
    local integer unitId
    local group g = CreateGroup()
    local integer id
    loop
        set FoG = FirstOfGroup(LivingUnits)
        exitwhen FoG == null
        set unitId = GetUnitUserData(FoG)
        call GroupRemoveUnit(LivingUnits, FoG)
        call GroupAddUnit(g, FoG)
        
        set id = AHE_CreateNewIndex()
        set udg_AHE_Param_Source[id] = FoG
        set udg_AHE_Param_Target[id] = FoG
        set udg_AHE_Param_Amount[id] = Table_Unit_Health_Regeneration[unitId] * 0.1
        set udg_AHE_Param_HealType[id] = udg_HEAL_TYPE_REGENERATION
        call AHE_ApplyHeal(id)
    endloop
    call DestroyGroup(LivingUnits)
    set LivingUnits = g
    set g = null
endfunction

Only this part is really important.
JASS:
        set id = AHE_CreateNewIndex()
        set udg_AHE_Param_Source[id] = FoG
        set udg_AHE_Param_Target[id] = FoG
        set udg_AHE_Param_Amount[id] = Table_Unit_Health_Regeneration[unitId] * 0.1
        set udg_AHE_Param_Modifier[id] = 1
        set udg_AHE_Param_HealType[id] = udg_HEAL_TYPE_REGENERATION
        call AHE_ApplyHeal(id)

Which can also be done in GUI: (If you created the variables in GUI ofcourse.)
  • Actions
    • Custom script: set udg_TempInteger = AHE_CreateNewIndex()
    • Set AHE_Param_Source[TempInteger] = (Triggering unit)
    • Set AHE_Param_Target[TempInteger] = (Triggering unit)
    • Set AHE_Param_Amount[TempInteger] = 100.00
    • Set AHE_Param_HealType[TempInteger] = HEAL_TYPE_SPELL
    • Custom script: call AHE_ApplyHeal(udg_TempInteger)
To display the text, I use a little snippet for CombatText:
JASS:
library combatText
    
    globals
        
        integer array       udg_AHE_CombatText_Color_Blue
        integer array       udg_AHE_CombatText_Color_Green
        integer array       udg_AHE_CombatText_Color_Red
        string array        udg_AHE_CombatText_String
        
    endglobals

    function CreateCombatText takes string text, real size, real x, real y, integer red, integer green, integer blue returns nothing
        local texttag tt = CreateTextTag()
        local real angle = GetRandomReal(0, 90) + GetRandomReal(0, 90)
        
        call SetTextTagText(tt, text, size)
        call SetTextTagPos(tt, x, y, 40)
        call SetTextTagColor(tt, red, green, blue, 255)
        call SetTextTagVelocity(tt, 0.071 * Cos(angle * bj_DEGTORAD), 0.071 * Sin(angle * bj_DEGTORAD))
        call SetTextTagPermanent(tt, false)
        call SetTextTagLifespan(tt, 1.3)
        call SetTextTagFadepoint(tt, 0.9)
        
        set tt = null
    endfunction
    
endlibrary

Wich I use like this for my heals:
JASS:
function AHE_CreateCombatText takes nothing returns boolean
    local real size = 0.0158 + 0.00006 * udg_AHE_Param_Amount[udg_AHE_Index]
    set udg_AHE_CombatText_String[udg_AHE_Index] = I2S(R2I(udg_AHE_Param_Amount[udg_AHE_Index]))
    if udg_AHE_CombatText_Color_Red[udg_AHE_Index] > 255 then
        set udg_AHE_CombatText_Color_Red[udg_AHE_Index] = 0
        set udg_AHE_CombatText_Color_Green[udg_AHE_Index] = 255
        set udg_AHE_CombatText_Color_Blue[udg_AHE_Index] = 0
    endif
    if size > 0.345 then
        set size = 0.345
    endif
    
    call CreateCombatText(udg_AHE_CombatText_String[udg_AHE_Index], size, GetUnitX(udg_AHE_Param_Target[udg_AHE_Index]), GetUnitY(udg_AHE_Param_Target[udg_AHE_Index]), udg_AHE_CombatText_Color_Red[udg_AHE_Index], udg_AHE_CombatText_Color_Green[udg_AHE_Index], udg_AHE_CombatText_Color_Blue[udg_AHE_Index])
    
    return false
endfunction

function AHE_InitCombatText takes nothing returns boolean
    
    set udg_AHE_CombatText_String[udg_AHE_NewIndex]         = null
    set udg_AHE_CombatText_Color_Red[udg_AHE_NewIndex]      = 256
    set udg_AHE_CombatText_Color_Green[udg_AHE_NewIndex]    = 256
    set udg_AHE_CombatText_Color_Blue[udg_AHE_NewIndex]     = 256
    
    return false
endfunction

//===========================================================================
function InitTrig_ADE_Combat_Text_Extension takes nothing returns nothing
    local trigger t
    
    set t = CreateTrigger()
    call TriggerRegisterVariableEvent(t, "udg_AHE_Event_OnHeal_After", EQUAL, 0)
    call TriggerAddCondition(t, Filter(function AHE_CreateCombatText))
    
    set t = CreateTrigger()
    call TriggerRegisterVariableEvent(t, "udg_AHE_Event_Heal_Created", EQUAL, 0)
    call TriggerAddCondition(t, Filter(function AHE_InitCombatText))
    
    set t = null
endfunction
 
Level 31
Joined
Jul 10, 2007
Messages
6,306
You want to display heals only every x seconds or you'll get spammed. These intervals are called ticks. Many ticks are 6 seconds long. Some games only regen or buff every tick as well. Anyways, continue to add in the regen amt and then every tick, display it and clear it out. This should be done for all over time things.
 
Status
Not open for further replies.
Top