• 🏆 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!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[vJASS] anything to improve on here ?

Status
Not open for further replies.
Level 29
Joined
Oct 24, 2012
Messages
6,543
hello this is a unit spawn trigger for my td. if there is anything i can do to inprove it plz tell me thx

JASS:
scope UnitSpawnAll initializer Unit_Spawn_all_Lvls

globals
    trigger trg_UnitSpawnsAll
    boolean array Unit_Spawns_Player
    integer array EnemiesAlive_Counter_Player
    boolean array Boss_Add_Mana_Boolean_Player
    integer array Boss_Bonus_Counter
    integer array Damage_Boss_Round_Count_Player
    group array Unit_Spawns_Group_Player // group for detecting units used in moving from region to region and in P1 kills and P1 spawn 
    private integer array handleID
    private integer array LoopIntPlayer
    private real array spawnx
    private real array spawny
    private integer array Unit_Runner_Spawn
    private integer array Battlegrounds_Spawn
    private constant real bx = GetRectCenterX(gg_rct_P11_Battleground_Spawn)
    private constant real by = GetRectCenterY(gg_rct_P11_Battleground_Spawn)
endglobals

private function BattlegroundSpawns takes integer ub, integer bs, integer p returns nothing
    local integer Loop = 1
    local unit u
    local integer T
    loop
        exitwhen Loop > bs
        set u = CreateUnit(Player(11), ub, bx, by, 0)
        call GroupAddUnit(Battlegrounds_Group_Player[11], u)
        call SetHeroLevel( u, Round_Player, false ) // Round_Player[i]
        set T = GetHeroInt( u, true )
        if T >= 2000 then
            call UnitAddAbility( u, 'ACev' )
            call SetUnitAbilityLevel(  u, 'ACev', 99 )
        elseif T >= 20 then
            call UnitAddAbility( u, 'ACev' )
            call SetUnitAbilityLevel(  u, 'ACev', ( T / 20 ) )
        endif
        set Loop = Loop + 1
    endloop
    set u = null
endfunction

private function whichTimer takes timer t returns integer
    local integer i = 0
    local integer h = GetHandleId( t)
    set t = null
    loop
        exitwhen i > 3
        if handleID[i] == h then
            return i
        endif
        set i = i + 1
    endloop
    return 11
endfunction

private function UnitSpawns takes nothing returns nothing
    local multiboarditem mbi
    local integer us
    local integer ub
    local integer bs
    local integer p
    local timer t
    local unit u
    set t = GetExpiredTimer()
    set p = whichTimer( t)
    set LoopIntPlayer = LoopIntPlayer + 1
    if ( Round_Player < 31) then
        set us = Unit_Runner_Spawn[Round_Player]
        set ub = Battlegrounds_Spawn[Round_Player]
        set bs = 1
    else
        set us = Unit_Runner_Spawn[31]
        set ub = Battlegrounds_Spawn[30]
        set bs = 2
    endif 
    set u = CreateUnit( Player(11), us, spawnx, spawny, 0)
    call GroupAddUnit(Unit_Spawns_Group_Player, u)
    call SetHeroLevel( u, ( Round_Player - 30 ), false )
    set EnemiesAlive_Player = EnemiesAlive_Player + 1 //multiboard variable enemies alive
    set mbi = MultiboardGetItem( gamescoresMultiboard, 5, (p+1) )
    call MultiboardSetItemValue( mbi, playerColors + I2S(EnemiesAlive_Player) + color )
    call MultiboardReleaseItem( mbi)
    call BattlegroundSpawns( ub, bs, p)
    call text( I2S(LoopIntPlayer), p)
    if LoopIntPlayer > Number_Of_Unit_Spawns_Player then
        set LoopIntPlayer = 1
        call PauseTimer( t)
        call DestroyTimer( t)
    endif
    set mbi = null
    set t = null
endfunction

