HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

Heavy trigger, memory leak.

01-10-2005, 07:21 PM#1
Mjukland
Ok, This trigger leaks, I don't know where, so if u have some time to go through this code I would realy appreciate it.

Code:
// FADING TEXT FUNCTION IN WEU

function FadingText_child takes nothing returns nothing
local integer alpha=255
local integer red=S2I(SubString(bj_cineFadeContinueTex,1,4))
local integer green=S2I(SubString(bj_cineFadeContinueTex,4,7))
local integer blue=S2I(SubString(bj_cineFadeContinueTex,7,10))
local texttag t= bj_lastCreatedTextTag
call DestroyTrigger(GetTriggeringTrigger())
call TriggerSleepAction(1.00)
loop
set alpha=alpha - 32
exitwhen alpha <= 0
call SetTextTagColor(t,red,green,blue,alpha)
call TriggerSleepAction(0.01)
endloop
call DestroyTextTag(t)
set t = null
endfunction


function FadingText takes string msg, integer red, integer green, integer blue, real x, real y returns nothing
local texttag t = CreateTextTag()
local trigger child = CreateTrigger()
call SetTextTagText(t,msg,0.025)
call SetTextTagPos(t,x,y, 0.00)
call SetTextTagColor(t,red,green,blue,255)
call SetTextTagVelocity(t,0,0.02)
call TriggerAddAction(child, function FadingText_child)
set bj_lastCreatedTextTag=t
set bj_cineFadeContinueTex=I2S(1000000000 + red * 1000000 + green * 1000 + blue)
call TriggerExecute(child)
endfunction

// FADING TEXT FUNCTION IN WEU


// INFLICTDAMAGE FUNCTION

function inflictdamage takes unit u, unit target, real damage, integer typeofdamage, sound s returns nothing

local real truedamage
local integer i 
local integer randnr
local integer evasion
local integer showdmg
local location l
local real randomdmg

set l = GetUnitLoc(target)
set i = GetConvertedPlayerId(GetOwningPlayer(target))
set evasion = R2I(udg_HeroEvasion[i])

if ( typeofdamage == 1 ) then

    set randnr = GetRandomInt(1, 100)
    if ( randnr > evasion ) then

        set randomdmg = GetRandomReal(1.00, 10.00)
        set damage = damage + randomdmg
        set truedamage = damage - (udg_HeroDefense[i] * 3)
        call UnitDamageTargetBJ( u, target, truedamage, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )
        set showdmg = R2I(truedamage)
        call FadingText( I2S(showdmg), 255, 0, 0, GetUnitX(target), GetUnitY(target) )
        call PlaySoundAtPointBJ( s, 100, l, 0 )

     else
     endif

else
endif

call RemoveLocation(l)
set l = null

endfunction

// INFLICTDAMAGE FUNCTION

//CONDITION

function Trig_AttackSword_Conditions takes nothing returns boolean
    if (GetSpellAbilityId() == 'A000') then
        return true
    endif
    return false
endfunction

//CONDITION


function GroupCheck takes nothing returns boolean
    return ( IsUnitEnemy(GetFilterUnit(),  GetOwningPlayer(udg_Hero[udg_IntTempAttack])) and IsUnitAliveBJ(GetFilterUnit())  )
endfunction


//MAIN

function Trig_AttackSword_Actions takes nothing returns nothing

    local group g = null
    local unit u = null
    local location l

    local integer k
    local integer k2
    local integer i
    local integer showdmg
    local integer typeofdamage
    local rect r
    local real array re
    local real damage
    local real randomdmg
    local sound s

    set s = gg_snd_MetalHeavyBashFlesh3
    set i = GetConvertedPlayerId(GetOwningPlayer(GetTriggerUnit()))

    call TriggerSleepAction( 0.01 )
    set udg_BoolHeroArrowUp[i] = false
    set udg_BoolHeroArrowDown[i] = false
    set udg_BoolHeroArrowLeft[i] = false
    set udg_BoolHeroArrowRight[i] = false
    set udg_RealTimerMovement[i] = 1

    set l = GetUnitLoc(udg_Hero[i])
    set r = RectFromCenterSizeBJ(PolarProjectionBJ( l, 90.00, GetUnitFacing(udg_Hero[i])), 240.00, 240.00)
    call ResetUnitAnimation( udg_Hero[i] )
    call SetUnitAnimation( udg_Hero[i], "attack" )
    set udg_IntTempAttack = i
    set g = GetUnitsInRectMatching(r, Condition(function GroupCheck))
    set k = CountUnitsInGroup(g)
    set k2 = 0

    if ( k > 0 ) then
    loop
        exitwhen k2 >= k

        set u = GroupPickRandomUnit(g)

    if ( IsUnitType( u, UNIT_TYPE_HERO) == true ) then
    
    set typeofdamage = 1
    set damage = udg_HeroDamageMain[i]

    if (udg_HeroCharge[i] < 100 ) then
    set damage = damage * 0.05
    endif

    set udg_HeroCharge[i] = 0
    set udg_StringTest[i] = ""

    call inflictdamage( udg_Hero[i], u, damage,typeofdamage,s)
    call GroupRemoveUnitSimple( u, g )

    else
        call PlaySoundAtPointBJ( gg_snd_MetalHeavyBashFlesh3, 100, l, 0 )
        set damage = udg_HeroDamageMain[i]
  
        if (udg_HeroCharge[i] < 100 ) then
        set damage = damage * 0.05
        endif

        set udg_HeroCharge[i] = 0
        set udg_StringTest[i] = ""
        set randomdmg = GetRandomReal(1.00, 10.00)
        set damage = damage + randomdmg
        call UnitDamageTargetBJ( udg_Hero[i], u, damage, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )
        set showdmg = R2I(damage)
        call FadingText( I2S(showdmg), 255, 0, 0, GetUnitX(u), GetUnitY(u) )
        call GroupRemoveUnitSimple( u, g )

        endif
        set k2 = k2 + 1

    endloop

    else
        set udg_HeroCharge[i] = 0
        set udg_StringTest[i] = ""
    endif

    call GroupClear( g )
    call DestroyGroup( g )
    call RemoveLocation (l)
    call RemoveRect(r)
    set l = null
    set u = null
    set r = null
    set g = null

endfunction

//MAIN


//===========================================================================
function InitTrig_Attack_Warrior takes nothing returns nothing
    set gg_trg_Attack_Warrior = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Attack_Warrior, Player(0), EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Attack_Warrior, Player(1), EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Attack_Warrior, Player(2), EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Attack_Warrior, Player(3), EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Attack_Warrior, Player(4), EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Attack_Warrior, Player(5), EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Attack_Warrior, Player(6), EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Attack_Warrior, Player(7), EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Attack_Warrior, Player(8), EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Attack_Warrior, Player(9), EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Attack_Warrior, Condition( function Trig_AttackSword_Conditions ) )
    call TriggerAddAction( gg_trg_Attack_Warrior, function Trig_AttackSword_Actions )
endfunction

01-10-2005, 07:46 PM#2
Mjukland
OPS, sorry, found out that this trigger is in fact not leaking at all. Maybe some minor leak, I had another trigger that was the source of the leak, but I've fixed that now.
01-10-2005, 10:18 PM#3
PitzerMike
Nevertheless you should Destroy and null the local trigger at the end of your FadingText function.