HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

Gah Leaks

04-12-2007, 12:23 AM#1
Tastingo
Sorry for asking for so much help, but I wanna make sure I learn all the ins and outs of JASS with this little map. Anyway this trigger seems to really leak a lot every time its ran. The trigger is kind of long but, its pretty much repeated in the Thaw section. I would appreciate it if you could help me yet again with my trouble. Thanks to everyone who has been helping me though, especially blue_da_noob since he has pretty much answered all my questions. Couple things you should know, I want the unit to turn a color when its frozen, and it to be paused. For some reason since I put the loops in the pausing hasn't worked. Any fix ups on this would be most appreciated.

Collapse JASS:
function FreezeUnit takes nothing returns nothing
    //Locals
    local unit UFreezing
    local unit UFrozen
    local force TempForce
    local integer begin = 0
    local integer end = 6
    set UFreezing = GetAttacker()
    set UFrozen = GetTriggerUnit()
    set TempForce = GetPlayersAll()
    
    //Heal Unit
    
    call SetUnitState(UFrozen, UNIT_STATE_LIFE, RMaxBJ(0,100))
    
    //Check if unit can be frozen
    
    if( IsUnitPaused(UFrozen) == false ) then
        if( GetUnitTypeId(UFrozen) != GetUnitTypeId(UFreezing)) then
            
            //Team 1 Frozen Color
            if( GetUnitTypeId(UFrozen) == udg_UNTTypes[1] ) then
                loop
                    if(GetLocalPlayer() == Player(begin)) then
                        call SetUnitVertexColor(UFrozen, 0, 0, 255, 255)
                        set begin=begin+1
                    endif
                    exitwhen begin>end
                endloop
                set begin=6
                set end=11
                loop
                    if(GetLocalPlayer() == Player(begin)) then
                        call SetUnitVertexColor(UFrozen, 0, 255, 0, 255)
                        set begin=begin+1
                    endif
                    exitwhen begin>end
                endloop
                
                //Team 2 Frozen Color
            else
                set begin = 0
                set end = 6
                if( GetUnitTypeId(UFrozen) == udg_UNTTypes[2] ) then
                    loop
                        if(GetLocalPlayer() == Player(begin)) then
                            call SetUnitVertexColor(UFrozen, 0, 255, 0, 255)
                            set begin=begin+1
                        endif
                        exitwhen begin>end
                    endloop
                    set begin=6
                    set end=11
                    loop
                        if(GetLocalPlayer() == Player(begin)) then
                            call SetUnitVertexColor(UFrozen, 0, 0, 255, 255)
                            set begin=begin+1
                        endif
                        exitwhen begin>end
                    endloop
                endif
            endif
            
            //Other Animations
            call SetUnitTimeScalePercent( UFrozen, 0.00 )
            call IssueImmediateOrder( UFrozen, "stop" )
            call PauseUnit(UFrozen, true)
            call PingMinimapForForce(TempForce, GetLocationX(GetUnitLoc(UFrozen)), GetLocationY(GetUnitLoc(UFrozen)), 5.00)
            
            //Message players
            call DisplayTimedTextToForce( TempForce, 10.00, ( udg_STRColors[GetPlayerId(GetOwningPlayer(UFreezing))+1] + ( udg_STRNameArray[GetPlayerId(GetOwningPlayer(UFreezing))+1] + ( " |cff3366FFhas frozen|r " + ( udg_STRColors[GetPlayerId(GetOwningPlayer(UFrozen))+1] + udg_STRNameArray[GetPlayerId(GetOwningPlayer(UFrozen))+1] ) ) ) ) )
            
            //Score for players
            
            if( GetUnitTypeId(UFrozen) == udg_UNTTypes[1] ) then
                set udg_INTTeam1Frozen = udg_INTTeam1Frozen+1
            else
                set udg_INTTeam2Frozen = udg_INTTeam2Frozen+1
            endif
            call SetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_GOLD) + 1)
            call SetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_FOOD_USED, GetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_FOOD_USED) + 1)
            set udg_INTFrozen[GetConvertedPlayerId(GetOwningPlayer(UFrozen))] = ( udg_INTFrozen[GetConvertedPlayerId(GetOwningPlayer(UFrozen))] + 1 )
            set udg_INTFreezes[GetConvertedPlayerId(GetOwningPlayer(UFreezing))] = ( udg_INTFreezes[GetConvertedPlayerId(GetOwningPlayer(UFreezing))] + 1 )
            
            
            //Check if all frozen
            if( udg_INTTeam1Players == udg_INTTeam1Frozen) then
                set udg_INTWinner = 2
                call TriggerExecute( gg_trg_Team_Scores )
            elseif( udg_INTTeam2Players == udg_INTTeam2Frozen) then
                set udg_INTWinner = 1
                call TriggerExecute( gg_trg_Team_Scores )
                
            endif
        endif
        
        //Check if unit can be thawed
        
    elseif( IsUnitPaused(UFrozen) == true ) then
        if( GetUnitTypeId(UFrozen) == GetUnitTypeId(UFreezing)) then
            
            //Team 1 Thaw Color
            set begin=0
            set end = 6
            if( GetUnitTypeId(UFrozen) == udg_UNTTypes[1] ) then
                loop
                    if(GetLocalPlayer() == Player(begin)) then
                        call SetUnitVertexColor(UFrozen, 255, 255, 255, 255)
                        set begin=begin+1
                    endif
                    exitwhen begin>end
                endloop
                set begin=6
                set end=11
                loop
                    if(GetLocalPlayer() == Player(begin)) then
                        call SetUnitVertexColor(UFrozen, 255, 0, 0, 255)
                        set begin=begin+1
                    endif
                    exitwhen begin>end
                endloop
                
                //Team 2 Thaw Color
            else
                set begin = 0
                set end = 6
                if( GetUnitTypeId(UFrozen) == udg_UNTTypes[2] ) then
                    loop
                        if(GetLocalPlayer() == Player(begin)) then
                            call SetUnitVertexColor(UFrozen, 255, 0, 0, 255)
                            set begin=begin+1
                        endif
                        exitwhen begin>end
                    endloop
                    set begin=6
                    set end=11
                    loop
                        if(GetLocalPlayer() == Player(begin)) then
                            call SetUnitVertexColor(UFrozen, 255, 255, 255, 255)
                            set begin=begin+1
                        endif
                        exitwhen begin>end
                    endloop
                endif
            endif
            
            //Other Animations
            call SetUnitTimeScalePercent( UFrozen, 100.00 )
            call PauseUnit(UFrozen, false)
            call PingMinimapForForce(TempForce, GetLocationX(GetUnitLoc(UFrozen)), GetLocationY(GetUnitLoc(UFrozen)), 5.00)
            
            //Message players
            call DisplayTimedTextToForce( TempForce, 10.00, ( udg_STRColors[GetPlayerId(GetOwningPlayer(UFreezing))+1] + ( udg_STRNameArray[GetPlayerId(GetOwningPlayer(UFreezing))+1] + ( " |cffCC3333has thawed|r " + ( udg_STRColors[GetPlayerId(GetOwningPlayer(UFrozen))+1] + udg_STRNameArray[GetPlayerId(GetOwningPlayer(UFrozen))+1] ) ) ) ) )
            
            //Score for players
            if( GetUnitTypeId(UFrozen) == udg_UNTTypes[1] ) then
                set udg_INTTeam1Frozen = udg_INTTeam1Frozen-1
            else
                set udg_INTTeam2Frozen = udg_INTTeam2Frozen-1
            endif
            call SetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_GOLD) + 1)
            call SetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_LUMBER, GetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_LUMBER) + 1)
            set udg_INTThaws[GetConvertedPlayerId(GetOwningPlayer(UFreezing))] = ( udg_INTThaws[GetConvertedPlayerId(GetOwningPlayer(UFreezing))] + 1 )
            set udg_INTThawed[GetConvertedPlayerId(GetOwningPlayer(UFrozen))] = ( udg_INTThawed[GetConvertedPlayerId(GetOwningPlayer(UFrozen))] + 1 )
            
        endif
    endif
    
    //Null Locals
    
    set UFreezing = null
    set UFrozen = null
    call DestroyForce(TempForce)