private function Actions takes nothing returns nothing
    local multiboarditem mbi
    local integer p = GetPlayerId( GetTriggerPlayer())
    set Unit_Spawns_Player = false
    set Damage_Boss_Round_Count_Player = Damage_Boss_Round_Count_Player + 1
    set EnemiesAlive_Counter_Player = Number_Of_Unit_Spawns_Player[0]//#of unit spawns is a selected number of spawns in the game
    set Boss_Bonus_Counter = Boss_Bonus_Counter + 1//used for giving players mana to summon a boss
    set Round_Player = Round_Player + 1
    set mbi = MultiboardGetItem( gamescoresMultiboard, 1, (p+1) )
    call MultiboardSetItemValue( mbi, playerColors + I2S(Round_Player) + color )
    call MultiboardReleaseItem( mbi)
    if Boss_Bonus_Counter == 5 then
        set Boss_Add_Mana_Boolean_Player = true
        set Boss_Bonus_Counter = 0
    endif
    set mbi = null
endfunction

private function timersetup takes nothing returns nothing
    local timer t
    local integer p = GetPlayerId( GetTriggerPlayer())
    local integer i
    call Actions()
    set t = CreateTimer()
    set i = GetHandleId( t)
    set handleID = i
    call TimerStart( t, Spawn_Speed_Player, true, function UnitSpawns)
    set t = null
endfunction

private function Runners takes nothing returns nothing
    local integer Loop = 0
    loop
        exitwhen Loop > 1
        set Battlegrounds_Group_Player[Loop] = CreateGroup()
        set Unit_Spawns_Group_Player[Loop] = CreateGroup()
        set Unit_Bosses_Group_Player[Loop] = CreateGroup()
        set Loop = Loop + 1
    endloop
    set Battlegrounds_Group_Player[11] = CreateGroup()
    //the enemy runners for all players
    set Unit_Runner_Spawn[1] = 'h00C'
    set Unit_Runner_Spawn[2] = 'h01Y'
    set Unit_Runner_Spawn[3] = 'h01Z'
    set Unit_Runner_Spawn[4] = 'h020'
    set Unit_Runner_Spawn[5] = 'h021'
    set Unit_Runner_Spawn[6] = 'h022'
    set Unit_Runner_Spawn[7] = 'h023'
    set Unit_Runner_Spawn[8] = 'h024'
    set Unit_Runner_Spawn[9] = 'h025'
    set Unit_Runner_Spawn[10] = 'h026'
    set Unit_Runner_Spawn[11] = 'h027'
    set Unit_Runner_Spawn[12] = 'h028'
    set Unit_Runner_Spawn[13] = 'h029'
    set Unit_Runner_Spawn[14] = 'h02A'
    set Unit_Runner_Spawn[15] = 'h02B'
    set Unit_Runner_Spawn[16] = 'h02C'
    set Unit_Runner_Spawn[17] = 'h02D'
    set Unit_Runner_Spawn[18] = 'h02E'
    set Unit_Runner_Spawn[19] = 'h02F'
    set Unit_Runner_Spawn[20] = 'h02G'
    set Unit_Runner_Spawn[21] = 'h02H'
    set Unit_Runner_Spawn[22] = 'h02I'
    set Unit_Runner_Spawn[23] = 'h02J'
    set Unit_Runner_Spawn[24] = 'h02K'
    set Unit_Runner_Spawn[25] = 'h02L'
    set Unit_Runner_Spawn[26] = 'h02M'
    set Unit_Runner_Spawn[27] = 'h02N'
    set Unit_Runner_Spawn[28] = 'h02O'
    set Unit_Runner_Spawn[29] = 'h02P'
    set Unit_Runner_Spawn[30] = 'h02Q'
    set Unit_Runner_Spawn[31] = 'U00A'
