This commit is contained in:
Frank 2021-01-30 21:29:29 +01:00
parent 242462b9ba
commit bcf8973eed
3 changed files with 123 additions and 48 deletions

View File

@ -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))

View File

@ -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 distance<targetdist then
env.info("FF 400")
-- Check type attribute.
local righttype=false
for _,attribute in pairs(self.engagedetectedTypes) do
local gotit=group:HasAttribute(attribute, false)
--self:I(self.lid..string.format("Group %s has attribute %s = %s", group:GetName(), attribute, tostring(gotit)))
self:I(self.lid..string.format("Group %s has attribute %s = %s", group:GetName(), attribute, tostring(gotit)))
if gotit then
righttype=true
break
@ -1085,7 +1092,7 @@ function FLIGHTGROUP:onafterStatus(From, Event, To)
-- If we found a group, we engage it.
if targetgroup then
--self:I(self.lid..string.format("Engaging target group %s at distance %d meters", targetgroup:GetName(), targetdist))
self:I(self.lid..string.format("Engaging target group %s at distance %d meters", targetgroup:GetName(), targetdist))
self:EngageTarget(targetgroup)
end
@ -1871,7 +1878,7 @@ function FLIGHTGROUP:onafterUpdateRoute(From, Event, To, n)
if #wp>1 then
-- Route group to all defined waypoints remaining.
self:Route(wp, 1)
self:Route(wp)
else

View File

@ -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)