• Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.

Periodic Healing Text

Status
Not open for further replies.
Level 24
Joined
Aug 1, 2013
Messages
4,658
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
 
Status
Not open for further replies.
Top