endfunction

//===========================================================================
function InitTrig_Player_Attacked takes nothing returns nothing
    local integer begin = 0
    set gg_trg_Player_Attacked = CreateTrigger(  )
    loop
        call TriggerRegisterPlayerUnitEventSimple( gg_trg_Player_Attacked, Player(begin), EVENT_PLAYER_UNIT_ATTACKED )
        set begin = begin+1
        exitwhen begin>11
    endloop
    call TriggerAddAction( gg_trg_Player_Attacked, function FreezeUnit )
endfunction
04-12-2007, 12:42 AM#2
Earth-Fury
I try to fix your code for you... but without indenting, its impossible. I can't understand what the hell is going on in that much code without some form of indenting.
04-12-2007, 12:45 AM#3
Tastingo
Well I'll do anything to get this fixed, I need to learn from it so... Tell me how you wanted it indented. Like if you if then else indented, same with loops.
04-12-2007, 12:48 AM#4
Earth-Fury
Usually, you indent in blocks.

Blocks are anything that have a start (function) and an end (endfunction). With an If, you just consider else and elseif to end the last if block and start a new one.
eg:
Collapse JASS:
function
    loop
        call
        call
        call
        exitwhen
    endloop
    if
        call
        call
    else
        call
        call
    endif
endfunction
04-12-2007, 12:49 AM#5
Tastingo
Ok, I'll indent it right now. Thanks a bunch.
04-12-2007, 12:50 AM#6
PurgeandFire111
I will run it under JC, just give me a second. (I don't feel like reading the whole thing)

I don't know, it gave me like 44 errors or 42 or something like that. Maybe you can get JASSCraft and correct it...
Here is the link:
Click here to get JASSCraft!
Sorry, I can't c'n'p the errors because it isn't actual changable text.

@Earth-Fury: Here is the code indented... Here:
Collapse JASS:
function FreezeUnit takes nothing returns nothing
    //Locals
    local unit UFreezing
    local unit UFrozen
    local force TempForce
    local integer begin = 0
    local integer end = 6
    set UFreezing = GetAttacker()
    set UFrozen = GetTriggerUnit()
    set TempForce = GetPlayersAll()
    
    //Heal Unit
    
    call SetUnitState(UFrozen, UNIT_STATE_LIFE, RMaxBJ(0,100))
    
    //Check if unit can be frozen
    
    if( IsUnitPaused(UFrozen) == false ) then
        if( GetUnitTypeId(UFrozen) != GetUnitTypeId(UFreezing)) then
            
            //Team 1 Frozen Color
            if( GetUnitTypeId(UFrozen) == udg_UNTTypes[1] ) then
                loop
                    if(GetLocalPlayer() == Player(begin)) then
                        call SetUnitVertexColor(UFrozen, 0, 0, 255, 255)
                        set begin=begin+1
                    endif
                    exitwhen begin>end
                endloop
                set begin=6
                set end=11
                loop
                    if(GetLocalPlayer() == Player(begin)) then
                        call SetUnitVertexColor(UFrozen, 0, 255, 0, 255)
                        set begin=begin+1
                    endif
                    exitwhen begin>end
                endloop
                
                //Team 2 Frozen Color
            else
                set begin = 0
                set end = 6
                if( GetUnitTypeId(UFrozen) == udg_UNTTypes[2] ) then
                    loop
                        if(GetLocalPlayer() == Player(begin)) then
                            call SetUnitVertexColor(UFrozen, 0, 255, 0, 255)
                            set begin=begin+1
                        endif
                        exitwhen begin>end
                    endloop
                    set begin=6
                    set end=11
                    loop
                        if(GetLocalPlayer() == Player(begin)) then
                            call SetUnitVertexColor(UFrozen, 0, 0, 255, 255)
                            set begin=begin+1
                        endif
                        exitwhen begin>end
                    endloop
                endif
            endif
            
            //Other Animations
            call SetUnitTimeScalePercent( UFrozen, 0.00 )
            call IssueImmediateOrder( UFrozen, "stop" )
            call PauseUnit(UFrozen, true)
            call PingMinimapForForce(TempForce, GetLocationX(GetUnitLoc(UFrozen)), GetLocationY(GetUnitLoc(UFrozen)), 5.00)
            
            //Message players
            call DisplayTimedTextToForce( TempForce, 10.00, ( udg_STRColors[GetPlayerId(GetOwningPlayer(UFreezing))+1] + ( udg_STRNameArray[GetPlayerId(GetOwningPlayer(UFreezing))+1] + ( " |cff3366FFhas frozen|r " + ( udg_STRColors[GetPlayerId(GetOwningPlayer(UFrozen))+1] + udg_STRNameArray[GetPlayerId(GetOwningPlayer(UFrozen))+1] ) ) ) ) )
            
            //Score for players
            
            if( GetUnitTypeId(UFrozen) == udg_UNTTypes[1] ) then
                set udg_INTTeam1Frozen = udg_INTTeam1Frozen+1
            else
                set udg_INTTeam2Frozen = udg_INTTeam2Frozen+1
            endif
            call SetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_GOLD) + 1)
            call SetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_FOOD_USED, GetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_FOOD_USED) + 1)
            set udg_INTFrozen[GetConvertedPlayerId(GetOwningPlayer(UFrozen))] = ( udg_INTFrozen[GetConvertedPlayerId(GetOwningPlayer(UFrozen))] + 1 )
            set udg_INTFreezes[GetConvertedPlayerId(GetOwningPlayer(UFreezing))] = ( udg_INTFreezes[GetConvertedPlayerId(GetOwningPlayer(UFreezing))] + 1 )
            
            
            //Check if all frozen
            if( udg_INTTeam1Players == udg_INTTeam1Frozen) then
                set udg_INTWinner = 2
                call TriggerExecute( gg_trg_Team_Scores )
            elseif( udg_INTTeam2Players == udg_INTTeam2Frozen) then
                set udg_INTWinner = 1
                call TriggerExecute( gg_trg_Team_Scores )
                
            endif
        endif
        
        //Check if unit can be thawed
        
    elseif( IsUnitPaused(UFrozen) == true ) then
        if( GetUnitTypeId(UFrozen) == GetUnitTypeId(UFreezing)) then
            
            //Team 1 Thaw Color
            set begin=0
            set end = 6
            if( GetUnitTypeId(UFrozen) == udg_UNTTypes[1] ) then
                loop
                    if(GetLocalPlayer() == Player(begin)) then
                        call SetUnitVertexColor(UFrozen, 255, 255, 255, 255)
                        set begin=begin+1
                    endif
                    exitwhen begin>end
                endloop
                set begin=6
                set end=11
                loop
                    if(GetLocalPlayer() == Player(begin)) then
                        call SetUnitVertexColor(UFrozen, 255, 0, 0, 255)
                        set begin=begin+1
                    endif
                    exitwhen begin>end
                endloop
                
                //Team 2 Thaw Color
            else
                set begin = 0
                set end = 6
                if( GetUnitTypeId(UFrozen) == udg_UNTTypes[2] ) then
                    loop
                        if(GetLocalPlayer() == Player(begin)) then
                            call SetUnitVertexColor(UFrozen, 255, 0, 0, 255)
                            set begin=begin+1
                        endif
                        exitwhen begin>end
                    endloop
                    set begin=6
                    set end=11
                    loop
                        if(GetLocalPlayer() == Player(begin)) then
                            call SetUnitVertexColor(UFrozen, 255, 255, 255, 255)
                            set begin=begin+1
                        endif
                        exitwhen begin>end
                    endloop
                endif
            endif
            
            //Other Animations
            call SetUnitTimeScalePercent( UFrozen, 100.00 )
            call PauseUnit(UFrozen, false)
            call PingMinimapForForce(TempForce, GetLocationX(GetUnitLoc(UFrozen)), GetLocationY(GetUnitLoc(UFrozen)), 5.00)
            
            //Message players
            call DisplayTimedTextToForce( TempForce, 10.00, ( udg_STRColors[GetPlayerId(GetOwningPlayer(UFreezing))+1] + ( udg_STRNameArray[GetPlayerId(GetOwningPlayer(UFreezing))+1] + ( " |cffCC3333has thawed|r " + ( udg_STRColors[GetPlayerId(GetOwningPlayer(UFrozen))+1] + udg_STRNameArray[GetPlayerId(GetOwningPlayer(UFrozen))+1] ) ) ) ) )
            
            //Score for players
            if( GetUnitTypeId(UFrozen) == udg_UNTTypes[1] ) then
                set udg_INTTeam1Frozen = udg_INTTeam1Frozen-1
            else
                set udg_INTTeam2Frozen = udg_INTTeam2Frozen-1
            endif
            call SetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_GOLD) + 1)
            call SetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_LUMBER, GetPlayerState(GetOwningPlayer(UFreezing), PLAYER_STATE_RESOURCE_LUMBER) + 1)
            set udg_INTThaws[GetConvertedPlayerId(GetOwningPlayer(UFreezing))] = ( udg_INTThaws[GetConvertedPlayerId(GetOwningPlayer(UFreezing))] + 1 )
            set udg_INTThawed[GetConvertedPlayerId(GetOwningPlayer(UFrozen))] = ( udg_INTThawed[GetConvertedPlayerId(GetOwningPlayer(UFrozen))] + 1 )
            
        endif
    endif
    
    //Null Locals
    
    set UFreezing = null
    set UFrozen = null
    call DestroyForce(TempForce)
