This commit is contained in:
Frank 2020-09-18 18:07:10 +02:00
parent 29d694722b
commit d497bb25f3
4 changed files with 110 additions and 6 deletions

View File

@ -389,7 +389,7 @@ do -- COORDINATE
-- @return #boolean True if units were found.
-- @return #boolean True if statics were found.
-- @return #boolean True if scenery objects were found.
-- @return #table Table of MOOSE @[#Wrapper.Unit#UNIT} objects found.
-- @return #table Table of MOOSE @{Wrapper.Unit#UNIT} objects found.
-- @return #table Table of DCS static objects found.
-- @return #table Table of DCS scenery objects found.
function COORDINATE:ScanObjects(radius, scanunits, scanstatics, scanscenery)
@ -477,7 +477,7 @@ do -- COORDINATE
end
for _,scenery in pairs(Scenery) do
self:T(string.format("Scan found scenery %s typename=%s", scenery:getName(), scenery:getTypeName()))
SCENERY:Register(scenery:getName(), scenery)
--SCENERY:Register(scenery:getName(), scenery)
end
return gotunits, gotstatics, gotscenery, Units, Statics, Scenery
@ -523,6 +523,50 @@ do -- COORDINATE
return umin
end
--- Scan/find SCENERY objects within a certain radius around the coordinate using the world.searchObjects() DCS API function.
-- @param #COORDINATE self
-- @param #number radius (Optional) Scan radius in meters. Default 100 m.
-- @return table Set of scenery objects.
function COORDINATE:ScanScenery(radius)
local _,_,_,_,_,scenerys=self:ScanObjects(radius, false, false, true)
local set={}
for _,_scenery in pairs(scenerys) do
local scenery=_scenery --DCS#Object
local name=scenery:getName()
local s=SCENERY:Register(name, scenery)
table.insert(set, s)
end
return set
end
--- Find the closest scenery to the COORDINATE within a certain radius.
-- @param #COORDINATE self
-- @param #number radius Scan radius in meters. Default 100 m.
-- @return Wrapper.Scenery#SCENERY The closest scenery or #nil if no object is inside the given radius.
function COORDINATE:FindClosestScenery(radius)
local sceneries=self:ScanScenery(radius)
local umin=nil --Wrapper.Scenery#SCENERY
local dmin=math.huge
for _,_scenery in pairs(sceneries) do
local scenery=_scenery --Wrapper.Scenery#SCENERY
local coordinate=scenery:GetCoordinate()
local d=self:Get2DDistance(coordinate)
if d<dmin then
dmin=d
umin=scenery
end
end
return umin
end
--- Calculate the distance from a reference @{#COORDINATE}.
-- @param #COORDINATE self

View File

@ -2795,7 +2795,15 @@ function AUFTRAG:_TargetFromObject(Object)
if not self.engageTarget then
self.engageTarget=TARGET:New(Object)
if Object:IsInstanceOf("TARGET") then
self.engageTarget=Object
else
self.engageTarget=TARGET:New(Object)
end
else

View File

@ -3543,7 +3543,7 @@ end
--- Set the default ROT for the group. This is the ROT state gets when the group is spawned or to which it defaults back after a mission.
-- @param #OPSGROUP self
-- @param #number rot ROT of group. Default is ENUMS.ROT.PassiveDefense.
-- @param #number rot ROT of group. Default is `ENUMS.ROT.PassiveDefense`.
-- @return #OPSGROUP self
function OPSGROUP:SetDefaultROT(rot)
self.optionDefault.ROT=rot or ENUMS.ROT.PassiveDefense

View File

@ -58,14 +58,17 @@ TARGET = {
--- Type.
-- @type TARGET.ObjectType
-- @field #string GROUP Target is a GROUP object.
-- @field #string UNIT Target is a UNIT object.
-- @field #string STATIC Target is a STATIC object.
-- @field #string SCENERY Target is a SCENERY object.
-- @field #string COORDINATE Target is a COORDINATE.
-- @field #string AIRBASE Target is an AIRBASE.
TARGET.ObjectType={
GROUP="Group",
UNIT="Unit",
STATIC="Static",
SCENERY="Scenery",
COORDINATE="Coordinate",
AIRBASE="Airbase",
}
@ -492,6 +495,19 @@ function TARGET:_AddObject(Object)
self.Ntargets0=self.Ntargets0+1
end
elseif Object:IsInstanceOf("SCENERY") then
local scenery=Object --Wrapper.Scenery#SCENERY
target.Type=TARGET.ObjectType.SCENERY
target.Name=scenery:GetName()
target.Coordinate=scenery:GetCoordinate()
target.Life0=1
target.Life=1
self.Ntargets0=self.Ntargets0+1
elseif Object:IsInstanceOf("AIRBASE") then
@ -519,8 +535,18 @@ function TARGET:_AddObject(Object)
target.Life0=1
target.Life=1
-- TODO: does this make sense for a coordinate?
--self.Ntargets0=self.Ntargets0+1
elseif Object:IsInstanceOf("ZONE_BASE") then
local zone=Object --Core.Zone#ZONE_BASE
Object=zone:GetCoordinate()
target.Type=TARGET.ObjectType.COORDINATE
target.Name=zone:GetName()
target.Coordinate=Object
target.Life0=1
target.Life=1
else
self:E(self.lid.."ERROR: Unknown object type!")
@ -605,6 +631,14 @@ function TARGET:GetTargetLife(Target)
return 0
end
elseif Target.Type==TARGET.ObjectType.SCENERY then
if Target.Status==TARGET.ObjectStatus.ALIVE then
return 1
else
return 0
end
elseif Target.Type==TARGET.ObjectType.AIRBASE then
if Target.Status==TARGET.ObjectStatus.ALIVE then
@ -670,6 +704,14 @@ function TARGET:GetTargetVec3(Target)
return object:GetVec3()
end
elseif Target.Type==TARGET.ObjectType.SCENERY then
local object=Target.Object --Wrapper.Scenery#SCENERY
if object then
return object:GetVec3()
end
elseif Target.Type==TARGET.ObjectType.AIRBASE then
local object=Target.Object --Wrapper.Airbase#AIRBASE
@ -841,6 +883,10 @@ function TARGET:GetTargetCategory(Target)
return TARGET.Category.GROUND
elseif Target.Type==TARGET.ObjectType.SCENERY then
return TARGET.Category.GROUND
elseif Target.Type==TARGET.ObjectType.AIRBASE then
return TARGET.Category.AIRBASE
@ -944,6 +990,12 @@ function TARGET:CountTargets()
N=N+1
end
elseif Target.Type==TARGET.ObjectType.SCENERY then
if Target.Status==TARGET.ObjectStatus.ALIVE then
N=N+1
end
elseif Target.Type==TARGET.ObjectType.AIRBASE then
if Target.Status==TARGET.ObjectStatus.ALIVE then