diff --git a/Moose Development/Moose/Ops/ArmyGroup.lua b/Moose Development/Moose/Ops/ArmyGroup.lua index 78d060050..95a622aa5 100644 --- a/Moose Development/Moose/Ops/ArmyGroup.lua +++ b/Moose Development/Moose/Ops/ArmyGroup.lua @@ -353,10 +353,10 @@ end function ARMYGROUP:onbeforeStatus(From, Event, To) if self:IsDead() then - self:T(self.lid..string.format("Onbefore Status DEAD ==> false")) + self:I(self.lid..string.format("Onbefore Status DEAD ==> false")) return false elseif self:IsStopped() then - self:T(self.lid..string.format("Onbefore Status STOPPED ==> false")) + self:I(self.lid..string.format("Onbefore Status STOPPED ==> false")) return false end @@ -476,7 +476,7 @@ function ARMYGROUP:onafterStatus(From, Event, To) --- if self.cargoTransport then - + local text=string.format("Cargo: %s %s --> %s", self.carrierStatus, self.cargoTransport.pickupzone:GetName(), self.cargoTransport.deployzone:GetName()) for _,_cargo in pairs(self.cargoTransport.cargos) do @@ -484,19 +484,57 @@ function ARMYGROUP:onafterStatus(From, Event, To) local name=cargo.opsgroup:GetName() local gstatus=cargo.opsgroup:GetState() local cstatus=cargo.opsgroup.cargoStatus - text=text..string.format("\n- %s [%s]: %s", name, gstatus, cstatus) - - if self:IsPickingup() then - - elseif self:IsLoading() then - - elseif self:IsLoaded() then - - end - + text=text..string.format("\n- %s [%s]: %s", name, gstatus, cstatus) end - self:I(self.lid..text) + self:I(self.lid..text) + + + if self:IsNotCarrier() then + + env.info("FF not carrier ==> pickup") + + -- Initiate the cargo transport process. + self:Pickup(self.cargoTransport.pickupzone) + + elseif self:IsPickingup() then + + env.info("FF picking up") + + elseif self:IsLoading() then + + env.info("FF loading") + + local boarding=false + for _,_cargo in pairs(self.cargoTransport.cargos) do + local cargo=_cargo --Ops.OpsGroup#OPSGROUP.CargoGroup + + if cargo.opsgroup.carrierGroup:GetName()==self:GetName() and cargo.opsgroup.cargoStatus==OPSGROUP.CargoStatus.BOARDING then + boarding=true + end + + end + + -- Boarding finished ==> Transport cargo. + if not boarding then + env.info("FF boarding finished ==> Loaded") + self:Loaded() + end + + elseif self:IsLoaded() then + + env.info("FF loaded") + + elseif self:IsTransporting() then + + env.info("FF transporting") + + elseif self:IsUnloading() then + + env.info("FF unloading") + + end + end @@ -1190,7 +1228,7 @@ function ARMYGROUP:_InitGroup() self.actype=units[1]:GetTypeName() -- Debug info. - if self.verbose>=1 then + if self.verbose>=0 then local text=string.format("Initialized Army Group %s:\n", self.groupname) text=text..string.format("Unit type = %s\n", self.actype) text=text..string.format("Speed max = %.1f Knots\n", UTILS.KmphToKnots(self.speedMax)) diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index b4bc02f7f..0fd9130d6 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -1010,6 +1010,7 @@ function FLIGHTGROUP:onafterStatus(From, Event, To) -- Engage Detected Targets --- if self:IsAirborne() and self.detectionOn and self.engagedetectedOn and not (self.fuellow or self.fuelcritical) then + env.info("FF 100") -- Target. local targetgroup=nil --Wrapper.Group#GROUP @@ -1019,8 +1020,12 @@ function FLIGHTGROUP:onafterStatus(From, Event, To) for _,_group in pairs(self.detectedgroups:GetSet()) do local group=_group --Wrapper.Group#GROUP + env.info("FF 200") + if group and group:IsAlive() then + env.info("FF 300") + -- Get 3D vector of target. local targetVec3=group:GetVec3() @@ -1029,11 +1034,13 @@ function FLIGHTGROUP:onafterStatus(From, Event, To) if distance<=self.engagedetectedRmax and distance1 then -- Route group to all defined waypoints remaining. - self:Route(wp, 1) + self:Route(wp) else diff --git a/Moose Development/Moose/Ops/OpsGroup.lua b/Moose Development/Moose/Ops/OpsGroup.lua index 366bbc5ff..9341875a9 100644 --- a/Moose Development/Moose/Ops/OpsGroup.lua +++ b/Moose Development/Moose/Ops/OpsGroup.lua @@ -362,17 +362,21 @@ OPSGROUP.TaskType={ --- Cargo Carrier status. -- @type OPSGROUP.CarrierStatus +-- @field #string NOTCARRIER This group is not a carrier yet. -- @field #string EMPTY Carrier is empty and ready for cargo transport. -- @field #string PICKUP Carrier is on its way to pickup cargo. -- @field #string LOADING Carrier is loading cargo. -- @field #string LOADED Carrier has loaded cargo. -- @field #string TRANSPORTING Carrier is transporting cargo. +-- @field #string UNLOADING Carrier is unloading cargo. OPSGROUP.CarrierStatus={ + NOTCARRIER="not carrier", EMPTY="empty", PICKUP="pickup", LOADING="loading", LOADED="loaded", TRANSPORTING="transporting", + UNLOADING="unloading", } --- Cargo status. @@ -468,7 +472,7 @@ function OPSGROUP:New(group) self.spot.Coordinate=COORDINATE:New(0, 0, 0) self:SetLaser(1688, true, false, 0.5) self.cargoStatus=OPSGROUP.CargoStatus.NOTCARGO - self.carrierStatus=OPSGROUP.CarrierStatus.EMPTY + self.carrierStatus=OPSGROUP.CarrierStatus.NOTCARRIER -- Init task counter. self.taskcurrent=0 @@ -1519,6 +1523,13 @@ function OPSGROUP:IsEngaging() return self:is("Engaging") end +--- Check if the group is not a carrier yet. +-- @param #OPSGROUP self +-- @return #boolean If true, group is not a carrier. +function OPSGROUP:IsNotCarrier() + return self.carrierStatus==OPSGROUP.CarrierStatus.NOTCARRIER +end + --- Check if the group is picking up cargo. -- @param #OPSGROUP self -- @return #boolean If true, group is picking up. @@ -1548,7 +1559,12 @@ function OPSGROUP:IsTransporting() return self.carrierStatus==OPSGROUP.CarrierStatus.TRANSPORTING end - +--- Check if the group is unloading cargo. +-- @param #OPSGROUP self +-- @return #boolean If true, group is unloading. +function OPSGROUP:IsUnloading() + return self.carrierStatus==OPSGROUP.CarrierStatus.UNLOADING +end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- Waypoint Functions @@ -4556,22 +4572,16 @@ end -- @param #string From From state. -- @param #string Event Event. -- @param #string To To state. --- @param #OPSGROUP.CargoTransport CargoTransport Cargo transport assignment. -function OPSGROUP:onafterPickup(From, Event, To, CargoTransport) +-- @param Core.Zone#ZONE Zone Pickup zone. +function OPSGROUP:onafterPickup(From, Event, To, Zone) env.info("FF pickup") -- Set carrier status. self.carrierStatus=OPSGROUP.CarrierStatus.PICKUP - - local Zone=CargoTransport.pickupzone local inzone=Zone:IsCoordinateInZone(self:GetCoordinate()) - - self.cargoTransport=CargoTransport - - - + if inzone then -- We are already in the pickup zone ==> initiate loading. @@ -4594,16 +4604,12 @@ end -- @param #string From From state. -- @param #string Event Event. -- @param #string To To state. --- @param #OPSGROUP.CargoTransport CargoTransport Cargo transport assignment. -function OPSGROUP:onafterLoading(From, Event, To, CargoTransport) +function OPSGROUP:onafterLoading(From, Event, To) env.info("FF loading") -- Set carrier status. self.carrierStatus=OPSGROUP.CarrierStatus.LOADING - - CargoTransport=CargoTransport or self.cargoTransport - --- Find a carrier which can load a given weight. local function _findCarrier(weight) local carrier=nil --#OPSGROUP.Element @@ -4622,7 +4628,7 @@ function OPSGROUP:onafterLoading(From, Event, To, CargoTransport) end - for _,_cargo in pairs(CargoTransport.cargos) do + for _,_cargo in pairs(self.cargoTransport.cargos) do local cargo=_cargo --#OPSGROUP.CargoGroup local weight=cargo.opsgroup:GetWeightTotal() @@ -4631,6 +4637,9 @@ function OPSGROUP:onafterLoading(From, Event, To, CargoTransport) if carrier then + -- Set cargo status. + cargo.opsgroup.cargoStatus=OPSGROUP.CargoStatus.ASSIGNED + -- Order cargo group to board the carrier. env.info("FF order group to board carrier") cargo.opsgroup:Board(self, carrier) @@ -4664,13 +4673,13 @@ function OPSGROUP:onafterLoad(From, Event, To, CargoGroup) carrier.weightCargo=carrier.weightCargo+weight -- This function is only really used for aircraft and sets the total internal cargo weight. - trigger.action.setUnitInternalCargo(carrier.name, carrier.weightCargo) --https://wiki.hoggitworld.com/view/DCS_func_setUnitInternalCargo + --trigger.action.setUnitInternalCargo(carrier.name, carrier.weightCargo) --https://wiki.hoggitworld.com/view/DCS_func_setUnitInternalCargo -- Embark ==> Loaded CargoGroup:Embark(carrier) - env.info("FF carrier loaded (todo)") - self:Loaded() + --env.info("FF carrier loaded (todo)") + --self:Loaded() else self:E(self.lid.."ERROR: Cargo has no carrier on Load event!") @@ -4734,21 +4743,27 @@ end -- @param Core.Zone#ZONE Zone Deploy zone. function OPSGROUP:onafterDeploy(From, Event, To, Zone) env.info("FF deploy at zone ".. (Zone and Zone:GetName() or "Not given!")) + + self.carrierStatus=OPSGROUP.CarrierStatus.UNLOADING - for _,_cargo in pairs(self.cargo) do + for _,_cargo in pairs(self.cargoTransport.cargos) do local cargo=_cargo --#OPSGROUP.CargoGroup - local zone=Zone or cargo.deployzone + env.info("FF deploy cargo "..cargo.opsgroup:GetName()) + + local zone=Zone or cargo.deployzone --Core.Zone#ZONE - if zone:IsCoordinateInZone(self:GetCoordinate()) then + --if zone:IsCoordinateInZone(self:GetCoordinate()) then local Coordinate=zone:GetRandomCoordinate() local Heading=math.random(0,359) -- Unload. - self:Unload(cargo.opsgroup, Coordinate, Heading) + env.info("FF unload cargo "..cargo.opsgroup:GetName()) + cargo.opsgroup:Unboard(Coordinate, Heading) + --self:Unload(cargo.opsgroup, Coordinate, Heading) - end + --end end @@ -4792,8 +4807,15 @@ function OPSGROUP:onafterBoard(From, Event, To, CarrierGroup, Carrier) self.carrier=Carrier self.carrierGroup=CarrierGroup + -- Add to current cargo of carrier. + --CarrierGroup:_AddCargoGroup(self) + + --TODO: make cargo run to carrier + --TODO: check if cargo is mobile. if not ==> load + --TODO: check if cargo is alive=true. if only exists ==> load. + -- Trigger embark event. - self.carrierGroup:Load(self) + self.carrierGroup:__Load(10, self) end @@ -4827,11 +4849,12 @@ end function OPSGROUP:onafterUnboard(From, Event, To, Coordinate, Heading) env.info("FF Unboard") - -- Set cargo status. - self.cargoStatus=OPSGROUP.CargoStatus.DELIVERED - -- Template for the respawned group. local Template=UTILS.DeepCopy(self.template) + + env.info("FF template") + self:I({template=Template}) + self:I({template=self.template}) -- Loop over template units. for _,Unit in pairs(Template.units) do @@ -4866,7 +4889,14 @@ function OPSGROUP:onafterUnboard(From, Event, To, Coordinate, Heading) self.carrier.weightCargo=self.carrier.weightCargo-element.weight end -- This function is only really used for aircraft and sets the total internal cargo weight. - trigger.action.setUnitInternalCargo(self.carrier.name, self.carrier.weightCargo) --https://wiki.hoggitworld.com/view/DCS_func_setUnitInternalCargo + if self.isFlightgroup then + trigger.action.setUnitInternalCargo(self.carrier.name, self.carrier.weightCargo) --https://wiki.hoggitworld.com/view/DCS_func_setUnitInternalCargo + end + + -- Set cargo status. + self.cargoStatus=OPSGROUP.CargoStatus.NOTCARGO + self.carrier=nil + self.carrierGroup=nil -- Respawn group. self:_Respawn(0, Template)