Hello,
I have a little probleme on my map Restricted Complex 601.
In my creeps spawn system, they are periodic triggers which update the destination of the creeps (which are managed by players 11, 13 and 14).
The probleme is: I use a "ForGroup" function to order creeps to move to the unit called "GeneralTarget" it is not dead.
Thing is: each time the periodic trigger does this ForGroup, the time for the unit to be ordered, they have a micro pause.
Then, all creeps move slower since they periodically pause each X seconds.
Why do I get this? Why do they pause when they are ordered? (pause duration <= 1 second, but they do pause anyway, which disturb the gameplay).
Thanks a lot,
system
JASS:
library SpawnSystem initializer init requires LeaderBoard ,TimerUtils ,SideQuestSystem ,CheckPointValidity , BoundSentinel ,AbilityPreload ,GroupFunction ,Ranks , AutoIndex
globals
unit GeneralTarget
private constant real WAIT = 0.7
real array SpecialCreepsChance [4 ]
private constant integer CHANCE_RUSH = 5
private constant integer CHANCE_AIR = 15
private constant integer UP_HP = 'A02L'
private constant integer UP_DMG = 'A02G'
private real TimeOutNormal = 30.
private real TimeOutRush = 60.
private real TimeOutHero = 30.
private constant real TIMEOUT_UPDATE = 6.
constant integer CREEPS_TOTALMAX = 100
private constant integer NORMAL_MAX = 70
private constant integer HERO_MAX = 20
private constant integer RUSH_MAX = 20
private constant integer CREEPS_AMOUNT_PER_SPAWNPOINT = 3
private constant integer CREEPS_WAVEMAXCOEFF = 3
private constant integer CREEPS_RANDOMMAX = 2
private constant integer CREEPS_BASE_SPAWN = 4
private rect array SpawnRect [60 ]
private rect array BaseRect [10 ]
private integer BaseRectMax = 0
private real array BaseXMin [10 ]
private real array BaseYMin [10 ]
private real array BaseXMax [10 ]
private real array BaseYMax [10 ]
boolean array SpawnTrue [60 ]
boolean array SpawnCaveDestroyed [60 ]
boolean array SpawnIsCave [60 ]
integer CaveToDestroy = 0
integer SpawnMax = 0
private real SpawnRushX = 0.
private real SpawnRushY = 0.
private real array SpawnX [60 ]
private real array SpawnY [60 ]
private integer array SpawnCreepsId [40 ]
private integer array SpawnSpecialId [10 ]
private integer SpawnRushId
private integer SpawnAirId
private integer SpawnCreepsIdMax = 0
private integer SpawnSpecialIdMax = 0
private integer SpawnCreepsAmount = 0
private integer SpawnCreepsWaveAmount = 0
private timer TimerSpawnNormal = null
private timer TimerSpawnRush = null
private timer TimerSpawnHero = null
private constant integer OWNER_NORMAL = 11
private constant integer OWNER_RUSH = 13
private constant integer OWNER_HERO = 14
integer CreepsPop = 0
integer NormalPop = 0
integer RushPop = 0
integer HeroPop = 0
private integer array SubKill [10 ]
private constant integer WINDSTALKER_ID = 'u00Y'
private constant integer WINDSTALKER_REQ = 75000
private constant integer WINDSTALKER_CHANCE = 15
private constant integer IMMORTAL_ID = 'u013'
private constant integer IMMORTAL_REQ = 100000
private constant integer IMMORTAL_CHANCE = 15
private constant integer DEGENERESCENCE_ID = 'u00Z'
private constant integer DEGENERESCENCE_REQ = 60000
private constant integer DEGENERESCENCE_CHANCE = 5
private constant integer REBORN_ID = 'u010'
private constant integer REBORN_REQ = 40000
private constant integer REBORN_CHANCE = 15
private group NormalGroup
private group RushGroup
private group HeroGroup
private constant real RANDOMSPAWN_DISTANCEMIN = 1000.
private constant real RANDOMSPAWN_DISTANCEMAX = 2000.
endglobals
private function SetSpawnVariables takes nothing returns nothing
local integer i = 0
set BaseRect [i ]=gg_rct_ExternalOutpost
set i = i + 1
set BaseRect [i ]=gg_rct_Barracks
set i = i + 1
set BaseRect [i ]=gg_rct_ShipBase
set i = i + 1
set BaseRect [i ]=gg_rct_AirfieldBase
set i = i + 1
set BaseRect [i ]=gg_rct_MechanoidsFacilities
set i = i + 1
set BaseRect [i ]=gg_rct_TeleporterBase
set i = i + 1
set BaseRect [i ]=gg_rct_ContainerBase
set BaseRectMax = i
set i = 1
set SpawnRect [i ]=gg_rct_Spawn001
set SpawnIsCave [i ]=true
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn002
set SpawnIsCave [i ]=true
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn003
set SpawnIsCave [i ]=true
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn004
set SpawnIsCave [i ]=true
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn005
set SpawnIsCave [i ]=true
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn006
set SpawnIsCave [i ]=true
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn007
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn008
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn009
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn010
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn011
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn012
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn013
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn014
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn015
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn016
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn017
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn018
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn019
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn020
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn021
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn022
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn023
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn024
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn025
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn026
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn027
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn028
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn029
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn030
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn031
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn032
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn033
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn034
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn035
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn036
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn037
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn038
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn039
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn040
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn041
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn042
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn043
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn044
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn045
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn046
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn047
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn048
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn049
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn050
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn051
set SpawnIsCave [i ]=false
set i = i + 1
set SpawnRect [i ]=gg_rct_Spawn052
set SpawnIsCave [i ]=false
set SpawnMax = i
endfunction
function CreepsCheckHeroAmount takes nothing returns integer
local integer i = 0
local integer k = 0
loop
exitwhen i > MAXPLAYER
if not (IsUnitType (Hero [i ],UNIT_TYPE_DEAD )) and Hero [i ]!= null then
set k = k + 1
endif
set i = i + 1
endloop
return k
endfunction
function CreepsRemoveUnitFromGroup takes unit creeps returns nothing
set CreepsPop = CreepsPop - 1
if IsUnitInGroup (creeps ,NormalGroup ) then
call GroupRemoveUnit (NormalGroup ,creeps )
set NormalPop = NormalPop - 1
elseif IsUnitInGroup (creeps ,RushGroup ) then
call GroupRemoveUnit (RushGroup ,creeps )
set RushPop = RushPop - 1
elseif IsUnitInGroup (creeps ,HeroGroup ) then
call GroupRemoveUnit (HeroGroup ,creeps )
set HeroPop = HeroPop - 1
endif
endfunction
private function SetRandomHeroTarget takes nothing returns integer
local integer i = 0
local integer random = 0
loop
exitwhen i > MAXPLAYER
set random = GetRandomInt (0 ,MAXPLAYER )
if not (IsUnitType (Hero [i ],UNIT_TYPE_DEAD )) and Hero [i ]!=null then
return random
endif
set i = i + 1
endloop
return random
endfunction
private struct s_targetId
integer targetId = 0
private static method createFilter takes unit u returns boolean
return (GetOwningPlayer (u )==Player (OWNER_NORMAL ) or GetOwningPlayer (u )==Player (OWNER_RUSH ) or GetOwningPlayer (u )==Player (OWNER_HERO )) and not (IsUnitType (u ,UNIT_TYPE_TAUREN ))
endmethod
private method onCreate takes nothing returns nothing
local integer ownerId = GetPlayerId (GetOwningPlayer (me ))
set CreepsPop = CreepsPop + 1
if ownerId == OWNER_NORMAL then
set NormalPop = NormalPop + 1
call GroupAddUnit (NormalGroup ,me )
elseif ownerId == OWNER_RUSH then
set RushPop = RushPop + 1
call GroupAddUnit (RushGroup ,me )
elseif ownerId == OWNER_HERO then
set HeroPop = HeroPop + 1
call GroupAddUnit (HeroGroup ,me )
endif
if not (IsUnitType (GeneralTarget ,UNIT_TYPE_DEAD )) and GeneralTarget != null then
call IssuePointOrder (me ,"attack" ,GetUnitX (GeneralTarget )+GetRandomReal (-500. ,500. ),GetUnitY (GeneralTarget )+GetRandomReal (-500. ,500. ))
else
if IsUnitType (Hero [.targetId ],UNIT_TYPE_DEAD ) or Hero [.targetId ]==null then
set .targetId = SetRandomHeroTarget ()
endif
call IssuePointOrder (me ,"attack" ,GetUnitX (Hero [.targetId ]),GetUnitY (Hero [.targetId ]))
endif
endmethod
implement AutoCreate
private method onDestroy takes nothing returns nothing
set .targetId = 0
endmethod
implement AutoDestroy
endstruct
function SpawnCreeps takes integer unitId ,integer ownerId , real x , real y returns nothing
local unit creeps = CreateUnit (Player (ownerId ),unitId ,x ,y ,0. )
call SetUnitAbilityLevel (creeps ,UP_DMG ,XpAverageCoeff )
call SetUnitAbilityLevel (creeps ,UP_HP ,XpAverageCoeff )
set creeps = null
endfunction
private function SetAllDestination takes unit creeps returns nothing
local s_targetId dat = s_targetId [creeps ]
if not (IsUnitType (GeneralTarget ,UNIT_TYPE_DEAD )) and GeneralTarget != null then
call IssuePointOrder (creeps ,"attack" ,GetUnitX (GeneralTarget )+GetRandomReal (-500. ,500. ),GetUnitY (GeneralTarget )+GetRandomReal (-500. ,500. ))
else
if IsUnitType (Hero [dat.targetId ],UNIT_TYPE_DEAD ) or Hero [dat.targetId ]==null then
set dat.targetId = SetRandomHeroTarget ()
endif
call IssuePointOrder (creeps ,"attack" ,GetUnitX (Hero [dat.targetId ]),GetUnitY (Hero [dat.targetId ]))
endif
endfunction
private function CreepsOrderPlayerGroup takes player owner returns boolean
local group g = NewGroup ()
local unit creeps = null
call GroupEnumUnitsOfPlayer (g ,owner ,null )
loop
set creeps = FirstOfGroup (g )
exitwhen creeps == null
call SetAllDestination (creeps )
call GroupRemoveUnit (g ,creeps )
endloop
call ReleaseGroup (g )
set g = null
set creeps = null
return false
endfunction
private function PeriodicNormalUpdate takes nothing returns boolean
call CreepsOrderPlayerGroup (Player (OWNER_NORMAL ))
return false
endfunction
private function PeriodicRushUpdate takes nothing returns boolean
call CreepsOrderPlayerGroup (Player (OWNER_RUSH ))
return false
endfunction
private function PeriodicHeroUpdate takes nothing returns boolean
call CreepsOrderPlayerGroup (Player (OWNER_HERO ))
return false
endfunction
private function SpawnHero takes nothing returns nothing
local integer i = 0
local integer j = 0
local integer r = 0
local real x1 = 0.
local real y1 = 0.
local real x2 = 0.
local real y2 = 0.
local real x3 = 0.
local real y3 = 0.
local real angle = 0.
local real distance = 0
if ChapterIntermission == false then
loop
exitwhen i > MAXPLAYER
if CreepsPop <= CREEPS_TOTALMAX and HeroPop <= HERO_MAX and GetRandomInt (0 ,100 )<=REBORN_CHANCE and XpAverage >= REBORN_REQ then
call SpawnCreeps (REBORN_ID ,OWNER_HERO ,GetRandomReal (MapXMin ,MapXMax ),GetRandomReal (MapYMin ,MapYMax ))
endif
set j = 0
loop
exitwhen j > CREEPS_RANDOMMAX
if not (IsUnitType (Hero [i ],UNIT_TYPE_DEAD )) and Hero [i ]!=null and CreepsPop <= CREEPS_TOTALMAX and HeroPop <= HERO_MAX then
set angle = GetRandomReal (0 ,6.28 )
set x1 = GetUnitX (Hero [i ])
set y1 = GetUnitY (Hero [i ])
set distance = GetRandomReal (RANDOMSPAWN_DISTANCEMIN ,RANDOMSPAWN_DISTANCEMAX )
set x2 = CheckPointValidity (x1 +distance *Cos (angle ),MapXMin ,MapXMax )
set y2 = CheckPointValidity (y1 +distance *Sin (angle ),MapYMin ,MapYMax )
set r = 0
loop
exitwhen r > BaseRectMax
set x3 = CheckPointValidity (x2 ,BaseXMin [i ],BaseXMax [i ])
set y3 = CheckPointValidity (y2 ,BaseYMin [i ],BaseYMax [i ])
set x2 = x3
set y2 = y3
set r = r + 1
endloop
call SpawnCreeps (SpawnCreepsId [GetRandomInt (0 ,SpawnCreepsIdMax )],OWNER_RUSH ,x2 ,y2 )
endif
set j = j + 1
endloop
set i = i + 1
endloop
endif
endfunction
private function SpawnRush takes nothing returns nothing
local integer i = 0
if ChapterIntermission == false then
set i = 0
loop
exitwhen i > SpawnCreepsWaveAmount
if CreepsPop <= CREEPS_TOTALMAX and RushPop <= RUSH_MAX then
call SpawnCreeps (SpawnRushId ,OWNER_RUSH ,SpawnRushX ,SpawnRushY )
endif
set i = i + 1
endloop
set i = 0
loop
exitwhen i > SpawnCreepsWaveAmount
if CreepsPop <= CREEPS_TOTALMAX and RushPop <= RUSH_MAX then
call SpawnCreeps (SpawnAirId ,OWNER_RUSH ,GetRandomReal (MapXMin ,MapXMax ),GetRandomReal (MapYMin ,MapYMax ))
endif
set i = i + 1
endloop
endif
endfunction
private function SpawnNormal takes nothing returns nothing
local integer spawnRectIndex = 1
local integer i = 0
set SpawnCreepsAmount = CREEPS_BASE_SPAWN +PlayerAmount
set SpawnCreepsWaveAmount = SpawnCreepsAmount +CREEPS_WAVEMAXCOEFF *R2I ((1 +(PlayerAmount /8 )))
if ChapterIntermission == false then
if GetRandomInt (0 ,100 )<=CHANCE_AIR then
set i = 0
loop
exitwhen i > SpawnCreepsWaveAmount
if CreepsPop <= CREEPS_TOTALMAX and RushPop <= RUSH_MAX then
call SpawnCreeps (SpawnAirId ,OWNER_RUSH ,GetRandomReal (MapXMin ,MapXMax ),GetRandomReal (MapYMin ,MapYMax ))
endif
set i = i + 1
endloop
endif
if CreepsPop <= CREEPS_TOTALMAX and NormalPop <= NORMAL_MAX and GetRandomInt (0 ,100 )<=WINDSTALKER_CHANCE and XpAverage >= WINDSTALKER_REQ then
call SpawnCreeps (WINDSTALKER_ID ,OWNER_NORMAL ,GetRandomReal (MapXMin ,MapXMax ),GetRandomReal (MapYMin ,MapYMax ))
endif
if CreepsPop <= CREEPS_TOTALMAX and RushPop <= RUSH_MAX and GetRandomInt (0 ,100 )<=DEGENERESCENCE_CHANCE and XpAverage >= DEGENERESCENCE_REQ then
call SpawnCreeps (DEGENERESCENCE_ID ,OWNER_RUSH ,GetRandomReal (MapXMin ,MapXMax ),GetRandomReal (MapYMin ,MapYMax ))
endif
if CreepsPop <= CREEPS_TOTALMAX and RushPop <= RUSH_MAX and GetRandomInt (0 ,100 )<=IMMORTAL_CHANCE and ((GameMode != 3 and XpAverage >= IMMORTAL_REQ ) or (GameMode ==3 )) then
call SpawnCreeps (IMMORTAL_ID ,OWNER_RUSH ,GetRandomReal (MapXMin ,MapXMax ),GetRandomReal (MapYMin ,MapYMax ))
endif
loop
exitwhen spawnRectIndex > SpawnMax
set i = 0
loop
exitwhen i > SpawnCreepsWaveAmount
if SpawnTrue [spawnRectIndex ]==true and not (SpawnCaveDestroyed [spawnRectIndex ]) then
if CreepsPop <= CREEPS_TOTALMAX and NormalPop <= NORMAL_MAX then
call SpawnCreeps (SpawnCreepsId [GetRandomInt (0 ,SpawnCreepsIdMax )],OWNER_NORMAL ,SpawnX [spawnRectIndex ],SpawnY [spawnRectIndex ])
endif
if CreepsPop <= CREEPS_TOTALMAX and NormalPop <= NORMAL_MAX and GetRandomInt (0 ,100 )<XpAverageCoeff *SpecialCreepsChance [GameMode ] then
call SpawnCreeps (SpawnSpecialId [GetRandomInt (0 ,SpawnSpecialIdMax )],OWNER_NORMAL ,SpawnX [spawnRectIndex ],SpawnY [spawnRectIndex ])
endif
endif
set i = i + 1
endloop
set spawnRectIndex = spawnRectIndex + 1
endloop
endif
endfunction
function CreepsSpawnFirstWave takes nothing returns nothing
local integer spawnRectIndex = 1
local integer i = 0
set SpawnCreepsAmount = CREEPS_BASE_SPAWN +PlayerAmount
set SpawnCreepsWaveAmount = SpawnCreepsAmount +CREEPS_WAVEMAXCOEFF *R2I ((1 +(PlayerAmount /8 )))
if CreepsPop <= CREEPS_TOTALMAX and NormalPop <= NORMAL_MAX and XpAverage >= DEGENERESCENCE_REQ then
call SpawnCreeps (DEGENERESCENCE_ID ,OWNER_NORMAL ,GetRandomReal (MapXMin ,MapXMax ),GetRandomReal (MapYMin ,MapYMax ))
endif
loop
exitwhen spawnRectIndex > 6
set i = 0
if not (SpawnCaveDestroyed [spawnRectIndex ]) then
loop
exitwhen i > SpawnCreepsWaveAmount
if NormalPop <NORMAL_MAX and CreepsPop <= CREEPS_TOTALMAX then
call SpawnCreeps (SpawnCreepsId [GetRandomInt (0 ,SpawnCreepsIdMax )],OWNER_RUSH ,SpawnX [spawnRectIndex ],SpawnY [spawnRectIndex ])
endif
set i = i + 1
endloop
endif
set spawnRectIndex = spawnRectIndex + 1
endloop
endfunction
function CreepsResetCreepsId takes nothing returns nothing
local integer i = 0
loop
exitwhen i > SpawnCreepsIdMax
set SpawnCreepsId [i ]= 0
set i = i + 1
endloop
set SpawnCreepsIdMax = 0
set i = 0
loop
exitwhen i > SpawnSpecialIdMax
set SpawnSpecialId [i ]= 0
set i = i + 1
endloop
set SpawnCreepsIdMax = 0
set SpawnSpecialIdMax = 0
endfunction
function CreepsAddRushId takes integer idcreeps returns nothing
set SpawnRushId = idcreeps
endfunction
function CreepsAddAirId takes integer idcreeps returns nothing
set SpawnAirId = idcreeps
endfunction
function CreepsAddCreepsId takes integer idcreeps returns nothing
set SpawnCreepsId [SpawnCreepsIdMax ] = idcreeps
set SpawnCreepsIdMax = SpawnCreepsIdMax + 1
endfunction
function CreepsAddSpecialId takes integer idcreeps returns nothing
set SpawnSpecialId [SpawnSpecialIdMax ] = idcreeps
set SpawnSpecialIdMax = SpawnSpecialIdMax + 1
endfunction
function CreepsChangeTimerRate takes real whichTimeout returns nothing
set TimeOutNormal = whichTimeout
set TimeOutHero = whichTimeout
call ReleaseTimer (TimerSpawnNormal )
call ReleaseTimer (TimerSpawnHero )
set TimerSpawnNormal = NewTimer ()
set TimerSpawnHero = NewTimer ()
call TimerStart ( TimerSpawnNormal , TimeOutNormal , true , function SpawnNormal )
call TimerStart ( TimerSpawnHero , TimeOutHero , true , function SpawnHero )
endfunction
function CreepsResetSpawn takes nothing returns nothing
local integer i = 0
loop
exitwhen i > SpawnMax
set SpawnTrue [i ]=false
set i = i + 1
endloop
endfunction
function CreepsAddAmount takes integer whichInteger returns nothing
set SpawnCreepsAmount = SpawnCreepsAmount + whichInteger
endfunction
private function FilterAllNormalCreeps takes nothing returns boolean
if (GetOwningPlayer (GetFilterUnit ())==Player (OWNER_NORMAL ) or GetOwningPlayer (GetFilterUnit ())==Player (OWNER_RUSH ) or GetOwningPlayer (GetFilterUnit ())==Player (OWNER_HERO )) and not (IsUnitType (GetFilterUnit (),UNIT_TYPE_MECHANICAL )) and not (IsUnitType (GetFilterUnit (),UNIT_TYPE_STRUCTURE )) then
call KillUnit (GetFilterUnit ())
endif
return true
endfunction
function CreepsKillAllNormal takes nothing returns nothing
call GroupEnumUnitsInRect (ENUM_GROUP ,bj_mapInitialPlayableArea ,Filter (function FilterAllNormalCreeps ))
set CreepsPop = 0
set NormalPop = 0
set RushPop = 0
set HeroPop = 0
endfunction
function CreepsDestroySystem takes nothing returns nothing
call ReleaseTimer (TimerSpawnNormal )
call ReleaseTimer (TimerSpawnRush )
call ReleaseTimer (TimerSpawnHero )
endfunction
private function CreepsInitializeSpawns takes nothing returns boolean
local integer i = 0
set PlayerAmount = 0
set NormalGroup = NewGroup ()
set RushGroup = NewGroup ()
set HeroGroup = NewGroup ()
loop
exitwhen i > 9
if GetPlayerSlotState (Player (i ))==PLAYER_SLOT_STATE_PLAYING then
set PlayerAmount = PlayerAmount + 1
endif
set i = i + 1
endloop
set SpawnCreepsAmount = CREEPS_BASE_SPAWN +PlayerAmount
set TimerSpawnNormal = NewTimer ()
set TimerSpawnRush = NewTimer ()
set TimerSpawnHero = NewTimer ()
call TimerStart (TimerSpawnNormal , TimeOutNormal , true , function SpawnNormal )
call TimerStart (TimerSpawnRush , TimeOutRush , true , function SpawnRush )
call TimerStart (TimerSpawnHero , TimeOutHero , true , function SpawnHero )
return false
endfunction
private function CreepsDeath takes nothing returns boolean
local player killerOwner = GetOwningPlayer (GetKillingUnit ())
local integer killerOwnerId = GetPlayerId (killerOwner )
call CreepsRemoveUnitFromGroup (GetTriggerUnit ())
if GetPlayerSlotState (killerOwner )==PLAYER_SLOT_STATE_PLAYING and GetPlayerController (killerOwner ) == MAP_CONTROL_USER then
set Kill [killerOwnerId ]=Kill [killerOwnerId ]+1
call BoardUpdateKill (killerOwner )
set SubKill [killerOwnerId ] = SubKill [killerOwnerId ] + 1
if SubKill [killerOwnerId ] >= HeroCoeff [killerOwnerId ] then
set SubKill [killerOwnerId ] = 0
if XpAvailable == true then
set Xp [killerOwnerId ] = Xp [killerOwnerId ] + 1
set CurrentGameXp [killerOwnerId ] = CurrentGameXp [killerOwnerId ] + 1
endif
endif
call CheckRank (killerOwnerId )
endif
set killerOwner = null
return false
endfunction
private function init takes nothing returns nothing
local integer i = 1
local trigger t1 = CreateTrigger ()
local trigger t2 = CreateTrigger ()
local trigger t3 = CreateTrigger ()
local trigger t4 = CreateTrigger ()
local trigger t5 = CreateTrigger ()
set CreepsPop = 0
set NormalPop = 0
set RushPop = 0
set HeroPop = 0
call SetSpawnVariables ()
call AbilityPreload (UP_HP )
call AbilityPreload (UP_DMG )
set CaveToDestroy = 0
set SpawnRushX = GetRectCenterX (gg_rct_SpawnRush )
set SpawnRushY = GetRectCenterY (gg_rct_SpawnRush )
loop
exitwhen i > SpawnMax
set SpawnTrue [i ] = false
set SpawnX [i ]=GetRectCenterX (SpawnRect [i ])
set SpawnY [i ]=GetRectCenterY (SpawnRect [i ])
set SpawnCaveDestroyed [i ]=false
if SpawnIsCave [i ]==true then
set CaveToDestroy = CaveToDestroy + 1
endif
set i = i + 1
endloop
set i = 0
loop
exitwhen i > BaseRectMax
set BaseXMin [i ] = GetRectMinX (BaseRect [i ])
set BaseYMin [i ] = GetRectMinY (BaseRect [i ])
set BaseXMax [i ] = GetRectMaxX (BaseRect [i ])
set BaseYMax [i ] = GetRectMaxY (BaseRect [i ])
set i = i + 1
endloop
call TriggerRegisterPlayerUnitEvent (t1 , Player (OWNER_NORMAL ), EVENT_PLAYER_UNIT_DEATH , null )
call TriggerRegisterPlayerUnitEvent (t1 , Player (OWNER_RUSH ), EVENT_PLAYER_UNIT_DEATH , null )
call TriggerRegisterPlayerUnitEvent (t1 , Player (OWNER_HERO ), EVENT_PLAYER_UNIT_DEATH , null )
call TriggerAddCondition (t1 , Condition (function CreepsDeath ))
call TriggerRegisterTimerEvent (t2 , WAIT ,false )
call TriggerAddCondition (t2 , Condition (function CreepsInitializeSpawns ))
call TriggerRegisterTimerEvent (t3 , TIMEOUT_UPDATE ,true )
call TriggerAddCondition (t3 , Condition (function PeriodicHeroUpdate ))
call TriggerRegisterTimerEvent (t4 , TIMEOUT_UPDATE +0.1 ,true )
call TriggerAddCondition (t4 , Condition (function PeriodicNormalUpdate ))
call TriggerRegisterTimerEvent (t5 , TIMEOUT_UPDATE +0.2 ,true )
call TriggerAddCondition (t5 , Condition (function PeriodicRushUpdate ))
endfunction
endlibrary