Is This Spell Leaking?

chobibo

Level 1 Crypt Lord
Reaction score
48
@ off topic:How do you know if your spell leaks? Is there a program you use?
OK now for my real question: Does my spell leak? here it is:
JASS:
// Global Variables used || Remove This if you're not using NewGen WE =====
globals
    unit DSunit = null
endglobals
//Configuration ===========================================================
constant function DivineShieldId takes nothing returns integer
    return 'A000' // put raw code here
endfunction

constant function DivineShieldDuration takes integer level returns integer
    return 10 * level
endfunction

constant function DivineShieldRange takes integer level returns integer
    return 500 + level*50
endfunction

constant function DivineShieldEffectTarget takes nothing returns string
    return "Abilities\\Spells\\Human\\DivineShield\\DivineShieldTarget.mdl"
endfunction

constant function DivineShieldEffectCaster takes nothing returns string
    return "Abilities\\Spells\\Human\\Resurrect\\ResurrectCaster.mdl"
endfunction
//==================================================
function DivineShieldCondition takes nothing returns boolean
    return GetSpellAbilityId() == DivineShieldId() 
endfunction

function DSfilter takes nothing returns boolean
    return GetWidgetLife(GetFilterUnit()) > 0.405 == true and IsUnitType(GetFilterUnit(), UNIT_TYPE_MECHANICAL) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitAlly(GetFilterUnit(), GetOwningPlayer(GetTriggerUnit())) == true and GetOwningPlayer(GetFilterUnit()) != Player(PLAYER_NEUTRAL_PASSIVE) 
endfunction

function DivineShieldEx takes nothing returns nothing
    call ExecuteFunc("DivineShield")
endfunction

function DivineShieldAction takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit fu
    local integer level = GetUnitAbilityLevel( u, DivineShieldId())
    local group g = CreateGroup()
    local boolexpr b = Condition(function DSfilter)
    
    call GroupEnumUnitsInRange( g, GetUnitX(u), GetUnitY(u), I2R(DivineShieldRange(level)), b)
    call DestroyEffect(AddSpecialEffectTarget( DivineShieldEffectCaster(), u, "origin"))
    
    loop
        set fu = FirstOfGroup(g)
        set DSunit = fu // udg_DSunit
        exitwhen fu == null
        call DivineShieldEx()
        call GroupRemoveUnit( g, fu)
    endloop
    
    call DestroyGroup(g)
    set u = null
    set fu = null
    set g = null
    set b = null
    
endfunction

function DivineShield takes nothing returns nothing
    local unit caster = GetTriggerUnit()
    local unit u = DSunit// udg_DSunit
    local effect sfx // Optional Effect
    local integer level = GetUnitAbilityLevel( caster, DivineShieldId())
    if GetUnitUserData(u) != 1 then
        call SetUnitUserData(u, 1)
        set sfx = AddSpecialEffectTarget(DivineShieldEffectTarget(), u, "origin") // Optional Effect
        call SetUnitInvulnerable( u, true)
        call TriggerSleepAction(I2R(DivineShieldDuration(level)))
        call DestroyEffect(sfx) //Optional Effect
        call SetUnitInvulnerable( u, false)
        call SetUnitUserData(u, 0)
    endif
    set u = null
    set caster = null
    set DSunit = null //udg_DSunit
    set sfx = null
endfunction

//===========================================================================
function DivineShieldboolexpr takes nothing returns boolean
    return true
endfunction

function InitTrig_Divine_Shield takes nothing returns nothing
    local integer i = 0
    local player p
    local boolexpr b = Condition(function DivineShieldboolexpr)
    local triggeraction DivineShield_ta
    local triggercondition DivineShield_tc
    set gg_trg_Divine_Shield = CreateTrigger(  )
    
    loop
        set p = Player(i)
        call TriggerRegisterPlayerUnitEvent( gg_trg_Divine_Shield, p, EVENT_PLAYER_UNIT_SPELL_CAST, b)
        set i = i + 1
        set p = null
        exitwhen i == bj_MAX_PLAYERS
    endloop
    
    set DivineShield_tc = TriggerAddCondition( gg_trg_Divine_Shield, Condition( function DivineShieldCondition ) )
    set DivineShield_ta = TriggerAddAction( gg_trg_Divine_Shield, function DivineShieldAction )
    
    call Preload ("Abilities\\Spells\\Human\\DivineShield\\DivineShieldTarget.mdl") // Optional Effect
    call Preload("Abilities\\Spells\\Human\\Resurrect\\ResurrectCaster.mdl")
    
    set gg_trg_Divine_Shield = null
    set DivineShield_tc = null
    set DivineShield_ta = null
    set b = null
    set p = null
endfunction

I lose 100 - 200 kb of memory every time I cast this spell. I'm monitoring it via task manager. No background programs running, just warcraft 3 tft. I'm thinking its normal but I just wanted to ask to confirm if it a memory leak or not. Thanks.
 

chobibo

Level 1 Crypt Lord
Reaction score
48
lol :eek:, I thought I was really monitoring it. btw AceHart, does the spell leak ?
 

Rheias

New Helper (I got over 2000 posts)
Reaction score
232
Using local triggeractions isn't safe. Use only conditions and execute a function. Other than that I couldn't see anything that leaks. I suggest not nulling globals triggers. Not that you don't have to null BoolExprs.
 

Vexorian

Why no custom sig?
Reaction score
187
> I'm monitoring it via task manager.

That doesn't tell you anything of value...
It does if you run war3 and window and place task manager in a visible place, you can see war3 raising memory...
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      • Ghan
        Administrator - Servers are fun

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top