- Improved behaviour of OPSTRANSPORT when cargo or carrier is on mission.
This commit is contained in:
Frank 2021-10-25 22:17:56 +02:00
parent 6009432933
commit 02b0ba2278
2 changed files with 42 additions and 48 deletions

View File

@ -137,6 +137,7 @@
-- @field #number missionRange Mission range in meters. Used by LEGION classes (AIRWING, BRIGADE, ...). -- @field #number missionRange Mission range in meters. Used by LEGION classes (AIRWING, BRIGADE, ...).
-- @field Core.Point#COORDINATE missionWaypointCoord Mission waypoint coordinate. -- @field Core.Point#COORDINATE missionWaypointCoord Mission waypoint coordinate.
-- @field Core.Point#COORDINATE missionEgressCoord Mission egress waypoint coordinate. -- @field Core.Point#COORDINATE missionEgressCoord Mission egress waypoint coordinate.
-- @field #number missionWaypointRadius Random radius in meters.
-- --
-- @field #table enrouteTasks Mission enroute tasks. -- @field #table enrouteTasks Mission enroute tasks.
-- --
@ -4415,6 +4416,15 @@ function AUFTRAG:SetMissionWaypointCoord(Coordinate)
return self return self
end end
--- Set randomization of the mission waypoint coordinate. Each assigned group will get a random ingress coordinate, where the mission is executed.
-- @param #AUFTRAG self
-- @param #number Radius Distance in meters. Default `#nil`.
-- @return #AUFTRAG self
function AUFTRAG:SetMissionWaypointRandomization(Radius)
self.missionWaypointRadius=Radius
return self
end
--- Set the mission egress coordinate. This is the coordinate where the assigned group will go once the mission is finished. --- Set the mission egress coordinate. This is the coordinate where the assigned group will go once the mission is finished.
-- @param #AUFTRAG self -- @param #AUFTRAG self
-- @param Core.Point#COORDINATE Coordinate Egrees coordinate. -- @param Core.Point#COORDINATE Coordinate Egrees coordinate.

View File