// battleground unit spawns
    set Battlegrounds_Spawn[1] = 'E008'
    set Battlegrounds_Spawn[2] = 'E009'
    set Battlegrounds_Spawn[3] = 'E00B'
    set Battlegrounds_Spawn[4] = 'H05M'
    set Battlegrounds_Spawn[5] = 'N019'
    set Battlegrounds_Spawn[6] = 'N01H'
    set Battlegrounds_Spawn[7] = 'O003'
    set Battlegrounds_Spawn[8] = 'O004'
    set Battlegrounds_Spawn[9] = 'N017'
    set Battlegrounds_Spawn[10] = 'N018'
    set Battlegrounds_Spawn[11] = 'H05P'
    set Battlegrounds_Spawn[12] = 'N016'
    set Battlegrounds_Spawn[13] = 'O005'
    set Battlegrounds_Spawn[14] = 'N01J'
    set Battlegrounds_Spawn[15] = 'N01I'
    set Battlegrounds_Spawn[16] = 'O002'
    set Battlegrounds_Spawn[17] = 'U00M'
    set Battlegrounds_Spawn[18] = 'U00L'
    set Battlegrounds_Spawn[19] = 'U00O'
    set Battlegrounds_Spawn[20] = 'U00N'
    set Battlegrounds_Spawn[21] = 'N01A'
    set Battlegrounds_Spawn[22] = 'H05Q'
    set Battlegrounds_Spawn[23] = 'H05N'
    set Battlegrounds_Spawn[24] = 'E00A'
    set Battlegrounds_Spawn[25] = 'N01B'
    set Battlegrounds_Spawn[26] = 'N01C'
    set Battlegrounds_Spawn[27] = 'N01G'
    set Battlegrounds_Spawn[28] = 'N01D'
    set Battlegrounds_Spawn[29] = 'N01E'
    set Battlegrounds_Spawn[30] = 'N01F'
endfunction 

private function startup takes nothing returns nothing
    call Runners()
    set spawnx[0] = GetRectCenterX(gg_rct_red_start)
    set spawny[0] = GetRectCenterY(gg_rct_red_start)
    set spawnx[1] = GetRectCenterX(gg_rct_blue_start)
    set spawny[1] = GetRectCenterY(gg_rct_blue_start)
    set LoopIntPlayer[0] = 1
    set LoopIntPlayer[1] = 1
    set LoopIntPlayer[2] = 1
    set LoopIntPlayer[3] = 1
    call TriggerClearActions( trg_UnitSpawnsAll)
    call TriggerAddAction( trg_UnitSpawnsAll, function timersetup)
endfunction

private function conditions takes nothing returns boolean
    return Unit_Spawns_Player[GetPlayerId(GetTriggerPlayer())] == true
endfunction

//===========================================================================
function Unit_Spawn_all_Lvls takes nothing returns nothing
    set trg_UnitSpawnsAll = CreateTrigger()
    call startup()
    call TriggerAddCondition( trg_UnitSpawnsAll, Condition( function conditions ) )
    call TriggerRegisterPlayerEvent( trg_UnitSpawnsAll, Player(0), EVENT_PLAYER_END_CINEMATIC)
    call TriggerRegisterPlayerEvent( trg_UnitSpawnsAll, Player(1), EVENT_PLAYER_END_CINEMATIC)
    call TriggerRegisterPlayerEvent( trg_UnitSpawnsAll, Player(2), EVENT_PLAYER_END_CINEMATIC)
    call TriggerRegisterPlayerEvent( trg_UnitSpawnsAll, Player(3), EVENT_PLAYER_END_CINEMATIC)
endfunction

endscope
 
Last edited:
Level 37
Joined
Mar 6, 2006
Messages
9,240
Could use globals as the rect never changes:
JASS:
local real bx = GetRectCenterX(gg_rct_P11_Battleground_Spawn)
local real by = GetRectCenterY(gg_rct_P11_Battleground_Spawn)

JASS:
if T < 20 then
        elseif T >= 20 then
            call UnitAddAbility( u, 'ACev' )
            call SetUnitAbilityLevel(  u, 'ACev', ( T / 20 ) )
        elseif T >= 2000 then
            call UnitAddAbility( u, 'ACev' )
            call SetUnitAbilityLevel(  u, 'ACev', 99 )
        endif
