diff --git a/Moose/Base.lua b/Moose/Base.lua index dc4029ff0..77724a7a1 100644 --- a/Moose/Base.lua +++ b/Moose/Base.lua @@ -156,9 +156,20 @@ trace.f( self.ClassName, { EventTime, Initiator, IniUnitName, place, subplace } subplace = subplace } - world.onEvent( Event ) + world.onEvent( Event ) end +function BASE:CreateEventCrash( EventTime, Initiator ) +trace.f( self.ClassName, { EventTime, Initiator } ) + + local Event = { + id = world.event.S_EVENT_CRASH, + time = EventTime, + initiator = Initiator, + } + + world.onEvent( Event ) +end function BASE:onEvent(event) --trace.f(self.ClassName, event ) @@ -204,6 +215,6 @@ function BASE:T( Arguments ) local Line = DebugInfo.currentline - env.info( string.format( "%6d/%1s:%20s.%s\(%s\)" , Line, "T", self.ClassName, Function .. routines.utils.oneLineSerialize( Arguments ) ) ) + env.info( string.format( "%6d/%1s:%20s.%s\(%s\)" , Line, "T", self.ClassName, Function, routines.utils.oneLineSerialize( Arguments ) ) ) end end diff --git a/Moose/Cargo.lua b/Moose/Cargo.lua index d302f8f98..d113e70b1 100644 --- a/Moose/Cargo.lua +++ b/Moose/Cargo.lua @@ -31,24 +31,25 @@ CARGO_ZONE = { } } -function CARGO_ZONE:New( CargoZoneName, CargoHostName ) -trace.f( self.ClassName, { CargoZoneName, CargoHostName } ) - - local self = BASE:Inherit( self, BASE:New() ) +function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, BASE:New() ) +self:T( { CargoZoneName, CargoHostName } ) self.CargoZoneName = CargoZoneName self.CargoZone = trigger.misc.getZone( CargoZoneName ) + if CargoHostName then self.CargoHostName = CargoHostName self.CargoHostSpawn = SPAWN:New( CargoHostName ) end + + self:T( self.CargoZone ) return self end function CARGO_ZONE:Spawn() -trace.f( self.ClassName, CargoHostSpawn ) +self:T( CargoHostSpawn ) if self.CargoHostSpawn then local CargoHostGroup = Group.getByName( self.CargoHostSpawn:SpawnGroupName() ) @@ -84,7 +85,7 @@ function CARGO_ZONE:GetHostUnit() end function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) -trace.f( self.ClassName ) +self:T() local SignalUnit = self:GetHostUnit() @@ -95,23 +96,25 @@ trace.f( self.ClassName ) local HostMessage = "" local IsCargo = false - for CargoID, Cargo in pairs( Cargos ) do + for CargoID, Cargo in pairs( CARGOS ) do if Cargo.CargoType == Task.CargoType then - HostMessage = HostMessage .. "\n - " .. Cargo.CargoName - IsCargo = true + if Cargo:IsStatusNone() then + HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" + IsCargo = true + end end end if not IsCargo then - HostMessage = HostMessage .. "No Cargo Available." + HostMessage = "No Cargo Available." end - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) + Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) end end function CARGO_ZONE:Signal() -trace.f( self.ClassName ) +self:T() local Signalled = false @@ -125,7 +128,7 @@ trace.f( self.ClassName ) if SignalUnit then - trace.i( self.ClassName, 'Signalling Unit' ) + self:T( 'Signalling Unit' ) local SignalVehiclePos = SignalUnit:getPosition().p SignalVehiclePos.y = SignalVehiclePos.y + 2 @@ -165,7 +168,7 @@ trace.f( self.ClassName ) end function CARGO_ZONE:WhiteSmoke() -trace.f( self.ClassName ) +self:T() self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE @@ -174,7 +177,7 @@ trace.f( self.ClassName ) end function CARGO_ZONE:BlueSmoke() -trace.f( self.ClassName ) +self:T() self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE @@ -183,7 +186,7 @@ trace.f( self.ClassName ) end function CARGO_ZONE:RedSmoke() -trace.f( self.ClassName ) +self:T() self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED @@ -192,7 +195,7 @@ trace.f( self.ClassName ) end function CARGO_ZONE:OrangeSmoke() -trace.f( self.ClassName ) +self:T() self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE @@ -201,7 +204,7 @@ trace.f( self.ClassName ) end function CARGO_ZONE:GreenSmoke() -trace.f( self.ClassName ) +self:T() self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN @@ -211,7 +214,7 @@ end function CARGO_ZONE:WhiteFlare() -trace.f( self.ClassName ) +self:T() self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE @@ -220,7 +223,7 @@ trace.f( self.ClassName ) end function CARGO_ZONE:RedFlare() -trace.f( self.ClassName ) +self:T() self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED @@ -229,7 +232,7 @@ trace.f( self.ClassName ) end function CARGO_ZONE:GreenFlare() -trace.f( self.ClassName ) +self:T() self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN @@ -238,7 +241,7 @@ trace.f( self.ClassName ) end function CARGO_ZONE:YellowFlare() -trace.f( self.ClassName ) +self:T() self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW @@ -248,7 +251,7 @@ end function CARGO_ZONE:GetCargoHostUnit() -trace.f( self.ClassName ) +self:T() local CargoHostUnit = Group.getByName( self.CargoHostSpawn:SpawnGroupName() ):getUnit(1) if CargoHostUnit and CargoHostUnit:isExist() then @@ -259,7 +262,7 @@ trace.f( self.ClassName ) end function CARGO_ZONE:GetCargoZoneName() -trace.f( self.ClassName ) +self:T() return self.CargoZoneName end @@ -276,10 +279,9 @@ CARGO = { } --- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... -function CARGO:New( CargoType, CargoName, CargoWeight ) -trace.f( self.ClassName, { CargoType, CargoName, CargoWeight } ) +function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) +self:T( { CargoType, CargoName, CargoWeight } ) - local self = BASE:Inherit( self, BASE:New() ) self.CargoType = CargoType self.CargoName = CargoName @@ -291,14 +293,14 @@ trace.f( self.ClassName, { CargoType, CargoName, CargoWeight } ) end function CARGO:Spawn() -trace.f( self.ClassName ) +self:T() return self end function CARGO:IsNear( Client, LandingZone ) -trace.f( self.ClassName ) +self:T() local Near = true @@ -307,7 +309,7 @@ trace.f( self.ClassName ) end function CARGO:IsLoadedInClient() -trace.f( self.ClassName ) +self:T() if self:IsStatusLoaded() or self:IsStatusLoading() then return self.CargoClient @@ -319,7 +321,7 @@ end function CARGO:UnLoad( Client, TargetZoneName ) -trace.f( self.ClassName ) +self:T() self:StatusUnLoaded() @@ -327,7 +329,7 @@ trace.f( self.ClassName ) end function CARGO:OnBoard( Client, LandingZone ) -trace.f(self.ClassName ) +self:T() local Valid = true @@ -338,7 +340,7 @@ trace.f(self.ClassName ) end function CARGO:OnBoarded( Client, LandingZone ) -trace.f(self.ClassName ) +self:T() local OnBoarded = true @@ -346,7 +348,7 @@ trace.f(self.ClassName ) end function CARGO:Load( Client ) -trace.f( self.ClassName ) +self:T() self:StatusLoaded( Client ) @@ -354,18 +356,18 @@ trace.f( self.ClassName ) end function CARGO:IsLandingRequired() -trace.f( self.ClassName ) +self:T() return true end function CARGO:IsSlingLoad() -trace.f( self.ClassName ) +self:T() return false end function CARGO:StatusNone() -trace.f(self.ClassName ) +self:T() self.CargoClient = nil self.CargoStatus = CARGO.STATUS.NONE @@ -374,16 +376,17 @@ trace.f(self.ClassName ) end function CARGO:StatusLoading( Client ) -trace.f(self.ClassName ) +self:T() self.CargoClient = Client self.CargoStatus = CARGO.STATUS.LOADING + self:T( "Cargo loaded in Client: " .. CargoClient:GetClientGroupName() ) return self end function CARGO:StatusLoaded( Client ) -trace.f(self.ClassName ) +self:T() self.CargoClient = Client self.CargoStatus = CARGO.STATUS.LOADED @@ -392,7 +395,7 @@ trace.f(self.ClassName ) end function CARGO:StatusUnLoaded() -trace.f(self.ClassName ) +self:T() self.CargoClient = nil self.CargoStatus = CARGO.STATUS.UNLOADED @@ -402,25 +405,25 @@ end function CARGO:IsStatusNone() -trace.f(self.ClassName ) +self:T() return self.CargoStatus == CARGO.STATUS.NONE end function CARGO:IsStatusLoading() -trace.f(self.ClassName ) +self:T() return self.CargoStatus == CARGO.STATUS.LOADING end function CARGO:IsStatusLoaded() -trace.f(self.ClassName ) +self:T() return self.CargoStatus == CARGO.STATUS.LOADED end function CARGO:IsStatusUnLoaded() -trace.f(self.ClassName ) +self:T() return self.CargoStatus == CARGO.STATUS.UNLOADED end @@ -431,12 +434,9 @@ CARGO_GROUP = { } -function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) -trace.f( self.ClassName, { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) +function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) +self:T( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) - -- Arrange meta tables - local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self.CargoSpawn = SPAWN:New( CargoGroupTemplate ) self.CargoZone = CargoZone @@ -447,7 +447,7 @@ trace.f( self.ClassName, { CargoType, CargoName, CargoWeight, CargoGroupTemplate end function CARGO_GROUP:Spawn() -trace.f( self.ClassName ) +self:T() local SpawnCargo = true @@ -477,13 +477,13 @@ trace.f( self.ClassName ) self:StatusNone() end - trace.i( self.ClassName, { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) + self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) return self end function CARGO_GROUP:IsNear( Client, LandingZone ) -trace.f( self.ClassName ) +self:T() local Near = false @@ -498,8 +498,9 @@ trace.f( self.ClassName ) end + function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) -trace.f(self.ClassName ) +self:T() local Valid = true @@ -517,12 +518,12 @@ trace.f(self.ClassName ) local Points = {} - trace.i( self.ClassName, 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - trace.i( self.ClassName, 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - trace.i( self.ClassName, 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) if OnBoardSide == nil then OnBoardSide = CLIENT.ONBOARDSIDE.NONE @@ -530,7 +531,7 @@ trace.f(self.ClassName ) if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - trace.i( self.ClassName, "TransportCargoOnBoard: Onboarding LEFT" ) + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) CarrierPosMove.z = CarrierPosMove.z - 25 CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) @@ -538,7 +539,7 @@ trace.f(self.ClassName ) elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - trace.i( self.ClassName, "TransportCargoOnBoard: Onboarding RIGHT" ) + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) CarrierPosMove.z = CarrierPosMove.z + 25 CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) @@ -546,7 +547,7 @@ trace.f(self.ClassName ) elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - trace.i( self.ClassName, "TransportCargoOnBoard: Onboarding BACK" ) + self:T( "TransportCargoOnBoard: Onboarding BACK" ) CarrierPosMove.x = CarrierPosMove.x - 25 CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) @@ -554,7 +555,7 @@ trace.f(self.ClassName ) elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - trace.i( self.ClassName, "TransportCargoOnBoard: Onboarding FRONT" ) + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) CarrierPosMove.x = CarrierPosMove.x + 25 CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) @@ -562,11 +563,11 @@ trace.f(self.ClassName ) elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - trace.i( self.ClassName, "TransportCargoOnBoard: Onboarding CENTRAL" ) + self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) end - trace.i( self.ClassName, "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) + self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) @@ -578,7 +579,7 @@ end function CARGO_GROUP:OnBoarded( Client, LandingZone ) -trace.f(self.ClassName ) +self:T() local OnBoarded = false @@ -592,11 +593,12 @@ trace.f(self.ClassName ) return OnBoarded end -function CARGO_GROUP:UnLoad( Client, TargetZoneName ) -trace.f( self.ClassName ) - trace.i( self.ClassName, 'self.CargoName = ' .. self.CargoName ) - trace.i( self.ClassName, 'self.CargoGroupName = ' .. self.CargoGroupName ) +function CARGO_GROUP:UnLoad( Client, TargetZoneName ) +self:T() + + self:T( 'self.CargoName = ' .. self.CargoName ) + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) self.CargoSpawn:FromCarrier( Client:GetClientGroupUnit(), TargetZoneName, self.CargoGroupName ) @@ -611,18 +613,11 @@ CARGO_PACKAGE = { } -function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClientInitGroupName ) -trace.f( self.ClassName, { CargoType, CargoName, CargoWeight, CargoClientInitGroupName } ) +function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - -- Arrange meta tables - local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - - self.CargoClientInitGroupName = CargoClientInitGroupName - - self.CargoClient = CLIENT:New( self.CargoClientInitGroupName ) - self:StatusLoaded( self.CargoClient ) - - self.CargoClientInitGroupSpawn = SPAWN:New( self.CargoClientInitGroupName ) + self:T( { CargoType, CargoName, CargoWeight, CargoClient.ClientName } ) + + self.CargoClient = CargoClient CARGOS[self.CargoName] = self @@ -630,21 +625,28 @@ trace.f( self.ClassName, { CargoType, CargoName, CargoWeight, CargoClientInitGro end + function CARGO_PACKAGE:Spawn() -trace.f( self.ClassName ) +self:T() -- this needs to be checked thoroughly + local CargoClientInitGroup = self.CargoClient:ClientGroup() + if not CargoClientInitGroup then + if not self.CargoClientInitGroupSpawn then + self.CargoClientInitGroupSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ) + end + self.CargoClientInitGroupSpawn:Spawn( self.CargoClient:GetClientGroupName() ) + end + local SpawnCargo = true - trace.i( self.ClassName, self.CargoClientInitGroupName ) - if self:IsStatusNone() then elseif self:IsStatusLoading() or self:IsStatusLoaded() then - local Client = self:IsLoadedInClient() - if Client and Client:ClientGroup() then + local CargoClientLoaded = self:IsLoadedInClient() + if CargoClientLoaded and CargoClientLoaded:ClientGroup() then SpawnCargo = false end @@ -657,26 +659,21 @@ trace.f( self.ClassName ) end if SpawnCargo then - self.CargoClient = CLIENT:New( self.CargoClientInitGroupName ) self:StatusLoaded( self.CargoClient ) end - - local CargoClientInitGroup = Group.getByName( self.CargoClientInitGroupName ) - if CargoClientInitGroup then - self.CargoClientInitGroupSpawn:Spawn( self.CargoClientInitGroupName ) - end - + return self end + function CARGO_PACKAGE:IsNear( Client, LandingZone ) -trace.f( self.ClassName ) +self:T() local Near = false if self.CargoClient and self.CargoClient:ClientGroup() then - trace.i( self.ClassName, self.CargoClient.ClientName ) - trace.i( self.ClassName, 'Client Exists.' ) + self:T( self.CargoClient.ClientName ) + self:T( 'Client Exists.' ) if routines.IsUnitInRadius( self.CargoClient:GetClientGroupUnit(), Client:ClientPosition(), 150 ) then Near = true @@ -687,8 +684,9 @@ trace.f( self.ClassName ) end + function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) -trace.f(self.ClassName ) +self:T() local Valid = true @@ -707,12 +705,12 @@ trace.f(self.ClassName ) local Points = {} - trace.i( self.ClassName, 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - trace.i( self.ClassName, 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - trace.i( self.ClassName, 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) if OnBoardSide == nil then OnBoardSide = CLIENT.ONBOARDSIDE.NONE @@ -720,7 +718,7 @@ trace.f(self.ClassName ) if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - trace.i( self.ClassName, "TransportCargoOnBoard: Onboarding LEFT" ) + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) CarrierPosMove.z = CarrierPosMove.z - 25 CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 @@ -730,7 +728,7 @@ trace.f(self.ClassName ) elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - trace.i( self.ClassName, "TransportCargoOnBoard: Onboarding RIGHT" ) + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) CarrierPosMove.z = CarrierPosMove.z + 25 CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 @@ -740,7 +738,7 @@ trace.f(self.ClassName ) elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - trace.i( self.ClassName, "TransportCargoOnBoard: Onboarding BACK" ) + self:T( "TransportCargoOnBoard: Onboarding BACK" ) CarrierPosMove.x = CarrierPosMove.x - 25 CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 @@ -750,7 +748,7 @@ trace.f(self.ClassName ) elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - trace.i( self.ClassName, "TransportCargoOnBoard: Onboarding FRONT" ) + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) CarrierPosMove.x = CarrierPosMove.x + 25 CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 @@ -760,7 +758,7 @@ trace.f(self.ClassName ) elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - trace.i( self.ClassName, "TransportCargoOnBoard: Onboarding FRONT" ) + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) CarrierPosMove.x = CarrierPosMove.x + 25 CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 @@ -769,7 +767,7 @@ trace.f(self.ClassName ) Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) end - trace.i( self.ClassName, "Routing " .. CargoHostName ) + self:T( "Routing " .. CargoHostName ) routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) @@ -779,7 +777,7 @@ end function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) -trace.f(self.ClassName ) +self:T() local OnBoarded = false @@ -797,11 +795,12 @@ trace.f(self.ClassName ) return OnBoarded end -function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) -trace.f( self.ClassName ) - trace.i( self.ClassName, 'self.CargoName = ' .. self.CargoName ) - --trace.i( self.ClassName, 'self.CargoHostName = ' .. self.CargoHostName ) +function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) +self:T() + + self:T( 'self.CargoName = ' .. self.CargoName ) + --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) --self.CargoSpawn:FromCarrier( Client:ClientGroup(), TargetZoneName, self.CargoHostName ) self:StatusUnLoaded() @@ -816,11 +815,10 @@ CARGO_SLINGLOAD = { function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) -trace.f( self.ClassName, { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) - - -- Arrange meta tables local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:T( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) + self.CargoHostName = CargoHostName -- Cargo will be initialized around the CargoZone position. @@ -838,19 +836,21 @@ trace.f( self.ClassName, { CargoType, CargoName, CargoWeight, CargoZone, CargoHo end + function CARGO_SLINGLOAD:IsLandingRequired() -trace.f( self.ClassName ) +self:T() return false end + function CARGO_SLINGLOAD:IsSlingLoad() -trace.f( self.ClassName ) +self:T() return true end function CARGO_SLINGLOAD:Spawn() -trace.f( self.ClassName ) +self:T() local Zone = trigger.misc.getZone( self.CargoZone ) @@ -858,7 +858,7 @@ trace.f( self.ClassName ) ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - trace.i( self.ClassName, "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) + self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) --[[ -- This does not work in 1.5.2. @@ -898,8 +898,9 @@ trace.f( self.ClassName ) return self end + function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) -trace.f( self.ClassName ) +self:T() local Near = false @@ -908,7 +909,7 @@ end function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) -trace.f( self.ClassName ) +self:T() local Near = false @@ -923,9 +924,8 @@ trace.f( self.ClassName ) end - function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) -trace.f(self.ClassName ) +self:T() local Valid = true @@ -935,34 +935,28 @@ end function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) -trace.f(self.ClassName ) +self:T() local OnBoarded = false local CargoStaticUnit = StaticObject.getByName( self.CargoName ) if CargoStaticUnit then if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - Onboarded = true + OnBoarded = true end end return OnBoarded end -function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) -trace.f( self.ClassName ) - trace.i( self.ClassName, 'self.CargoName = ' .. self.CargoName ) - trace.i( self.ClassName, 'self.CargoGroupName = ' .. self.CargoGroupName ) +function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) +self:T() + + self:T( 'self.CargoName = ' .. self.CargoName ) + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) self:StatusUnLoaded() return Cargo end - ---[[-- - Internal Table to understand the form of the CARGO. - @table CARGO_TRANSPORT ---]] -CARGO_TRANSPORT = { UNIT = 1, SLING = 2, STATIC = 3, INVISIBLE = 4 } - diff --git a/Moose/Client.lua b/Moose/Client.lua index ed8994a53..8b152620f 100644 --- a/Moose/Client.lua +++ b/Moose/Client.lua @@ -44,10 +44,9 @@ CLIENT = { -- Mission:AddClient( CLIENT:New( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) function CLIENT:New( ClientName, ClientBriefing ) -trace.f( self.ClassName, { ClientName, ClientBriefing } ) - - -- Arrange meta tables local self = BASE:Inherit( self, BASE:New() ) + self:T() + self.ClientName = ClientName self:AddBriefing( ClientBriefing ) self.MessageSwitch = true @@ -58,7 +57,7 @@ end --- Resets a CLIENT. -- @tparam string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. function CLIENT:Reset( ClientName ) -trace.f(self.ClassName) +self:T() self._Menus = {} end @@ -66,11 +65,11 @@ end -- This function is modified to deal with a couple of bugs in DCS 1.5.3 -- @treturn Group function CLIENT:ClientGroup() -trace.f(self.ClassName) +self:T() -- local ClientData = Group.getByName( self.ClientName ) -- if ClientData and ClientData:isExist() then --- trace.i( self.ClassName, self.ClientName .. " : group found!" ) +-- self:T( self.ClientName .. " : group found!" ) -- return ClientData -- else -- return nil @@ -78,33 +77,33 @@ trace.f(self.ClassName) local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - trace.i( self.ClassName, CoalitionData ) + self:T( { "CoalitionData:", CoalitionData } ) for UnitId, UnitData in pairs( CoalitionData ) do - trace.i( self.ClassName, UnitData ) + self:T( { "UnitData:", UnitData } ) if UnitData and UnitData:isExist() then local ClientGroup = Group.getByName( self.ClientName ) if ClientGroup then - trace.i( self.ClassName, "ClientGroup = " .. self.ClientName ) + self:T( "ClientGroup = " .. self.ClientName ) if ClientGroup:isExist() then if ClientGroup:getID() == UnitData:getGroup():getID() then - trace.i( self.ClassName, "Normal logic" ) - trace.i( self.ClassName, self.ClientName .. " : group found!" ) + self:T( "Normal logic" ) + self:T( self.ClientName .. " : group found!" ) return ClientGroup end else -- Now we need to resolve the bugs in DCS 1.5 ... -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) - trace.i( self.ClassName, "Bug 1.5 logic" ) + self:T( "Bug 1.5 logic" ) local ClientUnits = _Database.Groups[self.ClientName].Units - trace.i( self.ClassName, { ClientUnits[1].name, env.getValueDictByKey(ClientUnits[1].name) } ) + self:T( { ClientUnits[1].name, env.getValueDictByKey(ClientUnits[1].name) } ) for ClientUnitID, ClientUnitData in pairs( ClientUnits ) do - trace.i( self.ClassName, { tonumber(UnitData:getID()), ClientUnitData.unitId } ) + self:T( { tonumber(UnitData:getID()), ClientUnitData.unitId } ) if tonumber(UnitData:getID()) == ClientUnitData.unitId then local ClientGroupTemplate = _Database.Groups[self.ClientName].Template self.ClientGroupID = ClientGroupTemplate.groupId self.ClientGroupUnit = UnitData - trace.i( self.ClassName, self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) + self:T( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) return ClientGroup end end @@ -119,10 +118,10 @@ trace.f(self.ClassName) -- For non player clients local ClientGroup = Group.getByName( self.ClientName ) if ClientGroup then - trace.i( self.ClassName, "ClientGroup = " .. self.ClientName ) + self:T( "ClientGroup = " .. self.ClientName ) if ClientGroup:isExist() then - trace.i( self.ClassName, "Normal logic" ) - trace.i( self.ClassName, self.ClientName .. " : group found!" ) + self:T( "Normal logic" ) + self:T( self.ClientName .. " : group found!" ) return ClientGroup end end @@ -135,7 +134,7 @@ end function CLIENT:GetClientGroupID() -trace.f(self.ClassName) +self:T() ClientGroup = self:ClientGroup() @@ -150,10 +149,29 @@ trace.f(self.ClassName) return nil end + +function CLIENT:GetClientGroupName() +self:T() + + ClientGroup = self:ClientGroup() + + if ClientGroup then + if ClientGroup:isExist() then + self:T( ClientGroup:getName() ) + return ClientGroup:getName() + else + self:T( self.ClientName ) + return self.ClientName + end + end + + return nil +end + --- Returns the Unit of the @{CLIENT}. -- @treturn Unit function CLIENT:GetClientGroupUnit() -trace.f(self.ClassName) +self:T() ClientGroup = self:ClientGroup() @@ -172,7 +190,7 @@ end --- Returns the Position of the @{CLIENT}. -- @treturn Position function CLIENT:ClientPosition() ---trace.f(self.ClassName) +--self:T() ClientGroupUnit = self:GetClientGroupUnit() @@ -188,7 +206,7 @@ end --- Transport defines that the Client is a Transport. -- @treturn CLIENT function CLIENT:Transport() -trace.f(self.ClassName) +self:T() self.ClientTransport = true return self @@ -198,7 +216,7 @@ end -- @tparam string ClientBriefing is the text defining the Mission briefing. -- @treturn CLIENT function CLIENT:AddBriefing( ClientBriefing ) -trace.f(self.ClassName) +self:T() self.ClientBriefing = ClientBriefing return self end @@ -206,14 +224,14 @@ end --- IsTransport returns if a Client is a transport. -- @treturn bool function CLIENT:IsTransport() -trace.f(self.ClassName) +self:T() return self.ClientTransport end --- ShowCargo shows the @{CARGO} within the CLIENT to the Player. -- The @{CARGO} is shown throught the MESSAGE system of DCS World. function CLIENT:ShowCargo() -trace.f( self.ClassName ) +self:T() local CargoMsg = "" @@ -244,7 +262,7 @@ end -- @tparam string MessageCategory is the category of the message (the title). -- @tparam number MessageInterval is the interval in seconds between the display of the Message when the CLIENT is in the air. function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) -trace.f( self.ClassName, { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) +self:T() if not self.MenuMessages then if self:GetClientGroupID() then diff --git a/Moose/DeployTask.lua b/Moose/DeployTask.lua index e27e29898..612f1f6ad 100644 --- a/Moose/DeployTask.lua +++ b/Moose/DeployTask.lua @@ -14,27 +14,25 @@ DEPLOYTASK = { -- @tparam table{string,...}|string LandingZones Table or name of the zone(s) where Cargo is to be unloaded. -- @tparam CARGO_TYPE CargoType Type of the Cargo. function DEPLOYTASK:New( CargoType ) -trace.f(self.ClassName) + local self = BASE:Inherit( self, TASK:New() ) + self:T() - -- Child holds the inherited instance of the DEPLOYTASK Class to the BASE class. - local Child = BASE:Inherit( self, TASK:New() ) - local Valid = true if Valid then - Child.Name = 'Deploy Cargo' - Child.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." - Child.CargoType = CargoType - Child.GoalVerb = CargoType .. " " .. self.GoalVerb - Child.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } - Child.SetStage( Child, 1 ) + self.Name = 'Deploy Cargo' + self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) end - return Child + return self end function DEPLOYTASK:ToZone( LandingZone ) -trace.f(self.ClassName) +self:T() self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone @@ -44,7 +42,7 @@ end function DEPLOYTASK:InitCargo( InitCargos ) -trace.f( self.ClassName, { InitCargos } ) +self:T( { InitCargos } ) if type( InitCargos ) == "table" then self.Cargos.InitCargos = InitCargos @@ -52,13 +50,12 @@ trace.f( self.ClassName, { InitCargos } ) self.Cargos.InitCargos = { InitCargos } end - return self end function DEPLOYTASK:LoadCargo( LoadCargos ) -trace.f( self.ClassName, { LoadCargos } ) +self:T( { LoadCargos } ) if type( LoadCargos ) == "table" then self.Cargos.LoadCargos = LoadCargos @@ -73,7 +70,7 @@ end --- When the cargo is unloaded, it will move to the target zone name. -- @tparam string TargetZoneName Name of the Zone to where the Cargo should move after unloading. function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) -trace.f(self.ClassName) +self:T() local Valid = true @@ -88,7 +85,7 @@ trace.f(self.ClassName) end function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) -trace.f( self.ClassName ) +self:T() local ClientGroupID = Client:GetClientGroupID() @@ -135,7 +132,7 @@ trace.f( self.ClassName ) end function DEPLOYTASK:RemoveCargoMenus( Client ) -trace.f(self.ClassName ) +self:T() local ClientGroupID = Client:GetClientGroupID() trace.i( self.ClassName, ClientGroupID ) diff --git a/Moose/Group.lua b/Moose/Group.lua index 9fa5977af..3506b79e0 100644 --- a/Moose/Group.lua +++ b/Moose/Group.lua @@ -24,6 +24,74 @@ trace.f( self.ClassName, _Group:getName() ) return self end + +function GROUP:GetName() + self:T( self.GroupName ) + + return self.GroupName +end + +function GROUP:Destroy() + self:T( self.GroupName ) + + for Index, UnitData in pairs( self._Group:getUnits() ) do + self:CreateEventCrash( timer.getTime(), UnitData ) + end + + self._Group:destroy() +end + +function GROUP:IsAir() +self:T() + + local IsAirResult = self._Group:getCategory() == Group.Category.AIRPLANE or self._Group:getCategory() == Group.Category.HELICOPTER + + self:T( IsAirResult ) + return IsAirResult +end + +function GROUP:AllOnGround() +self:T() + + local AllOnGroundResult = true + + for Index, UnitData in pairs( self._Group:getUnits() ) do + if UnitData:inAir() then + AllOnGroundResult = false + end + end + + self:T( AllOnGroundResult ) + return AllOnGroundResult +end + + +function GROUP:GetMaxVelocity() +self:T() + + local MaxVelocity = 0 + + for Index, UnitData in pairs( self._Group:getUnits() ) do + + local Velocity = UnitData:getVelocity() + local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) + + if VelocityTotal < MaxVelocity then + MaxVelocity = VelocityTotal + end + end + + return MaxVelocity +end + + +function GROUP:GetHeight() +self:T() + + +end + + function GROUP:Land( Point, Duration ) trace.f( self.ClassName, { self.GroupName, Point, Duration } ) diff --git a/Moose/Mission.lua b/Moose/Mission.lua index 13d0ca400..3d699212f 100644 --- a/Moose/Mission.lua +++ b/Moose/Mission.lua @@ -243,11 +243,12 @@ function MISSION:ShowBriefing( Client ) if not Client.ClientBriefingShown then Client.ClientBriefingShown = true - Client:Message( '(Press the keys [LEFT ALT]+[B] to view the briefing pages. Browse through the graphical briefing.)\n' .. - self.MissionBriefing, 40, self.Name .. '/MissionBriefing', "Mission Command: Mission Briefing" ) + local Briefing = self.MissionBriefing if Client.ClientBriefing then - Client:Message( Client.ClientBriefing, 40, self.Name .. '/ClientBriefing', "Mission Command: Mission Briefing" ) + Briefing = Briefing .. "\n" .. Client.ClientBriefing end + Briefing = Briefing .. "\n (Press [LEFT ALT]+[B] to view the graphical documentation.)" + Client:Message( Briefing, 30, self.Name .. '/MissionBriefing', "Command: Mission Briefing" ) end return Client diff --git a/Moose/PickupTask.lua b/Moose/PickupTask.lua index 52479fa42..92100df64 100644 --- a/Moose/PickupTask.lua +++ b/Moose/PickupTask.lua @@ -16,30 +16,30 @@ PICKUPTASK = { -- @tparam CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. -- @tparam number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. function PICKUPTASK:New( CargoType, OnBoardSide ) -trace.f(self.ClassName) + local self = BASE:Inherit( self, TASK:New() ) + self:T() - -- Child holds the inherited instance of the PICKUPTASK Class to the BASE class. - local Child = BASE:Inherit( self, TASK:New() ) + -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. local Valid = true if Valid then - Child.Name = 'Pickup Cargo' - Child.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." - Child.CargoType = CargoType - Child.GoalVerb = CargoType .. " " .. Child.GoalVerb - Child.OnBoardSide = OnBoardSide - Child.IsLandingRequired = false -- required to decide whether the client needs to land or not - Child.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo - Child.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } - Child.SetStage( Child, 1 ) + self.Name = 'Pickup Cargo' + self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.OnBoardSide = OnBoardSide + self.IsLandingRequired = false -- required to decide whether the client needs to land or not + self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) end - return Child + return self end function PICKUPTASK:FromZone( LandingZone ) -trace.f(self.ClassName) +self:T() self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone @@ -48,7 +48,7 @@ trace.f(self.ClassName) end function PICKUPTASK:InitCargo( InitCargos ) -trace.f( self.ClassName, { InitCargos } ) +self:T( { InitCargos } ) if type( InitCargos ) == "table" then self.Cargos.InitCargos = InitCargos @@ -60,7 +60,7 @@ trace.f( self.ClassName, { InitCargos } ) end function PICKUPTASK:LoadCargo( LoadCargos ) -trace.f( self.ClassName, { LoadCargos } ) +self:T( { LoadCargos } ) if type( LoadCargos ) == "table" then self.Cargos.LoadCargos = LoadCargos @@ -72,11 +72,11 @@ trace.f( self.ClassName, { LoadCargos } ) end function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) -trace.f( self.ClassName ) +self:T() for CargoID, Cargo in pairs( Cargos ) do - trace.i( self.ClassName, { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) if Cargo:IsStatusNone() or ( Cargo:IsStatusLoaded() and Client ~= Cargo:IsLoadedInClient() ) then @@ -96,7 +96,7 @@ trace.f( self.ClassName ) self.TEXT[1] .. " " .. Cargo.CargoType, nil ) - trace.i( self.ClassName, 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) + self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) end if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then @@ -110,7 +110,7 @@ trace.f( self.ClassName ) self.MenuAction, { ReferenceTask = self, CargoTask = Cargo } ) - trace.i( self.ClassName, 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) end end end @@ -118,17 +118,17 @@ trace.f( self.ClassName ) end function PICKUPTASK:RemoveCargoMenus( Client ) -trace.f( self.ClassName ) +self:T() for MenuID, MenuData in pairs( Client._Menus ) do for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) - trace.i( self.ClassName, "Removed PickupSubMenu " ) + self:T( "Removed PickupSubMenu " ) SubMenuData = nil end if MenuData.PickupMenu then missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) - trace.i( self.ClassName, "Removed PickupMenu " ) + self:T( "Removed PickupMenu " ) MenuData.PickupMenu = nil end end @@ -138,7 +138,7 @@ end function PICKUPTASK:HasFailed( ClientDead ) -trace.f(self.ClassName) +self:T() local TaskHasFailed = self.TaskFailed return TaskHasFailed diff --git a/Moose/Routines.lua b/Moose/Routines.lua index a40a8c9df..bdcc7924f 100644 --- a/Moose/Routines.lua +++ b/Moose/Routines.lua @@ -48,53 +48,69 @@ end -- porting in Slmod's serialize_slmod2 routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function - if type(tbl) == 'table' then --function only works for tables! - local tbl_str = {} + lookup_table = {} + + local function _Serialize( tbl ) - tbl_str[#tbl_str + 1] = '{' - - for ind,val in pairs(tbl) do -- serialize its fields - if type(ind) == "number" then - tbl_str[#tbl_str + 1] = '[' - tbl_str[#tbl_str + 1] = tostring(ind) - tbl_str[#tbl_str + 1] = ']=' - else --must be a string - tbl_str[#tbl_str + 1] = '[' - tbl_str[#tbl_str + 1] = routines.utils.basicSerialize(ind) - tbl_str[#tbl_str + 1] = ']=' + if type(tbl) == 'table' then --function only works for tables! + + if lookup_table[tbl] then + return lookup_table[object] end - if ((type(val) == 'number') or (type(val) == 'boolean')) then - tbl_str[#tbl_str + 1] = tostring(val) - tbl_str[#tbl_str + 1] = ',' - elseif type(val) == 'string' then - tbl_str[#tbl_str + 1] = routines.utils.basicSerialize(val) - tbl_str[#tbl_str + 1] = ',' - elseif type(val) == 'nil' then -- won't ever happen, right? - tbl_str[#tbl_str + 1] = 'nil,' - elseif type(val) == 'table' then - if ind == "__index" then - tbl_str[#tbl_str + 1] = "__index" + local tbl_str = {} + + lookup_table[tbl] = tbl_str + + tbl_str[#tbl_str + 1] = '{' + + for ind,val in pairs(tbl) do -- serialize its fields + if type(ind) == "number" then + tbl_str[#tbl_str + 1] = '[' + tbl_str[#tbl_str + 1] = tostring(ind) + tbl_str[#tbl_str + 1] = ']=' + else --must be a string + tbl_str[#tbl_str + 1] = '[' + tbl_str[#tbl_str + 1] = routines.utils.basicSerialize(ind) + tbl_str[#tbl_str + 1] = ']=' + end + + if ((type(val) == 'number') or (type(val) == 'boolean')) then + tbl_str[#tbl_str + 1] = tostring(val) + tbl_str[#tbl_str + 1] = ',' + elseif type(val) == 'string' then + tbl_str[#tbl_str + 1] = routines.utils.basicSerialize(val) + tbl_str[#tbl_str + 1] = ',' + elseif type(val) == 'nil' then -- won't ever happen, right? + tbl_str[#tbl_str + 1] = 'nil,' + elseif type(val) == 'table' then + if ind == "__index" then + tbl_str[#tbl_str + 1] = "__index" + tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else + + tbl_str[#tbl_str + 1] = _Serialize(val) + tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + end + elseif type(val) == 'function' then + tbl_str[#tbl_str + 1] = "function " .. tostring(ind) tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it else - tbl_str[#tbl_str + 1] = routines.utils.oneLineSerialize(val) - tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) + env.info( debug.traceback() ) end - elseif type(val) == 'function' then - tbl_str[#tbl_str + 1] = "function " .. tostring(ind) - tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else - env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) - env.info( debug.traceback() ) - end + end + tbl_str[#tbl_str + 1] = '}' + return table.concat(tbl_str) + else + return tostring(tbl) end - tbl_str[#tbl_str + 1] = '}' - return table.concat(tbl_str) - else - return tostring(tbl) end + + local objectreturn = _Serialize(tbl) + return objectreturn end --porting in Slmod's "safestring" basic serialize diff --git a/Moose/Spawn.lua b/Moose/Spawn.lua index 0fdd5d521..343d6614b 100644 --- a/Moose/Spawn.lua +++ b/Moose/Spawn.lua @@ -236,6 +236,37 @@ trace.f( self.ClassName ) return self end +function SPAWN:CleanUp( SpawnCleanUpInterval ) +self:T() + + self.SpawnCleanUpInterval = SpawnCleanUpInterval + self.SpawnCleanUpTimeStamps = {} + self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, 60 ) +end + +function SPAWN:_SpawnCleanUpScheduler() +self:T() + + local SpawnGroup = self:GetFirstAliveGroup() + + while SpawnGroup do + + if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then + if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() + else + if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then + SpawnGroup:Destroy() + end + end + else + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil + end + + SpawnGroup = self:GetNextAliveGroup() + end + +end --- Will SPAWN a Group whenever you want to do this. -- Note that the configuration with the above functions will apply when calling this method: Maxima, Randomization of routes, Scheduler, ... @@ -441,7 +472,42 @@ function SPAWN:GetLastIndex() end -function SPAWN:GetLastGroup() + +function SPAWN:GetFirstAliveGroup() +self:T() + + self.SpawnIndex = 1 + for SpawnIndex = 1, self.SpawnCount do + SpawnGroupName = self:SpawnGroupName( SpawnIndex ) + SpawnGroup = Group.getByName( SpawnGroupName ) + if SpawnGroup and SpawnGroup:isExist() then + self.SpawnIndex = SpawnIndex + return GROUP:New( SpawnGroup ) + end + end + + self.SpawnIndex = nil + return nil +end + +function SPAWN:GetNextAliveGroup() +self:T() + + self.SpawnIndex = self.SpawnIndex + 1 + for SpawnIndex = self.SpawnIndex, self.SpawnCount do + SpawnGroupName = self:SpawnGroupName( SpawnIndex ) + SpawnGroup = Group.getByName( SpawnGroupName ) + if SpawnGroup and SpawnGroup:isExist() then + self.SpawnIndex = SpawnIndex + return GROUP:New( SpawnGroup ) + end + end + + self.SpawnIndex = nil + return nil +end + +function SPAWN:GetLastAliveGroup() trace.f( self.ClassName ) local LastGroupName = self:SpawnGroupName( self:GetLastIndex() ) @@ -449,7 +515,6 @@ trace.f( self.ClassName ) return GROUP:New( Group.getByName( LastGroupName ) ) end - --- Will SPAWN a Group within a given ZoneName. -- @tparam string ZonePrefix is the name of the zone where the Group is to be SPAWNed. -- @treturn SpawnTemplate diff --git a/Moose/Stage.lua b/Moose/Stage.lua index a9e8377aa..5b79bfd8a 100644 --- a/Moose/Stage.lua +++ b/Moose/Stage.lua @@ -27,13 +27,12 @@ STAGE = { function STAGE:New() -trace.f(self.ClassName) local self = BASE:Inherit( self, BASE:New() ) + self:T() return self end function STAGE:Execute( Mission, Client, Task ) -trace.f(self.ClassName) local Valid = true @@ -41,13 +40,10 @@ trace.f(self.ClassName) end function STAGE:Executing( Mission, Client, Task ) -trace.f(self.ClassName) end function STAGE:Validate( Mission, Client, Task ) -trace.f(self.ClassName) - local Valid = true return Valid @@ -63,24 +59,23 @@ STAGEBRIEF = { } function STAGEBRIEF:New() -trace.f(self.ClassName) - -- Arrange meta tables - local Child = BASE:Inherit( self, STAGE:New() ) - Child.StageType = 'CLIENT' - return Child + local self = BASE:Inherit( self, STAGE:New() ) + self:T() + self.StageType = 'CLIENT' + return self end function STAGEBRIEF:Execute( Mission, Client, Task ) -trace.f(self.ClassName) local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + self:T() Mission:ShowBriefing( Client ) self.StageBriefingTime = timer.getTime() return Valid end function STAGEBRIEF:Validate( Mission, Client, Task ) -trace.f(self.ClassName) local Valid = STAGE:Validate( Mission, Client, Task ) + self:T() if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then return 0 @@ -101,27 +96,26 @@ STAGESTART = { } function STAGESTART:New() -trace.f(self.ClassName) - -- Arrange meta tables - local Child = BASE:Inherit( self, STAGE:New() ) - Child.StageType = 'CLIENT' - return Child + local self = BASE:Inherit( self, STAGE:New() ) + self:T() + self.StageType = 'CLIENT' + return self end function STAGESTART:Execute( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) if Task.TaskBriefing then - Client:Message( Task.TaskBriefing, 15, Mission.Name .. "/Stage", "Mission Command: Tasking" ) + Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Mission Command: Tasking" ) else - Client:Message( 'Task ' .. Task.TaskNumber .. '.', 15, Mission.Name .. "/Stage", "Mission Command: Tasking" ) + Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Mission Command: Tasking" ) end self.StageStartTime = timer.getTime() return Valid end function STAGESTART:Validate( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() local Valid = STAGE:Validate( Mission, Client, Task ) if timer.getTime() - self.StageStartTime <= self.StageStartDuration then @@ -140,15 +134,14 @@ STAGE_CARGO_LOAD = { } function STAGE_CARGO_LOAD:New() -trace.f(self.ClassName) - -- Arrange meta tables local self = BASE:Inherit( self, STAGE:New() ) + self:T() self.StageType = 'CLIENT' return self end function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do @@ -163,7 +156,7 @@ trace.f(self.ClassName) end function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() local Valid = STAGE:Validate( Mission, Client, Task ) return 1 @@ -175,26 +168,26 @@ STAGE_CARGO_INIT = { } function STAGE_CARGO_INIT:New() -trace.f(self.ClassName) - -- Arrange meta tables local self = BASE:Inherit( self, STAGE:New() ) + self:T() self.StageType = 'CLIENT' return self end function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do - trace.i( self.ClassName, InitLandingZone ) + self:T( InitLandingZone ) InitLandingZone:Spawn() end - - for InitCargoID, InitCargo in pairs( Task.Cargos.InitCargos ) do - trace.i( self.ClassName ) - InitCargo:Spawn() + + self:T( Task.Cargos.InitCargos ) + for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do + self:T( { InitCargoData } ) + InitCargoData:Spawn() end return Valid @@ -202,7 +195,7 @@ end function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() local Valid = STAGE:Validate( Mission, Client, Task ) return 1 @@ -218,9 +211,8 @@ STAGEROUTE = { } function STAGEROUTE:New() -trace.f(self.ClassName) - -- Arrange meta tables local self = BASE:Inherit( self, STAGE:New() ) + self:T() self.StageType = 'CLIENT' self.MessageSwitch = true return self @@ -228,10 +220,11 @@ end function STAGEROUTE:Execute( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) local RouteMessage = "Fly to " + self:T( Task.LandingZones ) for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do RouteMessage = RouteMessage .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupUnit():getPoint(), true, true } ) .. ' km. ' end @@ -245,11 +238,11 @@ trace.f(self.ClassName) end function STAGEROUTE:Validate( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() local Valid = STAGE:Validate( Mission, Client, Task ) -- check if the Client is in the landing zone - trace.i( self.ClassName, Task.LandingZones.LandingZoneNames ) + self:T( Task.LandingZones.LandingZoneNames ) Task.CurrentLandingZoneName = routines.IsUnitInZones( Client:GetClientGroupUnit(), Task.LandingZones.LandingZoneNames ) if Task.CurrentLandingZoneName then @@ -279,15 +272,14 @@ STAGELANDING = { } function STAGELANDING:New() -trace.f(self.ClassName) - -- Arrange meta tables - local Child = BASE:Inherit( self, STAGE:New() ) - Child.StageType = 'CLIENT' - return Child + local self = BASE:Inherit( self, STAGE:New() ) + self:T() + self.StageType = 'CLIENT' + return self end function STAGELANDING:Execute( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot: Arrived", 10 ) @@ -307,12 +299,12 @@ trace.f(self.ClassName) if Cargo.CargoType == Task.CargoType then if Cargo:IsLandingRequired() then - trace.i( self.ClassName, "Task for cargo " .. Cargo.CargoType .. " requires landing.") + self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") Task.IsLandingRequired = true end if Cargo:IsSlingLoad() then - trace.i( self.ClassName, "Task for cargo " .. Cargo.CargoType .. " is a slingload.") + self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") Task.IsSlingLoad = true end @@ -337,13 +329,13 @@ trace.f(self.ClassName) end function STAGELANDING:Validate( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() Task.CurrentLandingZoneName = routines.IsUnitInZones( Client:GetClientGroupUnit(), Task.LandingZones.LandingZoneNames ) if Task.CurrentLandingZoneName then -- Client is in de landing zone. - trace.i( self.ClassName, Task.CurrentLandingZoneName ) + self:T( Task.CurrentLandingZoneName ) Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] @@ -380,15 +372,14 @@ STAGELANDED = { } function STAGELANDED:New() -trace.f(self.ClassName) - -- Arrange meta tables - local Child = BASE:Inherit( self, STAGE:New() ) - Child.StageType = 'CLIENT' - return Child + local self = BASE:Inherit( self, STAGE:New() ) + self:T() + self.StageType = 'CLIENT' + return self end function STAGELANDED:Execute( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() if Task.IsLandingRequired then Client:Message( 'We have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', @@ -404,17 +395,17 @@ end function STAGELANDED:Validate( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() if not routines.IsUnitInZones( Client:GetClientGroupUnit(), Task.CurrentLandingZoneName ) then - trace.i( self.ClassName, "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) + self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) Task.Signalled = false Task:RemoveCargoMenus( Client ) return -2 end if Task.IsLandingRequired and Client:GetClientGroupUnit():inAir() then - trace.i( self.ClassName, "Client went back in the air. Go back to stage Landing." ) + self:T( "Client went back in the air. Go back to stage Landing." ) Task.Signalled = false return -1 end @@ -436,22 +427,21 @@ STAGEUNLOAD = { } function STAGEUNLOAD:New() -trace.f(self.ClassName) - -- Arrange meta tables - local Child = BASE:Inherit( self, STAGE:New() ) - Child.StageType = 'CLIENT' - return Child + local self = BASE:Inherit( self, STAGE:New() ) + self:T() + self.StageType = 'CLIENT' + return self end function STAGEUNLOAD:Execute( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot: Unload" ) Task:RemoveCargoMenus( Client ) end function STAGEUNLOAD:Executing( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) local TargetZoneName @@ -471,7 +461,7 @@ trace.f(self.ClassName) end function STAGEUNLOAD:Validate( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() env.info( 'STAGEUNLOAD:Validate()' ) if routines.IsUnitInZones( Client:GetClientGroupUnit(), Task.CurrentLandingZoneName ) then @@ -509,15 +499,14 @@ STAGELOAD = { } function STAGELOAD:New() -trace.f(self.ClassName) - -- Arrange meta tables - local Child = BASE:Inherit( self, STAGE:New() ) - Child.StageType = 'CLIENT' - return Child + local self = BASE:Inherit( self, STAGE:New() ) + self:T() + self.StageType = 'CLIENT' + return self end function STAGELOAD:Execute( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() if not Task.IsSlingLoad then Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', @@ -532,7 +521,7 @@ trace.f(self.ClassName) end function STAGELOAD:Executing( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() -- If the Cargo is ready to be loaded, load it into the Client. @@ -556,7 +545,7 @@ trace.f(self.ClassName) Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" .. ":", 10 ) for CargoID, Cargo in pairs( CARGOS ) do - trace.i( self.ClassName, "Cargo.CargoName = " .. Cargo.CargoName ) + self:T( "Cargo.CargoName = " .. Cargo.CargoName ) if Cargo:IsSlingLoad() then local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) @@ -575,7 +564,7 @@ trace.f(self.ClassName) break end else - trace.i( self.ClassName, "Cargo not found in the DCS simulator." ) + self:T( "Cargo not found in the DCS simulator." ) end end end @@ -584,9 +573,9 @@ trace.f(self.ClassName) end function STAGELOAD:Validate( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() - trace.i( self.ClassName, "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) + self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) if not Task.IsSlingLoad then if not routines.IsUnitInZones( Client:GetClientGroupUnit(), Task.CurrentLandingZoneName ) then @@ -634,93 +623,6 @@ trace.f(self.ClassName) return 0 end -STAGE_SLINGLOAD_HOOK = { - ClassName = "STAGE_SLINGLOAD_HOOK", - MSG = { ID = "SlingLoadHook", TIME = 10 }, - Name = "SlingLoadHook" -} - -function STAGE_SLINGLOAD_HOOK:New() -trace.f(self.ClassName) - -- Arrange meta tables - local self = BASE:Inherit( self, STAGE:New() ) - self.StageType = 'CLIENT' - return self -end - -function STAGE_SLINGLOAD_HOOK:Execute( Mission, Client, Task ) -trace.f(self.ClassName) - Client:Message( 'Hook the Cargo onto the helicopter, and fly out the pick-up zone. Due to a bug in DCS world it cannot be chacked (for the moment) ' .. - 'if the cargo is in our out of the zone and attached to your helicopter...', self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot: Hook" ) -end - -function STAGE_SLINGLOAD_HOOK:Validate( Mission, Client, Task ) -trace.f(self.ClassName) - - - for CargoID, CargoName in pairs( Task.CargoPrefixes ) do - env.info( CargoName ) - if StaticObject.getByName( CargoName ):inAir() then - Task.CargoName = CargoName - Task.CargoID = CargoID - Client:Message( 'Co-Pilot: The Cargo has been successfully hooked onto the helicopter within the landing zone.', self.MSG.TIME, Mission.Name .. "/StageSuccess" ) - break - end - end - - if Task.CargoName then - if routines.IsStaticInZones( StaticObject.getByName( Task.CargoName ), Task.CurrentLandingZoneName ) then - else - return 1 - end - end - - return 1 -end - -STAGE_SLINGLOAD_UNHOOK = { - ClassName = "STAGE_SLINGLOAD_UNHOOK", - MSG = { ID = "SlingLoadUnHook", TIME = 10 }, - Name = "SlingLoadUnHook" -} - -function STAGE_SLINGLOAD_UNHOOK:New() -trace.f(self.ClassName) - -- Arrange meta tables - local self = BASE:Inherit( self, STAGE:New() ) - self.StageType = 'CLIENT' - return self -end - -function STAGE_SLINGLOAD_UNHOOK:Execute( Mission, Client, Task ) -trace.f(self.ClassName) - Client:Message( 'Deploy the Cargo in the Landing Zone and unhook the cargo, and fly out of the drop zone.', self.MSG.TIME, Mission.Name .. "/StageUnhook", "Co-Pilot: Unhook" ) -end - -function STAGE_SLINGLOAD_UNHOOK:Validate( Mission, Client, Task ) -trace.f(self.ClassName) - - for CargoID, CargoName in pairs( Task.CargoPrefixes ) do - if StaticObject.getByName( CargoName ):inAir() then - Task.CargoName = CargoName - Task.CargoID = CargoID - Client:Message( 'Co-Pilot: Drop the cargo within the landing zone and unhook.', self.MSG.TIME, Mission.Name .. "/Stage" ) - break - end - end - - if Task.CargoName then - if not StaticObject.getByName( Task.CargoName ):inAir() then - if routines.IsUnitInZones( Client:GetClientGroupUnit(), Task.CurrentLandingZoneName ) then - else - Client:Message( 'Co-Pilot: The Cargo is Dropped in the Landing Zone, and You have flown outside of the landing zone.', self.MSG.TIME, Mission.Name .. "/Stage" ) - return 1 - end - end - end - - return 1 -end STAGEDONE = { ClassName = "STAGEDONE", @@ -729,20 +631,19 @@ STAGEDONE = { } function STAGEDONE:New() -trace.f(self.ClassName) - -- Arrange meta tables - local Child = BASE:Inherit( self, STAGE:New() ) - Child.StageType = 'AI' - return Child + local self = BASE:Inherit( self, STAGE:New() ) + self:T() + self.StageType = 'AI' + return self end function STAGEDONE:Execute( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() end function STAGEDONE:Validate( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() Task:Done() @@ -756,22 +657,21 @@ STAGEARRIVE = { } function STAGEARRIVE:New() -trace.f(self.ClassName) - -- Arrange meta tables - local Child = BASE:Inherit( self, STAGE:New() ) - Child.StageType = 'CLIENT' - return Child + local self = BASE:Inherit( self, STAGE:New() ) + self:T() + self.StageType = 'CLIENT' + return self end function STAGEARRIVE:Execute( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot: Arrived" ) end function STAGEARRIVE:Validate( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupUnit(), Task.LandingZones ) if ( Task.CurrentLandingZoneID ) then @@ -791,11 +691,10 @@ STAGEGROUPSDESTROYED = { } function STAGEGROUPSDESTROYED:New() -trace.f(self.ClassName) - -- Arrange meta tables - local Child = BASE:Inherit( self, STAGE:New() ) - Child.StageType = 'AI' - return Child + local self = BASE:Inherit( self, STAGE:New() ) + self:T() + self.StageType = 'AI' + return self end --function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) @@ -805,7 +704,7 @@ end --end function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) -trace.f(self.ClassName) +self:T() if Task.MissionTask:IsGoalReached() then return 1 @@ -815,8 +714,8 @@ trace.f(self.ClassName) end function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) -trace.f(self.ClassName) - trace.i( self.ClassName, { Task.ClassName, Task.Destroyed } ) +self:T() + self:T( { Task.ClassName, Task.Destroyed } ) --env.info( 'Event Table Task = ' .. tostring(Task) ) end diff --git a/Test Missions/MOOSE_Pickup_Test.lua b/Test Missions/MOOSE_Pickup_Test.lua new file mode 100644 index 000000000..dfe4ff840 --- /dev/null +++ b/Test Missions/MOOSE_Pickup_Test.lua @@ -0,0 +1,126 @@ +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "DeployTask" ) +Include.File( "PickupTask" ) +Include.File( "DestroyGroupsTask" ) +Include.File( "DestroyRadarsTask" ) +Include.File( "DestroyUnitTypesTask" ) +Include.File( "GoHomeTask" ) +Include.File( "Spawn" ) +Include.File( "Movement" ) +Include.File( "Sead" ) +Include.File( "CleanUp" ) + +do + local Mission = MISSION:New( 'Pickup', 'Operational', 'Pickup Troops', 'NATO' ) + + Mission:AddClient( CLIENT:New( 'DE Pickup Test 1' ):Transport() ) + Mission:AddClient( CLIENT:New( 'DE Pickup Test 2' ):Transport() ) + + local CargoTable = {} + + local EngineerNames = { "Alpha", "Beta", "Gamma", "Delta", "Theta" } + + Cargo_Pickup_Zone_1 = CARGO_ZONE:New( 'Pickup Zone 1', 'DE Communication Center 1' ):BlueSmoke() + Cargo_Pickup_Zone_2 = CARGO_ZONE:New( 'Pickup Zone 2', 'DE Communication Center 2' ):RedSmoke() + + for CargoItem = 1, 2 do + CargoTable[CargoItem] = CARGO_GROUP:New( 'Engineers', 'Team ' .. EngineerNames[CargoItem], math.random( 70, 100 ) * 3, 'DE Infantry', Cargo_Pickup_Zone_1 ) + end + + for CargoItem = 3, 5 do + CargoTable[CargoItem] = CARGO_GROUP:New( 'Engineers', 'Team ' .. EngineerNames[CargoItem], math.random( 70, 100 ) * 3, 'DE Infantry', Cargo_Pickup_Zone_2 ) + end + + --Cargo_Package = CARGO_INVISIBLE:New( 'Letter', 0.1, 'DE Secret Agent', 'Pickup Zone Package' ) + --Cargo_Goods = CARGO_STATIC:New( 'Goods', 20, 'Goods', 'Pickup Zone Goods', 'DE Collection Point' ) + --Cargo_SlingLoad = CARGO_SLING:New( 'Basket', 40, 'Basket', 'Pickup Zone Sling Load', 'DE Cargo Guard' ) + + + -- Assign the Pickup Task + local PickupTask = PICKUPTASK:New( 'Engineers', CLIENT.ONBOARDSIDE.LEFT ) + PickupTask:FromZone( Cargo_Pickup_Zone_1 ) + PickupTask:FromZone( Cargo_Pickup_Zone_2 ) + PickupTask:InitCargo( CargoTable ) + PickupTask:SetGoalTotal( 3 ) + Mission:AddTask( PickupTask, 1 ) + + + Cargo_Deploy_Zone_1 = CARGO_ZONE:New( 'Deploy Zone 1', 'DE Communication Center 3' ):RedFlare() + Cargo_Deploy_Zone_2 = CARGO_ZONE:New( 'Deploy Zone 2', 'DE Communication Center 4' ):WhiteFlare() + + -- Assign the Pickup Task + local DeployTask = DEPLOYTASK:New( 'Engineers' ) + DeployTask:ToZone( Cargo_Deploy_Zone_1 ) + DeployTask:ToZone( Cargo_Deploy_Zone_2 ) + DeployTask:SetGoalTotal( 3 ) + Mission:AddTask( DeployTask, 2 ) + + MISSIONSCHEDULER.AddMission( Mission ) +end + +do + local Mission = MISSION:New( 'Deliver secret letter', 'Operational', 'Pickup letter to the commander.', 'NATO' ) + + Mission:AddClient( CLIENT:New( 'BE Package Test 1' ):Transport() ) + Mission:AddClient( CLIENT:New( 'BE Package Test 2' ):Transport() ) + Mission:AddClient( CLIENT:New( 'DE Pickup Test 1' ):Transport() ) + Mission:AddClient( CLIENT:New( 'DE Pickup Test 2' ):Transport() ) + + Package_Pickup_Zone = CARGO_ZONE:New( 'Package Pickup Zone', 'DE Guard' ):GreenSmoke() + + Cargo_Package = CARGO_PACKAGE:New( 'Letter', 'Letter to Command', 0.1, 'DE Guard' ) + --Cargo_Goods = CARGO_STATIC:New( 'Goods', 20, 'Goods', 'Pickup Zone Goods', 'DE Collection Point' ) + --Cargo_SlingLoad = CARGO_SLING:New( 'Basket', 40, 'Basket', 'Pickup Zone Sling Load', 'DE Cargo Guard' ) + + + -- Assign the Pickup Task + local PickupTask = PICKUPTASK:New( 'Letter', CLIENT.ONBOARDSIDE.FRONT ) + PickupTask:FromZone( Package_Pickup_Zone ) + PickupTask:InitCargo( { Cargo_Package } ) + PickupTask:SetGoalTotal( 1 ) + Mission:AddTask( PickupTask, 1 ) + + + Package_Deploy_Zone = CARGO_ZONE:New( 'Package Deploy Zone', 'DE Secret Car' ):GreenFlare() + + -- Assign the Pickup Task + local DeployTask = DEPLOYTASK:New( 'Letter' ) + DeployTask:ToZone( Package_Deploy_Zone ) + DeployTask:SetGoalTotal( 1 ) + Mission:AddTask( DeployTask, 2 ) + + MISSIONSCHEDULER.AddMission( Mission ) +end + +do + local Mission = MISSION:New( 'Sling load Cargo', 'Operational', 'Sling Load Cargo to Deploy Zone.', 'NATO' ) + + Mission:AddClient( CLIENT:New( 'Sling Load Test Client 1' ):Transport() ) + Mission:AddClient( CLIENT:New( 'Sling Load Test Client 2' ):Transport() ) + + Sling_Load_Pickup_Zone = CARGO_ZONE:New( 'Sling Load Pickup Zone', 'Sling Load Guard' ):RedSmoke() + + Cargo_Sling_Load = CARGO_SLINGLOAD:New( 'Sling', 'Food Boxes', 200, 'Sling Load Pickup Zone', 'Sling Load Guard', country.id.USA ) + --Cargo_Goods = CARGO_STATIC:New( 'Goods', 20, 'Goods', 'Pickup Zone Goods', 'DE Collection Point' ) + --Cargo_SlingLoad = CARGO_SLING:New( 'Basket', 40, 'Basket', 'Pickup Zone Sling Load', 'DE Cargo Guard' ) + + + -- Assign the Pickup Task + local PickupTask = PICKUPTASK:New( 'Sling', CLIENT.ONBOARDSIDE.FRONT ) + PickupTask:FromZone( Sling_Load_Pickup_Zone ) + PickupTask:InitCargo( { Cargo_Sling_Load } ) + PickupTask:SetGoalTotal( 1 ) + Mission:AddTask( PickupTask, 1 ) + + MISSIONSCHEDULER.AddMission( Mission ) +end + + + +-- MISSION SCHEDULER STARTUP +MISSIONSCHEDULER.Start() +MISSIONSCHEDULER.ReportMenu() +MISSIONSCHEDULER.ReportMissionsHide() + +env.info( "Test Mission loaded" ) diff --git a/Test Missions/MOOSE_Pickup_Test.miz b/Test Missions/MOOSE_Pickup_Test.miz new file mode 100644 index 000000000..b200f5ef2 Binary files /dev/null and b/Test Missions/MOOSE_Pickup_Test.miz differ diff --git a/Test Missions/MOOSE_Spawn_Test.lua b/Test Missions/MOOSE_Spawn_Test.lua new file mode 100644 index 000000000..e0ef01e5b --- /dev/null +++ b/Test Missions/MOOSE_Spawn_Test.lua @@ -0,0 +1,15 @@ +Include.File( "Spawn" ) + +SpawnTest = SPAWN:New( 'TEST' ):Schedule( 1, 1, 15, 0.4 ):Repeat() + +SpawnTestPlane = SPAWN:New( 'TESTPLANE' ):Schedule( 1, 1, 15, 0.4 ):RepeatOnLanding() + +SpawnTestShipPlane = SPAWN:New( 'SHIPPLANE' ):Schedule( 1, 1, 15, 0.4 ):RepeatOnLanding() + +SpawnTestShipHeli = SPAWN:New( 'SHIPHELI' ):Schedule( 1, 1, 15, 0.4 ):RepeatOnLanding() + +SpawnCH53E = SPAWN:New( 'VEHICLE' ) + + +SpawnTestHelicopterCleanUp = SPAWN:New( "TEST_HELI_CLEANUP" ):Limit( 3, 100 ):Schedule( 10, 0 ):RandomizeRoute( 1, 1, 1000 ):CleanUp( 180 ) +SpawnTestVehiclesCleanUp = SPAWN:New( "TEST_AAA_CLEANUP" ):Limit( 3, 100 ):Schedule( 10, 0 ):RandomizeRoute( 1, 1, 1000 ) \ No newline at end of file diff --git a/Test Missions/MOOSE_Spawn_Test.miz b/Test Missions/MOOSE_Spawn_Test.miz new file mode 100644 index 000000000..fc2b4022b Binary files /dev/null and b/Test Missions/MOOSE_Spawn_Test.miz differ