@ -4134,6 +4134,13 @@ function OPSGROUP:GetMissionCurrent()
return self:GetMissionByID(self.currentmission) return self:GetMissionByID(self.currentmission)
end end
--- Check if group is currently on a mission.
-- @param #OPSGROUP self
-- @return #boolean If `true`, group is currently on a mission
function OPSGROUP:IsOnMission()
return self.currentmission~=nil
end
--- On before "MissionStart" event. --- On before "MissionStart" event.
-- @param #OPSGROUP self -- @param #OPSGROUP self
-- @param #string From From state. -- @param #string From From state.
@ -4477,8 +4484,8 @@ function OPSGROUP:RouteToMission(mission, delay)
local waypointcoord=nil --Core.Point#COORDINATE local waypointcoord=nil --Core.Point#COORDINATE
-- Random radius of 1000 meters. -- Random radius of 1000 meters.
local randomradius=1000 local randomradius=mission.missionWaypointRadius or 1000
-- Surface types. -- Surface types.
local surfacetypes=nil local surfacetypes=nil
if self:IsArmygroup() then if self:IsArmygroup() then
@ -4491,6 +4498,8 @@ function OPSGROUP:RouteToMission(mission, delay)
if mission.type==AUFTRAG.Type.PATROLZONE or mission.type==AUFTRAG.Type.BARRAGE then if mission.type==AUFTRAG.Type.PATROLZONE or mission.type==AUFTRAG.Type.BARRAGE then
local zone=mission.engageTarget:GetObject() --Core.Zone#ZONE local zone=mission.engageTarget:GetObject() --Core.Zone#ZONE
waypointcoord=zone:GetRandomCoordinate(nil , nil, surfacetypes) waypointcoord=zone:GetRandomCoordinate(nil , nil, surfacetypes)
elseif mission.type==AUFTRAG.Type.ONGUARD then
waypointcoord=mission:GetMissionWaypointCoord(self.group, nil, surfacetypes)
else else
waypointcoord=mission:GetMissionWaypointCoord(self.group, randomradius, surfacetypes) waypointcoord=mission:GetMissionWaypointCoord(self.group, randomradius, surfacetypes)
end end
@ -6175,7 +6184,7 @@ function OPSGROUP:_CheckCargoTransport()
end end
-- Check if there is anything in the queue. -- Check if there is anything in the queue.
if not self.cargoTransport then if not self.cargoTransport and not self:IsOnMission() then
self.cargoTransport=self:_GetNextCargoTransport() self.cargoTransport=self:_GetNextCargoTransport()
if self.cargoTransport and not self:IsActive() then if self.cargoTransport and not self:IsActive() then
self:Activate() self:Activate()
@ -7156,13 +7165,21 @@ function OPSGROUP:onafterLoading(From, Event, To)
-- Loading time stamp. -- Loading time stamp.
self.Tloading=timer.getAbsTime() self.Tloading=timer.getAbsTime()
-- Cargo group table. -- Get valid cargos of the TZC.
--local cargos=self.cargoTZC.Cargos
local cargos={} local cargos={}
for _,_cargo in pairs(self.cargoTZC.Cargos) do for _,_cargo in pairs(self.cargoTZC.Cargos) do
local cargo=_cargo --Ops.OpsGroup#OPSGROUP.CargoGroup local cargo=_cargo --Ops.OpsGroup#OPSGROUP.CargoGroup
if self:CanCargo(cargo.opsgroup) and (not (cargo.delivered or cargo.opsgroup:IsDead())) then
local isCarrier=cargo.opsgroup:IsPickingup() or cargo.opsgroup:IsLoading() or cargo.opsgroup:IsTransporting() or cargo.opsgroup:IsUnloading()
local isOnMission=cargo.opsgroup:IsOnMission()
-- Check if cargo is in embark/pickup zone.
-- Added InUtero here, if embark zone is moving (ship) and cargo has been spawned late activated and its position is not updated. Not sure if that breaks something else!
local inzone=cargo.opsgroup:IsInZone(self.cargoTZC.EmbarkZone) --or cargo.opsgroup:IsInUtero()
-- TODO: Need a better :IsBusy() function or :IsReadyForMission() :IsReadyForBoarding() :IsReadyForTransport()
if self:CanCargo(cargo.opsgroup) and inzone and cargo.opsgroup:IsNotCargo(true) and (not (cargo.delivered or cargo.opsgroup:IsDead() or isCarrier or isOnMission)) then
table.insert(cargos, cargo) table.insert(cargos, cargo)
end end
end end
@ -7179,53 +7196,20 @@ function OPSGROUP:onafterLoading(From, Event, To)
for _,_cargo in pairs(cargos) do for _,_cargo in pairs(cargos) do
local cargo=_cargo --#OPSGROUP.CargoGroup local cargo=_cargo --#OPSGROUP.CargoGroup
-- Check that cargo weight is -- Find a carrier for this cargo.
if self:CanCargo(cargo.opsgroup) and (not (cargo.delivered or cargo.opsgroup:IsDead())) then local carrier=self:FindCarrierForCargo(cargo.opsgroup)
-- Check if cargo is currently acting as carrier.
local isCarrier=cargo.opsgroup:IsPickingup() or cargo.opsgroup:IsLoading() or cargo.opsgroup:IsTransporting() or cargo.opsgroup:IsUnloading()
-- Check that group is NOT cargo and NOT acting as carrier already if carrier then
-- TODO: Need a better :IsBusy() function or :IsReadyForMission() :IsReadyForBoarding() :IsReadyForTransport()
if cargo.opsgroup:IsNotCargo(true) and not isCarrier then
-- Check if cargo is in embark/pickup zone. -- Set cargo status.
-- Added InUtero here, if embark zone is moving (ship) and cargo has been spawned late activated and its position is not updated. Not sure if that breaks something else! cargo.opsgroup:_NewCargoStatus(OPSGROUP.CargoStatus.ASSIGNED)
local inzone=cargo.opsgroup:IsInZone(self.cargoTZC.EmbarkZone) --or cargo.opsgroup:IsInUtero()
-- Cargo MUST be inside zone or it will not be loaded! -- Order cargo group to board the carrier.
if inzone then cargo.opsgroup:Board(self, carrier)
-- Find a carrier for this cargo.
local carrier=self:FindCarrierForCargo(cargo.opsgroup)
if carrier then
-- Set cargo status.
cargo.opsgroup:_NewCargoStatus(OPSGROUP.CargoStatus.ASSIGNED)
-- Order cargo group to board the carrier.
cargo.opsgroup:Board(self, carrier)
else
-- Debug info.
self:T(self.lid..string.format("Cannot board carrier! Group %s is NOT (yet) in zone %s", cargo.opsgroup:GetName(), self.cargoTZC.EmbarkZone:GetName()))
end
else
-- Debug info.
self:T(self.lid..string.format("Cargo %s NOT in embark zone %s (and not InUTERO)", cargo.opsgroup:GetName(), self.cargoTZC.EmbarkZone:GetName()))
end
end
else
-- Debug info.
self:T3(self.lid.."Cargo already delivered, is dead or carrier cannot")
end end
end end
end end
--- Set (new) cargo status. --- Set (new) cargo status.