->
JASS:
        if T >= 2000 then
            call UnitAddAbility( u, 'ACev' )
            call SetUnitAbilityLevel(  u, 'ACev', 99 )
        elseif T >= 20 then
            call UnitAddAbility( u, 'ACev' )
            call SetUnitAbilityLevel(  u, 'ACev', ( T / 20 ) )
        endif

People say that function parameters no not leak so no need to null t in whichTimer.

Use MultiboardReleaseItem for every MultiboardGetItem

I don't see the groups for the unit group array created anywhere.
 
Level 29
Joined
Oct 24, 2012
Messages
6,543
Ooo I didn't know u had to release every mbi b4 u change it. The groups r created in another trigger I meant to copy them over to this one. I never noticed the one bug I had w the it'd u showed me thx ill change them ASAP and the repost the new trig. Do u see anything else ?

edit: updated
JASS:
scope UnitSpawnAll initializer Unit_Spawn_all_Lvls

globals
    trigger trg_UnitSpawnsAll
    boolean array Unit_Spawns_Player
    integer array EnemiesAlive_Counter_Player
    boolean array Boss_Add_Mana_Boolean_Player
    integer array Boss_Bonus_Counter
    integer array Damage_Boss_Round_Count_Player
    group array Unit_Spawns_Group_Player // group for detecting units used in moving from region to region and in P1 kills and P1 spawn 
    private integer array handleID
    private integer array LoopIntPlayer
    private real array spawnx
    private real array spawny
    private integer array Unit_Runner_Spawn
    private integer array Battlegrounds_Spawn
    private constant real bx = GetRectCenterX(gg_rct_P11_Battleground_Spawn)
    private constant real by = GetRectCenterY(gg_rct_P11_Battleground_Spawn)
endglobals

private function BattlegroundSpawns takes integer ub, integer bs, integer p returns nothing
    local integer Loop = 1
    local unit u
    local integer T
    loop
        exitwhen Loop > bs
        set u = CreateUnit(Player(11), ub, bx, by, 0)
        call GroupAddUnit(Battlegrounds_Group_Player[11], u)
        call SetHeroLevel( u, Round_Player, false ) // Round_Player[i]
        set T = GetHeroInt( u, true )
        if T >= 2000 then
            call UnitAddAbility( u, 'ACev' )
            call SetUnitAbilityLevel(  u, 'ACev', 99 )
        elseif T >= 20 then
            call UnitAddAbility( u, 'ACev' )
            call SetUnitAbilityLevel(  u, 'ACev', ( T / 20 ) )
        endif
        set Loop = Loop + 1
    endloop
    set u = null
endfunction

private function whichTimer takes timer t returns integer
    local integer i = 0
    local integer h = GetHandleId( t)
    set t = null
    loop
        exitwhen i > 3
        if handleID[i] == h then
            return i
        endif
        set i = i + 1
    endloop
    return 11
endfunction

private function UnitSpawns takes nothing returns nothing
    local multiboarditem mbi
    local integer us
    local integer ub
    local integer bs
    local integer p
    local timer t
    local unit u
    set t = GetExpiredTimer()
    set p = whichTimer( t)
    set LoopIntPlayer = LoopIntPlayer + 1
    if ( Round_Player < 31) then
        set us = Unit_Runner_Spawn[Round_Player]
        set ub = Battlegrounds_Spawn[Round_Player]
        set bs = 1
    else
        set us = Unit_Runner_Spawn[31]
        set ub = Battlegrounds_Spawn[30]
        set bs = 2
    endif 
    set u = CreateUnit( Player(11), us, spawnx, spawny, 0)
    call GroupAddUnit(Unit_Spawns_Group_Player, u)
    call SetHeroLevel( u, ( Round_Player - 30 ), false )
    set EnemiesAlive_Player = EnemiesAlive_Player + 1 //multiboard variable enemies alive
    set mbi = MultiboardGetItem( gamescoresMultiboard, 5, (p+1) )
    call MultiboardSetItemValue( mbi, playerColors + I2S(EnemiesAlive_Player) + color )
    call MultiboardReleaseItem( mbi)
    call BattlegroundSpawns( ub, bs, p)
    call text( I2S(LoopIntPlayer), p)
    if LoopIntPlayer > Number_Of_Unit_Spawns_Player then
        set LoopIntPlayer = 1
        call PauseTimer( t)
        call DestroyTimer( t)
    endif
    set mbi = null
    set t = null
