From 34d268b451169487e24335aa64a4438899247630 Mon Sep 17 00:00:00 2001 From: Sven Van de Velde Date: Tue, 10 May 2016 12:05:07 +0200 Subject: [PATCH] Optimized the scheduler --- Moose/Scheduler.lua | 25 ++++-- Moose/Spawn.lua | 72 +++++++----------- .../Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz | Bin 49198 -> 48753 bytes 3 files changed, 46 insertions(+), 51 deletions(-) diff --git a/Moose/Scheduler.lua b/Moose/Scheduler.lua index 3134e2626..f1bfbe91a 100644 --- a/Moose/Scheduler.lua +++ b/Moose/Scheduler.lua @@ -18,6 +18,7 @@ SCHEDULER = { --- SCHEDULER constructor. -- @param #SCHEDULER self +-- @param #table TimeEventObject -- @param #function TimeEventFunction -- @param #table TimeEventFunctionArguments -- @param #number StartSeconds @@ -49,13 +50,12 @@ function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArg if StopSeconds then self.StopSeconds = StopSeconds end + + self.Repeat = false self.StartTime = timer.getTime() - self:T("Calling function " .. timer.getTime() + self.StartSeconds ) - - timer.scheduleFunction( self.Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) - + self:Start() return self end @@ -81,7 +81,7 @@ function SCHEDULER:Scheduler() self:T( { Status, Result } ) if Status and Status == true and Result and Result == true then - if not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) then + if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then timer.scheduleFunction( self.Scheduler, self, @@ -92,6 +92,21 @@ function SCHEDULER:Scheduler() end +function SCHEDULER:Start() + self:F( self.TimeEventObject ) + + self.Repeat = true + timer.scheduleFunction( self.Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) + + return self +end + +function SCHEDULER:Stop() + self:F( self.TimeEventObject ) + + self.Repeat = false +end + diff --git a/Moose/Spawn.lua b/Moose/Spawn.lua index 7152b7c29..0bdf4fefb 100644 --- a/Moose/Spawn.lua +++ b/Moose/Spawn.lua @@ -80,6 +80,7 @@ Include.File( "Database" ) Include.File( "Group" ) Include.File( "Zone" ) Include.File( "Event" ) +Include.File( "Scheduler" ) --- SPAWN Class -- @type SPAWN @@ -323,8 +324,8 @@ function SPAWN:CleanUp( SpawnCleanUpInterval ) self.SpawnCleanUpInterval = SpawnCleanUpInterval self.SpawnCleanUpTimeStamps = {} - self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) - + --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) return self end @@ -502,20 +503,30 @@ function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) self.SpawnCurrentTimer = 0 -- The internal timer counter to trigger a scheduled spawning of SpawnTemplatePrefix. self.SpawnSetTimer = 0 -- The internal timer value when a scheduled spawning of SpawnTemplatePrefix occurs. self.AliveFactor = 1 -- - self.SpawnLowTimer = 0 - self.SpawnHighTimer = 0 if SpawnTime ~= nil and SpawnTimeVariation ~= nil then - self.SpawnLowTimer = SpawnTime - SpawnTime / 2 * SpawnTimeVariation - self.SpawnHighTimer = SpawnTime + SpawnTime / 2 * SpawnTimeVariation - self:SpawnScheduleStart() + self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) end - self:T( { self.SpawnLowTimer, self.SpawnHighTimer } ) - return self end +--- Will re-start the spawning scheduler. +-- Note: This function is only required to be called when the schedule was stopped. +function SPAWN:SpawnScheduleStart() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Start() +end + +--- Will stop the scheduled spawning scheduler. +function SPAWN:SpawnScheduleStop() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Stop() +end + + --- Allows to place a CallFunction hook when a new group spawns. -- The provided function will be called when a new group is spawned, including its given parameters. -- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. @@ -537,30 +548,6 @@ end ---- Will start the spawning scheduler. --- Note: This function is called automatically when @{#SPAWN.Scheduled} is called. -function SPAWN:SpawnScheduleStart() - self:F( { self.SpawnTemplatePrefix } ) - - --local ClientUnit = #AlivePlayerUnits() - - self.AliveFactor = 10 -- ( 10 - ClientUnit ) / 10 - - if self.SpawnIsScheduled == false then - self.SpawnIsScheduled = true - self.SpawnInit = true - self.SpawnSetTimer = math.random( self.SpawnLowTimer * self.AliveFactor / 10 , self.SpawnHighTimer * self.AliveFactor / 10 ) - - self.SpawnFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 1 ) - end -end - ---- Will stop the scheduled spawning scheduler. -function SPAWN:SpawnScheduleStop() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnIsScheduled = false -end --- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. -- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. @@ -1240,19 +1227,10 @@ end function SPAWN:_Scheduler() self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) - if self.SpawnInit or self.SpawnCurrentTimer == self.SpawnSetTimer then - -- Validate if there are still groups left in the batch... - self:Spawn() - self.SpawnInit = false - if self.SpawnIsScheduled == true then - --local ClientUnit = #AlivePlayerUnits() - self.AliveFactor = 1 -- ( 10 - ClientUnit ) / 10 - self.SpawnCurrentTimer = 0 - self.SpawnSetTimer = math.random( self.SpawnLowTimer * self.AliveFactor , self.SpawnHighTimer * self.AliveFactor ) - end - else - self.SpawnCurrentTimer = self.SpawnCurrentTimer + 1 - end + -- Validate if there are still groups left in the batch... + self:Spawn() + + return true end function SPAWN:_SpawnCleanUpScheduler() @@ -1284,4 +1262,6 @@ function SPAWN:_SpawnCleanUpScheduler() end + return true -- Repeat + end diff --git a/Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz b/Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz index 34c45342706d1a6aa6de763ab291481cac1a023f..f00fe66c2beb3a6045f5f33b00fa45678e1403f9 100644 GIT binary patch delta 1222 zcmV;%1UdVzfCKUT00yZF&R%038ni00#g70B>+~X>V?GomWe9<2DSw=T~@g zUU#CjNptDJd96DWZ+2`amrh3mlaPgmA~k&2n|AiU7qVnWlBsN3-%Nmbe82}nru1aA z8~rvq`R8QBzdueTWf_T}{OjqT)p>PV%W8QRQ0*icD2Ja~5(M`;e+LORE>^HY<#sY} zLq}AQrs>n|u-O|^6hV`KD%_}v6Bec?M_%7Z1_(KN}aY9OSA>~8w)Ov z+NYv0*26&RuwgGG+ym%!fHl^>G>5yvjvHabOG*BjTmUtn#jQE?pOslP&iav5c-$*m z=RSTrCy5JB;w3J&e;~=kMI}gOntMkjf-)Y>H;-0>st}GB*Oe$dcw_H=sOqVV3xY$t z&`=)gc%-1o*H=#q^p?bFw|J#-96_Vel?m>TWsb#L(M(6dV#$?{$F)T$`Fb4Arq&Bi zKDcYJ6Q#@+Wn6iUS;jckF<1me&L6V){%JHGk5J2z$$AuRe^^^8ct!gK_E~(v?MQHs zJ6h|;2>Y;5=G>)mVsmjUkX~{{gT+0Vq&r{~?3HHR>x||CeW;t_G!g9CLYGk%l>x~U zfkJKV=OnrOwbL3oNV8p9!~t4qa>iRz*0boB4)nkQ?~c#g$5~KnA=sjho1EUxkEetr z2P=gWv;)l8e~_cqoXOq5J3~&Y=%jo5cz?VPW0HMGy>yj>77CUzZZI%|QX4+HdD6L2Cv*6~G4NRN5Z6nbNWrB>P=eagKj~P!= z)I2hmXJ?(b+^ZIGcUzLa9?;3(+@%bjO^D6*}+J;SWnZB*6M%ZH0ZkW3*zPX`GhLx5xpK<4KgjPmiOa}g3s5y z@c8`hZ3F6?T?ab8wlOL+`%dS4x8W{IL=j)*i{P3EZ=7_VOcz$3yuyK9&sZhf-g+=L zf54sW%j*Ox1sY8lXp;)7!fXb1pX?&lj5j);f`|r`B}tm`YnnF8S4`*rJl%cnw4dpu zYve42Er@u|H^x{=yb@!|uVb}j)@*wKKYB1c06NQ#5d7((`6DUKfYf2TIZn-3foX;) zS3FEo)YbAO;~x*a3FMYr{BKUPejEmj8oJzU)7_Jlu8e%`EA@)iE6>UImbCe1Joy*1 k%(?Fc3WmpSZF&R%038pL#lJ-Y54e*Iz#Il6y8r+H0J5cCZvX%Q delta 1670 zcmV;126_4M`~t3k1F(Lxf49Byvo{6+0OS||00#g70B>+~X>V?G%~(rw+DH(-`&YO) zhb@Fdf)9JZV9Zubl0w)yY;CCqsfA`eno-RI>}=(~Z;KJ2#|Y!>9>NWEPd~rznQoD3 zD!97*{qo|Ui%b0d*@OSDb-_1RN|CR(^N>^qMU3{2@Taf;cG+IU{!H+bORMFp$MNcsvoH`ge~Sy zVHt@SvN>rIGPJ^-e}RNX;A>i(Y=lpehzfVqN#;)Jvj)it%Y)}usWJ#P(L&z7%363{ zjS%oPqZsfqqo$c#f>9uSPO?KT8w{Klq3NWcB@H{(1ZF~^sRxdTnzYIhB2tzKq{sY; zP94NkM%RgUhj_Kh3ODD?lxhip#gBZH z(W2jZ!}tA4e~%zL7+czJA4|VsrT67|S4}HslZ8E6{y6tXBO8HA=;&rCNuI7&42H~T zbaqajCzx}>L+jgh)neq3gz_a;sFC}yrR2FHDn(4tIrb$4y${;hBJX%1;zE)Nt4c^D zwo43_6T7it%ny;u-H?c=A}a|#dr(mLqx>~iqztEoh9 zv_m))s@EGWoBe-dd%lnRO)wr-GRT1#Pg z6lfyXf1m@(W7iE-VI?#T5@1M`Jk|2d-=tvHW^3Lc;E`q-_yK5ECrVPOA+Er6of~UGFtB-ma(+T2eC|U!AQa zn0CFvxJ^})eNOMX{cHcN2S(=~@J+WrIG;UtfB%irKU(%Mp?G7#8P?yuN&eNC9SoG%~yuK=FuIUOz~PO}(+Ip{<=d{w!E)lHe}#`9HrrkFc!qRz|om)9Sh1yotxn2@JfBmsQ zIHB^_U$8}FO0oJxx`W=Uz2RK*#u?9=g9oc!-WT2$zN>t!ar>SC zkvMGSb5sg0MDJLlED`&i3pNDDe|X)T+3#*7-pa}CaXnQRyf(CXY$KQ{mQj`OyPc$; z0fg?QYid+6uyre~2E8{cO*I4e?7tO~MP+rhNEWfX*rPy&!0^cd!nB|%4_7KSE$fj% zz%k;0?|0%}1;m~g#Q10m!ea}s^Gy4}ZZTb+Lal&Hn(;o@Jj54i6I3b(!Svo{6+0OS~x2);!E Q%(;_Kz8nVNyZ`_I0E=HOHUIzs