endfunction

//===========================================================================
function InitTrig_Player_Attacked takes nothing returns nothing
    local integer begin = 0
    set gg_trg_Player_Attacked = CreateTrigger(  )
    loop
        call TriggerRegisterPlayerUnitEventSimple( gg_trg_Player_Attacked, Player(begin), EVENT_PLAYER_UNIT_ATTACKED )
        set begin = begin+1
        exitwhen begin>11
    endloop
    call TriggerAddAction( gg_trg_Player_Attacked, function FreezeUnit )
endfunction

Ok... I'll tell you some of the problems:

- The variable "UNT_Types[1]" wasn't set as a variable, nor was it set as an array...
- The STR_Colors variable wasn't set.
- Basically, you forgot to set a bunch of variables you used. You can set a variable like this:
Collapse JASS:
set Var = Value
or
local <Type> Var = <Value>
etc. 
I hope this helps!
04-12-2007, 12:58 AM#7
Tastingo
Wow thanks that looks a lot better then what I had done, haha. Changing it. I have all the global variables set in another trigger, the trigger works fine but it just lags really bad when a bunch of units attack. I also wish for the event to be attack instead of damage.
04-12-2007, 01:17 AM#8
PurgeandFire111
I'll take a look at it. btw:
This:
Collapse JASS:
function FreezeUnit takes nothing returns nothing
    //Locals
    local unit UFreezing
    local unit UFrozen
    local force TempForce
    local integer begin = 0
    local integer end = 6
    set UFreezing = GetAttacker()
    set UFrozen = GetTriggerUnit()
    set TempForce = GetPlayersAll()