endfunction

private function Actions takes nothing returns nothing
    local multiboarditem mbi
    local integer p = GetPlayerId( GetTriggerPlayer())
    set Unit_Spawns_Player = false
    set Damage_Boss_Round_Count_Player = Damage_Boss_Round_Count_Player + 1
    set EnemiesAlive_Counter_Player = Number_Of_Unit_Spawns_Player[0]//#of unit spawns is a selected number of spawns in the game
    set Boss_Bonus_Counter = Boss_Bonus_Counter + 1//used for giving players mana to summon a boss
    set Round_Player = Round_Player + 1
    set mbi = MultiboardGetItem( gamescoresMultiboard, 1, (p+1) )
    call MultiboardSetItemValue( mbi, playerColors + I2S(Round_Player) + color )
    call MultiboardReleaseItem( mbi)
    if Boss_Bonus_Counter == 5 then
        set Boss_Add_Mana_Boolean_Player = true
        set Boss_Bonus_Counter = 0
    endif
    set mbi = null
endfunction

private function timersetup takes nothing returns nothing
    local timer t
    local integer p = GetPlayerId( GetTriggerPlayer())
    local integer i
    call Actions()
    set t = CreateTimer()
    set i = GetHandleId( t)
    set handleID = i
    call TimerStart( t, Spawn_Speed_Player, true, function UnitSpawns)
    set t = null
endfunction

private function Runners takes nothing returns nothing
    local integer Loop = 0
    loop
        exitwhen Loop > 1
        set Battlegrounds_Group_Player[Loop] = CreateGroup()
        set Unit_Spawns_Group_Player[Loop] = CreateGroup()
        set Unit_Bosses_Group_Player[Loop] = CreateGroup()
        set Loop = Loop + 1
    endloop
    set Battlegrounds_Group_Player[11] = CreateGroup()
    //the enemy runners for all players
    set Unit_Runner_Spawn[1] = 'h00C'
    set Unit_Runner_Spawn[2] = 'h01Y'
    set Unit_Runner_Spawn[3] = 'h01Z'
    set Unit_Runner_Spawn[4] = 'h020'
    set Unit_Runner_Spawn[5] = 'h021'
    set Unit_Runner_Spawn[6] = 'h022'
    set Unit_Runner_Spawn[7] = 'h023'
    set Unit_Runner_Spawn[8] = 'h024'
    set Unit_Runner_Spawn[9] = 'h025'
    set Unit_Runner_Spawn[10] = 'h026'
    set Unit_Runner_Spawn[11] = 'h027'
    set Unit_Runner_Spawn[12] = 'h028'
    set Unit_Runner_Spawn[13] = 'h029'
    set Unit_Runner_Spawn[14] = 'h02A'
    set Unit_Runner_Spawn[15] = 'h02B'
    set Unit_Runner_Spawn[16] = 'h02C'
    set Unit_Runner_Spawn[17] = 'h02D'
    set Unit_Runner_Spawn[18] = 'h02E'
    set Unit_Runner_Spawn[19] = 'h02F'
    set Unit_Runner_Spawn[20] = 'h02G'
    set Unit_Runner_Spawn[21] = 'h02H'
    set Unit_Runner_Spawn[22] = 'h02I'
    set Unit_Runner_Spawn[23] = 'h02J'
    set Unit_Runner_Spawn[24] = 'h02K'
    set Unit_Runner_Spawn[25] = 'h02L'
    set Unit_Runner_Spawn[26] = 'h02M'
    set Unit_Runner_Spawn[27] = 'h02N'
    set Unit_Runner_Spawn[28] = 'h02O'
    set Unit_Runner_Spawn[29] = 'h02P'
    set Unit_Runner_Spawn[30] = 'h02Q'
    set Unit_Runner_Spawn[31] = 'U00A'
