OPS Transport

This commit is contained in:
Frank 2021-07-24 01:06:44 +02:00
parent 4ffdf9e536
commit 65e852f341
2 changed files with 78 additions and 7 deletions

View File

@ -3149,8 +3149,9 @@ end
--- Get coordinate of target. First unit/group of the set is used.
-- @param #AUFTRAG self
-- @param Wrapper.Group#GROUP group Group.
-- @param #number randomradius Random radius in meters.
-- @return Core.Point#COORDINATE Coordinate where the mission is executed.
function AUFTRAG:GetMissionWaypointCoord(group)
function AUFTRAG:GetMissionWaypointCoord(group, randomradius)
-- Check if a coord has been explicitly set.
if self.missionWaypointCoord then
@ -3166,7 +3167,9 @@ function AUFTRAG:GetMissionWaypointCoord(group)
local alt=waypointcoord.y
-- Add some randomization.
waypointcoord=ZONE_RADIUS:New("Temp", waypointcoord:GetVec2(), 1000):GetRandomCoordinate():SetAltitude(alt, false)
if randomradius then
waypointcoord=ZONE_RADIUS:New("Temp", waypointcoord:GetVec2(), randomradius):GetRandomCoordinate():SetAltitude(alt, false)
end
-- Set altitude of mission waypoint.
if self.missionAltitude then

View File

@ -3009,6 +3009,7 @@ function OPSGROUP:onafterTaskExecute(From, Event, To, Task)
-- Parameters.
local zone=Task.dcstask.params.zone --Core.Zone#ZONE
local Coordinate=zone:GetRandomCoordinate()
Coordinate:MarkToAll("Random Patrol Zone Coordinate")
local Speed=UTILS.KmphToKnots(Task.dcstask.params.speed or self.speedCruise)
local Altitude=Task.dcstask.params.altitude and UTILS.MetersToFeet(Task.dcstask.params.altitude) or nil
@ -3695,15 +3696,21 @@ function OPSGROUP:RouteToMission(mission, delay)
self:ScheduleOnce(delay, OPSGROUP.RouteToMission, self, mission)
else
if self:IsDead() then
if self:IsDead() or self:IsStopped() then
return
end
-- ID of current waypoint.
local uid=self:GetWaypointCurrent().uid
-- Random radius.
local randomradius=1000
if mission.type==AUFTRAG.Type.PATROLZONE then
randomradius=nil
end
-- Get coordinate where the mission is executed.
local waypointcoord=mission:GetMissionWaypointCoord(self.group)
local waypointcoord=mission:GetMissionWaypointCoord(self.group, randomradius)
-- Add enroute tasks.
for _,task in pairs(mission.enrouteTasks) do
@ -5423,6 +5430,39 @@ function OPSGROUP:_CheckDelivered(CargoTransport)
return done
end
--- Check if all cargo of this transport assignment was delivered.
-- @param #OPSGROUP self
-- @param Ops.OpsTransport#OPSTRANSPORT CargoTransport The next due cargo transport or `nil`.
-- @return #boolean If true, all cargo was delivered.
function OPSGROUP:_CheckGoPickup(CargoTransport)
local done=true
for _,_cargo in pairs(CargoTransport.cargos) do
local cargo=_cargo --Ops.OpsGroup#OPSGROUP.CargoGroup
if self:CanCargo(cargo.opsgroup) then
if cargo.delivered then
-- This one is delivered.
elseif cargo.opsgroup==nil or cargo.opsgroup:IsDead() or cargo.opsgroup:IsStopped() then
-- This one is dead.
elseif cargo.opsgroup:IsLoaded() then
-- This one is loaded into a(nother) carrier.
else
done=false --Someone is not done!
end
end
end
-- Debug info.
self:T(self.lid..string.format("Cargotransport UID=%d Status=%s: delivered=%s", CargoTransport.uid, CargoTransport:GetState(), tostring(done)))
return done
end
--- Create a cargo transport assignment.
-- @param #OPSGROUP self
-- @param Ops.OpsTransport#OPSTRANSPORT OpsTransport The troop transport assignment.
@ -5517,6 +5557,32 @@ function OPSGROUP:GetFreeCargobay(UnitName, IncludeReserved)
return Free
end
--- Get relative free cargo bay in percent.
-- @param #OPSGROUP self
-- @param #string UnitName Name of the unit. Default is of the whole group.
-- @param #boolean IncludeReserved If `false`, cargo weight that is only *reserved* is **not** counted. By default (`true` or `nil`), the reserved cargo is included.
-- @return #number Free cargo bay in percent.
function OPSGROUP:GetFreeCargobayRelative(UnitName, IncludeReserved)
local free=self:GetFreeCargobay(UnitName, IncludeReserved)
local total=self:GetWeightCargoMax(UnitName)
local percent=free/total*100
return percent
end
--- Get relative used (loaded) cargo bay in percent.
-- @param #OPSGROUP self
-- @param #string UnitName Name of the unit. Default is of the whole group.
-- @param #boolean IncludeReserved If `false`, cargo weight that is only *reserved* is **not** counted. By default (`true` or `nil`), the reserved cargo is included.
-- @return #number Used cargo bay in percent.
function OPSGROUP:GetUsedCargobayRelative(UnitName, IncludeReserved)
local free=self:GetFreeCargobayRelative(UnitName, IncludeReserved)
return 100-free
end
--- Get max weight of cargo (group) this group can load. This is the largest free cargo bay of any (not dead) element of the group.
-- Optionally, you can calculate the current max weight possible, which accounts for currently loaded cargo.
-- @param #OPSGROUP self
@ -6563,7 +6629,7 @@ function OPSGROUP:onafterUnloaded(From, Event, To)
end
-- Check everything was delivered (or is dead).
local delivered=self:_CheckDelivered(self.cargoTransport)
local delivered=self:_CheckGoPickup(self.cargoTransport)
if not delivered then
@ -9295,9 +9361,11 @@ end
-- @return #OPSGROUP self
function OPSGROUP:_SetTemplate(Template)
-- Set the template.
self.template=Template or self.group:GetTemplate()
self:I(self.lid.."Setting group template")
-- Debug info.
self:T3(self.lid.."Setting group template")
return self
end