Can be this:
Collapse JASS:
function FreezeUnit takes nothing returns nothing
    //Locals
    local unit UFreezing = GetAttacker()
    local unit UFrozen = GetTriggerUnit()
    local force TempForce = GetPlayersAll()
    local integer begin = 0
    local integer end = 6
...but that's not the problem.

EDIT: After skimming, I found one small position leak here:
Collapse JASS:
            call PingMinimapForForce(TempForce, GetLocationX(GetUnitLoc(UFrozen)), GetLocationY(GetUnitLoc(UFrozen)), 5.00)
Set it as a variable:
Collapse JASS:
      local location UFrozloc = (GetUnitLoc(UFrozen))
Use it:
Collapse JASS:
            call PingMinimapForForce(TempForce, GetLocationX(UFrozloc), GetLocationY(UFrozloc), 5.00)
Then null and remove it:
Collapse JASS:
      set UFrozloc = null
      call RemoveLocation( UFrozloc )
04-12-2007, 01:19 AM#9
wantok
Collapse JASS:
loop
    if(GetLocalPlayer() == Player(begin)) then
        call SetUnitVertexColor(UFrozen, 0, 0, 255, 255)
        set begin=begin+1
    endif
    exitwhen begin>end
endloop
set begin=6
set end=11
loop
    if(GetLocalPlayer() == Player(begin)) then
        call SetUnitVertexColor(UFrozen, 0, 255, 0, 255)
        set begin=begin+1
    endif
    exitwhen begin>end