// battleground unit spawns
    set Battlegrounds_Spawn[1] = 'E008'
    set Battlegrounds_Spawn[2] = 'E009'
    set Battlegrounds_Spawn[3] = 'E00B'
    set Battlegrounds_Spawn[4] = 'H05M'
    set Battlegrounds_Spawn[5] = 'N019'
    set Battlegrounds_Spawn[6] = 'N01H'
    set Battlegrounds_Spawn[7] = 'O003'
    set Battlegrounds_Spawn[8] = 'O004'
    set Battlegrounds_Spawn[9] = 'N017'
    set Battlegrounds_Spawn[10] = 'N018'
    set Battlegrounds_Spawn[11] = 'H05P'
    set Battlegrounds_Spawn[12] = 'N016'
    set Battlegrounds_Spawn[13] = 'O005'
    set Battlegrounds_Spawn[14] = 'N01J'
    set Battlegrounds_Spawn[15] = 'N01I'
    set Battlegrounds_Spawn[16] = 'O002'
    set Battlegrounds_Spawn[17] = 'U00M'
    set Battlegrounds_Spawn[18] = 'U00L'
    set Battlegrounds_Spawn[19] = 'U00O'
    set Battlegrounds_Spawn[20] = 'U00N'
    set Battlegrounds_Spawn[21] = 'N01A'
    set Battlegrounds_Spawn[22] = 'H05Q'
    set Battlegrounds_Spawn[23] = 'H05N'
    set Battlegrounds_Spawn[24] = 'E00A'
    set Battlegrounds_Spawn[25] = 'N01B'
    set Battlegrounds_Spawn[26] = 'N01C'
    set Battlegrounds_Spawn[27] = 'N01G'
    set Battlegrounds_Spawn[28] = 'N01D'
    set Battlegrounds_Spawn[29] = 'N01E'
    set Battlegrounds_Spawn[30] = 'N01F'
endfunction 

private function startup takes nothing returns nothing
    call Runners()
    set spawnx[0] = GetRectCenterX(gg_rct_red_start)
    set spawny[0] = GetRectCenterY(gg_rct_red_start)
    set spawnx[1] = GetRectCenterX(gg_rct_blue_start)
    set spawny[1] = GetRectCenterY(gg_rct_blue_start)
    set LoopIntPlayer[0] = 1
    set LoopIntPlayer[1] = 1
    set LoopIntPlayer[2] = 1
    set LoopIntPlayer[3] = 1
    call TriggerClearActions( trg_UnitSpawnsAll)
    call TriggerAddAction( trg_UnitSpawnsAll, function timersetup)
endfunction

private function conditions takes nothing returns boolean
    return Unit_Spawns_Player[GetPlayerId(GetTriggerPlayer())] == true
endfunction

//===========================================================================
function Unit_Spawn_all_Lvls takes nothing returns nothing
    set trg_UnitSpawnsAll = CreateTrigger()
    call startup()
    call TriggerAddCondition( trg_UnitSpawnsAll, Condition( function conditions ) )
    call TriggerRegisterPlayerEvent( trg_UnitSpawnsAll, Player(0), EVENT_PLAYER_END_CINEMATIC)
    call TriggerRegisterPlayerEvent( trg_UnitSpawnsAll, Player(1), EVENT_PLAYER_END_CINEMATIC)
    call TriggerRegisterPlayerEvent( trg_UnitSpawnsAll, Player(2), EVENT_PLAYER_END_CINEMATIC)
    call TriggerRegisterPlayerEvent( trg_UnitSpawnsAll, Player(3), EVENT_PLAYER_END_CINEMATIC)
endfunction

endscope
 
Status
Not open for further replies.
Top