endloop

I'm not sure, but aren't these infinite loops? I don't see how begin will ever become greater than end.
04-12-2007, 01:27 AM#10
PurgeandFire111
Wouldn't it loop until that occurs, or? Also, if it goes into an infinite loop, wouldn't WE crash? I'm not sure either...
04-12-2007, 01:33 AM#11
wantok
Collapse JASS:
set UFrozloc = null
call RemoveLocation( UFrozloc )

Small correction: You want to remove it before you null it. Otherwise you wont be removing anything.
04-12-2007, 01:33 AM#12
Tastingo
Now the thing with nulling is that I was told by Vexorian that nulling is bad because it makes it so there is nothing to delete. I'm not sure if he was talking about something different though. Please explain this for me.
04-12-2007, 01:41 AM#13
wantok
You said that the units no longer get paused since you put in the loops. Does any of the other stuff after the loops work?
04-12-2007, 01:49 AM#14
Tastingo
Well I was wrong, I noticed that only udg_UNTTypes[2] gets frozen. Also the message only displays with that and the ping. With udg_UNTTypes[1] however, the unit just turns blue but doesn't pause nor a text display nor a ping.
04-12-2007, 01:57 AM#15
wantok
Try changing your loops to to this:

Collapse JASS:
loop
    if(GetLocalPlayer() == Player(begin)) then
        call SetUnitVertexColor(UFrozen, 0, 0, 255, 255)
    endif
    set begin = begin + 1
    exitwhen begin>end
endloop

Also I think you want your end value to be 5 not 6.