mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
Compare commits
143 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2d7e7d55a9 | ||
|
|
6e37300d9b | ||
|
|
85fef96d00 | ||
|
|
47d814e409 | ||
|
|
41b01a508d | ||
|
|
1ae41319fa | ||
|
|
0265152c12 | ||
|
|
a893d46cb9 | ||
|
|
b68f271fb7 | ||
|
|
057e231a9d | ||
|
|
b6fedbd97d | ||
|
|
7cd29501a9 | ||
|
|
59e4f48726 | ||
|
|
20fe2ee505 | ||
|
|
8b4ba430fb | ||
|
|
3b0949de72 | ||
|
|
ebb4623bb5 | ||
|
|
2309487429 | ||
|
|
a3decc33c9 | ||
|
|
b2d87a8780 | ||
|
|
5034005f6b | ||
|
|
c045ba0c6d | ||
|
|
d0fb4d44ef | ||
|
|
d1f3e3f4bb | ||
|
|
45f578b5a3 | ||
|
|
620f4b96b9 | ||
|
|
39d3f85b71 | ||
|
|
9a7df65faa | ||
|
|
596eb4c7e4 | ||
|
|
2bce305451 | ||
|
|
2bcc531e73 | ||
|
|
2e66a854b1 | ||
|
|
57f6096aa1 | ||
|
|
dc64b98c59 | ||
|
|
e6dde7335a | ||
|
|
bbb2174957 | ||
|
|
b37b50a0c6 | ||
|
|
459ff8038b | ||
|
|
f2da862442 | ||
|
|
9c6c2ec5ca | ||
|
|
aa13583aa7 | ||
|
|
002f1e09ef | ||
|
|
5091ed7d6d | ||
|
|
2475f22937 | ||
|
|
f4f12f786c | ||
|
|
eb659446df | ||
|
|
62c42adebc | ||
|
|
0fc91595b8 | ||
|
|
18fca6461b | ||
|
|
869b819a4f | ||
|
|
8ae6192a5f | ||
|
|
3b2af6ea07 | ||
|
|
82da7a8f24 | ||
|
|
3749686882 | ||
|
|
b2eba4911a | ||
|
|
40700a387c | ||
|
|
0577940d58 | ||
|
|
1d6be07cff | ||
|
|
2d6545429a | ||
|
|
9f095a1d28 | ||
|
|
91b6da70af | ||
|
|
235e40cb26 | ||
|
|
8ba3a30278 | ||
|
|
3675ddaf04 | ||
|
|
62a59e7b2a | ||
|
|
1f949463aa | ||
|
|
6d53a30b1f | ||
|
|
5aeb480069 | ||
|
|
4b6aa3b56f | ||
|
|
4209569f29 | ||
|
|
7106efbc04 | ||
|
|
4e878e49a7 | ||
|
|
3e470e557d | ||
|
|
5f567fcf66 | ||
|
|
2289e16d91 | ||
|
|
40415ef933 | ||
|
|
6519c30b3a | ||
|
|
42d253a9ca | ||
|
|
38b40e2931 | ||
|
|
f7a7ea14a3 | ||
|
|
41e0f92cc0 | ||
|
|
2c5e9789db | ||
|
|
e198aae1dd | ||
|
|
d040cc0d03 | ||
|
|
f078e94a7a | ||
|
|
9973099f57 | ||
|
|
9ca7785a64 | ||
|
|
e7d5fd6c1b | ||
|
|
9eed35ace7 | ||
|
|
c7ec1b4e5e | ||
|
|
34ffebb46a | ||
|
|
e8a2167934 | ||
|
|
fa342a5b6b | ||
|
|
4ebcaf913c | ||
|
|
7a4c9806a4 | ||
|
|
bddc1d7fdc | ||
|
|
cb813b70e1 | ||
|
|
f161f08fc1 | ||
|
|
3e22411328 | ||
|
|
b00778bb86 | ||
|
|
564f95781e | ||
|
|
6c2f8aa6ff | ||
|
|
2e342e4341 | ||
|
|
3c6089884e | ||
|
|
884ea866e2 | ||
|
|
1af1ada7dc | ||
|
|
c72c3fd091 | ||
|
|
0848718313 | ||
|
|
832abd7860 | ||
|
|
12e745af54 | ||
|
|
f18c818b8e | ||
|
|
4deca4f816 | ||
|
|
b023ecfb99 | ||
|
|
cdb491bb5f | ||
|
|
3ac47c967e | ||
|
|
e577062720 | ||
|
|
95dc7ad2b4 | ||
|
|
fccf58cd6c | ||
|
|
6791e4d4ba | ||
|
|
11f8ac4820 | ||
|
|
8f2672f928 | ||
|
|
fb66d74ab7 | ||
|
|
37c061bcbd | ||
|
|
9491b18ff4 | ||
|
|
8cff2eaac0 | ||
|
|
f64550f7c8 | ||
|
|
0addafa627 | ||
|
|
b643d73f7f | ||
|
|
798c5b292a | ||
|
|
688c57d91d | ||
|
|
d4c8d5d91b | ||
|
|
154cc9fbeb | ||
|
|
327bac3058 | ||
|
|
c0e58e9c92 | ||
|
|
e8bfab515c | ||
|
|
695f204493 | ||
|
|
a7202ccd0d | ||
|
|
c71c6c5178 | ||
|
|
155b06edc8 | ||
|
|
64b8f2fb46 | ||
|
|
7a07e15032 | ||
|
|
3d74312d43 | ||
|
|
6baf85d429 |
@@ -26,24 +26,25 @@ init:
|
|||||||
# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
||||||
|
|
||||||
install:
|
install:
|
||||||
|
- cmd:
|
||||||
# Outcomment if lua environment invalidates and needs to be reinstalled, otherwise all will run from the cache.
|
# Outcomment if lua environment invalidates and needs to be reinstalled, otherwise all will run from the cache.
|
||||||
# - call choco install 7zip.commandline
|
call choco install 7zip.commandline
|
||||||
# - call choco install lua51
|
call choco install lua51
|
||||||
# - call choco install luarocks
|
call choco install luarocks
|
||||||
# - call refreshenv
|
call refreshenv
|
||||||
# - call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
|
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
|
||||||
# - cmd: PATH = %PATH%;C:\ProgramData\chocolatey\lib\luarocks\luarocks-2.4.3-win32\systree\bin
|
cmd: PATH = %PATH%;C:\ProgramData\chocolatey\lib\luarocks\luarocks-2.4.3-win32\systree\bin
|
||||||
# - cmd: set LUA_PATH = %LUA_PATH%;C:\ProgramData\chocolatey\lib\luarocks\luarocks-2.4.3-win32\systree\share\lua\5.1\?.lua;C:\ProgramData\chocolatey\lib\luarocks\luarocks-2.4.3-win32\systree\share\lua\5.1\?\init.lua
|
cmd: set LUA_PATH = %LUA_PATH%;C:\ProgramData\chocolatey\lib\luarocks\luarocks-2.4.3-win32\systree\share\lua\5.1\?.lua;C:\ProgramData\chocolatey\lib\luarocks\luarocks-2.4.3-win32\systree\share\lua\5.1\?\init.lua
|
||||||
# - cmd: set LUA_CPATH = %LUA_CPATH%;C:\ProgramData\chocolatey\lib\luarocks\luarocks-2.4.3-win32\systree\lib\lua\5.1\?.dll
|
cmd: set LUA_CPATH = %LUA_CPATH%;C:\ProgramData\chocolatey\lib\luarocks\luarocks-2.4.3-win32\systree\lib\lua\5.1\?.dll
|
||||||
# - call luarocks install luasrcdiet
|
call luarocks install luasrcdiet
|
||||||
# - call luarocks install checks
|
call luarocks install checks
|
||||||
# - call luarocks install luadocumentor
|
call luarocks install luadocumentor
|
||||||
# - call luarocks install luacheck
|
call luarocks install luacheck
|
||||||
|
|
||||||
|
|
||||||
#cache:
|
cache:
|
||||||
# - C:\ProgramData\chocolatey\lib
|
C:\ProgramData\chocolatey\lib
|
||||||
# - C:\ProgramData\chocolatey\bin
|
C:\ProgramData\chocolatey\bin
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -51,8 +52,9 @@ build_script:
|
|||||||
- ps: |
|
- ps: |
|
||||||
if( $env:appveyor_repo_branch -eq 'master' -or $env:appveyor_repo_branch -eq 'develop' )
|
if( $env:appveyor_repo_branch -eq 'master' -or $env:appveyor_repo_branch -eq 'develop' )
|
||||||
{
|
{
|
||||||
|
echo "Hello World!"
|
||||||
$apiUrl = 'https://ci.appveyor.com/api'
|
$apiUrl = 'https://ci.appveyor.com/api'
|
||||||
$token = 'qts80b5kpq0ooj4x6vvw'
|
$token = 'v2.6hcv3ige78kg3yvg4ge8'
|
||||||
$headers = @{
|
$headers = @{
|
||||||
"Authorization" = "Bearer $token"
|
"Authorization" = "Bearer $token"
|
||||||
"Content-type" = "application/json"
|
"Content-type" = "application/json"
|
||||||
@@ -65,7 +67,7 @@ build_script:
|
|||||||
if( $env:appveyor_repo_branch -eq 'master' -or $env:appveyor_repo_branch -eq 'develop' )
|
if( $env:appveyor_repo_branch -eq 'master' -or $env:appveyor_repo_branch -eq 'develop' )
|
||||||
{
|
{
|
||||||
$apiUrl = 'https://ci.appveyor.com/api'
|
$apiUrl = 'https://ci.appveyor.com/api'
|
||||||
$token = 'qts80b5kpq0ooj4x6vvw'
|
$token = 'v2.6hcv3ige78kg3yvg4ge8'
|
||||||
$headers = @{
|
$headers = @{
|
||||||
"Authorization" = "Bearer $token"
|
"Authorization" = "Bearer $token"
|
||||||
"Content-type" = "application/json"
|
"Content-type" = "application/json"
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -18,6 +18,8 @@ local.properties
|
|||||||
# External tool builders
|
# External tool builders
|
||||||
.externalToolBuilders/
|
.externalToolBuilders/
|
||||||
|
|
||||||
|
# AppVeyor
|
||||||
|
.appveyor/
|
||||||
|
|
||||||
# CDT-specific
|
# CDT-specific
|
||||||
.cproject
|
.cproject
|
||||||
|
|||||||
54
.luacheckrc
Normal file
54
.luacheckrc
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
ignore = {
|
||||||
|
"011", -- A syntax error.
|
||||||
|
"021", -- An invalid inline option.
|
||||||
|
"022", -- An unpaired inline push directive.
|
||||||
|
"023", -- An unpaired inline pop directive.
|
||||||
|
"111", -- Setting an undefined global variable.
|
||||||
|
"112", -- Mutating an undefined global variable.
|
||||||
|
"113", -- Accessing an undefined global variable.
|
||||||
|
"121", -- Setting a read-only global variable.
|
||||||
|
"122", -- Setting a read-only field of a global variable.
|
||||||
|
"131", -- Unused implicitly defined global variable.
|
||||||
|
"142", -- Setting an undefined field of a global variable.
|
||||||
|
"143", -- Accessing an undefined field of a global variable.
|
||||||
|
"211", -- Unused local variable.
|
||||||
|
"212", -- Unused argument.
|
||||||
|
"213", -- Unused loop variable.
|
||||||
|
"221", -- Local variable is accessed but never set.
|
||||||
|
"231", -- Local variable is set but never accessed.
|
||||||
|
"232", -- An argument is set but never accessed.
|
||||||
|
"233", -- Loop variable is set but never accessed.
|
||||||
|
"241", -- Local variable is mutated but never accessed.
|
||||||
|
"311", -- Value assigned to a local variable is unused.
|
||||||
|
"312", -- Value of an argument is unused.
|
||||||
|
"313", -- Value of a loop variable is unused.
|
||||||
|
"314", -- Value of a field in a table literal is unused.
|
||||||
|
"321", -- Accessing uninitialized local variable.
|
||||||
|
"331", -- Value assigned to a local variable is mutated but never accessed.
|
||||||
|
"341", -- Mutating uninitialized local variable.
|
||||||
|
"411", -- Redefining a local variable.
|
||||||
|
"412", -- Redefining an argument.
|
||||||
|
"413", -- Redefining a loop variable.
|
||||||
|
"421", -- Shadowing a local variable.
|
||||||
|
"422", -- Shadowing an argument.
|
||||||
|
"423", -- Shadowing a loop variable.
|
||||||
|
"431", -- Shadowing an upvalue.
|
||||||
|
"432", -- Shadowing an upvalue argument.
|
||||||
|
"433", -- Shadowing an upvalue loop variable.
|
||||||
|
"511", -- Unreachable code.
|
||||||
|
"512", -- Loop can be executed at most once.
|
||||||
|
"521", -- Unused label.
|
||||||
|
"531", -- Left-hand side of an assignment is too short.
|
||||||
|
"532", -- Left-hand side of an assignment is too long.
|
||||||
|
"541", -- An empty do end block.
|
||||||
|
"542", -- An empty if branch.
|
||||||
|
"551", -- An empty statement.
|
||||||
|
"561", -- Cyclomatic complexity of a function is too high.
|
||||||
|
"571", -- A numeric for loop goes from #(expr) down to 1 or less without negative step.
|
||||||
|
"611", -- A line consists of nothing but whitespace.
|
||||||
|
"612", -- A line contains trailing whitespace.
|
||||||
|
"613", -- Trailing whitespace in a string.
|
||||||
|
"614", -- Trailing whitespace in a comment.
|
||||||
|
"621", -- Inconsistent indentation (SPACE followed by TAB).
|
||||||
|
"631", -- Line is too long.
|
||||||
|
}
|
||||||
@@ -143,7 +143,7 @@ end
|
|||||||
-- @return #AI_A2A_CAP
|
-- @return #AI_A2A_CAP
|
||||||
function AI_A2A_CAP:New( AICap, PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, EngageMinSpeed, EngageMaxSpeed, PatrolAltType )
|
function AI_A2A_CAP:New( AICap, PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, EngageMinSpeed, EngageMaxSpeed, PatrolAltType )
|
||||||
|
|
||||||
return self:New2( AICap, EngageMinSpeed, EngageMaxSpeed, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolZone, PatrolMinSpeed, PatrolMaxSpeed, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolAltType, PatrolAltType )
|
return self:New2( AICap, EngageMinSpeed, EngageMaxSpeed, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolAltType, PatrolZone, PatrolMinSpeed, PatrolMaxSpeed, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolAltType )
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
--
|
--
|
||||||
-- ## Infantry health.
|
-- ## Infantry health.
|
||||||
--
|
--
|
||||||
-- When infantry is unboarded from the APCs, the infantry is actually respawned into the battlefield.
|
-- When infantry is unboarded from the helicopters, the infantry is actually respawned into the battlefield.
|
||||||
-- As a result, the unboarding infantry is very _healthy_ every time it unboards.
|
-- As a result, the unboarding infantry is very _healthy_ every time it unboards.
|
||||||
-- This is due to the limitation of the DCS simulator, which is not able to specify the health of new spawned units as a parameter.
|
-- This is due to the limitation of the DCS simulator, which is not able to specify the health of new spawned units as a parameter.
|
||||||
-- However, infantry that was destroyed when unboarded, won't be respawned again. Destroyed is destroyed.
|
-- However, infantry that was destroyed when unboarded, won't be respawned again. Destroyed is destroyed.
|
||||||
@@ -67,18 +67,6 @@ function AI_CARGO_HELICOPTER:New( Helicopter, CargoSet )
|
|||||||
|
|
||||||
self:AddTransition( "Unloaded", "Pickup", "*" )
|
self:AddTransition( "Unloaded", "Pickup", "*" )
|
||||||
self:AddTransition( "Loaded", "Deploy", "*" )
|
self:AddTransition( "Loaded", "Deploy", "*" )
|
||||||
--[[
|
|
||||||
self:AddTransition( { "Unloaded", "Loading" }, "Load", "Boarding" )
|
|
||||||
self:AddTransition( "Boarding", "Board", "Boarding" )
|
|
||||||
self:AddTransition( "Boarding", "Loaded", "Loaded" )
|
|
||||||
self:AddTransition( "Boarding", "PickedUp", "Loaded" )
|
|
||||||
self:AddTransition( "Boarding", "Deploy", "Loaded" )
|
|
||||||
self:AddTransition( "Loaded", "Unload", "Unboarding" )
|
|
||||||
self:AddTransition( "Unboarding", "Unboard", "Unboarding" )
|
|
||||||
self:AddTransition( "Unboarding", "Unloaded", "Unboarding" )
|
|
||||||
self:AddTransition( "Unboarding", "Deployed", "Unloaded" )
|
|
||||||
self:AddTransition( "Unboarding", "Pickup", "Unloaded" )
|
|
||||||
--]]
|
|
||||||
self:AddTransition( "*", "Loaded", "Loaded" )
|
self:AddTransition( "*", "Loaded", "Loaded" )
|
||||||
self:AddTransition( "Unboarding", "Pickup", "Unloaded" )
|
self:AddTransition( "Unboarding", "Pickup", "Unloaded" )
|
||||||
self:AddTransition( "Unloaded", "Unboard", "Unloaded" )
|
self:AddTransition( "Unloaded", "Unboard", "Unloaded" )
|
||||||
@@ -107,13 +95,31 @@ function AI_CARGO_HELICOPTER:New( Helicopter, CargoSet )
|
|||||||
-- @param #string Event
|
-- @param #string Event
|
||||||
-- @param #string To
|
-- @param #string To
|
||||||
-- @param Core.Point#COORDINATE Coordinate
|
-- @param Core.Point#COORDINATE Coordinate
|
||||||
-- @param #number Speed Speed in km/h to drive to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
-- @param #number Speed Speed in km/h to fly to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
||||||
|
|
||||||
|
--- PickedUp Handler OnAfter for AI_CARGO_HELICOPTER - Cargo set has been picked up, ready to deploy
|
||||||
|
-- @function [parent=#AI_CARGO_HELICOPTER] OnAfterPickedUp
|
||||||
|
-- @param #AI_CARGO_HELICOPTER self
|
||||||
|
-- @param Wrapper.Group#GROUP Helicopter The helicopter #GROUP object
|
||||||
|
-- @param #string From
|
||||||
|
-- @param #string Event
|
||||||
|
-- @param #string To
|
||||||
|
-- @param Wrapper.Unit#UNIT Unit The helicopter #UNIT object
|
||||||
|
|
||||||
|
--- Unloaded Handler OnAfter for AI_CARGO_HELICOPTER - Cargo unloaded, carrier is empty
|
||||||
|
-- @function [parent=#AI_CARGO_HELICOPTER] OnAfterUnloaded
|
||||||
|
-- @param #AI_CARGO_HELICOPTER self
|
||||||
|
-- @param #string From
|
||||||
|
-- @param #string Event
|
||||||
|
-- @param #string To
|
||||||
|
-- @param Cargo.CargoGroup#CARGO_GROUP Cargo The #CARGO_GROUP object.
|
||||||
|
-- @param Wrapper.Unit#UNIT Unit The helicopter #UNIT object
|
||||||
|
|
||||||
--- Pickup Trigger for AI_CARGO_HELICOPTER
|
--- Pickup Trigger for AI_CARGO_HELICOPTER
|
||||||
-- @function [parent=#AI_CARGO_HELICOPTER] Pickup
|
-- @function [parent=#AI_CARGO_HELICOPTER] Pickup
|
||||||
-- @param #AI_CARGO_HELICOPTER self
|
-- @param #AI_CARGO_HELICOPTER self
|
||||||
-- @param Core.Point#COORDINATE Coordinate
|
-- @param Core.Point#COORDINATE Coordinate
|
||||||
-- @param #number Speed Speed in km/h to drive to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
-- @param #number Speed Speed in km/h to fly to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
||||||
|
|
||||||
--- Pickup Asynchronous Trigger for AI_CARGO_HELICOPTER
|
--- Pickup Asynchronous Trigger for AI_CARGO_HELICOPTER
|
||||||
-- @function [parent=#AI_CARGO_HELICOPTER] __Pickup
|
-- @function [parent=#AI_CARGO_HELICOPTER] __Pickup
|
||||||
@@ -129,7 +135,7 @@ function AI_CARGO_HELICOPTER:New( Helicopter, CargoSet )
|
|||||||
-- @param #string Event
|
-- @param #string Event
|
||||||
-- @param #string To
|
-- @param #string To
|
||||||
-- @param Core.Point#COORDINATE Coordinate Place at which cargo is deployed.
|
-- @param Core.Point#COORDINATE Coordinate Place at which cargo is deployed.
|
||||||
-- @param #number Speed Speed in km/h to drive to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
-- @param #number Speed Speed in km/h to fly to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
||||||
-- @return #boolean
|
-- @return #boolean
|
||||||
|
|
||||||
--- Deploy Handler OnAfter for AI_CARGO_HELICOPTER
|
--- Deploy Handler OnAfter for AI_CARGO_HELICOPTER
|
||||||
@@ -139,21 +145,42 @@ function AI_CARGO_HELICOPTER:New( Helicopter, CargoSet )
|
|||||||
-- @param #string Event
|
-- @param #string Event
|
||||||
-- @param #string To
|
-- @param #string To
|
||||||
-- @param Core.Point#COORDINATE Coordinate
|
-- @param Core.Point#COORDINATE Coordinate
|
||||||
-- @param #number Speed Speed in km/h to drive to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
-- @param #number Speed Speed in km/h to fly to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
||||||
|
|
||||||
|
--- Deployed Handler OnAfter for AI_CARGO_HELICOPTER
|
||||||
|
-- @function [parent=#AI_CARGO_HELICOPTER] OnAfterDeployed
|
||||||
|
-- @param #AI_CARGO_HELICOPTER self
|
||||||
|
-- @param #string From
|
||||||
|
-- @param #string Event
|
||||||
|
-- @param #string To
|
||||||
|
|
||||||
--- Deploy Trigger for AI_CARGO_HELICOPTER
|
--- Deploy Trigger for AI_CARGO_HELICOPTER
|
||||||
-- @function [parent=#AI_CARGO_HELICOPTER] Deploy
|
-- @function [parent=#AI_CARGO_HELICOPTER] Deploy
|
||||||
-- @param #AI_CARGO_HELICOPTER self
|
-- @param #AI_CARGO_HELICOPTER self
|
||||||
-- @param Core.Point#COORDINATE Coordinate Place at which the cargo is deployed.
|
-- @param Core.Point#COORDINATE Coordinate Place at which the cargo is deployed.
|
||||||
-- @param #number Speed Speed in km/h to drive to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
-- @param #number Speed Speed in km/h to fly to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
||||||
|
|
||||||
--- Deploy Asynchronous Trigger for AI_CARGO_HELICOPTER
|
--- Deploy Asynchronous Trigger for AI_CARGO_HELICOPTER
|
||||||
-- @function [parent=#AI_CARGO_HELICOPTER] __Deploy
|
-- @function [parent=#AI_CARGO_HELICOPTER] __Deploy
|
||||||
-- @param #number Delay Delay in seconds.
|
-- @param #number Delay Delay in seconds.
|
||||||
-- @param #AI_CARGO_HELICOPTER self
|
-- @param #AI_CARGO_HELICOPTER self
|
||||||
-- @param Core.Point#COORDINATE Coordinate Place at which the cargo is deployed.
|
-- @param Core.Point#COORDINATE Coordinate Place at which the cargo is deployed.
|
||||||
-- @param #number Speed Speed in km/h to drive to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
-- @param #number Speed Speed in km/h to fly to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
||||||
|
|
||||||
|
--- Home Trigger for AI_CARGO_HELICOPTER
|
||||||
|
-- @function [parent=#AI_CARGO_HELICOPTER] Home
|
||||||
|
-- @param #AI_CARGO_HELICOPTER self
|
||||||
|
-- @param Core.Point#COORDINATE Coordinate Place to which the helicopter will go.
|
||||||
|
-- @param #number Speed (optional) Speed in km/h to fly to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
||||||
|
-- @param #number Height (optional) Height the Helicopter should be flying at.
|
||||||
|
|
||||||
|
--- Home Asynchronous Trigger for AI_CARGO_HELICOPTER
|
||||||
|
-- @function [parent=#AI_CARGO_HELICOPTER] __Home
|
||||||
|
-- @param #number Delay Delay in seconds.
|
||||||
|
-- @param #AI_CARGO_HELICOPTER self
|
||||||
|
-- @param Core.Point#COORDINATE Coordinate Place to which the helicopter will go.
|
||||||
|
-- @param #number Speed (optional) Speed in km/h to fly to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
||||||
|
-- @param #number Height (optional) Height the Helicopter should be flying at.
|
||||||
|
|
||||||
-- We need to capture the Crash events for the helicopters.
|
-- We need to capture the Crash events for the helicopters.
|
||||||
-- The helicopter reference is used in the semaphore AI_CARGO_QUEUE.
|
-- The helicopter reference is used in the semaphore AI_CARGO_QUEUE.
|
||||||
@@ -235,7 +262,7 @@ end
|
|||||||
-- @param Event
|
-- @param Event
|
||||||
-- @param To
|
-- @param To
|
||||||
function AI_CARGO_HELICOPTER:onafterLanded( Helicopter, From, Event, To )
|
function AI_CARGO_HELICOPTER:onafterLanded( Helicopter, From, Event, To )
|
||||||
|
self:F({From, Event, To})
|
||||||
Helicopter:F( { Name = Helicopter:GetName() } )
|
Helicopter:F( { Name = Helicopter:GetName() } )
|
||||||
|
|
||||||
if Helicopter and Helicopter:IsAlive() then
|
if Helicopter and Helicopter:IsAlive() then
|
||||||
@@ -250,7 +277,7 @@ function AI_CARGO_HELICOPTER:onafterLanded( Helicopter, From, Event, To )
|
|||||||
self:F( { Helicopter:GetName(), Height = Helicopter:GetHeight( true ), Velocity = Helicopter:GetVelocityKMH() } )
|
self:F( { Helicopter:GetName(), Height = Helicopter:GetHeight( true ), Velocity = Helicopter:GetVelocityKMH() } )
|
||||||
|
|
||||||
if self.RoutePickup == true then
|
if self.RoutePickup == true then
|
||||||
if Helicopter:GetHeight( true ) <= 5.5 and Helicopter:GetVelocityKMH() < 10 then
|
if Helicopter:GetHeight( true ) <= 5.5 and Helicopter:GetVelocityKMH() < 15 then
|
||||||
--self:Load( Helicopter:GetPointVec2() )
|
--self:Load( Helicopter:GetPointVec2() )
|
||||||
self:Load( self.PickupZone )
|
self:Load( self.PickupZone )
|
||||||
self.RoutePickup = false
|
self.RoutePickup = false
|
||||||
@@ -258,7 +285,7 @@ function AI_CARGO_HELICOPTER:onafterLanded( Helicopter, From, Event, To )
|
|||||||
end
|
end
|
||||||
|
|
||||||
if self.RouteDeploy == true then
|
if self.RouteDeploy == true then
|
||||||
if Helicopter:GetHeight( true ) <= 5.5 and Helicopter:GetVelocityKMH() < 10 then
|
if Helicopter:GetHeight( true ) <= 5.5 and Helicopter:GetVelocityKMH() < 15 then
|
||||||
self:Unload( self.DeployZone )
|
self:Unload( self.DeployZone )
|
||||||
self.RouteDeploy = false
|
self.RouteDeploy = false
|
||||||
end
|
end
|
||||||
@@ -276,7 +303,7 @@ end
|
|||||||
-- @param Core.Point#COORDINATE Coordinate
|
-- @param Core.Point#COORDINATE Coordinate
|
||||||
-- @param #number Speed
|
-- @param #number Speed
|
||||||
function AI_CARGO_HELICOPTER:onafterQueue( Helicopter, From, Event, To, Coordinate, Speed, DeployZone )
|
function AI_CARGO_HELICOPTER:onafterQueue( Helicopter, From, Event, To, Coordinate, Speed, DeployZone )
|
||||||
|
self:F({From, Event, To, Coordinate, Speed, DeployZone})
|
||||||
local HelicopterInZone = false
|
local HelicopterInZone = false
|
||||||
|
|
||||||
if Helicopter and Helicopter:IsAlive() == true then
|
if Helicopter and Helicopter:IsAlive() == true then
|
||||||
@@ -359,7 +386,8 @@ end
|
|||||||
-- @param Core.Point#COORDINATE Coordinate
|
-- @param Core.Point#COORDINATE Coordinate
|
||||||
-- @param #number Speed
|
-- @param #number Speed
|
||||||
function AI_CARGO_HELICOPTER:onafterOrbit( Helicopter, From, Event, To, Coordinate )
|
function AI_CARGO_HELICOPTER:onafterOrbit( Helicopter, From, Event, To, Coordinate )
|
||||||
|
self:F({From, Event, To, Coordinate})
|
||||||
|
|
||||||
if Helicopter and Helicopter:IsAlive() then
|
if Helicopter and Helicopter:IsAlive() then
|
||||||
|
|
||||||
local Route = {}
|
local Route = {}
|
||||||
@@ -394,7 +422,7 @@ end
|
|||||||
-- @param #boolean Deployed Cargo is deployed.
|
-- @param #boolean Deployed Cargo is deployed.
|
||||||
-- @return #boolean True if all cargo has been unloaded.
|
-- @return #boolean True if all cargo has been unloaded.
|
||||||
function AI_CARGO_HELICOPTER:onafterDeployed( Helicopter, From, Event, To, DeployZone )
|
function AI_CARGO_HELICOPTER:onafterDeployed( Helicopter, From, Event, To, DeployZone )
|
||||||
self:F( { Helicopter, From, Event, To, DeployZone = DeployZone } )
|
self:F( { From, Event, To, DeployZone = DeployZone } )
|
||||||
|
|
||||||
self:Orbit( Helicopter:GetCoordinate(), 50 )
|
self:Orbit( Helicopter:GetCoordinate(), 50 )
|
||||||
|
|
||||||
@@ -416,7 +444,7 @@ end
|
|||||||
-- @param Event
|
-- @param Event
|
||||||
-- @param To
|
-- @param To
|
||||||
-- @param Core.Point#COORDINATE Coordinate Pickup place.
|
-- @param Core.Point#COORDINATE Coordinate Pickup place.
|
||||||
-- @param #number Speed Speed in km/h to drive to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
-- @param #number Speed Speed in km/h to fly to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
||||||
-- @param #number Height Height in meters to move to the pickup coordinate. This parameter is ignored for APCs.
|
-- @param #number Height Height in meters to move to the pickup coordinate. This parameter is ignored for APCs.
|
||||||
-- @param Core.Zone#ZONE PickupZone (optional) The zone where the cargo will be picked up. The PickupZone can be nil, if there wasn't any PickupZoneSet provided.
|
-- @param Core.Zone#ZONE PickupZone (optional) The zone where the cargo will be picked up. The PickupZone can be nil, if there wasn't any PickupZoneSet provided.
|
||||||
function AI_CARGO_HELICOPTER:onafterPickup( Helicopter, From, Event, To, Coordinate, Speed, Height, PickupZone )
|
function AI_CARGO_HELICOPTER:onafterPickup( Helicopter, From, Event, To, Coordinate, Speed, Height, PickupZone )
|
||||||
@@ -485,10 +513,10 @@ end
|
|||||||
-- @param Event
|
-- @param Event
|
||||||
-- @param To
|
-- @param To
|
||||||
-- @param Core.Point#COORDINATE Coordinate Place at which the cargo is deployed.
|
-- @param Core.Point#COORDINATE Coordinate Place at which the cargo is deployed.
|
||||||
-- @param #number Speed Speed in km/h to drive to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
-- @param #number Speed Speed in km/h to fly to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
||||||
-- @param #number Height Height in meters to move to the deploy coordinate.
|
-- @param #number Height Height in meters to move to the deploy coordinate.
|
||||||
function AI_CARGO_HELICOPTER:onafterDeploy( Helicopter, From, Event, To, Coordinate, Speed, Height, DeployZone )
|
function AI_CARGO_HELICOPTER:onafterDeploy( Helicopter, From, Event, To, Coordinate, Speed, Height, DeployZone )
|
||||||
|
self:F({From, Event, To, Coordinate, Speed, Height, DeployZone})
|
||||||
if Helicopter and Helicopter:IsAlive() ~= nil then
|
if Helicopter and Helicopter:IsAlive() ~= nil then
|
||||||
|
|
||||||
self.RouteDeploy = true
|
self.RouteDeploy = true
|
||||||
@@ -550,11 +578,12 @@ end
|
|||||||
-- @param Event
|
-- @param Event
|
||||||
-- @param To
|
-- @param To
|
||||||
-- @param Core.Point#COORDINATE Coordinate Home place.
|
-- @param Core.Point#COORDINATE Coordinate Home place.
|
||||||
-- @param #number Speed Speed in km/h to drive to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
-- @param #number Speed Speed in km/h to fly to the pickup coordinate. Default is 50% of max possible speed the unit can go.
|
||||||
-- @param #number Height Height in meters to move to the home coordinate.
|
-- @param #number Height Height in meters to move to the home coordinate.
|
||||||
-- @param Core.Zone#ZONE HomeZone The zone wherein the carrier will return when all cargo has been transported. This can be any zone type, like a ZONE, ZONE_GROUP, ZONE_AIRBASE.
|
-- @param Core.Zone#ZONE HomeZone The zone wherein the carrier will return when all cargo has been transported. This can be any zone type, like a ZONE, ZONE_GROUP, ZONE_AIRBASE.
|
||||||
function AI_CARGO_HELICOPTER:onafterHome( Helicopter, From, Event, To, Coordinate, Speed, Height, HomeZone )
|
function AI_CARGO_HELICOPTER:onafterHome( Helicopter, From, Event, To, Coordinate, Speed, Height, HomeZone )
|
||||||
|
self:F({From, Event, To, Coordinate, Speed, Height})
|
||||||
|
|
||||||
if Helicopter and Helicopter:IsAlive() ~= nil then
|
if Helicopter and Helicopter:IsAlive() ~= nil then
|
||||||
|
|
||||||
self.RouteHome = true
|
self.RouteHome = true
|
||||||
@@ -563,7 +592,8 @@ function AI_CARGO_HELICOPTER:onafterHome( Helicopter, From, Event, To, Coordinat
|
|||||||
|
|
||||||
--- Calculate the target route point.
|
--- Calculate the target route point.
|
||||||
|
|
||||||
Coordinate.y = Height
|
--Coordinate.y = Height
|
||||||
|
Height = Height or 50
|
||||||
|
|
||||||
Speed = Speed or Helicopter:GetSpeedMax()*0.5
|
Speed = Speed or Helicopter:GetSpeedMax()*0.5
|
||||||
|
|
||||||
@@ -576,7 +606,7 @@ function AI_CARGO_HELICOPTER:onafterHome( Helicopter, From, Event, To, Coordinat
|
|||||||
--- Create a route point of type air.
|
--- Create a route point of type air.
|
||||||
local CoordinateTo = Coordinate
|
local CoordinateTo = Coordinate
|
||||||
local landheight = CoordinateTo:GetLandHeight() -- get target height
|
local landheight = CoordinateTo:GetLandHeight() -- get target height
|
||||||
CoordinateTo.y = landheight + 50 -- flight height should be 50m above ground
|
CoordinateTo.y = landheight + Height -- flight height should be 50m above ground
|
||||||
|
|
||||||
local WaypointTo = CoordinateTo:WaypointAir("RADIO", POINT_VEC3.RoutePointType.TurningPoint, POINT_VEC3.RoutePointAction.TurningPoint, Speed, true)
|
local WaypointTo = CoordinateTo:WaypointAir("RADIO", POINT_VEC3.RoutePointType.TurningPoint, POINT_VEC3.RoutePointAction.TurningPoint, Speed, true)
|
||||||
|
|
||||||
@@ -589,12 +619,11 @@ function AI_CARGO_HELICOPTER:onafterHome( Helicopter, From, Event, To, Coordinat
|
|||||||
|
|
||||||
Tasks[#Tasks+1] = Helicopter:TaskLandAtVec2( CoordinateTo:GetVec2() )
|
Tasks[#Tasks+1] = Helicopter:TaskLandAtVec2( CoordinateTo:GetVec2() )
|
||||||
Route[#Route].task = Helicopter:TaskCombo( Tasks )
|
Route[#Route].task = Helicopter:TaskCombo( Tasks )
|
||||||
|
|
||||||
Route[#Route+1] = WaypointTo
|
Route[#Route+1] = WaypointTo
|
||||||
|
|
||||||
-- Now route the helicopter
|
-- Now route the helicopter
|
||||||
Helicopter:Route(Route, 0)
|
Helicopter:Route(Route, 0)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ do -- ACT_ROUTE
|
|||||||
self:F( { ZoneName = ZoneName } )
|
self:F( { ZoneName = ZoneName } )
|
||||||
local Zone = Zone -- Core.Zone#ZONE
|
local Zone = Zone -- Core.Zone#ZONE
|
||||||
local ZoneCoord = Zone:GetCoordinate()
|
local ZoneCoord = Zone:GetCoordinate()
|
||||||
local ZoneDistance = ZoneCoord:Get2DDistance( self.Coordinate )
|
local ZoneDistance = ZoneCoord:Get2DDistance( Coordinate )
|
||||||
self:F( { ShortestDistance, ShortestReferenceName } )
|
self:F( { ShortestDistance, ShortestReferenceName } )
|
||||||
if ShortestDistance == 0 or ZoneDistance < ShortestDistance then
|
if ShortestDistance == 0 or ZoneDistance < ShortestDistance then
|
||||||
ShortestDistance = ZoneDistance
|
ShortestDistance = ZoneDistance
|
||||||
|
|||||||
@@ -676,6 +676,37 @@ do -- Event Handling
|
|||||||
-- @param #BASE self
|
-- @param #BASE self
|
||||||
-- @param Core.Event#EVENTDATA EventData The EventData structure.
|
-- @param Core.Event#EVENTDATA EventData The EventData structure.
|
||||||
|
|
||||||
|
--- Paratrooper landing.
|
||||||
|
-- @function [parent=#BASE] OnEventParatrooperLanding
|
||||||
|
-- @param #BASE self
|
||||||
|
-- @param Core.Event#EVENTDATA EventData The EventData structure.
|
||||||
|
|
||||||
|
--- Discard chair after ejection.
|
||||||
|
-- @function [parent=#BASE] OnEventDiscardChairAfterEjection
|
||||||
|
-- @param #BASE self
|
||||||
|
-- @param Core.Event#EVENTDATA EventData The EventData structure.
|
||||||
|
|
||||||
|
--- Weapon add. Fires when entering a mission per pylon with the name of the weapon (double pylons not counted, infinite wep reload not counted.
|
||||||
|
-- @function [parent=#BASE] OnEventParatrooperLanding
|
||||||
|
-- @param #BASE self
|
||||||
|
-- @param Core.Event#EVENTDATA EventData The EventData structure.
|
||||||
|
|
||||||
|
--- Trigger zone.
|
||||||
|
-- @function [parent=#BASE] OnEventTriggerZone
|
||||||
|
-- @param #BASE self
|
||||||
|
-- @param Core.Event#EVENTDATA EventData The EventData structure.
|
||||||
|
|
||||||
|
--- Landing quality mark.
|
||||||
|
-- @function [parent=#BASE] OnEventLandingQualityMark
|
||||||
|
-- @param #BASE self
|
||||||
|
-- @param Core.Event#EVENTDATA EventData The EventData structure.
|
||||||
|
|
||||||
|
--- BDA.
|
||||||
|
-- @function [parent=#BASE] OnEventBDA
|
||||||
|
-- @param #BASE self
|
||||||
|
-- @param Core.Event#EVENTDATA EventData The EventData structure.
|
||||||
|
|
||||||
|
|
||||||
--- Occurs when a player enters a slot and takes control of an aircraft.
|
--- Occurs when a player enters a slot and takes control of an aircraft.
|
||||||
-- **NOTE**: This is a workaround of a long standing DCS bug with the PLAYER_ENTER_UNIT event.
|
-- **NOTE**: This is a workaround of a long standing DCS bug with the PLAYER_ENTER_UNIT event.
|
||||||
-- initiator : The unit that is being taken control of.
|
-- initiator : The unit that is being taken control of.
|
||||||
|
|||||||
@@ -298,24 +298,78 @@ do -- Zones
|
|||||||
-- @return #DATABASE self
|
-- @return #DATABASE self
|
||||||
function DATABASE:_RegisterZones()
|
function DATABASE:_RegisterZones()
|
||||||
|
|
||||||
for ZoneID, ZoneData in pairs( env.mission.triggers.zones ) do
|
for ZoneID, ZoneData in pairs(env.mission.triggers.zones) do
|
||||||
local ZoneName = ZoneData.name
|
local ZoneName = ZoneData.name
|
||||||
|
|
||||||
|
-- Color
|
||||||
|
local color=ZoneData.color or {1, 0, 0, 0.15}
|
||||||
|
|
||||||
|
-- Create new Zone
|
||||||
|
local Zone=nil --Core.Zone#ZONE_BASE
|
||||||
|
|
||||||
|
if ZoneData.type==0 then
|
||||||
|
|
||||||
|
---
|
||||||
|
-- Circular zone
|
||||||
|
---
|
||||||
|
|
||||||
|
self:I(string.format("Register ZONE: %s (Circular)", ZoneName))
|
||||||
|
|
||||||
|
Zone=ZONE:New(ZoneName)
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
self:I( { "Register ZONE:", Name = ZoneName } )
|
---
|
||||||
local Zone = ZONE:New( ZoneName )
|
-- Quad-point zone
|
||||||
self.ZONENAMES[ZoneName] = ZoneName
|
---
|
||||||
self:AddZone( ZoneName, Zone )
|
|
||||||
|
self:I(string.format("Register ZONE: %s (Polygon, Quad)", ZoneName))
|
||||||
|
|
||||||
|
Zone=ZONE_POLYGON_BASE:New(ZoneName, ZoneData.verticies)
|
||||||
|
|
||||||
|
--for i,vec2 in pairs(ZoneData.verticies) do
|
||||||
|
-- local coord=COORDINATE:NewFromVec2(vec2)
|
||||||
|
-- coord:MarkToAll(string.format("%s Point %d", ZoneName, i))
|
||||||
|
--end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
if Zone then
|
||||||
|
|
||||||
|
-- Store color of zone.
|
||||||
|
Zone.Color=color
|
||||||
|
|
||||||
|
-- Store in DB.
|
||||||
|
self.ZONENAMES[ZoneName] = ZoneName
|
||||||
|
|
||||||
|
-- Add zone.
|
||||||
|
self:AddZone(ZoneName, Zone)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Polygon zones defined by late activated groups.
|
||||||
for ZoneGroupName, ZoneGroup in pairs( self.GROUPS ) do
|
for ZoneGroupName, ZoneGroup in pairs( self.GROUPS ) do
|
||||||
if ZoneGroupName:match("#ZONE_POLYGON") then
|
if ZoneGroupName:match("#ZONE_POLYGON") then
|
||||||
|
|
||||||
local ZoneName1 = ZoneGroupName:match("(.*)#ZONE_POLYGON")
|
local ZoneName1 = ZoneGroupName:match("(.*)#ZONE_POLYGON")
|
||||||
local ZoneName2 = ZoneGroupName:match(".*#ZONE_POLYGON(.*)")
|
local ZoneName2 = ZoneGroupName:match(".*#ZONE_POLYGON(.*)")
|
||||||
local ZoneName = ZoneName1 .. ( ZoneName2 or "" )
|
local ZoneName = ZoneName1 .. ( ZoneName2 or "" )
|
||||||
|
|
||||||
self:I( { "Register ZONE_POLYGON:", Name = ZoneName } )
|
-- Debug output
|
||||||
|
self:I(string.format("Register ZONE: %s (Polygon)", ZoneName))
|
||||||
|
|
||||||
|
-- Create a new polygon zone.
|
||||||
local Zone_Polygon = ZONE_POLYGON:New( ZoneName, ZoneGroup )
|
local Zone_Polygon = ZONE_POLYGON:New( ZoneName, ZoneGroup )
|
||||||
|
|
||||||
|
-- Set color.
|
||||||
|
Zone_Polygon:SetColor({1, 0, 0}, 0.15)
|
||||||
|
|
||||||
|
-- Store name in DB.
|
||||||
self.ZONENAMES[ZoneName] = ZoneName
|
self.ZONENAMES[ZoneName] = ZoneName
|
||||||
|
|
||||||
|
-- Add zone to DB.
|
||||||
self:AddZone( ZoneName, Zone_Polygon )
|
self:AddZone( ZoneName, Zone_Polygon )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -540,7 +540,7 @@ do -- FSM
|
|||||||
|
|
||||||
--- Returns a table with the scores defined.
|
--- Returns a table with the scores defined.
|
||||||
-- @param #FSM self
|
-- @param #FSM self
|
||||||
-- @param #table Scores.
|
-- @return #table Scores.
|
||||||
function FSM:GetScores()
|
function FSM:GetScores()
|
||||||
return self._Scores or {}
|
return self._Scores or {}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -164,6 +164,7 @@ do -- COORDINATE
|
|||||||
--
|
--
|
||||||
-- * @{#COORDINATE.WaypointAir}(): Build an air route point.
|
-- * @{#COORDINATE.WaypointAir}(): Build an air route point.
|
||||||
-- * @{#COORDINATE.WaypointGround}(): Build a ground route point.
|
-- * @{#COORDINATE.WaypointGround}(): Build a ground route point.
|
||||||
|
-- * @{#COORDINATE.WaypointNaval}(): Build a naval route point.
|
||||||
--
|
--
|
||||||
-- Route points can be used in the Route methods of the @{Wrapper.Group#GROUP} class.
|
-- Route points can be used in the Route methods of the @{Wrapper.Group#GROUP} class.
|
||||||
--
|
--
|
||||||
@@ -183,10 +184,18 @@ do -- COORDINATE
|
|||||||
--
|
--
|
||||||
-- ## 9) Coordinate text generation
|
-- ## 9) Coordinate text generation
|
||||||
--
|
--
|
||||||
--
|
|
||||||
-- * @{#COORDINATE.ToStringBR}(): Generates a Bearing & Range text in the format of DDD for DI where DDD is degrees and DI is distance.
|
-- * @{#COORDINATE.ToStringBR}(): Generates a Bearing & Range text in the format of DDD for DI where DDD is degrees and DI is distance.
|
||||||
-- * @{#COORDINATE.ToStringLL}(): Generates a Latutude & Longutude text.
|
-- * @{#COORDINATE.ToStringLL}(): Generates a Latutude & Longutude text.
|
||||||
--
|
--
|
||||||
|
-- ## 10) Drawings on F10 map
|
||||||
|
--
|
||||||
|
-- * @{#COORDINATE.CircleToAll}(): Draw a circle on the F10 map.
|
||||||
|
-- * @{#COORDINATE.LineToAll}(): Draw a line on the F10 map.
|
||||||
|
-- * @{#COORDINATE.RectToAll}(): Draw a rectangle on the F10 map.
|
||||||
|
-- * @{#COORDINATE.QuadToAll}(): Draw a shape with four points on the F10 map.
|
||||||
|
-- * @{#COORDINATE.TextToAll}(): Write some text on the F10 map.
|
||||||
|
-- * @{#COORDINATE.ArrowToAll}(): Draw an arrow on the F10 map.
|
||||||
|
--
|
||||||
-- @field #COORDINATE
|
-- @field #COORDINATE
|
||||||
COORDINATE = {
|
COORDINATE = {
|
||||||
ClassName = "COORDINATE",
|
ClassName = "COORDINATE",
|
||||||
@@ -355,9 +364,9 @@ do -- COORDINATE
|
|||||||
|
|
||||||
-- Adjust height
|
-- Adjust height
|
||||||
if altitude==nil then
|
if altitude==nil then
|
||||||
_coord.y=altitude
|
|
||||||
else
|
|
||||||
_coord.y=self:GetLandHeight()
|
_coord.y=self:GetLandHeight()
|
||||||
|
else
|
||||||
|
_coord.y=altitude
|
||||||
end
|
end
|
||||||
|
|
||||||
return _coord
|
return _coord
|
||||||
@@ -625,9 +634,9 @@ do -- COORDINATE
|
|||||||
|
|
||||||
--- Return a random Coordinate within an Outer Radius and optionally NOT within an Inner Radius of the COORDINATE.
|
--- Return a random Coordinate within an Outer Radius and optionally NOT within an Inner Radius of the COORDINATE.
|
||||||
-- @param #COORDINATE self
|
-- @param #COORDINATE self
|
||||||
-- @param DCS#Distance OuterRadius
|
-- @param DCS#Distance OuterRadius Outer radius in meters.
|
||||||
-- @param DCS#Distance InnerRadius
|
-- @param DCS#Distance InnerRadius Inner radius in meters.
|
||||||
-- @return #COORDINATE
|
-- @return #COORDINATE self
|
||||||
function COORDINATE:GetRandomCoordinateInRadius( OuterRadius, InnerRadius )
|
function COORDINATE:GetRandomCoordinateInRadius( OuterRadius, InnerRadius )
|
||||||
self:F2( { OuterRadius, InnerRadius } )
|
self:F2( { OuterRadius, InnerRadius } )
|
||||||
|
|
||||||
@@ -1184,7 +1193,7 @@ do -- COORDINATE
|
|||||||
|
|
||||||
-- ETA.
|
-- ETA.
|
||||||
RoutePoint.ETA=0
|
RoutePoint.ETA=0
|
||||||
RoutePoint.ETA_locked=true
|
RoutePoint.ETA_locked=false
|
||||||
|
|
||||||
-- Waypoint description.
|
-- Waypoint description.
|
||||||
RoutePoint.name=description
|
RoutePoint.name=description
|
||||||
@@ -1333,7 +1342,7 @@ do -- COORDINATE
|
|||||||
RoutePoint.formation_template=""
|
RoutePoint.formation_template=""
|
||||||
|
|
||||||
RoutePoint.ETA=0
|
RoutePoint.ETA=0
|
||||||
RoutePoint.ETA_locked=true
|
RoutePoint.ETA_locked=false
|
||||||
|
|
||||||
RoutePoint.speed = ( Speed or 20 ) / 3.6
|
RoutePoint.speed = ( Speed or 20 ) / 3.6
|
||||||
RoutePoint.speed_locked = true
|
RoutePoint.speed_locked = true
|
||||||
@@ -1368,7 +1377,7 @@ do -- COORDINATE
|
|||||||
RoutePoint.formation_template = ""
|
RoutePoint.formation_template = ""
|
||||||
|
|
||||||
RoutePoint.ETA=0
|
RoutePoint.ETA=0
|
||||||
RoutePoint.ETA_locked=true
|
RoutePoint.ETA_locked=false
|
||||||
|
|
||||||
RoutePoint.speed = ( Speed or 20 ) / 3.6
|
RoutePoint.speed = ( Speed or 20 ) / 3.6
|
||||||
RoutePoint.speed_locked = true
|
RoutePoint.speed_locked = true
|
||||||
@@ -1978,9 +1987,243 @@ do -- COORDINATE
|
|||||||
function COORDINATE:RemoveMark( MarkID )
|
function COORDINATE:RemoveMark( MarkID )
|
||||||
trigger.action.removeMark( MarkID )
|
trigger.action.removeMark( MarkID )
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Line to all.
|
||||||
|
-- Creates a line on the F10 map from one point to another.
|
||||||
|
-- @param #COORDINATE self
|
||||||
|
-- @param #COORDINATE Endpoint COORDIANTE to where the line is drawn.
|
||||||
|
-- @param #number Coalition Coalition: All=-1, Neutral=0, Red=1, Blue=2. Default -1=All.
|
||||||
|
-- @param #table Color RGB color table {r, g, b}, e.g. {1,0,0} for red (default).
|
||||||
|
-- @param #number Alpha Transparency [0,1]. Default 1.
|
||||||
|
-- @param #number LineType Line type: 0=No line, 1=Solid, 2=Dashed, 3=Dotted, 4=Dot dash, 5=Long dash, 6=Two dash. Default 1=Solid.
|
||||||
|
-- @param #boolean ReadOnly (Optional) Mark is readonly and cannot be removed by users. Default false.
|
||||||
|
-- @param #string Text (Optional) Text displayed when mark is added. Default none.
|
||||||
|
-- @return #number The resulting Mark ID, which is a number. Can be used to remove the object again.
|
||||||
|
function COORDINATE:LineToAll(Endpoint, Coalition, Color, Alpha, LineType, ReadOnly, Text)
|
||||||
|
local MarkID = UTILS.GetMarkID()
|
||||||
|
if ReadOnly==nil then
|
||||||
|
ReadOnly=false
|
||||||
|
end
|
||||||
|
local vec3=Endpoint:GetVec3()
|
||||||
|
Coalition=Coalition or -1
|
||||||
|
Color=Color or {1,0,0}
|
||||||
|
Color[4]=Alpha or 1.0
|
||||||
|
LineType=LineType or 1
|
||||||
|
trigger.action.lineToAll(Coalition, MarkID, self:GetVec3(), vec3, Color, LineType, ReadOnly, Text or "")
|
||||||
|
return MarkID
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Circle to all.
|
||||||
|
-- Creates a circle on the map with a given radius, color, fill color, and outline.
|
||||||
|
-- @param #COORDINATE self
|
||||||
|
-- @param #numberr Radius Radius in meters. Default 1000 m.
|
||||||
|
-- @param #number Coalition Coalition: All=-1, Neutral=0, Red=1, Blue=2. Default -1=All.
|
||||||
|
-- @param #table Color RGB color table {r, g, b}, e.g. {1,0,0} for red (default).
|
||||||
|
-- @param #number Alpha Transparency [0,1]. Default 1.
|
||||||
|
-- @param #table FillColor RGB color table {r, g, b}, e.g. {1,0,0} for red. Default is same as `Color` value.
|
||||||
|
-- @param #number FillAlpha Transparency [0,1]. Default 0.15.
|
||||||
|
-- @param #number LineType Line type: 0=No line, 1=Solid, 2=Dashed, 3=Dotted, 4=Dot dash, 5=Long dash, 6=Two dash. Default 1=Solid.
|
||||||
|
-- @param #boolean ReadOnly (Optional) Mark is readonly and cannot be removed by users. Default false.
|
||||||
|
-- @param #string Text (Optional) Text displayed when mark is added. Default none.
|
||||||
|
-- @return #number The resulting Mark ID, which is a number. Can be used to remove the object again.
|
||||||
|
function COORDINATE:CircleToAll(Radius, Coalition, Color, Alpha, FillColor, FillAlpha, LineType, ReadOnly, Text)
|
||||||
|
local MarkID = UTILS.GetMarkID()
|
||||||
|
if ReadOnly==nil then
|
||||||
|
ReadOnly=false
|
||||||
|
end
|
||||||
|
local vec3=self:GetVec3()
|
||||||
|
Radius=Radius or 1000
|
||||||
|
Coalition=Coalition or -1
|
||||||
|
Color=Color or {1,0,0}
|
||||||
|
Color[4]=Alpha or 1.0
|
||||||
|
LineType=LineType or 1
|
||||||
|
FillColor=FillColor or Color
|
||||||
|
FillColor[4]=FillAlpha or 0.15
|
||||||
|
trigger.action.circleToAll(Coalition, MarkID, vec3, Radius, Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
return MarkID
|
||||||
|
end
|
||||||
|
|
||||||
end -- Markings
|
end -- Markings
|
||||||
|
|
||||||
|
--- Rectangle to all. Creates a rectangle on the map from the COORDINATE in one corner to the end COORDINATE in the opposite corner.
|
||||||
|
-- Creates a line on the F10 map from one point to another.
|
||||||
|
-- @param #COORDINATE self
|
||||||
|
-- @param #COORDINATE Endpoint COORDIANTE in the opposite corner.
|
||||||
|
-- @param #number Coalition Coalition: All=-1, Neutral=0, Red=1, Blue=2. Default -1=All.
|
||||||
|
-- @param #table Color RGB color table {r, g, b}, e.g. {1,0,0} for red (default).
|
||||||
|
-- @param #number Alpha Transparency [0,1]. Default 1.
|
||||||
|
-- @param #table FillColor RGB color table {r, g, b}, e.g. {1,0,0} for red. Default is same as `Color` value.
|
||||||
|
-- @param #number FillAlpha Transparency [0,1]. Default 0.15.
|
||||||
|
-- @param #number LineType Line type: 0=No line, 1=Solid, 2=Dashed, 3=Dotted, 4=Dot dash, 5=Long dash, 6=Two dash. Default 1=Solid.
|
||||||
|
-- @param #boolean ReadOnly (Optional) Mark is readonly and cannot be removed by users. Default false.
|
||||||
|
-- @param #string Text (Optional) Text displayed when mark is added. Default none.
|
||||||
|
-- @return #number The resulting Mark ID, which is a number. Can be used to remove the object again.
|
||||||
|
function COORDINATE:RectToAll(Endpoint, Coalition, Color, Alpha, FillColor, FillAlpha, LineType, ReadOnly, Text)
|
||||||
|
local MarkID = UTILS.GetMarkID()
|
||||||
|
if ReadOnly==nil then
|
||||||
|
ReadOnly=false
|
||||||
|
end
|
||||||
|
local vec3=Endpoint:GetVec3()
|
||||||
|
Coalition=Coalition or -1
|
||||||
|
Color=Color or {1,0,0}
|
||||||
|
Color[4]=Alpha or 1.0
|
||||||
|
LineType=LineType or 1
|
||||||
|
FillColor=FillColor or Color
|
||||||
|
FillColor[4]=FillAlpha or 0.15
|
||||||
|
trigger.action.rectToAll(Coalition, MarkID, self:GetVec3(), vec3, Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
return MarkID
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Creates a shape defined by 4 points on the F10 map. The first point is the current COORDINATE. The remaining three points need to be specified.
|
||||||
|
-- @param #COORDINATE self
|
||||||
|
-- @param #COORDINATE Coord2 Second COORDIANTE of the quad shape.
|
||||||
|
-- @param #COORDINATE Coord3 Third COORDIANTE of the quad shape.
|
||||||
|
-- @param #COORDINATE Coord4 Fourth COORDIANTE of the quad shape.
|
||||||
|
-- @param #number Coalition Coalition: All=-1, Neutral=0, Red=1, Blue=2. Default -1=All.
|
||||||
|
-- @param #table Color RGB color table {r, g, b}, e.g. {1,0,0} for red (default).
|
||||||
|
-- @param #number Alpha Transparency [0,1]. Default 1.
|
||||||
|
-- @param #table FillColor RGB color table {r, g, b}, e.g. {1,0,0} for red. Default is same as `Color` value.
|
||||||
|
-- @param #number FillAlpha Transparency [0,1]. Default 0.15.
|
||||||
|
-- @param #number LineType Line type: 0=No line, 1=Solid, 2=Dashed, 3=Dotted, 4=Dot dash, 5=Long dash, 6=Two dash. Default 1=Solid.
|
||||||
|
-- @param #boolean ReadOnly (Optional) Mark is readonly and cannot be removed by users. Default false.
|
||||||
|
-- @param #string Text (Optional) Text displayed when mark is added. Default none.
|
||||||
|
-- @return #number The resulting Mark ID, which is a number. Can be used to remove the object again.
|
||||||
|
function COORDINATE:QuadToAll(Coord2, Coord3, Coord4, Coalition, Color, Alpha, FillColor, FillAlpha, LineType, ReadOnly, Text)
|
||||||
|
local MarkID = UTILS.GetMarkID()
|
||||||
|
if ReadOnly==nil then
|
||||||
|
ReadOnly=false
|
||||||
|
end
|
||||||
|
local point1=self:GetVec3()
|
||||||
|
local point2=Coord2:GetVec3()
|
||||||
|
local point3=Coord3:GetVec3()
|
||||||
|
local point4=Coord4:GetVec3()
|
||||||
|
Coalition=Coalition or -1
|
||||||
|
Color=Color or {1,0,0}
|
||||||
|
Color[4]=Alpha or 1.0
|
||||||
|
LineType=LineType or 1
|
||||||
|
FillColor=FillColor or Color
|
||||||
|
FillColor[4]=FillAlpha or 0.15
|
||||||
|
trigger.action.quadToAll(Coalition, MarkID, self:GetVec3(), point2, point3, point4, Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
return MarkID
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Creates a free form shape on the F10 map. The first point is the current COORDINATE. The remaining points need to be specified.
|
||||||
|
-- **NOTE**: A free form polygon must have **at least three points** in total and currently only **up to 10 points** in total are supported.
|
||||||
|
-- @param #COORDINATE self
|
||||||
|
-- @param #table Coordinates Table of coordinates of the remaining points of the shape.
|
||||||
|
-- @param #number Coalition Coalition: All=-1, Neutral=0, Red=1, Blue=2. Default -1=All.
|
||||||
|
-- @param #table Color RGB color table {r, g, b}, e.g. {1,0,0} for red (default).
|
||||||
|
-- @param #number Alpha Transparency [0,1]. Default 1.
|
||||||
|
-- @param #table FillColor RGB color table {r, g, b}, e.g. {1,0,0} for red. Default is same as `Color` value.
|
||||||
|
-- @param #number FillAlpha Transparency [0,1]. Default 0.15.
|
||||||
|
-- @param #number LineType Line type: 0=No line, 1=Solid, 2=Dashed, 3=Dotted, 4=Dot dash, 5=Long dash, 6=Two dash. Default 1=Solid.
|
||||||
|
-- @param #boolean ReadOnly (Optional) Mark is readonly and cannot be removed by users. Default false.
|
||||||
|
-- @param #string Text (Optional) Text displayed when mark is added. Default none.
|
||||||
|
-- @return #number The resulting Mark ID, which is a number. Can be used to remove the object again.
|
||||||
|
function COORDINATE:MarkupToAllFreeForm(Coordinates, Coalition, Color, Alpha, FillColor, FillAlpha, LineType, ReadOnly, Text)
|
||||||
|
|
||||||
|
local MarkID = UTILS.GetMarkID()
|
||||||
|
if ReadOnly==nil then
|
||||||
|
ReadOnly=false
|
||||||
|
end
|
||||||
|
|
||||||
|
Coalition=Coalition or -1
|
||||||
|
|
||||||
|
Color=Color or {1,0,0}
|
||||||
|
Color[4]=Alpha or 1.0
|
||||||
|
|
||||||
|
LineType=LineType or 1
|
||||||
|
|
||||||
|
FillColor=FillColor or UTILS.DeepCopy(Color)
|
||||||
|
FillColor[4]=FillAlpha or 0.15
|
||||||
|
|
||||||
|
local vecs={}
|
||||||
|
vecs[1]=self:GetVec3()
|
||||||
|
for i,coord in ipairs(Coordinates) do
|
||||||
|
vecs[i+1]=coord:GetVec3()
|
||||||
|
end
|
||||||
|
|
||||||
|
if #vecs<3 then
|
||||||
|
self:E("ERROR: A free form polygon needs at least three points!")
|
||||||
|
elseif #vecs==3 then
|
||||||
|
trigger.action.markupToAll(7, Coalition, MarkID, vecs[1], vecs[2], vecs[3], Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
elseif #vecs==4 then
|
||||||
|
trigger.action.markupToAll(7, Coalition, MarkID, vecs[1], vecs[2], vecs[3], vecs[4], Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
elseif #vecs==5 then
|
||||||
|
trigger.action.markupToAll(7, Coalition, MarkID, vecs[1], vecs[2], vecs[3], vecs[4], vecs[5], Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
elseif #vecs==6 then
|
||||||
|
trigger.action.markupToAll(7, Coalition, MarkID, vecs[1], vecs[2], vecs[3], vecs[4], vecs[5], vecs[6], Color, FillColor, LineType, Text or "")
|
||||||
|
elseif #vecs==7 then
|
||||||
|
trigger.action.markupToAll(7, Coalition, MarkID, vecs[1], vecs[2], vecs[3], vecs[4], vecs[5], vecs[6], vecs[7], Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
elseif #vecs==8 then
|
||||||
|
trigger.action.markupToAll(7, Coalition, MarkID, vecs[1], vecs[2], vecs[3], vecs[4], vecs[5], vecs[6], vecs[7], vecs[8], Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
elseif #vecs==9 then
|
||||||
|
trigger.action.markupToAll(7, Coalition, MarkID, vecs[1], vecs[2], vecs[3], vecs[4], vecs[5], vecs[6], vecs[7], vecs[8], vecs[9], Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
elseif #vecs==10 then
|
||||||
|
trigger.action.markupToAll(7, Coalition, MarkID, vecs[1], vecs[2], vecs[3], vecs[4], vecs[5], vecs[6], vecs[7], vecs[8], vecs[9], vecs[10], Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
else
|
||||||
|
self:E("ERROR: Currently a free form polygon can only have 10 points in total!")
|
||||||
|
-- Unfortunately, unpack(vecs) does not work! So no idea how to generalize this :(
|
||||||
|
trigger.action.markupToAll(7, Coalition, MarkID, unpack(vecs), Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
end
|
||||||
|
|
||||||
|
return MarkID
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Text to all. Creates a text imposed on the map at the COORDINATE. Text scales with the map.
|
||||||
|
-- @param #COORDINATE self
|
||||||
|
-- @param #string Text Text displayed on the F10 map.
|
||||||
|
-- @param #number Coalition Coalition: All=-1, Neutral=0, Red=1, Blue=2. Default -1=All.
|
||||||
|
-- @param #table Color RGB color table {r, g, b}, e.g. {1,0,0} for red (default).
|
||||||
|
-- @param #number Alpha Transparency [0,1]. Default 1.
|
||||||
|
-- @param #table FillColor RGB color table {r, g, b}, e.g. {1,0,0} for red. Default is same as `Color` value.
|
||||||
|
-- @param #number FillAlpha Transparency [0,1]. Default 0.3.
|
||||||
|
-- @param #number FontSize Font size. Default 14.
|
||||||
|
-- @param #boolean ReadOnly (Optional) Mark is readonly and cannot be removed by users. Default false.
|
||||||
|
-- @return #number The resulting Mark ID, which is a number. Can be used to remove the object again.
|
||||||
|
function COORDINATE:TextToAll(Text, Coalition, Color, Alpha, FillColor, FillAlpha, FontSize, ReadOnly)
|
||||||
|
local MarkID = UTILS.GetMarkID()
|
||||||
|
if ReadOnly==nil then
|
||||||
|
ReadOnly=false
|
||||||
|
end
|
||||||
|
Coalition=Coalition or -1
|
||||||
|
Color=Color or {1,0,0}
|
||||||
|
Color[4]=Alpha or 1.0
|
||||||
|
FillColor=FillColor or Color
|
||||||
|
FillColor[4]=FillAlpha or 0.3
|
||||||
|
FontSize=FontSize or 14
|
||||||
|
trigger.action.textToAll(Coalition, MarkID, self:GetVec3(), Color, FillColor, FontSize, ReadOnly, Text or "Hello World")
|
||||||
|
return MarkID
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Arrow to all. Creates an arrow from the COORDINATE to the endpoint COORDINATE on the F10 map. There is no control over other dimensions of the arrow.
|
||||||
|
-- @param #COORDINATE self
|
||||||
|
-- @param #COORDINATE Endpoint COORDINATE where the tip of the arrow is pointing at.
|
||||||
|
-- @param #number Coalition Coalition: All=-1, Neutral=0, Red=1, Blue=2. Default -1=All.
|
||||||
|
-- @param #table Color RGB color table {r, g, b}, e.g. {1,0,0} for red (default).
|
||||||
|
-- @param #number Alpha Transparency [0,1]. Default 1.
|
||||||
|
-- @param #table FillColor RGB color table {r, g, b}, e.g. {1,0,0} for red. Default is same as `Color` value.
|
||||||
|
-- @param #number FillAlpha Transparency [0,1]. Default 0.15.
|
||||||
|
-- @param #number LineType Line type: 0=No line, 1=Solid, 2=Dashed, 3=Dotted, 4=Dot dash, 5=Long dash, 6=Two dash. Default 1=Solid.
|
||||||
|
-- @param #boolean ReadOnly (Optional) Mark is readonly and cannot be removed by users. Default false.
|
||||||
|
-- @param #string Text (Optional) Text displayed when mark is added. Default none.
|
||||||
|
-- @return #number The resulting Mark ID, which is a number. Can be used to remove the object again.
|
||||||
|
function COORDINATE:ArrowToAll(Endpoint, Coalition, Color, Alpha, FillColor, FillAlpha, LineType, ReadOnly, Text)
|
||||||
|
local MarkID = UTILS.GetMarkID()
|
||||||
|
if ReadOnly==nil then
|
||||||
|
ReadOnly=false
|
||||||
|
end
|
||||||
|
local vec3=Endpoint:GetVec3()
|
||||||
|
Coalition=Coalition or -1
|
||||||
|
Color=Color or {1,0,0}
|
||||||
|
Color[4]=Alpha or 1.0
|
||||||
|
LineType=LineType or 1
|
||||||
|
FillColor=FillColor or Color
|
||||||
|
FillColor[4]=FillAlpha or 0.15
|
||||||
|
--trigger.action.textToAll(Coalition, MarkID, self:GetVec3(), Color, FillColor, FontSize, ReadOnly, Text or "Hello World")
|
||||||
|
trigger.action.arrowToAll(Coalition, MarkID, vec3, self:GetVec3(), Color, FillColor, LineType, ReadOnly, Text or "")
|
||||||
|
return MarkID
|
||||||
|
end
|
||||||
|
|
||||||
--- Returns if a Coordinate has Line of Sight (LOS) with the ToCoordinate.
|
--- Returns if a Coordinate has Line of Sight (LOS) with the ToCoordinate.
|
||||||
-- @param #COORDINATE self
|
-- @param #COORDINATE self
|
||||||
|
|||||||
@@ -880,8 +880,8 @@ do -- SET_GROUP
|
|||||||
--
|
--
|
||||||
-- * @{#SET_GROUP.FilterCoalitions}: Builds the SET_GROUP with the groups belonging to the coalition(s).
|
-- * @{#SET_GROUP.FilterCoalitions}: Builds the SET_GROUP with the groups belonging to the coalition(s).
|
||||||
-- * @{#SET_GROUP.FilterCategories}: Builds the SET_GROUP with the groups belonging to the category(ies).
|
-- * @{#SET_GROUP.FilterCategories}: Builds the SET_GROUP with the groups belonging to the category(ies).
|
||||||
-- * @{#SET_GROUP.FilterCountries}: Builds the SET_GROUP with the gruops belonging to the country(ies).
|
-- * @{#SET_GROUP.FilterCountries}: Builds the SET_GROUP with the groups belonging to the country(ies).
|
||||||
-- * @{#SET_GROUP.FilterPrefixes}: Builds the SET_GROUP with the groups starting with the same prefix string(s).
|
-- * @{#SET_GROUP.FilterPrefixes}: Builds the SET_GROUP with the groups *containing* the given string in the group name. **Attention!** Bad naming convention, as this not really filtering *prefixes*.
|
||||||
-- * @{#SET_GROUP.FilterActive}: Builds the SET_GROUP with the groups that are only active. Groups that are inactive (late activation) won't be included in the set!
|
-- * @{#SET_GROUP.FilterActive}: Builds the SET_GROUP with the groups that are only active. Groups that are inactive (late activation) won't be included in the set!
|
||||||
--
|
--
|
||||||
-- For the Category Filter, extra methods have been added:
|
-- For the Category Filter, extra methods have been added:
|
||||||
@@ -1241,10 +1241,10 @@ do -- SET_GROUP
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Builds a set of groups of defined GROUP prefixes.
|
--- Builds a set of groups that contain the given string in their group name.
|
||||||
-- All the groups starting with the given prefixes will be included within the set.
|
-- **Attention!** Bad naming convention as this **does not** filter only **prefixes** but all groups that **contain** the string.
|
||||||
-- @param #SET_GROUP self
|
-- @param #SET_GROUP self
|
||||||
-- @param #string Prefixes The prefix of which the group name starts with.
|
-- @param #string Prefixes The string pattern(s) that needs to be contained in the group name. Can also be passed as a `#table` of strings.
|
||||||
-- @return #SET_GROUP self
|
-- @return #SET_GROUP self
|
||||||
function SET_GROUP:FilterPrefixes( Prefixes )
|
function SET_GROUP:FilterPrefixes( Prefixes )
|
||||||
if not self.Filter.GroupPrefixes then
|
if not self.Filter.GroupPrefixes then
|
||||||
@@ -1843,7 +1843,7 @@ do -- SET_UNIT
|
|||||||
-- * @{#SET_UNIT.FilterCategories}: Builds the SET_UNIT with the units belonging to the category(ies).
|
-- * @{#SET_UNIT.FilterCategories}: Builds the SET_UNIT with the units belonging to the category(ies).
|
||||||
-- * @{#SET_UNIT.FilterTypes}: Builds the SET_UNIT with the units belonging to the unit type(s).
|
-- * @{#SET_UNIT.FilterTypes}: Builds the SET_UNIT with the units belonging to the unit type(s).
|
||||||
-- * @{#SET_UNIT.FilterCountries}: Builds the SET_UNIT with the units belonging to the country(ies).
|
-- * @{#SET_UNIT.FilterCountries}: Builds the SET_UNIT with the units belonging to the country(ies).
|
||||||
-- * @{#SET_UNIT.FilterPrefixes}: Builds the SET_UNIT with the units starting with the same prefix string(s).
|
-- * @{#SET_UNIT.FilterPrefixes}: Builds the SET_UNIT with the units sharing the same string(s) in their name. **ATTENTION!** Bad naming convention as this *does not* only filter *prefixes*.
|
||||||
-- * @{#SET_UNIT.FilterActive}: Builds the SET_UNIT with the units that are only active. Units that are inactive (late activation) won't be included in the set!
|
-- * @{#SET_UNIT.FilterActive}: Builds the SET_UNIT with the units that are only active. Units that are inactive (late activation) won't be included in the set!
|
||||||
--
|
--
|
||||||
-- Once the filter criteria have been set for the SET_UNIT, you can start filtering using:
|
-- Once the filter criteria have been set for the SET_UNIT, you can start filtering using:
|
||||||
@@ -2105,10 +2105,10 @@ do -- SET_UNIT
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Builds a set of units of defined unit prefixes.
|
--- Builds a set of UNITs that contain a given string in their unit name.
|
||||||
-- All the units starting with the given prefixes will be included within the set.
|
-- **Attention!** Bad naming convention as this **does not** filter only **prefixes** but all units that **contain** the string.
|
||||||
-- @param #SET_UNIT self
|
-- @param #SET_UNIT self
|
||||||
-- @param #string Prefixes The prefix of which the unit name starts with.
|
-- @param #string Prefixes The string pattern(s) that needs to be contained in the unit name. Can also be passed as a `#table` of strings.
|
||||||
-- @return #SET_UNIT self
|
-- @return #SET_UNIT self
|
||||||
function SET_UNIT:FilterPrefixes( Prefixes )
|
function SET_UNIT:FilterPrefixes( Prefixes )
|
||||||
if not self.Filter.UnitPrefixes then
|
if not self.Filter.UnitPrefixes then
|
||||||
@@ -2963,7 +2963,7 @@ do -- SET_STATIC
|
|||||||
-- * @{#SET_STATIC.FilterCategories}: Builds the SET_STATIC with the units belonging to the category(ies).
|
-- * @{#SET_STATIC.FilterCategories}: Builds the SET_STATIC with the units belonging to the category(ies).
|
||||||
-- * @{#SET_STATIC.FilterTypes}: Builds the SET_STATIC with the units belonging to the unit type(s).
|
-- * @{#SET_STATIC.FilterTypes}: Builds the SET_STATIC with the units belonging to the unit type(s).
|
||||||
-- * @{#SET_STATIC.FilterCountries}: Builds the SET_STATIC with the units belonging to the country(ies).
|
-- * @{#SET_STATIC.FilterCountries}: Builds the SET_STATIC with the units belonging to the country(ies).
|
||||||
-- * @{#SET_STATIC.FilterPrefixes}: Builds the SET_STATIC with the units starting with the same prefix string(s).
|
-- * @{#SET_STATIC.FilterPrefixes}: Builds the SET_STATIC with the units containing the same string(s) in their name. **ATTENTION** bad naming convention as this *does not** only filter *prefixes*.
|
||||||
--
|
--
|
||||||
-- Once the filter criteria have been set for the SET_STATIC, you can start filtering using:
|
-- Once the filter criteria have been set for the SET_STATIC, you can start filtering using:
|
||||||
--
|
--
|
||||||
@@ -3176,10 +3176,10 @@ do -- SET_STATIC
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Builds a set of units of defined unit prefixes.
|
--- Builds a set of STATICs that contain the given string in their name.
|
||||||
-- All the units starting with the given prefixes will be included within the set.
|
-- **Attention!** Bad naming convention as this **does not** filter only **prefixes** but all statics that **contain** the string.
|
||||||
-- @param #SET_STATIC self
|
-- @param #SET_STATIC self
|
||||||
-- @param #string Prefixes The prefix of which the unit name starts with.
|
-- @param #string Prefixes The string pattern(s) that need to be contained in the static name. Can also be passed as a `#table` of strings.
|
||||||
-- @return #SET_STATIC self
|
-- @return #SET_STATIC self
|
||||||
function SET_STATIC:FilterPrefixes( Prefixes )
|
function SET_STATIC:FilterPrefixes( Prefixes )
|
||||||
if not self.Filter.StaticPrefixes then
|
if not self.Filter.StaticPrefixes then
|
||||||
@@ -3267,7 +3267,7 @@ do -- SET_STATIC
|
|||||||
-- @param #SET_STATIC self
|
-- @param #SET_STATIC self
|
||||||
-- @param Core.Zone#ZONE Zone The Zone to be tested for.
|
-- @param Core.Zone#ZONE Zone The Zone to be tested for.
|
||||||
-- @return #boolean
|
-- @return #boolean
|
||||||
function SET_STATIC:IsPatriallyInZone( Zone )
|
function SET_STATIC:IsPartiallyInZone( Zone )
|
||||||
|
|
||||||
local IsPartiallyInZone = false
|
local IsPartiallyInZone = false
|
||||||
|
|
||||||
@@ -3675,7 +3675,7 @@ do -- SET_CLIENT
|
|||||||
-- * @{#SET_CLIENT.FilterCategories}: Builds the SET_CLIENT with the clients belonging to the category(ies).
|
-- * @{#SET_CLIENT.FilterCategories}: Builds the SET_CLIENT with the clients belonging to the category(ies).
|
||||||
-- * @{#SET_CLIENT.FilterTypes}: Builds the SET_CLIENT with the clients belonging to the client type(s).
|
-- * @{#SET_CLIENT.FilterTypes}: Builds the SET_CLIENT with the clients belonging to the client type(s).
|
||||||
-- * @{#SET_CLIENT.FilterCountries}: Builds the SET_CLIENT with the clients belonging to the country(ies).
|
-- * @{#SET_CLIENT.FilterCountries}: Builds the SET_CLIENT with the clients belonging to the country(ies).
|
||||||
-- * @{#SET_CLIENT.FilterPrefixes}: Builds the SET_CLIENT with the clients starting with the same prefix string(s).
|
-- * @{#SET_CLIENT.FilterPrefixes}: Builds the SET_CLIENT with the clients containing the same string(s) in their unit/pilot name. **ATTENTION!** Bad naming convention as this *does not* only filter *prefixes*.
|
||||||
-- * @{#SET_CLIENT.FilterActive}: Builds the SET_CLIENT with the units that are only active. Units that are inactive (late activation) won't be included in the set!
|
-- * @{#SET_CLIENT.FilterActive}: Builds the SET_CLIENT with the units that are only active. Units that are inactive (late activation) won't be included in the set!
|
||||||
--
|
--
|
||||||
-- Once the filter criteria have been set for the SET_CLIENT, you can start filtering using:
|
-- Once the filter criteria have been set for the SET_CLIENT, you can start filtering using:
|
||||||
@@ -3858,10 +3858,10 @@ do -- SET_CLIENT
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Builds a set of clients of defined client prefixes.
|
--- Builds a set of CLIENTs that contain the given string in their unit/pilot name.
|
||||||
-- All the clients starting with the given prefixes will be included within the set.
|
-- **Attention!** Bad naming convention as this **does not** filter only **prefixes** but all clients that **contain** the string.
|
||||||
-- @param #SET_CLIENT self
|
-- @param #SET_CLIENT self
|
||||||
-- @param #string Prefixes The prefix of which the client name starts with.
|
-- @param #string Prefixes The string pattern(s) that needs to be contained in the unit/pilot name. Can also be passed as a `#table` of strings.
|
||||||
-- @return #SET_CLIENT self
|
-- @return #SET_CLIENT self
|
||||||
function SET_CLIENT:FilterPrefixes( Prefixes )
|
function SET_CLIENT:FilterPrefixes( Prefixes )
|
||||||
if not self.Filter.ClientPrefixes then
|
if not self.Filter.ClientPrefixes then
|
||||||
@@ -4114,7 +4114,7 @@ do -- SET_PLAYER
|
|||||||
-- * @{#SET_PLAYER.FilterCategories}: Builds the SET_PLAYER with the clients belonging to the category(ies).
|
-- * @{#SET_PLAYER.FilterCategories}: Builds the SET_PLAYER with the clients belonging to the category(ies).
|
||||||
-- * @{#SET_PLAYER.FilterTypes}: Builds the SET_PLAYER with the clients belonging to the client type(s).
|
-- * @{#SET_PLAYER.FilterTypes}: Builds the SET_PLAYER with the clients belonging to the client type(s).
|
||||||
-- * @{#SET_PLAYER.FilterCountries}: Builds the SET_PLAYER with the clients belonging to the country(ies).
|
-- * @{#SET_PLAYER.FilterCountries}: Builds the SET_PLAYER with the clients belonging to the country(ies).
|
||||||
-- * @{#SET_PLAYER.FilterPrefixes}: Builds the SET_PLAYER with the clients starting with the same prefix string(s).
|
-- * @{#SET_PLAYER.FilterPrefixes}: Builds the SET_PLAYER with the clients sharing the same string(s) in their unit/pilot name. **ATTENTION** Bad naming convention as this *does not* only filter prefixes.
|
||||||
--
|
--
|
||||||
-- Once the filter criteria have been set for the SET_PLAYER, you can start filtering using:
|
-- Once the filter criteria have been set for the SET_PLAYER, you can start filtering using:
|
||||||
--
|
--
|
||||||
@@ -4293,10 +4293,10 @@ do -- SET_PLAYER
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Builds a set of clients of defined client prefixes.
|
--- Builds a set of PLAYERs that contain the given string in their unit/pilot name.
|
||||||
-- All the clients starting with the given prefixes will be included within the set.
|
-- **Attention!** Bad naming convention as this **does not** filter only **prefixes** but all player clients that **contain** the string.
|
||||||
-- @param #SET_PLAYER self
|
-- @param #SET_PLAYER self
|
||||||
-- @param #string Prefixes The prefix of which the client name starts with.
|
-- @param #string Prefixes The string pattern(s) that needs to be contained in the unit/pilot name. Can also be passed as a `#table` of strings.
|
||||||
-- @return #SET_PLAYER self
|
-- @return #SET_PLAYER self
|
||||||
function SET_PLAYER:FilterPrefixes( Prefixes )
|
function SET_PLAYER:FilterPrefixes( Prefixes )
|
||||||
if not self.Filter.ClientPrefixes then
|
if not self.Filter.ClientPrefixes then
|
||||||
@@ -4874,7 +4874,7 @@ do -- SET_CARGO
|
|||||||
-- Filter criteria are defined by:
|
-- Filter criteria are defined by:
|
||||||
--
|
--
|
||||||
-- * @{#SET_CARGO.FilterCoalitions}: Builds the SET_CARGO with the cargos belonging to the coalition(s).
|
-- * @{#SET_CARGO.FilterCoalitions}: Builds the SET_CARGO with the cargos belonging to the coalition(s).
|
||||||
-- * @{#SET_CARGO.FilterPrefixes}: Builds the SET_CARGO with the cargos containing the prefix string(s).
|
-- * @{#SET_CARGO.FilterPrefixes}: Builds the SET_CARGO with the cargos containing the same string(s). **ATTENTION** Bad naming convention as this *does not* only filter *prefixes*.
|
||||||
-- * @{#SET_CARGO.FilterTypes}: Builds the SET_CARGO with the cargos belonging to the cargo type(s).
|
-- * @{#SET_CARGO.FilterTypes}: Builds the SET_CARGO with the cargos belonging to the cargo type(s).
|
||||||
-- * @{#SET_CARGO.FilterCountries}: Builds the SET_CARGO with the cargos belonging to the country(ies).
|
-- * @{#SET_CARGO.FilterCountries}: Builds the SET_CARGO with the cargos belonging to the country(ies).
|
||||||
--
|
--
|
||||||
@@ -5036,10 +5036,10 @@ do -- SET_CARGO
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--- (R2.1) Builds a set of cargos of defined cargo prefixes.
|
--- Builds a set of CARGOs that contain a given string in their name.
|
||||||
-- All the cargos starting with the given prefixes will be included within the set.
|
-- **Attention!** Bad naming convention as this **does not** filter only **prefixes** but all cargos that **contain** the string.
|
||||||
-- @param #SET_CARGO self
|
-- @param #SET_CARGO self
|
||||||
-- @param #string Prefixes The prefix of which the cargo name starts with.
|
-- @param #string Prefixes The string pattern(s) that need to be in the cargo name. Can also be passed as a `#table` of strings.
|
||||||
-- @return #SET_CARGO self
|
-- @return #SET_CARGO self
|
||||||
function SET_CARGO:FilterPrefixes( Prefixes ) --R2.1
|
function SET_CARGO:FilterPrefixes( Prefixes ) --R2.1
|
||||||
if not self.Filter.CargoPrefixes then
|
if not self.Filter.CargoPrefixes then
|
||||||
@@ -5315,7 +5315,7 @@ do -- SET_ZONE
|
|||||||
-- You can set filter criteria to build the collection of zones in SET_ZONE.
|
-- You can set filter criteria to build the collection of zones in SET_ZONE.
|
||||||
-- Filter criteria are defined by:
|
-- Filter criteria are defined by:
|
||||||
--
|
--
|
||||||
-- * @{#SET_ZONE.FilterPrefixes}: Builds the SET_ZONE with the zones having a certain text pattern of prefix.
|
-- * @{#SET_ZONE.FilterPrefixes}: Builds the SET_ZONE with the zones having a certain text pattern in their name. **ATTENTION!** Bad naming convention as this *does not* only filter *prefixes*.
|
||||||
--
|
--
|
||||||
-- Once the filter criteria have been set for the SET_ZONE, you can start filtering using:
|
-- Once the filter criteria have been set for the SET_ZONE, you can start filtering using:
|
||||||
--
|
--
|
||||||
@@ -5450,10 +5450,10 @@ do -- SET_ZONE
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
--- Builds a set of zones of defined zone prefixes.
|
--- Builds a set of ZONEs that contain the given string in their name.
|
||||||
-- All the zones starting with the given prefixes will be included within the set.
|
-- **ATTENTION!** Bad naming convention as this **does not** filter only **prefixes** but all zones that **contain** the string.
|
||||||
-- @param #SET_ZONE self
|
-- @param #SET_ZONE self
|
||||||
-- @param #string Prefixes The prefix of which the zone name starts with.
|
-- @param #string Prefixes The string pattern(s) that need to be contained in the zone name. Can also be passed as a `#table` of strings.
|
||||||
-- @return #SET_ZONE self
|
-- @return #SET_ZONE self
|
||||||
function SET_ZONE:FilterPrefixes( Prefixes )
|
function SET_ZONE:FilterPrefixes( Prefixes )
|
||||||
if not self.Filter.Prefixes then
|
if not self.Filter.Prefixes then
|
||||||
@@ -5652,7 +5652,7 @@ do -- SET_ZONE_GOAL
|
|||||||
-- You can set filter criteria to build the collection of zones in SET_ZONE_GOAL.
|
-- You can set filter criteria to build the collection of zones in SET_ZONE_GOAL.
|
||||||
-- Filter criteria are defined by:
|
-- Filter criteria are defined by:
|
||||||
--
|
--
|
||||||
-- * @{#SET_ZONE_GOAL.FilterPrefixes}: Builds the SET_ZONE_GOAL with the zones having a certain text pattern of prefix.
|
-- * @{#SET_ZONE_GOAL.FilterPrefixes}: Builds the SET_ZONE_GOAL with the zones having a certain text pattern in their name. **ATTENTION!** Bad naming convention as this *does not* only filter *prefixes*.
|
||||||
--
|
--
|
||||||
-- Once the filter criteria have been set for the SET_ZONE_GOAL, you can start filtering using:
|
-- Once the filter criteria have been set for the SET_ZONE_GOAL, you can start filtering using:
|
||||||
--
|
--
|
||||||
@@ -5768,10 +5768,10 @@ do -- SET_ZONE_GOAL
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
--- Builds a set of zones of defined zone prefixes.
|
--- Builds a set of ZONE_GOALs that contain the given string in their name.
|
||||||
-- All the zones starting with the given prefixes will be included within the set.
|
-- **ATTENTION!** Bad naming convention as this **does not** filter only **prefixes** but all zones that **contain** the string.
|
||||||
-- @param #SET_ZONE_GOAL self
|
-- @param #SET_ZONE_GOAL self
|
||||||
-- @param #string Prefixes The prefix of which the zone name starts with.
|
-- @param #string Prefixes The string pattern(s) that needs to be contained in the zone name. Can also be passed as a `#table` of strings.
|
||||||
-- @return #SET_ZONE_GOAL self
|
-- @return #SET_ZONE_GOAL self
|
||||||
function SET_ZONE_GOAL:FilterPrefixes( Prefixes )
|
function SET_ZONE_GOAL:FilterPrefixes( Prefixes )
|
||||||
if not self.Filter.Prefixes then
|
if not self.Filter.Prefixes then
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -295,6 +295,17 @@ do -- country
|
|||||||
-- @field QATAR
|
-- @field QATAR
|
||||||
-- @field OMAN
|
-- @field OMAN
|
||||||
-- @field UNITED_ARAB_EMIRATES
|
-- @field UNITED_ARAB_EMIRATES
|
||||||
|
-- @field SOUTH_AFRICA
|
||||||
|
-- @field CUBA
|
||||||
|
-- @field PORTUGAL
|
||||||
|
-- @field GDR
|
||||||
|
-- @field LEBANON
|
||||||
|
-- @field CJTF_BLUE
|
||||||
|
-- @field CJTF_RED
|
||||||
|
-- @field UN_PEACEKEEPERS
|
||||||
|
-- @field Argentinia
|
||||||
|
-- @field Cyprus
|
||||||
|
-- @field Slovenia
|
||||||
|
|
||||||
country = {} --#country
|
country = {} --#country
|
||||||
|
|
||||||
@@ -736,7 +747,66 @@ do -- Airbase
|
|||||||
|
|
||||||
end -- Airbase
|
end -- Airbase
|
||||||
|
|
||||||
|
do -- Spot
|
||||||
|
|
||||||
|
--- [DCS Class Spot](https://wiki.hoggitworld.com/view/DCS_Class_Spot)
|
||||||
|
-- Represents a spot from laser or IR-pointer.
|
||||||
|
-- @type Spot
|
||||||
|
-- @field #Spot.Category Category enum that stores spot categories.
|
||||||
|
|
||||||
|
--- Enum that stores spot categories.
|
||||||
|
-- @type Spot.Category
|
||||||
|
-- @field #string INFRA_RED
|
||||||
|
-- @field #string LASER
|
||||||
|
|
||||||
|
|
||||||
|
--- Creates a laser ray emanating from the given object to a point in 3d space.
|
||||||
|
-- @function [parent=#Spot] createLaser
|
||||||
|
-- @param DCS#Object Source The source object of the laser.
|
||||||
|
-- @param DCS#Vec3 LocalRef An optional 3D offset for the source.
|
||||||
|
-- @param DCS#Vec3 Vec3 Target coordinate where the ray is pointing at.
|
||||||
|
-- @param #number LaserCode Any 4 digit number between 1111 and 1788.
|
||||||
|
-- @return #Spot
|
||||||
|
|
||||||
|
--- Creates an infrared ray emanating from the given object to a point in 3d space. Can be seen with night vision goggles.
|
||||||
|
-- @function [parent=#Spot] createInfraRed
|
||||||
|
-- @param DCS#Object Source Source position of the IR ray.
|
||||||
|
-- @param DCS#Vec3 LocalRef An optional 3D offset for the source.
|
||||||
|
-- @param DCS#Vec3 Vec3 Target coordinate where the ray is pointing at.
|
||||||
|
-- @return #Spot
|
||||||
|
|
||||||
|
--- Returns a vec3 table of the x, y, and z coordinates for the position of the given object in 3D space. Coordinates are dependent on the position of the maps origin.
|
||||||
|
-- @function [parent=#Spot] getPoint
|
||||||
|
-- @param #Spot self
|
||||||
|
-- @return DCS#Vec3 Point in 3D, where the beam is pointing at.
|
||||||
|
|
||||||
|
--- Sets the destination point from which the source of the spot is drawn toward.
|
||||||
|
-- @function [parent=#Spot] setPoint
|
||||||
|
-- @param #Spot self
|
||||||
|
-- @param DCS#Vec3 Vec3 Point in 3D, where the beam is pointing at.
|
||||||
|
|
||||||
|
--- Returns the number that is used to define the laser code for which laser designation can track.
|
||||||
|
-- @function [parent=#Spot] getCode
|
||||||
|
-- @param #Spot self
|
||||||
|
-- @return #number Code The laser code used.
|
||||||
|
|
||||||
|
--- Sets the number that is used to define the laser code for which laser designation can track.
|
||||||
|
-- @function [parent=#Spot] setCode
|
||||||
|
-- @param #Spot self
|
||||||
|
-- @param #number Code The laser code. Default value is 1688.
|
||||||
|
|
||||||
|
--- Destroys the spot.
|
||||||
|
-- @function [parent=#Spot] destroy
|
||||||
|
-- @param #Spot self
|
||||||
|
|
||||||
|
--- Gets the category of the spot (laser or IR).
|
||||||
|
-- @function [parent=#Spot] getCategory
|
||||||
|
-- @param #Spot self
|
||||||
|
-- @return #string Category.
|
||||||
|
|
||||||
|
Spot = {} --#Spot
|
||||||
|
|
||||||
|
end -- Spot
|
||||||
|
|
||||||
do -- Controller
|
do -- Controller
|
||||||
--- Controller is an object that performs A.I.-routines. Other words controller is an instance of A.I.. Controller stores current main task, active enroute tasks and behavior options. Controller performs commands. Please, read DCS A-10C GUI Manual EN.pdf chapter "Task Planning for Unit Groups", page 91 to understand A.I. system of DCS:A-10C.
|
--- Controller is an object that performs A.I.-routines. Other words controller is an instance of A.I.. Controller stores current main task, active enroute tasks and behavior options. Controller performs commands. Please, read DCS A-10C GUI Manual EN.pdf chapter "Task Planning for Unit Groups", page 91 to understand A.I. system of DCS:A-10C.
|
||||||
@@ -1093,6 +1163,10 @@ do -- Unit
|
|||||||
-- @param #Unit self
|
-- @param #Unit self
|
||||||
-- @return #Unit.Desc
|
-- @return #Unit.Desc
|
||||||
|
|
||||||
|
--- GROUND - Switch on/off radar emissions
|
||||||
|
-- @function [parent=#Unit] enableEmission
|
||||||
|
-- @param #Unit self
|
||||||
|
-- @param #boolean switch
|
||||||
|
|
||||||
Unit = {} --#Unit
|
Unit = {} --#Unit
|
||||||
|
|
||||||
@@ -1163,7 +1237,7 @@ do -- Group
|
|||||||
-- @param #Group self
|
-- @param #Group self
|
||||||
-- @return #number
|
-- @return #number
|
||||||
|
|
||||||
--- Returns initial size of the group. If some of the units will be destroyed, initial size of the group will not be changed. Initial size limits the unitNumber parameter for Group.getUnit() function.
|
--- Returns initial size of the group. If some of the units will be destroyed, initial size of the group will not be changed; Initial size limits the unitNumber parameter for Group.getUnit() function.
|
||||||
-- @function [parent=#Group] getInitialSize
|
-- @function [parent=#Group] getInitialSize
|
||||||
-- @param #Group self
|
-- @param #Group self
|
||||||
-- @return #number
|
-- @return #number
|
||||||
@@ -1178,6 +1252,11 @@ do -- Group
|
|||||||
-- @param #Group self
|
-- @param #Group self
|
||||||
-- @return #Controller
|
-- @return #Controller
|
||||||
|
|
||||||
|
--- GROUND - Switch on/off radar emissions
|
||||||
|
-- @function [parent=#Group] enableEmission
|
||||||
|
-- @param #Group self
|
||||||
|
-- @param #boolean switch
|
||||||
|
|
||||||
Group = {} --#Group
|
Group = {} --#Group
|
||||||
|
|
||||||
end -- Group
|
end -- Group
|
||||||
@@ -1393,4 +1472,4 @@ do -- AI
|
|||||||
|
|
||||||
AI = {} --#AI
|
AI = {} --#AI
|
||||||
|
|
||||||
end -- AI
|
end -- AI
|
||||||
|
|||||||
@@ -1001,7 +1001,13 @@ do -- DESIGNATE
|
|||||||
local ID = self.Detection:GetDetectedItemID( DetectedItem )
|
local ID = self.Detection:GetDetectedItemID( DetectedItem )
|
||||||
local MenuText = ID --.. ", " .. Coord:ToStringA2G( AttackGroup )
|
local MenuText = ID --.. ", " .. Coord:ToStringA2G( AttackGroup )
|
||||||
|
|
||||||
MenuText = string.format( "(%3s) %s", Designating, MenuText )
|
-- Use injected MenuName from TaskA2GDispatcher if using same Detection Object
|
||||||
|
if DetectedItem.DesignateMenuName then
|
||||||
|
MenuText = string.format( "(%3s) %s", Designating, DetectedItem.DesignateMenuName )
|
||||||
|
else
|
||||||
|
MenuText = string.format( "(%3s) %s", Designating, MenuText )
|
||||||
|
end
|
||||||
|
|
||||||
local DetectedMenu = MENU_GROUP_DELAYED:New( AttackGroup, MenuText, MenuDesignate ):SetTime( MenuTime ):SetTag( self.DesignateName )
|
local DetectedMenu = MENU_GROUP_DELAYED:New( AttackGroup, MenuText, MenuDesignate ):SetTime( MenuTime ):SetTag( self.DesignateName )
|
||||||
|
|
||||||
-- Build the Lasing menu.
|
-- Build the Lasing menu.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
--- **Functional** -- Modular, Automatic and Network capable Targeting and Interception System for Air Defenses
|
--- **Functional** -- Modular, Automatic and Network capable Targeting and Interception System for Air Defenses
|
||||||
--
|
--
|
||||||
-- ===
|
-- ===
|
||||||
--
|
--
|
||||||
@@ -20,24 +20,24 @@
|
|||||||
-- @module Functional.Mantis
|
-- @module Functional.Mantis
|
||||||
-- @image Functional.Mantis.jpg
|
-- @image Functional.Mantis.jpg
|
||||||
|
|
||||||
-- Date: Jan 2021
|
-- Date: Apr 2021
|
||||||
|
|
||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
--- **MANTIS** class, extends @{#Core.Base#BASE}
|
--- **MANTIS** class, extends #Core.Base#BASE
|
||||||
-- @type MANTIS #MANTIS
|
-- @type MANTIS
|
||||||
-- @field #string Classname
|
-- @field #string Classname
|
||||||
-- @field #string name Name of this Mantis
|
-- @field #string name Name of this Mantis
|
||||||
-- @field #string SAM_Templates_Prefix Prefix to build the #GROUP_SET for SAM sites
|
-- @field #string SAM_Templates_Prefix Prefix to build the #SET_GROUP for SAM sites
|
||||||
-- @field @{#Core.Set#GROUP_SET} SAM_Group The SAM #GROUP_SET
|
-- @field Core.Set#SET_GROUP SAM_Group The SAM #SET_GROUP
|
||||||
-- @field #string EWR_Templates_Prefix Prefix to build the #GROUP_SET for EWR group
|
-- @field #string EWR_Templates_Prefix Prefix to build the #SET_GROUP for EWR group
|
||||||
-- @field @{#Core.Set#GROUP_SET} EWR_Group The EWR #GROUP_SET
|
-- @field Core.Set#SET_GROUP EWR_Group The EWR #SET_GROUP
|
||||||
-- @field @{#Core.Set#GROUP_SET} Adv_EWR_Group The EWR #GROUP_SET used for advanced mode
|
-- @field Core.Set#SET_GROUP Adv_EWR_Group The EWR #SET_GROUP used for advanced mode
|
||||||
-- @field #string HQ_Template_CC The ME name of the HQ object
|
-- @field #string HQ_Template_CC The ME name of the HQ object
|
||||||
-- @field @{#Wrapper.Group#GROUP} HQ_CC The #GROUP object of the HQ
|
-- @field Wrapper.Group#GROUP HQ_CC The #GROUP object of the HQ
|
||||||
-- @field #table SAM_Table Table of SAM sites
|
-- @field #table SAM_Table Table of SAM sites
|
||||||
-- @field #string lid Prefix for logging
|
-- @field #string lid Prefix for logging
|
||||||
-- @field @{#Functional.Detection#DETECTION_AREAS} Detection The #DETECTION_AREAS object for EWR
|
-- @field Functional.Detection#DETECTION_AREAS Detection The #DETECTION_AREAS object for EWR
|
||||||
-- @field @{Functional.Detection#DETECTION_AREAS} AWACS_Detection The #DETECTION_AREAS object for AWACS
|
-- @field Functional.Detection#DETECTION_AREAS AWACS_Detection The #DETECTION_AREAS object for AWACS
|
||||||
-- @field #boolean debug Switch on extra messages
|
-- @field #boolean debug Switch on extra messages
|
||||||
-- @field #boolean verbose Switch on extra logging
|
-- @field #boolean verbose Switch on extra logging
|
||||||
-- @field #number checkradius Radius of the SAM sites
|
-- @field #number checkradius Radius of the SAM sites
|
||||||
@@ -51,7 +51,12 @@
|
|||||||
-- @field #number adv_state Advanced mode state tracker
|
-- @field #number adv_state Advanced mode state tracker
|
||||||
-- @field #boolean advAwacs Boolean switch to use Awacs as a separate detection stream
|
-- @field #boolean advAwacs Boolean switch to use Awacs as a separate detection stream
|
||||||
-- @field #number awacsrange Detection range of an optional Awacs unit
|
-- @field #number awacsrange Detection range of an optional Awacs unit
|
||||||
-- @extends @{#Core.Base#BASE}
|
-- @field #boolean UseEmOnOff Decide if we are using Emissions on/off (true) or AlarmState red/green (default)
|
||||||
|
-- @field Functional.Shorad#SHORAD Shorad SHORAD Object, if available
|
||||||
|
-- @field #boolean ShoradLink If true, #MANTIS has #SHORAD enabled
|
||||||
|
-- @field #number ShoradTime Timer in seconds, how long #SHORAD will be active after a detection inside of the defense range
|
||||||
|
-- @field #number ShoradActDistance Distance of an attacker in meters from a Mantis SAM site, on which Shorad will be switched on. Useful to not give away Shorad sites too early. Default 15km. Should be smaller than checkradius.
|
||||||
|
-- @extends Core.Base#BASE
|
||||||
|
|
||||||
|
|
||||||
--- *The worst thing that can happen to a good cause is, not to be skillfully attacked, but to be ineptly defended.* - Frédéric Bastiat
|
--- *The worst thing that can happen to a good cause is, not to be skillfully attacked, but to be ineptly defended.* - Frédéric Bastiat
|
||||||
@@ -96,7 +101,7 @@
|
|||||||
--
|
--
|
||||||
-- # 2. Start up your MANTIS with a basic setting
|
-- # 2. Start up your MANTIS with a basic setting
|
||||||
--
|
--
|
||||||
-- `myredmantis = MANTIS:New("myredmantis","Red SAM","Red EWR",nil,"red",false)`
|
-- `myredmantis = MANTIS:New("myredmantis","Red SAM","Red EWR",nil,"red",false)`
|
||||||
-- `myredmantis:Start()`
|
-- `myredmantis:Start()`
|
||||||
--
|
--
|
||||||
-- [optional] Use
|
-- [optional] Use
|
||||||
@@ -111,7 +116,7 @@
|
|||||||
--
|
--
|
||||||
-- If you want to use a separate AWACS unit (default detection range: 250km) to support your EWR system, use e.g. the following setup:
|
-- If you want to use a separate AWACS unit (default detection range: 250km) to support your EWR system, use e.g. the following setup:
|
||||||
--
|
--
|
||||||
-- `mybluemantis = MANTIS:New("bluemantis","Blue SAM","Blue EWR",nil,"blue",false,"Blue Awacs")`
|
-- `mybluemantis = MANTIS:New("bluemantis","Blue SAM","Blue EWR",nil,"blue",false,"Blue Awacs")`
|
||||||
-- `mybluemantis:Start()`
|
-- `mybluemantis:Start()`
|
||||||
--
|
--
|
||||||
-- # 3. Default settings
|
-- # 3. Default settings
|
||||||
@@ -124,7 +129,7 @@
|
|||||||
-- * grouping = 5000 (meters) - Detection (EWR) will group enemy flights to areas of 5km for tracking - `MANTIS:SetEWRGrouping(radius)`
|
-- * grouping = 5000 (meters) - Detection (EWR) will group enemy flights to areas of 5km for tracking - `MANTIS:SetEWRGrouping(radius)`
|
||||||
-- * acceptrange = 80000 (meters) - Detection (EWR) will on consider flights inside a 80km radius - `MANTIS:SetEWRRange(radius)`
|
-- * acceptrange = 80000 (meters) - Detection (EWR) will on consider flights inside a 80km radius - `MANTIS:SetEWRRange(radius)`
|
||||||
-- * detectinterval = 30 (seconds) - MANTIS will decide every 30 seconds which SAM to activate - `MANTIS:SetDetectInterval(interval)`
|
-- * detectinterval = 30 (seconds) - MANTIS will decide every 30 seconds which SAM to activate - `MANTIS:SetDetectInterval(interval)`
|
||||||
-- * engagerange = 75 (percent) - SAMs will only fire if flights are inside of a 75% radius of their max firerange - `MANTIS:SetSAMRange(range)`
|
-- * engagerange = 85 (percent) - SAMs will only fire if flights are inside of a 85% radius of their max firerange - `MANTIS:SetSAMRange(range)`
|
||||||
-- * dynamic = false - Group filtering is set to once, i.e. newly added groups will not be part of the setup by default - `MANTIS:New(name,samprefix,ewrprefix,hq,coaltion,dynamic)`
|
-- * dynamic = false - Group filtering is set to once, i.e. newly added groups will not be part of the setup by default - `MANTIS:New(name,samprefix,ewrprefix,hq,coaltion,dynamic)`
|
||||||
-- * autorelocate = false - HQ and (mobile) EWR system will not relocate in random intervals between 30mins and 1 hour - `MANTIS:SetAutoRelocate(hq, ewr)`
|
-- * autorelocate = false - HQ and (mobile) EWR system will not relocate in random intervals between 30mins and 1 hour - `MANTIS:SetAutoRelocate(hq, ewr)`
|
||||||
-- * debug = false - Debugging reports on screen are set to off - `MANTIS:Debug(onoff)`
|
-- * debug = false - Debugging reports on screen are set to off - `MANTIS:Debug(onoff)`
|
||||||
@@ -132,8 +137,26 @@
|
|||||||
-- # 4. Advanced Mode
|
-- # 4. Advanced Mode
|
||||||
--
|
--
|
||||||
-- Advanced mode will *decrease* reactivity of MANTIS, if HQ and/or EWR network dies. Awacs is counted as one EWR unit. It will set SAMs to RED state if both are dead. Requires usage of an **HQ** object and the **dynamic** option.
|
-- Advanced mode will *decrease* reactivity of MANTIS, if HQ and/or EWR network dies. Awacs is counted as one EWR unit. It will set SAMs to RED state if both are dead. Requires usage of an **HQ** object and the **dynamic** option.
|
||||||
-- E.g. `mymantis:SetAdvancedMode( true, 90 )`
|
--
|
||||||
|
-- E.g. `mymantis:SetAdvancedMode( true, 90 )`
|
||||||
|
--
|
||||||
-- Use this option if you want to make use of or allow advanced SEAD tactics.
|
-- Use this option if you want to make use of or allow advanced SEAD tactics.
|
||||||
|
--
|
||||||
|
-- # 5. Integrate SHORAD
|
||||||
|
--
|
||||||
|
-- You can also choose to integrate Mantis with @{Functional.Shorad#SHORAD} for protection against HARMs and AGMs. When SHORAD detects a missile fired at one of MANTIS' SAM sites, it will activate SHORAD systems in
|
||||||
|
-- the given defense checkradius around that SAM site. Create a SHORAD object first, then integrate with MANTIS like so:
|
||||||
|
--
|
||||||
|
-- `local SamSet = SET_GROUP:New():FilterPrefixes("Blue SAM"):FilterCoalitions("blue"):FilterStart()`
|
||||||
|
-- `myshorad = SHORAD:New("BlueShorad", "Blue SHORAD", SamSet, 22000, 600, "blue")`
|
||||||
|
-- `-- now set up MANTIS`
|
||||||
|
-- `mymantis = MANTIS:New("BlueMantis","Blue SAM","Blue EWR",nil,"blue",false,"Blue Awacs")`
|
||||||
|
-- `mymantis:AddShorad(myshorad,720)`
|
||||||
|
-- `mymantis:Start()`
|
||||||
|
--
|
||||||
|
-- and (optionally) remove the link later on with
|
||||||
|
--
|
||||||
|
-- `mymantis:RemoveShorad()`
|
||||||
--
|
--
|
||||||
-- @field #MANTIS
|
-- @field #MANTIS
|
||||||
MANTIS = {
|
MANTIS = {
|
||||||
@@ -163,7 +186,12 @@ MANTIS = {
|
|||||||
AWACS_Prefix = "",
|
AWACS_Prefix = "",
|
||||||
advAwacs = false,
|
advAwacs = false,
|
||||||
verbose = false,
|
verbose = false,
|
||||||
awacsrange = 250000
|
awacsrange = 250000,
|
||||||
|
Shorad = nil,
|
||||||
|
ShoradLink = false,
|
||||||
|
ShoradTime = 600,
|
||||||
|
ShoradActDistance = 15000,
|
||||||
|
UseEmOnOff = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
@@ -180,8 +208,29 @@ do
|
|||||||
--@param #string coaltion Coalition side of your setup, e.g. "blue", "red" or "neutral"
|
--@param #string coaltion Coalition side of your setup, e.g. "blue", "red" or "neutral"
|
||||||
--@param #boolean dynamic Use constant (true) filtering or just filter once (false, default) (optional)
|
--@param #boolean dynamic Use constant (true) filtering or just filter once (false, default) (optional)
|
||||||
--@param #string awacs Group name of your Awacs (optional)
|
--@param #string awacs Group name of your Awacs (optional)
|
||||||
|
--@param #boolean EmOnOff Make MANTIS switch Emissions on and off instead of changing the alarm state between RED and GREEN (optional, deault true)
|
||||||
--@return #MANTIS self
|
--@return #MANTIS self
|
||||||
function MANTIS:New(name,samprefix,ewrprefix,hq,coaltion,dynamic,awacs)
|
--@usage Start up your MANTIS with a basic setting
|
||||||
|
--
|
||||||
|
-- `myredmantis = MANTIS:New("myredmantis","Red SAM","Red EWR",nil,"red",false)`
|
||||||
|
-- `myredmantis:Start()`
|
||||||
|
--
|
||||||
|
-- [optional] Use
|
||||||
|
--
|
||||||
|
-- * `MANTIS:SetEWRGrouping(radius)`
|
||||||
|
-- * `MANTIS:SetEWRRange(radius)`
|
||||||
|
-- * `MANTIS:SetSAMRadius(radius)`
|
||||||
|
-- * `MANTIS:SetDetectInterval(interval)`
|
||||||
|
-- * `MANTIS:SetAutoRelocate(hq, ewr)`
|
||||||
|
--
|
||||||
|
-- before starting #MANTIS to fine-tune your setup.
|
||||||
|
--
|
||||||
|
-- If you want to use a separate AWACS unit (default detection range: 250km) to support your EWR system, use e.g. the following setup:
|
||||||
|
--
|
||||||
|
-- `mybluemantis = MANTIS:New("bluemantis","Blue SAM","Blue EWR",nil,"blue",false,"Blue Awacs")`
|
||||||
|
-- `mybluemantis:Start()`
|
||||||
|
--
|
||||||
|
function MANTIS:New(name,samprefix,ewrprefix,hq,coaltion,dynamic,awacs, EmOnOff)
|
||||||
|
|
||||||
-- DONE: Create some user functions for these
|
-- DONE: Create some user functions for these
|
||||||
-- DONE: Make HQ useful
|
-- DONE: Make HQ useful
|
||||||
@@ -209,16 +258,26 @@ do
|
|||||||
self.verbose = false
|
self.verbose = false
|
||||||
self.Adv_EWR_Group = nil
|
self.Adv_EWR_Group = nil
|
||||||
self.AWACS_Prefix = awacs or nil
|
self.AWACS_Prefix = awacs or nil
|
||||||
self.awacsrange = 250000 --TODO: 250km, User Function to change
|
self.awacsrange = 250000 --DONE: 250km, User Function to change
|
||||||
|
self.Shorad = nil
|
||||||
|
self.ShoradLink = false
|
||||||
|
self.ShoradTime = 600
|
||||||
|
self.ShoradActDistance = 15000
|
||||||
|
-- TODO: add emissions on/off when available .... in 2 weeks
|
||||||
|
if EmOnOff then
|
||||||
|
if EmOnOff == false then
|
||||||
|
self.UseEmOnOff = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if type(awacs) == "string" then
|
if type(awacs) == "string" then
|
||||||
self.advAwacs = true
|
self.advAwacs = true
|
||||||
else
|
else
|
||||||
self.advAwacs = false
|
self.advAwacs = false
|
||||||
end
|
end
|
||||||
|
|
||||||
-- @field #string version
|
-- Inherit everything from BASE class.
|
||||||
self.version="0.3.6"
|
local self = BASE:Inherit(self, BASE:New()) -- #MANTIS
|
||||||
env.info(string.format("***** Starting MANTIS Version %s *****", self.version))
|
|
||||||
|
|
||||||
-- Set the string id for output to DCS.log file.
|
-- Set the string id for output to DCS.log file.
|
||||||
self.lid=string.format("MANTIS %s | ", self.name)
|
self.lid=string.format("MANTIS %s | ", self.name)
|
||||||
@@ -247,8 +306,10 @@ do
|
|||||||
if self.HQ_Template_CC then
|
if self.HQ_Template_CC then
|
||||||
self.HQ_CC = GROUP:FindByName(self.HQ_Template_CC)
|
self.HQ_CC = GROUP:FindByName(self.HQ_Template_CC)
|
||||||
end
|
end
|
||||||
-- Inherit everything from BASE class.
|
|
||||||
local self = BASE:Inherit(self, BASE:New()) -- #MANTIS
|
-- @field #string version
|
||||||
|
self.version="0.4.1"
|
||||||
|
self:I(string.format("***** Starting MANTIS Version %s *****", self.version))
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@@ -307,7 +368,7 @@ do
|
|||||||
self.engagerange = range
|
self.engagerange = range
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Function to set a new SAM firing engage range, use this method to adjust range while running MANTIS, e.g. for different setups day and night
|
--- Function to set a new SAM firing engage range, use this method to adjust range while running MANTIS, e.g. for different setups day and night
|
||||||
-- @param #MANTIS self
|
-- @param #MANTIS self
|
||||||
-- @param #number range Percent of the max fire range
|
-- @param #number range Percent of the max fire range
|
||||||
function MANTIS:SetNewSAMRangeWhileRunning(range)
|
function MANTIS:SetNewSAMRangeWhileRunning(range)
|
||||||
@@ -350,10 +411,18 @@ do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Function to set AWACS detection range. Defaults to 250.000m (250km) - use **before** starting your Mantis!
|
||||||
|
-- @param #MANTIS self
|
||||||
|
-- @param #number range Detection range of the AWACS group
|
||||||
|
function MANTIS:SetAwacsRange(range)
|
||||||
|
local range = range or 250000
|
||||||
|
self.awacsrange = range
|
||||||
|
end
|
||||||
|
|
||||||
--- Function to set the HQ object for further use
|
--- Function to set the HQ object for further use
|
||||||
-- @param #MANTIS self
|
-- @param #MANTIS self
|
||||||
-- @param Wrapper.GROUP#GROUP The HQ #GROUP object to be set as HQ
|
-- @param Wrapper.GROUP#GROUP group The #GROUP object to be set as HQ
|
||||||
function MANTIS:SetCommandCenter(group)
|
function MANTIS:SetCommandCenter(group)
|
||||||
local group = group or nil
|
local group = group or nil
|
||||||
if group ~= nil then
|
if group ~= nil then
|
||||||
@@ -398,6 +467,13 @@ do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Set using Emissions on/off instead of changing alarm state
|
||||||
|
-- @param #MANTIS self
|
||||||
|
-- @param #boolean switch Decide if we are changing alarm state or Emission state
|
||||||
|
function MANTIS:SetUsingEmOnOff(switch)
|
||||||
|
self.UseEmOnOff = switch or false
|
||||||
|
end
|
||||||
|
|
||||||
--- [Internal] Function to check if HQ is alive
|
--- [Internal] Function to check if HQ is alive
|
||||||
-- @param #MANTIS self
|
-- @param #MANTIS self
|
||||||
-- @return #boolean True if HQ is alive, else false
|
-- @return #boolean True if HQ is alive, else false
|
||||||
@@ -535,11 +611,12 @@ do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Function to check if any object is in the given SAM zone
|
--- (Internal) Function to check if any object is in the given SAM zone
|
||||||
-- @param #MANTIS self
|
-- @param #MANTIS self
|
||||||
-- @param #table dectset Table of coordinates of detected items
|
-- @param #table dectset Table of coordinates of detected items
|
||||||
-- @param samcoordinate Core.Point#COORDINATE Coordinate object.
|
-- @param samcoordinate Core.Point#COORDINATE Coordinate object.
|
||||||
-- @return #boolean True if in any zone, else false
|
-- @return #boolean True if in any zone, else false
|
||||||
|
-- @return #number Distance Target distance in meters or zero when no object is in zone
|
||||||
function MANTIS:CheckObjectInZone(dectset, samcoordinate)
|
function MANTIS:CheckObjectInZone(dectset, samcoordinate)
|
||||||
self:F(self.lid.."CheckObjectInZone Called")
|
self:F(self.lid.."CheckObjectInZone Called")
|
||||||
-- check if non of the coordinate is in the given defense zone
|
-- check if non of the coordinate is in the given defense zone
|
||||||
@@ -556,13 +633,13 @@ do
|
|||||||
if self.verbose then env.info(self.lid..text) end
|
if self.verbose then env.info(self.lid..text) end
|
||||||
-- end output to cross-check
|
-- end output to cross-check
|
||||||
if targetdistance <= radius then
|
if targetdistance <= radius then
|
||||||
return true
|
return true, targetdistance
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return false
|
return false, 0
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Function to start the detection via EWR groups
|
--- (Internal) Function to start the detection via EWR groups
|
||||||
-- @param #MANTIS self
|
-- @param #MANTIS self
|
||||||
-- @return Functional.Detection #DETECTION_AREAS The running detection set
|
-- @return Functional.Detection #DETECTION_AREAS The running detection set
|
||||||
function MANTIS:StartDetection()
|
function MANTIS:StartDetection()
|
||||||
@@ -593,7 +670,7 @@ do
|
|||||||
return _MANTISdetection
|
return _MANTISdetection
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Function to start the detection via AWACS if defined as separate
|
--- (Internal) Function to start the detection via AWACS if defined as separate
|
||||||
-- @param #MANTIS self
|
-- @param #MANTIS self
|
||||||
-- @return Functional.Detection #DETECTION_AREAS The running detection set
|
-- @return Functional.Detection #DETECTION_AREAS The running detection set
|
||||||
function MANTIS:StartAwacsDetection()
|
function MANTIS:StartAwacsDetection()
|
||||||
@@ -625,11 +702,11 @@ do
|
|||||||
return _MANTISAwacs
|
return _MANTISAwacs
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Function to set the SAM start state
|
--- (Internal) Function to set the SAM start state
|
||||||
-- @param #MANTIS self
|
-- @param #MANTIS self
|
||||||
-- @return #MANTIS self
|
-- @return #MANTIS self
|
||||||
function MANTIS:SetSAMStartState()
|
function MANTIS:SetSAMStartState()
|
||||||
-- TODO: if using dynamic filtering, update SAM_Table and the (active) SEAD groups, pull req #1405/#1406
|
-- DONE: if using dynamic filtering, update SAM_Table and the (active) SEAD groups, pull req #1405/#1406
|
||||||
self:F(self.lid.."Setting SAM Start States")
|
self:F(self.lid.."Setting SAM Start States")
|
||||||
-- get SAM Group
|
-- get SAM Group
|
||||||
local SAM_SET = self.SAM_Group
|
local SAM_SET = self.SAM_Group
|
||||||
@@ -640,7 +717,13 @@ do
|
|||||||
--cycle through groups and set alarm state etc
|
--cycle through groups and set alarm state etc
|
||||||
for _i,_group in pairs (SAM_Grps) do
|
for _i,_group in pairs (SAM_Grps) do
|
||||||
local group = _group
|
local group = _group
|
||||||
group:OptionAlarmStateGreen() -- AI off
|
-- TODO: add emissions on/off
|
||||||
|
if self.UseEmOnOff then
|
||||||
|
group:EnableEmission(false)
|
||||||
|
--group:SetAIOff()
|
||||||
|
else
|
||||||
|
group:OptionAlarmStateGreen() -- AI off
|
||||||
|
end
|
||||||
group:SetOption(AI.Option.Ground.id.AC_ENGAGEMENT_RANGE_RESTRICTION,engagerange) --default engagement will be 75% of firing range
|
group:SetOption(AI.Option.Ground.id.AC_ENGAGEMENT_RANGE_RESTRICTION,engagerange) --default engagement will be 75% of firing range
|
||||||
if group:IsGround() then
|
if group:IsGround() then
|
||||||
local grpname = group:GetName()
|
local grpname = group:GetName()
|
||||||
@@ -689,6 +772,27 @@ do
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Function to link up #MANTIS with a #SHORAD installation
|
||||||
|
-- @param #MANTIS self
|
||||||
|
-- @param Functional.Shorad#SHORAD Shorad The #SHORAD object
|
||||||
|
-- @param #number Shoradtime Number of seconds #SHORAD stays active post wake-up
|
||||||
|
function MANTIS:AddShorad(Shorad,Shoradtime)
|
||||||
|
local Shorad = Shorad or nil
|
||||||
|
local ShoradTime = Shoradtime or 600
|
||||||
|
local ShoradLink = true
|
||||||
|
if Shorad:IsInstanceOf("SHORAD") then
|
||||||
|
self.ShoradLink = ShoradLink
|
||||||
|
self.Shorad = Shorad --#SHORAD
|
||||||
|
self.ShoradTime = Shoradtime -- #number
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Function to unlink #MANTIS from a #SHORAD installation
|
||||||
|
-- @param #MANTIS self
|
||||||
|
function MANTIS:RemoveShorad()
|
||||||
|
self.ShoradLink = false
|
||||||
|
end
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
-- MANTIS main functions
|
-- MANTIS main functions
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
@@ -719,12 +823,25 @@ do
|
|||||||
local samcoordinate = _data[2]
|
local samcoordinate = _data[2]
|
||||||
local name = _data[1]
|
local name = _data[1]
|
||||||
local samgroup = GROUP:FindByName(name)
|
local samgroup = GROUP:FindByName(name)
|
||||||
if self:CheckObjectInZone(detset, samcoordinate) then --check any target in zone
|
local IsInZone, Distance = self:CheckObjectInZone(detset, samcoordinate)
|
||||||
|
if IsInZone then --check any target in zone
|
||||||
if samgroup:IsAlive() then
|
if samgroup:IsAlive() then
|
||||||
-- switch off SAM
|
-- switch on SAM
|
||||||
|
if self.UseEmOnOff then
|
||||||
|
-- TODO: add emissions on/off
|
||||||
|
--samgroup:SetAIOn()
|
||||||
|
samgroup:EnableEmission(true)
|
||||||
|
end
|
||||||
samgroup:OptionAlarmStateRed()
|
samgroup:OptionAlarmStateRed()
|
||||||
--samgroup:OptionROEWeaponFree()
|
-- link in to SHORAD if available
|
||||||
--samgroup:SetAIOn()
|
-- DONE: Test integration fully
|
||||||
|
if self.ShoradLink and Distance < self.ShoradActDistance then -- don't give SHORAD position away too early
|
||||||
|
local Shorad = self.Shorad
|
||||||
|
local radius = self.checkradius
|
||||||
|
local ontime = self.ShoradTime
|
||||||
|
Shorad:WakeUpShorad(name, radius, ontime)
|
||||||
|
end
|
||||||
|
-- debug output
|
||||||
local text = string.format("SAM %s switched to alarm state RED!", name)
|
local text = string.format("SAM %s switched to alarm state RED!", name)
|
||||||
local m=MESSAGE:New(text,10,"MANTIS"):ToAllIf(self.debug)
|
local m=MESSAGE:New(text,10,"MANTIS"):ToAllIf(self.debug)
|
||||||
if self.verbose then env.info(self.lid..text) end
|
if self.verbose then env.info(self.lid..text) end
|
||||||
@@ -732,7 +849,13 @@ do
|
|||||||
else
|
else
|
||||||
if samgroup:IsAlive() then
|
if samgroup:IsAlive() then
|
||||||
-- switch off SAM
|
-- switch off SAM
|
||||||
samgroup:OptionAlarmStateGreen()
|
if self.UseEmOnOff then
|
||||||
|
-- TODO: add emissions on/off
|
||||||
|
samgroup:EnableEmission(false)
|
||||||
|
--samgroup:SetAIOff()
|
||||||
|
else
|
||||||
|
samgroup:OptionAlarmStateGreen()
|
||||||
|
end
|
||||||
--samgroup:OptionROEWeaponFree()
|
--samgroup:OptionROEWeaponFree()
|
||||||
--samgroup:SetAIOn()
|
--samgroup:SetAIOn()
|
||||||
local text = string.format("SAM %s switched to alarm state GREEN!", name)
|
local text = string.format("SAM %s switched to alarm state GREEN!", name)
|
||||||
@@ -767,6 +890,11 @@ do
|
|||||||
local name = _data[1]
|
local name = _data[1]
|
||||||
local samgroup = GROUP:FindByName(name)
|
local samgroup = GROUP:FindByName(name)
|
||||||
if samgroup:IsAlive() then
|
if samgroup:IsAlive() then
|
||||||
|
if self.UseEmOnOff then
|
||||||
|
-- TODO: add emissions on/off
|
||||||
|
--samgroup:SetAIOn()
|
||||||
|
samgroup:EnableEmission(true)
|
||||||
|
end
|
||||||
samgroup:OptionAlarmStateRed()
|
samgroup:OptionAlarmStateRed()
|
||||||
end -- end alive
|
end -- end alive
|
||||||
end -- end for loop
|
end -- end for loop
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
--
|
--
|
||||||
-- ### Authors: **FlightControl**, **applevangelist**
|
-- ### Authors: **FlightControl**, **applevangelist**
|
||||||
--
|
--
|
||||||
-- Last Update: Dec 2020
|
-- Last Update: April 2021
|
||||||
--
|
--
|
||||||
-- ===
|
-- ===
|
||||||
--
|
--
|
||||||
-- @module Functional.Sead
|
-- @module Functional.Sead
|
||||||
@@ -51,9 +51,44 @@ SEAD = {
|
|||||||
EngagementRange = 75 -- default 75% engagement range Feature Request #1355
|
EngagementRange = 75 -- default 75% engagement range Feature Request #1355
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-- TODO Complete list?
|
||||||
|
--- Missile enumerators
|
||||||
|
-- @field Harms
|
||||||
|
SEAD.Harms = {
|
||||||
|
--[[
|
||||||
|
["X58"] = "weapons.missiles.X_58", --Kh-58X anti-radiation missiles fired
|
||||||
|
["Kh25"] = "weapons.missiles.Kh25MP_PRGS1VP", --Kh-25MP anti-radiation missiles fired
|
||||||
|
["X25"] = "weapons.missiles.X_25MP", --Kh-25MPU anti-radiation missiles fired
|
||||||
|
["X28"] = "weapons.missiles.X_28", --Kh-28 anti-radiation missiles fired
|
||||||
|
["X31"] = "weapons.missiles.X_31P", --Kh-31P anti-radiation missiles fired
|
||||||
|
["AGM45A"] = "weapons.missiles.AGM_45A", --AGM-45A anti-radiation missiles fired
|
||||||
|
["AGM45"] = "weapons.missiles.AGM_45", --AGM-45B anti-radiation missiles fired
|
||||||
|
["AGM88"] = "weapons.missiles.AGM_88", --AGM-88C anti-radiation missiles fired
|
||||||
|
["AGM122"] = "weapons.missiles.AGM_122", --AGM-122 Sidearm anti-radiation missiles fired
|
||||||
|
["LD10"] = "weapons.missiles.LD-10", --LD-10 anti-radiation missiles fired
|
||||||
|
["ALARM"] = "weapons.missiles.ALARM", --ALARM anti-radiation missiles fired
|
||||||
|
["AGM84E"] = "weapons.missiles.AGM_84E", --AGM84 anti-radiation missiles fired
|
||||||
|
["AGM84A"] = "weapons.missiles.AGM_84A", --AGM84 anti-radiation missiles fired
|
||||||
|
["AGM84H"] = "weapons.missiles.AGM_84H", --AGM84 anti-radiation missiles fired
|
||||||
|
--]]
|
||||||
|
["AGM_88"] = "AGM_88",
|
||||||
|
["AGM_45"] = "AGM_45",
|
||||||
|
["AGM_122"] = "AGM_122",
|
||||||
|
["AGM_84"] = "AGM_84",
|
||||||
|
["AGM_45"] = "AGM_45",
|
||||||
|
["ALARN"] = "ALARM",
|
||||||
|
["LD-10"] = "LD-10",
|
||||||
|
["X_58"] = "X_58",
|
||||||
|
["X_28"] = "X_28",
|
||||||
|
["X_25"] = "X_25",
|
||||||
|
["X_31"] = "X_31",
|
||||||
|
["Kh25"] = "Kh25",
|
||||||
|
}
|
||||||
|
|
||||||
--- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles.
|
--- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles.
|
||||||
-- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions...
|
-- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions...
|
||||||
-- Chances are big that the missile will miss.
|
-- Chances are big that the missile will miss.
|
||||||
|
-- @param #SEAD self
|
||||||
-- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCS mission editor on which evasive actions need to be taken.
|
-- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCS mission editor on which evasive actions need to be taken.
|
||||||
-- @return SEAD
|
-- @return SEAD
|
||||||
-- @usage
|
-- @usage
|
||||||
@@ -74,7 +109,7 @@ function SEAD:New( SEADGroupPrefixes )
|
|||||||
end
|
end
|
||||||
|
|
||||||
self:HandleEvent( EVENTS.Shot )
|
self:HandleEvent( EVENTS.Shot )
|
||||||
self:I("*** SEAD - Started Version 0.2.2")
|
self:I("*** SEAD - Started Version 0.2.7")
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -112,7 +147,20 @@ function SEAD:SetEngagementRange(range)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME.
|
--- Check if a known HARM was fired
|
||||||
|
-- @param #SEAD self
|
||||||
|
-- @param #string WeaponName
|
||||||
|
-- @return #boolean Returns true for a match
|
||||||
|
function SEAD:_CheckHarms(WeaponName)
|
||||||
|
self:F( { WeaponName } )
|
||||||
|
local hit = false
|
||||||
|
for _,_name in pairs (SEAD.Harms) do
|
||||||
|
if string.find(WeaponName,_name,1) then hit = true end
|
||||||
|
end
|
||||||
|
return hit
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Detects if an SAM site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME.
|
||||||
-- @see SEAD
|
-- @see SEAD
|
||||||
-- @param #SEAD
|
-- @param #SEAD
|
||||||
-- @param Core.Event#EVENTDATA EventData
|
-- @param Core.Event#EVENTDATA EventData
|
||||||
@@ -127,7 +175,7 @@ function SEAD:OnEventShot( EventData )
|
|||||||
self:T( "*** SEAD - Missile Launched = " .. SEADWeaponName)
|
self:T( "*** SEAD - Missile Launched = " .. SEADWeaponName)
|
||||||
self:T({ SEADWeapon })
|
self:T({ SEADWeapon })
|
||||||
|
|
||||||
--check for SEAD missiles
|
--[[check for SEAD missiles
|
||||||
if SEADWeaponName == "weapons.missiles.X_58" --Kh-58U anti-radiation missiles fired
|
if SEADWeaponName == "weapons.missiles.X_58" --Kh-58U anti-radiation missiles fired
|
||||||
or
|
or
|
||||||
SEADWeaponName == "weapons.missiles.Kh25MP_PRGS1VP" --Kh-25MP anti-radiation missiles fired
|
SEADWeaponName == "weapons.missiles.Kh25MP_PRGS1VP" --Kh-25MP anti-radiation missiles fired
|
||||||
@@ -155,16 +203,20 @@ function SEAD:OnEventShot( EventData )
|
|||||||
SEADWeaponName == "weapons.missiles.AGM_84A" --AGM84 anti-radiation missiles fired
|
SEADWeaponName == "weapons.missiles.AGM_84A" --AGM84 anti-radiation missiles fired
|
||||||
or
|
or
|
||||||
SEADWeaponName == "weapons.missiles.AGM_84H" --AGM84 anti-radiation missiles fired
|
SEADWeaponName == "weapons.missiles.AGM_84H" --AGM84 anti-radiation missiles fired
|
||||||
then
|
--]]
|
||||||
|
if self:_CheckHarms(SEADWeaponName) then
|
||||||
|
local _targetskill = "Random"
|
||||||
|
local _targetMimgroupName = "none"
|
||||||
local _evade = math.random (1,100) -- random number for chance of evading action
|
local _evade = math.random (1,100) -- random number for chance of evading action
|
||||||
local _targetMim = EventData.Weapon:getTarget() -- Identify target
|
local _targetMim = EventData.Weapon:getTarget() -- Identify target
|
||||||
local _targetMimname = Unit.getName(_targetMim) -- Unit name
|
local _targetUnit = UNIT:Find(_targetMim) -- Unit name by DCS Object
|
||||||
local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) --targeted grouo
|
if _targetUnit and _targetUnit:IsAlive() then
|
||||||
local _targetMimgroupName = _targetMimgroup:getName() -- group name
|
local _targetMimgroup = _targetUnit:GetGroup()
|
||||||
local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill
|
local _targetMimgroupName = _targetMimgroup:GetName() -- group name
|
||||||
self:T( self.SEADGroupPrefixes )
|
--local _targetskill = _DATABASE.Templates.Units[_targetUnit].Template.skill
|
||||||
self:T( _targetMimgroupName )
|
self:T( self.SEADGroupPrefixes )
|
||||||
|
self:T( _targetMimgroupName )
|
||||||
|
end
|
||||||
-- see if we are shot at
|
-- see if we are shot at
|
||||||
local SEADGroupFound = false
|
local SEADGroupFound = false
|
||||||
for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do
|
for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do
|
||||||
@@ -200,6 +252,7 @@ function SEAD:OnEventShot( EventData )
|
|||||||
local range = self.EngagementRange -- Feature Request #1355
|
local range = self.EngagementRange -- Feature Request #1355
|
||||||
self:T(string.format("*** SEAD - Engagement Range is %d", range))
|
self:T(string.format("*** SEAD - Engagement Range is %d", range))
|
||||||
id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED)
|
id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED)
|
||||||
|
--id.groupName:enableEmission(true)
|
||||||
id.ctrl:setOption(AI.Option.Ground.id.AC_ENGAGEMENT_RANGE_RESTRICTION,range) --Feature Request #1355
|
id.ctrl:setOption(AI.Option.Ground.id.AC_ENGAGEMENT_RANGE_RESTRICTION,range) --Feature Request #1355
|
||||||
self.SuppressedGroups[id.groupName] = nil --delete group id from table when done
|
self.SuppressedGroups[id.groupName] = nil --delete group id from table when done
|
||||||
end
|
end
|
||||||
@@ -212,6 +265,7 @@ function SEAD:OnEventShot( EventData )
|
|||||||
SuppressionEndTime = delay
|
SuppressionEndTime = delay
|
||||||
}
|
}
|
||||||
Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN)
|
Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN)
|
||||||
|
--_targetMimgroup:enableEmission(false)
|
||||||
timer.scheduleFunction(SuppressionEnd, id, SuppressionEndTime) --Schedule the SuppressionEnd() function
|
timer.scheduleFunction(SuppressionEnd, id, SuppressionEndTime) --Schedule the SuppressionEnd() function
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
527
Moose Development/Moose/Functional/Shorad.lua
Normal file
527
Moose Development/Moose/Functional/Shorad.lua
Normal file
@@ -0,0 +1,527 @@
|
|||||||
|
--- **Functional** -- Short Range Air Defense System
|
||||||
|
--
|
||||||
|
-- ===
|
||||||
|
--
|
||||||
|
-- **SHORAD** - Short Range Air Defense System
|
||||||
|
-- Controls a network of short range air/missile defense groups.
|
||||||
|
--
|
||||||
|
-- ===
|
||||||
|
--
|
||||||
|
-- ## Missions:
|
||||||
|
--
|
||||||
|
-- ### [SHORAD - Short Range Air Defense](https://github.com/FlightControl-Master/MOOSE_MISSIONS/tree/master/SRD%20-%20SHORAD%20Defense)
|
||||||
|
--
|
||||||
|
-- ===
|
||||||
|
--
|
||||||
|
-- ### Author : **applevangelist **
|
||||||
|
--
|
||||||
|
-- @module Functional.Shorad
|
||||||
|
-- @image Functional.Shorad.jpg
|
||||||
|
--
|
||||||
|
-- Date: May 2021
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
--- **SHORAD** class, extends Core.Base#BASE
|
||||||
|
-- @type SHORAD
|
||||||
|
-- @field #string ClassName
|
||||||
|
-- @field #string name Name of this Shorad
|
||||||
|
-- @field #boolean debug Set the debug state
|
||||||
|
-- @field #string Prefixes String to be used to build the @{#Core.Set#SET_GROUP}
|
||||||
|
-- @field #number Radius Shorad defense radius in meters
|
||||||
|
-- @field Core.Set#SET_GROUP Groupset The set of Shorad groups
|
||||||
|
-- @field Core.Set#SET_GROUP Samset The set of SAM groups to defend
|
||||||
|
-- @field #string Coalition The coalition of this Shorad
|
||||||
|
-- @field #number ActiveTimer How long a Shorad stays active after wake-up in seconds
|
||||||
|
-- @field #table ActiveGroups Table for the timer function
|
||||||
|
-- @field #string lid The log ID for the dcs.log
|
||||||
|
-- @field #boolean DefendHarms Default true, intercept incoming HARMS
|
||||||
|
-- @field #boolean DefendMavs Default true, intercept incoming AG-Missiles
|
||||||
|
-- @field #number DefenseLowProb Default 70, minimum detection limit
|
||||||
|
-- @field #number DefenseHighProb Default 90, maximim detection limit
|
||||||
|
-- @field #boolean UseEmOnOff Decide if we are using Emission on/off (default) or AlarmState red/green.
|
||||||
|
-- @extends Core.Base#BASE
|
||||||
|
|
||||||
|
--- *Good friends are worth defending.* Mr Tushman, Wonder (the Movie)
|
||||||
|
--
|
||||||
|
-- Simple Class for a more intelligent Short Range Air Defense System
|
||||||
|
--
|
||||||
|
-- #SHORAD
|
||||||
|
-- Moose derived missile intercepting short range defense system.
|
||||||
|
-- Protects a network of SAM sites. Uses events to switch on the defense groups closest to the enemy.
|
||||||
|
-- Easily integrated with @{Functional.Mantis#MANTIS} to complete the defensive system setup.
|
||||||
|
--
|
||||||
|
-- ## Usage
|
||||||
|
--
|
||||||
|
-- Set up a #SET_GROUP for the SAM sites to be protected:
|
||||||
|
--
|
||||||
|
-- `local SamSet = SET_GROUP:New():FilterPrefixes("Red SAM"):FilterCoalitions("red"):FilterStart()`
|
||||||
|
--
|
||||||
|
-- By default, SHORAD will defense against both HARMs and AG-Missiles with short to medium range. The default defense probability is 70-90%.
|
||||||
|
-- When a missile is detected, SHORAD will activate defense groups in the given radius around the target for 10 minutes. It will *not* react to friendly fire.
|
||||||
|
--
|
||||||
|
-- ### Start a new SHORAD system, parameters are:
|
||||||
|
--
|
||||||
|
-- * Name: Name of this SHORAD.
|
||||||
|
-- * ShoradPrefix: Filter for the Shorad #SET_GROUP.
|
||||||
|
-- * Samset: The #SET_GROUP of SAM sites to defend.
|
||||||
|
-- * Radius: Defense radius in meters.
|
||||||
|
-- * ActiveTimer: Determines how many seconds the systems stay on red alert after wake-up call.
|
||||||
|
-- * Coalition: Coalition, i.e. "blue", "red", or "neutral".*
|
||||||
|
--
|
||||||
|
-- `myshorad = SHORAD:New("RedShorad", "Red SHORAD", SamSet, 25000, 600, "red")`
|
||||||
|
--
|
||||||
|
-- ## Customize options
|
||||||
|
--
|
||||||
|
-- * SHORAD:SwitchDebug(debug)
|
||||||
|
-- * SHORAD:SwitchHARMDefense(onoff)
|
||||||
|
-- * SHORAD:SwitchAGMDefense(onoff)
|
||||||
|
-- * SHORAD:SetDefenseLimits(low,high)
|
||||||
|
-- * SHORAD:SetActiveTimer(seconds)
|
||||||
|
-- * SHORAD:SetDefenseRadius(meters)
|
||||||
|
--
|
||||||
|
-- @field #SHORAD
|
||||||
|
SHORAD = {
|
||||||
|
ClassName = "SHORAD",
|
||||||
|
name = "MyShorad",
|
||||||
|
debug = false,
|
||||||
|
Prefixes = "",
|
||||||
|
Radius = 20000,
|
||||||
|
Groupset = nil,
|
||||||
|
Samset = nil,
|
||||||
|
Coalition = nil,
|
||||||
|
ActiveTimer = 600, --stay on 10 mins
|
||||||
|
ActiveGroups = {},
|
||||||
|
lid = "",
|
||||||
|
DefendHarms = true,
|
||||||
|
DefendMavs = true,
|
||||||
|
DefenseLowProb = 70,
|
||||||
|
DefenseHighProb = 90,
|
||||||
|
UseEmOnOff = false,
|
||||||
|
}
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
-- SHORAD System
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
do
|
||||||
|
-- TODO Complete list?
|
||||||
|
--- Missile enumerators
|
||||||
|
-- @field Harms
|
||||||
|
SHORAD.Harms = {
|
||||||
|
--[[
|
||||||
|
["X58"] = "weapons.missiles.X_58", --Kh-58X anti-radiation missiles fired
|
||||||
|
["Kh25"] = "weapons.missiles.Kh25MP_PRGS1VP", --Kh-25MP anti-radiation missiles fired
|
||||||
|
["X25"] = "weapons.missiles.X_25MP", --Kh-25MPU anti-radiation missiles fired
|
||||||
|
["X28"] = "weapons.missiles.X_28", --Kh-28 anti-radiation missiles fired
|
||||||
|
["X31"] = "weapons.missiles.X_31P", --Kh-31P anti-radiation missiles fired
|
||||||
|
["AGM45A"] = "weapons.missiles.AGM_45A", --AGM-45A anti-radiation missiles fired
|
||||||
|
["AGM45"] = "weapons.missiles.AGM_45", --AGM-45B anti-radiation missiles fired
|
||||||
|
["AGM88"] = "weapons.missiles.AGM_88", --AGM-88C anti-radiation missiles fired
|
||||||
|
["AGM122"] = "weapons.missiles.AGM_122", --AGM-122 Sidearm anti-radiation missiles fired
|
||||||
|
["LD10"] = "weapons.missiles.LD-10", --LD-10 anti-radiation missiles fired
|
||||||
|
["ALARM"] = "weapons.missiles.ALARM", --ALARM anti-radiation missiles fired
|
||||||
|
["AGM84E"] = "weapons.missiles.AGM_84E", --AGM84 anti-radiation missiles fired
|
||||||
|
["AGM84A"] = "weapons.missiles.AGM_84A", --AGM84 anti-radiation missiles fired
|
||||||
|
["AGM84H"] = "weapons.missiles.AGM_84H", --AGM84 anti-radiation missiles fired
|
||||||
|
--]]
|
||||||
|
["AGM_88"] = "AGM_88",
|
||||||
|
["AGM_45"] = "AGM_45",
|
||||||
|
["AGM_122"] = "AGM_122",
|
||||||
|
["AGM_84"] = "AGM_84",
|
||||||
|
["AGM_45"] = "AGM_45",
|
||||||
|
["ALARN"] = "ALARM",
|
||||||
|
["LD-10"] = "LD-10",
|
||||||
|
["X_58"] = "X_58",
|
||||||
|
["X_28"] = "X_28",
|
||||||
|
["X_25"] = "X_25",
|
||||||
|
["X_31"] = "X_31",
|
||||||
|
["Kh25"] = "Kh25",
|
||||||
|
}
|
||||||
|
|
||||||
|
--- TODO complete list?
|
||||||
|
-- @field Mavs
|
||||||
|
SHORAD.Mavs = {
|
||||||
|
["AGM"] = "AGM",
|
||||||
|
["C-701"] = "C-701",
|
||||||
|
["Kh25"] = "Kh25",
|
||||||
|
["Kh29"] = "Kh29",
|
||||||
|
["Kh31"] = "Kh31",
|
||||||
|
["Kh66"] = "Kh66",
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Instantiates a new SHORAD object
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #string Name Name of this SHORAD
|
||||||
|
-- @param #string ShoradPrefix Filter for the Shorad #SET_GROUP
|
||||||
|
-- @param Core.Set#SET_GROUP Samset The #SET_GROUP of SAM sites to defend
|
||||||
|
-- @param #number Radius Defense radius in meters, used to switch on groups
|
||||||
|
-- @param #number ActiveTimer Determines how many seconds the systems stay on red alert after wake-up call
|
||||||
|
-- @param #string Coalition Coalition, i.e. "blue", "red", or "neutral"
|
||||||
|
function SHORAD:New(Name, ShoradPrefix, Samset, Radius, ActiveTimer, Coalition)
|
||||||
|
local self = BASE:Inherit( self, BASE:New() )
|
||||||
|
self:T({Name, ShoradPrefix, Samset, Radius, ActiveTimer, Coalition})
|
||||||
|
|
||||||
|
local GroupSet = SET_GROUP:New():FilterPrefixes(ShoradPrefix):FilterCoalitions(Coalition):FilterCategoryGround():FilterStart()
|
||||||
|
|
||||||
|
self.name = Name or "MyShorad"
|
||||||
|
self.Prefixes = ShoradPrefix or "SAM SHORAD"
|
||||||
|
self.Radius = Radius or 20000
|
||||||
|
self.Coalition = Coalition or "blue"
|
||||||
|
self.Samset = Samset or GroupSet
|
||||||
|
self.ActiveTimer = ActiveTimer or 600
|
||||||
|
self.ActiveGroups = {}
|
||||||
|
self.Groupset = GroupSet
|
||||||
|
self:HandleEvent( EVENTS.Shot )
|
||||||
|
self.DefendHarms = true
|
||||||
|
self.DefendMavs = true
|
||||||
|
self.DefenseLowProb = 70 -- probability to detect a missile shot, low margin
|
||||||
|
self.DefenseHighProb = 90 -- probability to detect a missile shot, high margin
|
||||||
|
self.UseEmOnOff = true -- Decide if we are using Emission on/off (default) or AlarmState red/green
|
||||||
|
self:I("*** SHORAD - Started Version 0.2.5")
|
||||||
|
-- Set the string id for output to DCS.log file.
|
||||||
|
self.lid=string.format("SHORAD %s | ", self.name)
|
||||||
|
self:_InitState()
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Initially set all groups to alarm state GREEN
|
||||||
|
-- @param #SHORAD self
|
||||||
|
function SHORAD:_InitState()
|
||||||
|
local table = {}
|
||||||
|
local set = self.Groupset
|
||||||
|
self:T({set = set})
|
||||||
|
local aliveset = set:GetAliveSet() --#table
|
||||||
|
for _,_group in pairs (aliveset) do
|
||||||
|
if self.UseEmOnOff then
|
||||||
|
--_group:SetAIOff()
|
||||||
|
_group:EnableEmission(false)
|
||||||
|
else
|
||||||
|
_group:OptionAlarmStateGreen() --Wrapper.Group#GROUP
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- gather entropy
|
||||||
|
for i=1,10 do
|
||||||
|
math.random()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Switch debug state
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #boolean debug Switch debug on (true) or off (false)
|
||||||
|
function SHORAD:SwitchDebug(debug)
|
||||||
|
self:T( { debug } )
|
||||||
|
local onoff = debug or false
|
||||||
|
if debug then
|
||||||
|
self.debug = true
|
||||||
|
--tracing
|
||||||
|
BASE:TraceOn()
|
||||||
|
BASE:TraceClass("SHORAD")
|
||||||
|
else
|
||||||
|
self.debug = false
|
||||||
|
BASE:TraceOff()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Switch defense for HARMs
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #boolean onoff
|
||||||
|
function SHORAD:SwitchHARMDefense(onoff)
|
||||||
|
self:T( { onoff } )
|
||||||
|
local onoff = onoff or true
|
||||||
|
self.DefendHarms = onoff
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Switch defense for AGMs
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #boolean onoff
|
||||||
|
function SHORAD:SwitchAGMDefense(onoff)
|
||||||
|
self:T( { onoff } )
|
||||||
|
local onoff = onoff or true
|
||||||
|
self.DefendMavs = onoff
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Set defense probability limits
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #number low Minimum detection limit, integer 1-100
|
||||||
|
-- @param #number high Maximum detection limit integer 1-100
|
||||||
|
function SHORAD:SetDefenseLimits(low,high)
|
||||||
|
self:T( { low, high } )
|
||||||
|
local low = low or 70
|
||||||
|
local high = high or 90
|
||||||
|
if (low < 0) or (low > 100) or (low > high) then
|
||||||
|
low = 70
|
||||||
|
end
|
||||||
|
if (high < 0) or (high > 100) or (high < low ) then
|
||||||
|
high = 90
|
||||||
|
end
|
||||||
|
self.DefenseLowProb = low
|
||||||
|
self.DefenseHighProb = high
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Set the number of seconds a SHORAD site will stay active
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #number seconds Number of seconds systems stay active
|
||||||
|
function SHORAD:SetActiveTimer(seconds)
|
||||||
|
local timer = seconds or 600
|
||||||
|
if timer < 0 then
|
||||||
|
timer = 600
|
||||||
|
end
|
||||||
|
self.ActiveTimer = timer
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Set the number of meters for the SHORAD defense zone
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #number meters Radius of the defense search zone in meters. #SHORADs in this range around a targeted group will go active
|
||||||
|
function SHORAD:SetDefenseRadius(meters)
|
||||||
|
local radius = meters or 20000
|
||||||
|
if radius < 0 then
|
||||||
|
radius = 20000
|
||||||
|
end
|
||||||
|
self.Radius = radius
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Set using Emission on/off instead of changing alarm state
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #boolean switch Decide if we are changing alarm state or AI state
|
||||||
|
function SHORAD:SetUsingEmOnOff(switch)
|
||||||
|
self.UseEmOnOff = switch or false
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check if a HARM was fired
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #string WeaponName
|
||||||
|
-- @return #boolean Returns true for a match
|
||||||
|
function SHORAD:_CheckHarms(WeaponName)
|
||||||
|
self:T( { WeaponName } )
|
||||||
|
local hit = false
|
||||||
|
if self.DefendHarms then
|
||||||
|
for _,_name in pairs (SHORAD.Harms) do
|
||||||
|
if string.find(WeaponName,_name,1) then hit = true end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return hit
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check if an AGM was fired
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #string WeaponName
|
||||||
|
-- @return #boolean Returns true for a match
|
||||||
|
function SHORAD:_CheckMavs(WeaponName)
|
||||||
|
self:T( { WeaponName } )
|
||||||
|
local hit = false
|
||||||
|
if self.DefendMavs then
|
||||||
|
for _,_name in pairs (SHORAD.Mavs) do
|
||||||
|
if string.find(WeaponName,_name,1) then hit = true end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return hit
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check the coalition of the attacker
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #string Coalition name
|
||||||
|
-- @return #boolean Returns false for a match
|
||||||
|
function SHORAD:_CheckCoalition(Coalition)
|
||||||
|
local owncoalition = self.Coalition
|
||||||
|
local othercoalition = ""
|
||||||
|
if Coalition == 0 then
|
||||||
|
othercoalition = "neutral"
|
||||||
|
elseif Coalition == 1 then
|
||||||
|
othercoalition = "red"
|
||||||
|
else
|
||||||
|
othercoalition = "blue"
|
||||||
|
end
|
||||||
|
self:T({owncoalition = owncoalition, othercoalition = othercoalition})
|
||||||
|
if owncoalition ~= othercoalition then
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check if the missile is aimed at a SHORAD
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #string TargetGroupName Name of the target group
|
||||||
|
-- @return #boolean Returns true for a match, else false
|
||||||
|
function SHORAD:_CheckShotAtShorad(TargetGroupName)
|
||||||
|
local tgtgrp = TargetGroupName
|
||||||
|
local shorad = self.Groupset
|
||||||
|
local shoradset = shorad:GetAliveSet() --#table
|
||||||
|
local returnname = false
|
||||||
|
for _,_groups in pairs (shoradset) do
|
||||||
|
local groupname = _groups:GetName()
|
||||||
|
if string.find(groupname, tgtgrp, 1) then
|
||||||
|
returnname = true
|
||||||
|
_groups:RelocateGroundRandomInRadius(7,100,false,false) -- be a bit evasive
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return returnname
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check if the missile is aimed at a SAM site
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #string TargetGroupName Name of the target group
|
||||||
|
-- @return #boolean Returns true for a match, else false
|
||||||
|
function SHORAD:_CheckShotAtSams(TargetGroupName)
|
||||||
|
local tgtgrp = TargetGroupName
|
||||||
|
local shorad = self.Samset
|
||||||
|
--local shoradset = shorad:GetAliveSet() --#table
|
||||||
|
local shoradset = shorad:GetSet() --#table
|
||||||
|
local returnname = false
|
||||||
|
for _,_groups in pairs (shoradset) do
|
||||||
|
local groupname = _groups:GetName()
|
||||||
|
if string.find(groupname, tgtgrp, 1) then
|
||||||
|
returnname = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return returnname
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Calculate if the missile shot is detected
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @return #boolean Returns true for a detection, else false
|
||||||
|
function SHORAD:_ShotIsDetected()
|
||||||
|
local IsDetected = false
|
||||||
|
local DetectionProb = math.random(self.DefenseLowProb, self.DefenseHighProb) -- reference value
|
||||||
|
local ActualDetection = math.random(1,100) -- value for this shot
|
||||||
|
if ActualDetection <= DetectionProb then
|
||||||
|
IsDetected = true
|
||||||
|
end
|
||||||
|
return IsDetected
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Wake up #SHORADs in a zone with diameter Radius for ActiveTimer seconds
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param #string TargetGroup Name of the target group used to build the #ZONE
|
||||||
|
-- @param #number Radius Radius of the #ZONE
|
||||||
|
-- @param #number ActiveTimer Number of seconds to stay active
|
||||||
|
-- @param #number TargetCat (optional) Category, i.e. Object.Category.UNIT or Object.Category.STATIC
|
||||||
|
-- @usage Use this function to integrate with other systems, example
|
||||||
|
--
|
||||||
|
-- local SamSet = SET_GROUP:New():FilterPrefixes("Blue SAM"):FilterCoalitions("blue"):FilterStart()
|
||||||
|
-- myshorad = SHORAD:New("BlueShorad", "Blue SHORAD", SamSet, 22000, 600, "blue")
|
||||||
|
-- myshorad:SwitchDebug(true)
|
||||||
|
-- mymantis = MANTIS:New("BlueMantis","Blue SAM","Blue EWR",nil,"blue",false,"Blue Awacs")
|
||||||
|
-- mymantis:AddShorad(myshorad,720)
|
||||||
|
-- mymantis:Start()
|
||||||
|
function SHORAD:WakeUpShorad(TargetGroup, Radius, ActiveTimer, TargetCat)
|
||||||
|
self:T({TargetGroup, Radius, ActiveTimer, TargetCat})
|
||||||
|
local targetcat = TargetCat or Object.Category.UNIT
|
||||||
|
local targetgroup = TargetGroup
|
||||||
|
local targetvec2 = nil
|
||||||
|
if targetcat == Object.Category.UNIT then
|
||||||
|
targetvec2 = GROUP:FindByName(targetgroup):GetVec2()
|
||||||
|
elseif targetcat == Object.Category.STATIC then
|
||||||
|
targetvec2 = STATIC:FindByName(targetgroup,false):GetVec2()
|
||||||
|
else
|
||||||
|
local samset = self.Samset
|
||||||
|
local sam = samset:GetRandom()
|
||||||
|
targetvec2 = sam:GetVec2()
|
||||||
|
end
|
||||||
|
local targetzone = ZONE_RADIUS:New("Shorad",targetvec2,Radius) -- create a defense zone to check
|
||||||
|
local groupset = self.Groupset --Core.Set#SET_GROUP
|
||||||
|
local shoradset = groupset:GetAliveSet() --#table
|
||||||
|
-- local function to switch off shorad again
|
||||||
|
local function SleepShorad(group)
|
||||||
|
local groupname = group:GetName()
|
||||||
|
self.ActiveGroups[groupname] = nil
|
||||||
|
if self.UseEmOnOff then
|
||||||
|
group:EnableEmission(false)
|
||||||
|
--group:SetAIOff()
|
||||||
|
else
|
||||||
|
group:OptionAlarmStateGreen()
|
||||||
|
end
|
||||||
|
local text = string.format("Sleeping SHORAD %s", group:GetName())
|
||||||
|
self:T(text)
|
||||||
|
local m = MESSAGE:New(text,10,"SHORAD"):ToAllIf(self.debug)
|
||||||
|
end
|
||||||
|
-- go through set and find the one(s) to activate
|
||||||
|
for _,_group in pairs (shoradset) do
|
||||||
|
if _group:IsAnyInZone(targetzone) then
|
||||||
|
local text = string.format("Waking up SHORAD %s", _group:GetName())
|
||||||
|
self:T(text)
|
||||||
|
local m = MESSAGE:New(text,10,"SHORAD"):ToAllIf(self.debug)
|
||||||
|
if self.UseEmOnOff then
|
||||||
|
_group:SetAIOn()
|
||||||
|
_group:EnableEmission(true)
|
||||||
|
end
|
||||||
|
_group:OptionAlarmStateRed()
|
||||||
|
local groupname = _group:GetName()
|
||||||
|
if self.ActiveGroups[groupname] == nil then -- no timer yet for this group
|
||||||
|
self.ActiveGroups[groupname] = { Timing = ActiveTimer }
|
||||||
|
local endtime = timer.getTime() + (ActiveTimer * math.random(75,100) / 100 ) -- randomize wakeup a bit
|
||||||
|
timer.scheduleFunction(SleepShorad, _group, endtime)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Main function - work on the EventData
|
||||||
|
-- @param #SHORAD self
|
||||||
|
-- @param Core.Event#EVENTDATA EventData The event details table data set
|
||||||
|
function SHORAD:OnEventShot( EventData )
|
||||||
|
self:T( { EventData } )
|
||||||
|
|
||||||
|
--local ShootingUnit = EventData.IniDCSUnit
|
||||||
|
--local ShootingUnitName = EventData.IniDCSUnitName
|
||||||
|
local ShootingWeapon = EventData.Weapon -- Identify the weapon fired
|
||||||
|
local ShootingWeaponName = EventData.WeaponName -- return weapon type
|
||||||
|
-- get firing coalition
|
||||||
|
local weaponcoalition = EventData.IniGroup:GetCoalition()
|
||||||
|
-- get detection probability
|
||||||
|
if self:_CheckCoalition(weaponcoalition) then --avoid overhead on friendly fire
|
||||||
|
local IsDetected = self:_ShotIsDetected()
|
||||||
|
-- convert to text
|
||||||
|
local DetectedText = "false"
|
||||||
|
if IsDetected then
|
||||||
|
DetectedText = "true"
|
||||||
|
end
|
||||||
|
local text = string.format("%s Missile Launched = %s | Detected probability state is %s", self.lid, ShootingWeaponName, DetectedText)
|
||||||
|
self:T( text )
|
||||||
|
local m = MESSAGE:New(text,10,"Info"):ToAllIf(self.debug)
|
||||||
|
--
|
||||||
|
if (self:_CheckHarms(ShootingWeaponName) or self:_CheckMavs(ShootingWeaponName)) and IsDetected then
|
||||||
|
-- get target data
|
||||||
|
local targetdata = EventData.Weapon:getTarget() -- Identify target
|
||||||
|
local targetcat = targetdata:getCategory() -- Identify category
|
||||||
|
self:T(string.format("Target Category (3=STATIC, 1=UNIT)= %s",tostring(targetcat)))
|
||||||
|
local targetunit = nil
|
||||||
|
if targetcat == Object.Category.UNIT then -- UNIT
|
||||||
|
targetunit = UNIT:Find(targetdata)
|
||||||
|
elseif targetcat == Object.Category.STATIC then -- STATIC
|
||||||
|
targetunit = STATIC:Find(targetdata)
|
||||||
|
end
|
||||||
|
--local targetunitname = Unit.getName(targetdata) -- Unit name
|
||||||
|
if targetunit and targetunit:IsAlive() then
|
||||||
|
local targetunitname = targetunit:GetName()
|
||||||
|
--local targetgroup = Unit.getGroup(Weapon.getTarget(ShootingWeapon)) --targeted group
|
||||||
|
local targetgroup = nil
|
||||||
|
local targetgroupname = "none"
|
||||||
|
if targetcat == Object.Category.UNIT then
|
||||||
|
targetgroup = targetunit:GetGroup()
|
||||||
|
targetgroupname = targetgroup:GetName() -- group name
|
||||||
|
elseif targetcat == Object.Category.STATIC then
|
||||||
|
targetgroup = targetunit
|
||||||
|
targetgroupname = targetunitname
|
||||||
|
end
|
||||||
|
local text = string.format("%s Missile Target = %s", self.lid, tostring(targetgroupname))
|
||||||
|
self:T( text )
|
||||||
|
local m = MESSAGE:New(text,10,"Info"):ToAllIf(self.debug)
|
||||||
|
-- check if we or a SAM site are the target
|
||||||
|
--local TargetGroup = EventData.TgtGroup -- Wrapper.Group#GROUP
|
||||||
|
local shotatus = self:_CheckShotAtShorad(targetgroupname) --#boolean
|
||||||
|
local shotatsams = self:_CheckShotAtSams(targetgroupname) --#boolean
|
||||||
|
-- if being shot at, find closest SHORADs to activate
|
||||||
|
if shotatsams or shotatus then
|
||||||
|
self:T({shotatsams=shotatsams,shotatus=shotatus})
|
||||||
|
self:WakeUpShorad(targetgroupname, self.Radius, self.ActiveTimer, targetcat)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
--
|
||||||
|
end
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
-- SHORAD end
|
||||||
|
-----------------------------------------------------------------------
|
||||||
@@ -2,6 +2,7 @@ __Moose.Include( 'Scripts/Moose/Utilities/Enums.lua' )
|
|||||||
__Moose.Include( 'Scripts/Moose/Utilities/Routines.lua' )
|
__Moose.Include( 'Scripts/Moose/Utilities/Routines.lua' )
|
||||||
__Moose.Include( 'Scripts/Moose/Utilities/Utils.lua' )
|
__Moose.Include( 'Scripts/Moose/Utilities/Utils.lua' )
|
||||||
__Moose.Include( 'Scripts/Moose/Utilities/Profiler.lua' )
|
__Moose.Include( 'Scripts/Moose/Utilities/Profiler.lua' )
|
||||||
|
__Moose.Include( 'Scripts/Moose/Utilities/Templates.lua' )
|
||||||
|
|
||||||
__Moose.Include( 'Scripts/Moose/Core/Base.lua' )
|
__Moose.Include( 'Scripts/Moose/Core/Base.lua' )
|
||||||
__Moose.Include( 'Scripts/Moose/Core/UserFlag.lua' )
|
__Moose.Include( 'Scripts/Moose/Core/UserFlag.lua' )
|
||||||
@@ -68,6 +69,7 @@ __Moose.Include( 'Scripts/Moose/Functional/PseudoATC.lua' )
|
|||||||
__Moose.Include( 'Scripts/Moose/Functional/Warehouse.lua' )
|
__Moose.Include( 'Scripts/Moose/Functional/Warehouse.lua' )
|
||||||
__Moose.Include( 'Scripts/Moose/Functional/Fox.lua' )
|
__Moose.Include( 'Scripts/Moose/Functional/Fox.lua' )
|
||||||
__Moose.Include( 'Scripts/Moose/Functional/Mantis.lua' )
|
__Moose.Include( 'Scripts/Moose/Functional/Mantis.lua' )
|
||||||
|
__Moose.Include( 'Scripts/Moose/Functional/Shorad.lua' )
|
||||||
|
|
||||||
__Moose.Include( 'Scripts/Moose/Ops/Airboss.lua' )
|
__Moose.Include( 'Scripts/Moose/Ops/Airboss.lua' )
|
||||||
__Moose.Include( 'Scripts/Moose/Ops/RecoveryTanker.lua' )
|
__Moose.Include( 'Scripts/Moose/Ops/RecoveryTanker.lua' )
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
-- * Wind direction and speed
|
-- * Wind direction and speed
|
||||||
-- * Visibility
|
-- * Visibility
|
||||||
-- * Cloud coverage, base and ceiling
|
-- * Cloud coverage, base and ceiling
|
||||||
-- * Temprature
|
-- * Temperature
|
||||||
-- * Dew point (approximate as there is no relative humidity in DCS yet)
|
-- * Dew point (approximate as there is no relative humidity in DCS yet)
|
||||||
-- * Pressure QNH/QFE
|
-- * Pressure QNH/QFE
|
||||||
-- * Weather phenomena: rain, thunderstorm, fog, dust
|
-- * Weather phenomena: rain, thunderstorm, fog, dust
|
||||||
@@ -564,7 +564,7 @@ _ATIS={}
|
|||||||
|
|
||||||
--- ATIS class version.
|
--- ATIS class version.
|
||||||
-- @field #string version
|
-- @field #string version
|
||||||
ATIS.version="0.9.0"
|
ATIS.version="0.9.1"
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- TODO list
|
-- TODO list
|
||||||
@@ -580,6 +580,8 @@ ATIS.version="0.9.0"
|
|||||||
-- DONE: Metric units.
|
-- DONE: Metric units.
|
||||||
-- DONE: Set UTC correction.
|
-- DONE: Set UTC correction.
|
||||||
-- DONE: Set magnetic variation.
|
-- DONE: Set magnetic variation.
|
||||||
|
-- DONE: New DCS 2.7 weather presets.
|
||||||
|
-- DONE: whatever
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- Constructor
|
-- Constructor
|
||||||
@@ -1431,9 +1433,103 @@ function ATIS:onafterBroadcast(From, Event, To)
|
|||||||
local cloudceil=clouds.base+clouds.thickness
|
local cloudceil=clouds.base+clouds.thickness
|
||||||
local clouddens=clouds.density
|
local clouddens=clouds.density
|
||||||
|
|
||||||
|
-- Cloud preset (DCS 2.7)
|
||||||
|
local cloudspreset=clouds.preset or "Nothing"
|
||||||
|
|
||||||
-- Precepitation: 0=None, 1=Rain, 2=Thunderstorm, 3=Snow, 4=Snowstorm.
|
-- Precepitation: 0=None, 1=Rain, 2=Thunderstorm, 3=Snow, 4=Snowstorm.
|
||||||
local precepitation=tonumber(clouds.iprecptns)
|
local precepitation=0
|
||||||
|
|
||||||
|
if cloudspreset:find("Preset10") then
|
||||||
|
-- Scattered 5
|
||||||
|
clouddens=4
|
||||||
|
elseif cloudspreset:find("Preset11") then
|
||||||
|
-- Scattered 6
|
||||||
|
clouddens=4
|
||||||
|
elseif cloudspreset:find("Preset12") then
|
||||||
|
-- Scattered 7
|
||||||
|
clouddens=4
|
||||||
|
elseif cloudspreset:find("Preset13") then
|
||||||
|
-- Broken 1
|
||||||
|
clouddens=7
|
||||||
|
elseif cloudspreset:find("Preset14") then
|
||||||
|
-- Broken 2
|
||||||
|
clouddens=7
|
||||||
|
elseif cloudspreset:find("Preset15") then
|
||||||
|
-- Broken 3
|
||||||
|
clouddens=7
|
||||||
|
elseif cloudspreset:find("Preset16") then
|
||||||
|
-- Broken 4
|
||||||
|
clouddens=7
|
||||||
|
elseif cloudspreset:find("Preset17") then
|
||||||
|
-- Broken 5
|
||||||
|
clouddens=7
|
||||||
|
elseif cloudspreset:find("Preset18") then
|
||||||
|
-- Broken 6
|
||||||
|
clouddens=7
|
||||||
|
elseif cloudspreset:find("Preset19") then
|
||||||
|
-- Broken 7
|
||||||
|
clouddens=7
|
||||||
|
elseif cloudspreset:find("Preset20") then
|
||||||
|
-- Broken 8
|
||||||
|
clouddens=7
|
||||||
|
elseif cloudspreset:find("Preset21") then
|
||||||
|
-- Overcast 1
|
||||||
|
clouddens=9
|
||||||
|
elseif cloudspreset:find("Preset22") then
|
||||||
|
-- Overcast 2
|
||||||
|
clouddens=9
|
||||||
|
elseif cloudspreset:find("Preset23") then
|
||||||
|
-- Overcast 3
|
||||||
|
clouddens=9
|
||||||
|
elseif cloudspreset:find("Preset24") then
|
||||||
|
-- Overcast 4
|
||||||
|
clouddens=9
|
||||||
|
elseif cloudspreset:find("Preset25") then
|
||||||
|
-- Overcast 5
|
||||||
|
clouddens=9
|
||||||
|
elseif cloudspreset:find("Preset26") then
|
||||||
|
-- Overcast 6
|
||||||
|
clouddens=9
|
||||||
|
elseif cloudspreset:find("Preset27") then
|
||||||
|
-- Overcast 7
|
||||||
|
clouddens=9
|
||||||
|
elseif cloudspreset:find("Preset1") then
|
||||||
|
-- Light Scattered 1
|
||||||
|
clouddens=1
|
||||||
|
elseif cloudspreset:find("Preset2") then
|
||||||
|
-- Light Scattered 2
|
||||||
|
clouddens=1
|
||||||
|
elseif cloudspreset:find("Preset3") then
|
||||||
|
-- High Scattered 1
|
||||||
|
clouddens=4
|
||||||
|
elseif cloudspreset:find("Preset4") then
|
||||||
|
-- High Scattered 2
|
||||||
|
clouddens=4
|
||||||
|
elseif cloudspreset:find("Preset5") then
|
||||||
|
-- Scattered 1
|
||||||
|
clouddens=4
|
||||||
|
elseif cloudspreset:find("Preset6") then
|
||||||
|
-- Scattered 2
|
||||||
|
clouddens=4
|
||||||
|
elseif cloudspreset:find("Preset7") then
|
||||||
|
-- Scattered 3
|
||||||
|
clouddens=4
|
||||||
|
elseif cloudspreset:find("Preset8") then
|
||||||
|
-- High Scattered 3
|
||||||
|
clouddens=4
|
||||||
|
elseif cloudspreset:find("Preset9") then
|
||||||
|
-- Scattered 4
|
||||||
|
clouddens=4
|
||||||
|
elseif cloudspreset:find("RainyPreset") then
|
||||||
|
-- Overcast + Rain
|
||||||
|
clouddens=9
|
||||||
|
if temperature>5 then
|
||||||
|
precepitation=1 -- rain
|
||||||
|
else
|
||||||
|
precepitation=3 -- snow
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local CLOUDBASE=string.format("%d", UTILS.MetersToFeet(cloudbase))
|
local CLOUDBASE=string.format("%d", UTILS.MetersToFeet(cloudbase))
|
||||||
local CLOUDCEIL=string.format("%d", UTILS.MetersToFeet(cloudceil))
|
local CLOUDCEIL=string.format("%d", UTILS.MetersToFeet(cloudceil))
|
||||||
|
|
||||||
|
|||||||
@@ -1705,7 +1705,7 @@ AIRBOSS.MenuF10Root=nil
|
|||||||
|
|
||||||
--- Airboss class version.
|
--- Airboss class version.
|
||||||
-- @field #string version
|
-- @field #string version
|
||||||
AIRBOSS.version="1.1.5"
|
AIRBOSS.version="1.1.6"
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- TODO list
|
-- TODO list
|
||||||
@@ -2641,6 +2641,15 @@ function AIRBOSS:SetRecoveryTurnTime(interval)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Set multiplayer environment wire correction.
|
||||||
|
-- @param #AIRBOSS self
|
||||||
|
-- @param #number Dcorr Correction distance in meters. Default 8.7 m.
|
||||||
|
-- @return #AIRBOSS self
|
||||||
|
function AIRBOSS:SetMPWireCorrection(Dcorr)
|
||||||
|
self.mpWireCorrection=Dcorr or 8.7
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
--- Set time interval for updating queues and other stuff.
|
--- Set time interval for updating queues and other stuff.
|
||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
-- @param #number interval Time interval in seconds. Default 30 sec.
|
-- @param #number interval Time interval in seconds. Default 30 sec.
|
||||||
@@ -4160,7 +4169,7 @@ function AIRBOSS:_InitStennis()
|
|||||||
|
|
||||||
-- Carrier Parameters.
|
-- Carrier Parameters.
|
||||||
self.carrierparam.sterndist =-153
|
self.carrierparam.sterndist =-153
|
||||||
self.carrierparam.deckheight = 19
|
self.carrierparam.deckheight = 19.06
|
||||||
|
|
||||||
-- Total size of the carrier (approx as rectangle).
|
-- Total size of the carrier (approx as rectangle).
|
||||||
self.carrierparam.totlength=310 -- Wiki says 332.8 meters overall length.
|
self.carrierparam.totlength=310 -- Wiki says 332.8 meters overall length.
|
||||||
@@ -4168,7 +4177,7 @@ function AIRBOSS:_InitStennis()
|
|||||||
self.carrierparam.totwidthstarboard=30
|
self.carrierparam.totwidthstarboard=30
|
||||||
|
|
||||||
-- Landing runway.
|
-- Landing runway.
|
||||||
self.carrierparam.rwyangle = -9
|
self.carrierparam.rwyangle = -9.1359
|
||||||
self.carrierparam.rwylength = 225
|
self.carrierparam.rwylength = 225
|
||||||
self.carrierparam.rwywidth = 20
|
self.carrierparam.rwywidth = 20
|
||||||
|
|
||||||
@@ -4311,7 +4320,7 @@ function AIRBOSS:_InitNimitz()
|
|||||||
|
|
||||||
-- Carrier Parameters.
|
-- Carrier Parameters.
|
||||||
self.carrierparam.sterndist =-164
|
self.carrierparam.sterndist =-164
|
||||||
self.carrierparam.deckheight = 20
|
self.carrierparam.deckheight = 20.1494 --DCS World OpenBeta\CoreMods\tech\USS_Nimitz\Database\USS_CVN_7X.lua
|
||||||
|
|
||||||
-- Total size of the carrier (approx as rectangle).
|
-- Total size of the carrier (approx as rectangle).
|
||||||
self.carrierparam.totlength=332.8 -- Wiki says 332.8 meters overall length.
|
self.carrierparam.totlength=332.8 -- Wiki says 332.8 meters overall length.
|
||||||
@@ -4319,7 +4328,7 @@ function AIRBOSS:_InitNimitz()
|
|||||||
self.carrierparam.totwidthstarboard=35
|
self.carrierparam.totwidthstarboard=35
|
||||||
|
|
||||||
-- Landing runway.
|
-- Landing runway.
|
||||||
self.carrierparam.rwyangle = -9
|
self.carrierparam.rwyangle = -9.1359 --DCS World OpenBeta\CoreMods\tech\USS_Nimitz\scripts\USS_Nimitz_RunwaysAndRoutes.lua
|
||||||
self.carrierparam.rwylength = 250
|
self.carrierparam.rwylength = 250
|
||||||
self.carrierparam.rwywidth = 25
|
self.carrierparam.rwywidth = 25
|
||||||
|
|
||||||
@@ -10341,7 +10350,7 @@ function AIRBOSS:_GetSternCoord()
|
|||||||
stern=stern:Translate(self.carrierparam.sterndist, hdg):Translate(7, FB+90)
|
stern=stern:Translate(self.carrierparam.sterndist, hdg):Translate(7, FB+90)
|
||||||
else
|
else
|
||||||
-- Nimitz SC: translate 8 meters starboard wrt Final bearing.
|
-- Nimitz SC: translate 8 meters starboard wrt Final bearing.
|
||||||
stern=stern:Translate(self.carrierparam.sterndist, hdg):Translate(8.5, FB+90)
|
stern=stern:Translate(self.carrierparam.sterndist, hdg):Translate(9.5, FB+90)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Set altitude.
|
-- Set altitude.
|
||||||
@@ -10371,6 +10380,11 @@ function AIRBOSS:_GetWire(Lcoord, dc)
|
|||||||
|
|
||||||
-- Corrected landing distance wrt to stern. Landing distance needs to be reduced due to delayed landing event for human players.
|
-- Corrected landing distance wrt to stern. Landing distance needs to be reduced due to delayed landing event for human players.
|
||||||
local d=Ldist-dc
|
local d=Ldist-dc
|
||||||
|
|
||||||
|
-- Multiplayer wire correction.
|
||||||
|
if self.mpWireCorrection then
|
||||||
|
d=d-self.mpWireCorrection
|
||||||
|
end
|
||||||
|
|
||||||
-- Shift wires from stern to their correct position.
|
-- Shift wires from stern to their correct position.
|
||||||
local w1=self.carrierparam.wire1
|
local w1=self.carrierparam.wire1
|
||||||
@@ -17725,7 +17739,7 @@ function AIRBOSS:onbeforeSave(From, Event, To, path, filename)
|
|||||||
|
|
||||||
-- Check default path.
|
-- Check default path.
|
||||||
if path==nil and not lfs then
|
if path==nil and not lfs then
|
||||||
self:E(self.lid.."WARNING: lfs not desanitized. Results will be saved in DCS installation root directory rather than your \"Saved Games\DCS\" folder.")
|
self:E(self.lid.."WARNING: lfs not desanitized. Results will be saved in DCS installation root directory rather than your \"Saved Games\\DCS\" folder.")
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@@ -17832,7 +17846,7 @@ function AIRBOSS:onbeforeLoad(From, Event, To, path, filename)
|
|||||||
|
|
||||||
-- Check default path.
|
-- Check default path.
|
||||||
if path==nil and not lfs then
|
if path==nil and not lfs then
|
||||||
self:E(self.lid.."WARNING: lfs not desanitized. Results will be saved in DCS installation root directory rather than your \"Saved Games\DCS\" folder.")
|
self:E(self.lid.."WARNING: lfs not desanitized. Results will be saved in DCS installation root directory rather than your \"Saved Games\\DCS\" folder.")
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Set path or default.
|
-- Set path or default.
|
||||||
|
|||||||
@@ -753,6 +753,7 @@ do -- TASK_A2G_DISPATCHER
|
|||||||
local TargetSetUnit = self:EvaluateSEAD( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed...
|
local TargetSetUnit = self:EvaluateSEAD( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed...
|
||||||
if TargetSetUnit then
|
if TargetSetUnit then
|
||||||
Task = TASK_A2G_SEAD:New( Mission, self.SetGroup, string.format( "SEAD.%03d", DetectedItemID ), TargetSetUnit )
|
Task = TASK_A2G_SEAD:New( Mission, self.SetGroup, string.format( "SEAD.%03d", DetectedItemID ), TargetSetUnit )
|
||||||
|
DetectedItem.DesignateMenuName = string.format( "SEAD.%03d", DetectedItemID ) --inject a name for DESIGNATE, if using same DETECTION object
|
||||||
Task:SetDetection( Detection, DetectedItem )
|
Task:SetDetection( Detection, DetectedItem )
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -761,6 +762,7 @@ do -- TASK_A2G_DISPATCHER
|
|||||||
local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be CASed...
|
local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be CASed...
|
||||||
if TargetSetUnit then
|
if TargetSetUnit then
|
||||||
Task = TASK_A2G_CAS:New( Mission, self.SetGroup, string.format( "CAS.%03d", DetectedItemID ), TargetSetUnit )
|
Task = TASK_A2G_CAS:New( Mission, self.SetGroup, string.format( "CAS.%03d", DetectedItemID ), TargetSetUnit )
|
||||||
|
DetectedItem.DesignateMenuName = string.format( "CAS.%03d", DetectedItemID ) --inject a name for DESIGNATE, if using same DETECTION object
|
||||||
Task:SetDetection( Detection, DetectedItem )
|
Task:SetDetection( Detection, DetectedItem )
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -769,6 +771,7 @@ do -- TASK_A2G_DISPATCHER
|
|||||||
local TargetSetUnit = self:EvaluateBAI( DetectedItem, self.Mission:GetCommandCenter():GetPositionable():GetCoalition() ) -- Returns a SetUnit if there are targets to be BAIed...
|
local TargetSetUnit = self:EvaluateBAI( DetectedItem, self.Mission:GetCommandCenter():GetPositionable():GetCoalition() ) -- Returns a SetUnit if there are targets to be BAIed...
|
||||||
if TargetSetUnit then
|
if TargetSetUnit then
|
||||||
Task = TASK_A2G_BAI:New( Mission, self.SetGroup, string.format( "BAI.%03d", DetectedItemID ), TargetSetUnit )
|
Task = TASK_A2G_BAI:New( Mission, self.SetGroup, string.format( "BAI.%03d", DetectedItemID ), TargetSetUnit )
|
||||||
|
DetectedItem.DesignateMenuName = string.format( "BAI.%03d", DetectedItemID ) --inject a name for DESIGNATE, if using same DETECTION object
|
||||||
Task:SetDetection( Detection, DetectedItem )
|
Task:SetDetection( Detection, DetectedItem )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -310,4 +310,53 @@ ENUMS.Morse.N7="- - * * *"
|
|||||||
ENUMS.Morse.N8="- - - * *"
|
ENUMS.Morse.N8="- - - * *"
|
||||||
ENUMS.Morse.N9="- - - - *"
|
ENUMS.Morse.N9="- - - - *"
|
||||||
ENUMS.Morse.N0="- - - - -"
|
ENUMS.Morse.N0="- - - - -"
|
||||||
ENUMS.Morse[" "]=" "
|
ENUMS.Morse[" "]=" "
|
||||||
|
|
||||||
|
--- ISO (639-1) 2-letter Language Codes. See the [Wikipedia](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes).
|
||||||
|
--
|
||||||
|
-- @type ENUMS.ISOLang
|
||||||
|
ENUMS.ISOLang =
|
||||||
|
{
|
||||||
|
Arabic = 'AR',
|
||||||
|
Chinese = 'ZH',
|
||||||
|
English = 'EN',
|
||||||
|
French = 'FR',
|
||||||
|
German = 'DE',
|
||||||
|
Russian = 'RU',
|
||||||
|
Spanish = 'ES',
|
||||||
|
Japanese = 'JA',
|
||||||
|
Italian = 'IT',
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Phonetic Alphabet (NATO). See the [Wikipedia](https://en.wikipedia.org/wiki/NATO_phonetic_alphabet).
|
||||||
|
--
|
||||||
|
-- @type ENUMS.Phonetic
|
||||||
|
ENUMS.Phonetic =
|
||||||
|
{
|
||||||
|
A = 'Alpha',
|
||||||
|
B = 'Bravo',
|
||||||
|
C = 'Charlie',
|
||||||
|
D = 'Delta',
|
||||||
|
E = 'Echo',
|
||||||
|
F = 'Foxtrot',
|
||||||
|
G = 'Golf',
|
||||||
|
H = 'Hotel',
|
||||||
|
I = 'India',
|
||||||
|
J = 'Juliett',
|
||||||
|
K = 'Kilo',
|
||||||
|
L = 'Lima',
|
||||||
|
M = 'Mike',
|
||||||
|
N = 'November',
|
||||||
|
O = 'Oscar',
|
||||||
|
P = 'Papa',
|
||||||
|
Q = 'Quebec',
|
||||||
|
R = 'Romeo',
|
||||||
|
S = 'Sierra',
|
||||||
|
T = 'Tango',
|
||||||
|
U = 'Uniform',
|
||||||
|
V = 'Victor',
|
||||||
|
W = 'Whiskey',
|
||||||
|
X = 'Xray',
|
||||||
|
Y = 'Yankee',
|
||||||
|
Z = 'Zulu',
|
||||||
|
}
|
||||||
612
Moose Development/Moose/Utilities/Templates.lua
Normal file
612
Moose Development/Moose/Utilities/Templates.lua
Normal file
@@ -0,0 +1,612 @@
|
|||||||
|
--- **Utils** Templates
|
||||||
|
--
|
||||||
|
-- DCS unit templates
|
||||||
|
--
|
||||||
|
-- @module Utilities.Templates
|
||||||
|
-- @image MOOSE.JPG
|
||||||
|
|
||||||
|
--- TEMPLATE class.
|
||||||
|
-- @type TEMPLATE
|
||||||
|
-- @field #string ClassName Name of the class.
|
||||||
|
|
||||||
|
--- *Templates*
|
||||||
|
--
|
||||||
|
-- ===
|
||||||
|
--
|
||||||
|
-- 
|
||||||
|
--
|
||||||
|
-- Get DCS templates from thin air.
|
||||||
|
--
|
||||||
|
-- # Ground Units
|
||||||
|
--
|
||||||
|
-- Ground units.
|
||||||
|
--
|
||||||
|
-- # Naval Units
|
||||||
|
--
|
||||||
|
-- Ships are not implemented yet.
|
||||||
|
--
|
||||||
|
-- # Aircraft
|
||||||
|
--
|
||||||
|
-- ## Airplanes
|
||||||
|
--
|
||||||
|
-- Airplanes are not implemented yet.
|
||||||
|
--
|
||||||
|
-- ## Helicopters
|
||||||
|
--
|
||||||
|
-- Helicopters are not implemented yet.
|
||||||
|
--
|
||||||
|
-- @field #TEMPLATE
|
||||||
|
TEMPLATE = {
|
||||||
|
ClassName = "TEMPLATE",
|
||||||
|
Ground = {},
|
||||||
|
Naval = {},
|
||||||
|
Airplane = {},
|
||||||
|
Helicopter = {},
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Ground unit type names.
|
||||||
|
-- @type TEMPLATE.TypeGround
|
||||||
|
-- @param #string InfantryAK
|
||||||
|
TEMPLATE.TypeGround={
|
||||||
|
InfantryAK="Infantry AK",
|
||||||
|
ParatrooperAKS74="Paratrooper AKS-74",
|
||||||
|
ParatrooperRPG16="Paratrooper RPG-16",
|
||||||
|
SoldierWWIIUS="soldier_wwii_us",
|
||||||
|
InfantryM248="Infantry M249",
|
||||||
|
SoldierM4="Soldier M4",
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Naval unit type names.
|
||||||
|
-- @type TEMPLATE.TypeNaval
|
||||||
|
-- @param #string Ticonderoga
|
||||||
|
TEMPLATE.TypeNaval={
|
||||||
|
Ticonderoga="TICONDEROG",
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Rotary wing unit type names.
|
||||||
|
-- @type TEMPLATE.TypeAirplane
|
||||||
|
-- @param #string A10C
|
||||||
|
TEMPLATE.TypeAirplane={
|
||||||
|
A10C="A-10C",
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Rotary wing unit type names.
|
||||||
|
-- @type TEMPLATE.TypeHelicopter
|
||||||
|
-- @param #string AH1W
|
||||||
|
TEMPLATE.TypeHelicopter={
|
||||||
|
AH1W="AH-1W",
|
||||||
|
}
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Ground Template
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
--- Get template for ground units.
|
||||||
|
-- @param #string TypeName Type name of the unit(s) in the groups. See `TEMPLATE.Ground`.
|
||||||
|
-- @param #string GroupName Name of the spawned group. **Must be unique!**
|
||||||
|
-- @param #number CountryID Country ID. Default `country.id.USA`. Coalition is automatically determined by the one the country belongs to.
|
||||||
|
-- @param DCS#Vec3 Vec3 Position of the group and the first unit.
|
||||||
|
-- @param #number Nunits Number of units. Default 1.
|
||||||
|
-- @param #number Radius Spawn radius for additonal units in meters. Default 50 m.
|
||||||
|
-- @return #table Template Template table.
|
||||||
|
function TEMPLATE.GetGround(TypeName, GroupName, CountryID, Vec3, Nunits, Radius)
|
||||||
|
|
||||||
|
-- Defaults.
|
||||||
|
TypeName=TypeName or TEMPLATE.TypeGround.SoldierM4
|
||||||
|
GroupName=GroupName or "Ground-1"
|
||||||
|
CountryID=CountryID or country.id.USA
|
||||||
|
Vec3=Vec3 or {x=0, y=0, z=0}
|
||||||
|
Nunits=Nunits or 1
|
||||||
|
Radius=Radius or 50
|
||||||
|
|
||||||
|
|
||||||
|
-- Get generic template.
|
||||||
|
local template=UTILS.DeepCopy(TEMPLATE.GenericGround)
|
||||||
|
|
||||||
|
-- Set group name.
|
||||||
|
template.name=GroupName
|
||||||
|
|
||||||
|
-- These are additional entries required by the MOOSE _DATABASE:Spawn() function.
|
||||||
|
template.CountryID=CountryID
|
||||||
|
template.CoalitionID=coalition.getCountryCoalition(template.CountryID)
|
||||||
|
template.CategoryID=Unit.Category.GROUND_UNIT
|
||||||
|
|
||||||
|
-- Set first unit.
|
||||||
|
template.units[1].type=TypeName
|
||||||
|
template.units[1].name=GroupName.."-1"
|
||||||
|
|
||||||
|
if Vec3 then
|
||||||
|
TEMPLATE.SetPositionFromVec3(template, Vec3)
|
||||||
|
end
|
||||||
|
|
||||||
|
TEMPLATE.SetUnits(template, Nunits, COORDINATE:NewFromVec3(Vec3), Radius)
|
||||||
|
|
||||||
|
return template
|
||||||
|
end
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Naval Template
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
--- Get template for ground units.
|
||||||
|
-- @param #string TypeName Type name of the unit(s) in the groups. See `TEMPLATE.Ground`.
|
||||||
|
-- @param #string GroupName Name of the spawned group. **Must be unique!**
|
||||||
|
-- @param #number CountryID Country ID. Default `country.id.USA`. Coalition is automatically determined by the one the country belongs to.
|
||||||
|
-- @param DCS#Vec3 Vec3 Position of the group and the first unit.
|
||||||
|
-- @param #number Nunits Number of units. Default 1.
|
||||||
|
-- @param #number Radius Spawn radius for additonal units in meters. Default 500 m.
|
||||||
|
-- @return #table Template Template table.
|
||||||
|
function TEMPLATE.GetNaval(TypeName, GroupName, CountryID, Vec3, Nunits, Radius)
|
||||||
|
|
||||||
|
-- Defaults.
|
||||||
|
TypeName=TypeName or TEMPLATE.TypeNaval.Ticonderoga
|
||||||
|
GroupName=GroupName or "Naval-1"
|
||||||
|
CountryID=CountryID or country.id.USA
|
||||||
|
Vec3=Vec3 or {x=0, y=0, z=0}
|
||||||
|
Nunits=Nunits or 1
|
||||||
|
Radius=Radius or 500
|
||||||
|
|
||||||
|
|
||||||
|
-- Get generic template.
|
||||||
|
local template=UTILS.DeepCopy(TEMPLATE.GenericNaval)
|
||||||
|
|
||||||
|
-- Set group name.
|
||||||
|
template.name=GroupName
|
||||||
|
|
||||||
|
-- These are additional entries required by the MOOSE _DATABASE:Spawn() function.
|
||||||
|
template.CountryID=CountryID
|
||||||
|
template.CoalitionID=coalition.getCountryCoalition(template.CountryID)
|
||||||
|
template.CategoryID=Unit.Category.SHIP
|
||||||
|
|
||||||
|
-- Set first unit.
|
||||||
|
template.units[1].type=TypeName
|
||||||
|
template.units[1].name=GroupName.."-1"
|
||||||
|
|
||||||
|
if Vec3 then
|
||||||
|
TEMPLATE.SetPositionFromVec3(template, Vec3)
|
||||||
|
end
|
||||||
|
|
||||||
|
TEMPLATE.SetUnits(template, Nunits, COORDINATE:NewFromVec3(Vec3), Radius)
|
||||||
|
|
||||||
|
return template
|
||||||
|
end
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Aircraft Template
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
--- Get template for fixed wing units.
|
||||||
|
-- @param #string TypeName Type name of the unit(s) in the groups. See `TEMPLATE.Ground`.
|
||||||
|
-- @param #string GroupName Name of the spawned group. **Must be unique!**
|
||||||
|
-- @param #number CountryID Country ID. Default `country.id.USA`. Coalition is automatically determined by the one the country belongs to.
|
||||||
|
-- @param DCS#Vec3 Vec3 Position of the group and the first unit.
|
||||||
|
-- @param #number Nunits Number of units. Default 1.
|
||||||
|
-- @param #number Radius Spawn radius for additonal units in meters. Default 500 m.
|
||||||
|
-- @return #table Template Template table.
|
||||||
|
function TEMPLATE.GetAirplane(TypeName, GroupName, CountryID, Vec3, Nunits, Radius)
|
||||||
|
|
||||||
|
-- Defaults.
|
||||||
|
TypeName=TypeName or TEMPLATE.TypeAirplane.A10C
|
||||||
|
GroupName=GroupName or "Airplane-1"
|
||||||
|
CountryID=CountryID or country.id.USA
|
||||||
|
Vec3=Vec3 or {x=0, y=1000, z=0}
|
||||||
|
Nunits=Nunits or 1
|
||||||
|
Radius=Radius or 100
|
||||||
|
|
||||||
|
local template=TEMPLATE._GetAircraft(true, TypeName, GroupName, CountryID, Vec3, Nunits, Radius)
|
||||||
|
|
||||||
|
return template
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Get template for fixed wing units.
|
||||||
|
-- @param #string TypeName Type name of the unit(s) in the groups. See `TEMPLATE.Ground`.
|
||||||
|
-- @param #string GroupName Name of the spawned group. **Must be unique!**
|
||||||
|
-- @param #number CountryID Country ID. Default `country.id.USA`. Coalition is automatically determined by the one the country belongs to.
|
||||||
|
-- @param DCS#Vec3 Vec3 Position of the group and the first unit.
|
||||||
|
-- @param #number Nunits Number of units. Default 1.
|
||||||
|
-- @param #number Radius Spawn radius for additonal units in meters. Default 500 m.
|
||||||
|
-- @return #table Template Template table.
|
||||||
|
function TEMPLATE.GetHelicopter(TypeName, GroupName, CountryID, Vec3, Nunits, Radius)
|
||||||
|
|
||||||
|
-- Defaults.
|
||||||
|
TypeName=TypeName or TEMPLATE.TypeHelicopter.AH1W
|
||||||
|
GroupName=GroupName or "Helicopter-1"
|
||||||
|
CountryID=CountryID or country.id.USA
|
||||||
|
Vec3=Vec3 or {x=0, y=500, z=0}
|
||||||
|
Nunits=Nunits or 1
|
||||||
|
Radius=Radius or 100
|
||||||
|
|
||||||
|
-- Limit unis to 4.
|
||||||
|
Nunits=math.min(Nunits, 4)
|
||||||
|
|
||||||
|
local template=TEMPLATE._GetAircraft(false, TypeName, GroupName, CountryID, Vec3, Nunits, Radius)
|
||||||
|
|
||||||
|
return template
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Get template for aircraft units.
|
||||||
|
-- @param #boolean Airplane If true, this is a fixed wing. Else, rotary wing.
|
||||||
|
-- @param #string TypeName Type name of the unit(s) in the groups. See `TEMPLATE.Ground`.
|
||||||
|
-- @param #string GroupName Name of the spawned group. **Must be unique!**
|
||||||
|
-- @param #number CountryID Country ID. Default `country.id.USA`. Coalition is automatically determined by the one the country belongs to.
|
||||||
|
-- @param DCS#Vec3 Vec3 Position of the group and the first unit.
|
||||||
|
-- @param #number Nunits Number of units. Default 1.
|
||||||
|
-- @param #number Radius Spawn radius for additonal units in meters. Default 500 m.
|
||||||
|
-- @return #table Template Template table.
|
||||||
|
function TEMPLATE._GetAircraft(Airplane, TypeName, GroupName, CountryID, Vec3, Nunits, Radius)
|
||||||
|
|
||||||
|
-- Defaults.
|
||||||
|
TypeName=TypeName
|
||||||
|
GroupName=GroupName or "Aircraft-1"
|
||||||
|
CountryID=CountryID or country.id.USA
|
||||||
|
Vec3=Vec3 or {x=0, y=0, z=0}
|
||||||
|
Nunits=Nunits or 1
|
||||||
|
Radius=Radius or 100
|
||||||
|
|
||||||
|
-- Get generic template.
|
||||||
|
local template=UTILS.DeepCopy(TEMPLATE.GenericAircraft)
|
||||||
|
|
||||||
|
-- Set group name.
|
||||||
|
template.name=GroupName
|
||||||
|
|
||||||
|
-- These are additional entries required by the MOOSE _DATABASE:Spawn() function.
|
||||||
|
template.CountryID=CountryID
|
||||||
|
template.CoalitionID=coalition.getCountryCoalition(template.CountryID)
|
||||||
|
if Airplane then
|
||||||
|
template.CategoryID=Unit.Category.AIRPLANE
|
||||||
|
else
|
||||||
|
template.CategoryID=Unit.Category.HELICOPTER
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Set first unit.
|
||||||
|
template.units[1].type=TypeName
|
||||||
|
template.units[1].name=GroupName.."-1"
|
||||||
|
|
||||||
|
-- Set position.
|
||||||
|
if Vec3 then
|
||||||
|
TEMPLATE.SetPositionFromVec3(template, Vec3)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Set number of units.
|
||||||
|
TEMPLATE.SetUnits(template, Nunits, COORDINATE:NewFromVec3(Vec3), Radius)
|
||||||
|
|
||||||
|
return template
|
||||||
|
end
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Misc Functions
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
--- Set the position of the template.
|
||||||
|
-- @param #table Template The template to be modified.
|
||||||
|
-- @param DCS#Vec2 Vec2 2D Position vector with x and y components of the group.
|
||||||
|
function TEMPLATE.SetPositionFromVec2(Template, Vec2)
|
||||||
|
|
||||||
|
Template.x=Vec2.x
|
||||||
|
Template.y=Vec2.y
|
||||||
|
|
||||||
|
for _,unit in pairs(Template.units) do
|
||||||
|
unit.x=Vec2.x
|
||||||
|
unit.y=Vec2.y
|
||||||
|
end
|
||||||
|
|
||||||
|
Template.route.points[1].x=Vec2.x
|
||||||
|
Template.route.points[1].y=Vec2.y
|
||||||
|
Template.route.points[1].alt=0 --TODO: Use land height.
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Set the position of the template.
|
||||||
|
-- @param #table Template The template to be modified.
|
||||||
|
-- @param DCS#Vec3 Vec3 Position vector of the group.
|
||||||
|
function TEMPLATE.SetPositionFromVec3(Template, Vec3)
|
||||||
|
|
||||||
|
local Vec2={x=Vec3.x, y=Vec3.z}
|
||||||
|
|
||||||
|
TEMPLATE.SetPositionFromVec2(Template, Vec2)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Set the position of the template.
|
||||||
|
-- @param #table Template The template to be modified.
|
||||||
|
-- @param #number N Total number of units in the group.
|
||||||
|
-- @param Core.Point#COORDINATE Coordinate Position of the first unit.
|
||||||
|
-- @param #number Radius Radius in meters to randomly place the additional units.
|
||||||
|
function TEMPLATE.SetUnits(Template, N, Coordinate, Radius)
|
||||||
|
|
||||||
|
local units=Template.units
|
||||||
|
|
||||||
|
local unit1=units[1]
|
||||||
|
|
||||||
|
local Vec3=Coordinate:GetVec3()
|
||||||
|
|
||||||
|
unit1.x=Vec3.x
|
||||||
|
unit1.y=Vec3.z
|
||||||
|
unit1.alt=Vec3.y
|
||||||
|
|
||||||
|
for i=2,N do
|
||||||
|
units[i]=UTILS.DeepCopy(unit1)
|
||||||
|
end
|
||||||
|
|
||||||
|
for i=1,N do
|
||||||
|
local unit=units[i]
|
||||||
|
unit.name=string.format("%s-%d", Template.name, i)
|
||||||
|
if i>1 then
|
||||||
|
local vec2=Coordinate:GetRandomCoordinateInRadius(Radius, 5):GetVec2()
|
||||||
|
unit.x=vec2.x
|
||||||
|
unit.y=vec2.y
|
||||||
|
unit.alt=unit1.alt
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Set the position of the template.
|
||||||
|
-- @param #table Template The template to be modified.
|
||||||
|
-- @param Wrapper.Airbase#AIRBASE AirBase The airbase where the aircraft are spawned.
|
||||||
|
-- @param #table ParkingSpots List of parking spot IDs. Every unit needs one!
|
||||||
|
-- @param #boolean EngineOn If true, aircraft are spawned hot.
|
||||||
|
function TEMPLATE.SetAirbase(Template, AirBase, ParkingSpots, EngineOn)
|
||||||
|
|
||||||
|
-- Airbase ID.
|
||||||
|
local AirbaseID=AirBase:GetID()
|
||||||
|
|
||||||
|
-- Spawn point.
|
||||||
|
local point=Template.route.points[1]
|
||||||
|
|
||||||
|
-- Set ID.
|
||||||
|
if AirBase:IsAirdrome() then
|
||||||
|
point.airdromeId=AirbaseID
|
||||||
|
else
|
||||||
|
point.helipadId=AirbaseID
|
||||||
|
point.linkUnit=AirbaseID
|
||||||
|
end
|
||||||
|
|
||||||
|
if EngineOn then
|
||||||
|
point.action=COORDINATE.WaypointAction.FromParkingAreaHot
|
||||||
|
point.type=COORDINATE.WaypointType.TakeOffParkingHot
|
||||||
|
else
|
||||||
|
point.action=COORDINATE.WaypointAction.FromParkingArea
|
||||||
|
point.type=COORDINATE.WaypointType.TakeOffParking
|
||||||
|
end
|
||||||
|
|
||||||
|
for i,unit in ipairs(Template.units) do
|
||||||
|
unit.parking_id=ParkingSpots[i]
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Add a waypoint.
|
||||||
|
-- @param #table Template The template to be modified.
|
||||||
|
-- @param #table Waypoint Waypoint table.
|
||||||
|
function TEMPLATE.AddWaypoint(Template, Waypoint)
|
||||||
|
|
||||||
|
table.insert(Template.route.points, Waypoint)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Generic Ground Template
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
TEMPLATE.GenericGround=
|
||||||
|
{
|
||||||
|
["visible"] = false,
|
||||||
|
["tasks"] = {}, -- end of ["tasks"]
|
||||||
|
["uncontrollable"] = false,
|
||||||
|
["task"] = "Ground Nothing",
|
||||||
|
["route"] =
|
||||||
|
{
|
||||||
|
["spans"] = {}, -- end of ["spans"]
|
||||||
|
["points"] =
|
||||||
|
{
|
||||||
|
[1] =
|
||||||
|
{
|
||||||
|
["alt"] = 0,
|
||||||
|
["type"] = "Turning Point",
|
||||||
|
["ETA"] = 0,
|
||||||
|
["alt_type"] = "BARO",
|
||||||
|
["formation_template"] = "",
|
||||||
|
["y"] = 0,
|
||||||
|
["x"] = 0,
|
||||||
|
["ETA_locked"] = true,
|
||||||
|
["speed"] = 0,
|
||||||
|
["action"] = "Off Road",
|
||||||
|
["task"] =
|
||||||
|
{
|
||||||
|
["id"] = "ComboTask",
|
||||||
|
["params"] =
|
||||||
|
{
|
||||||
|
["tasks"] =
|
||||||
|
{
|
||||||
|
}, -- end of ["tasks"]
|
||||||
|
}, -- end of ["params"]
|
||||||
|
}, -- end of ["task"]
|
||||||
|
["speed_locked"] = true,
|
||||||
|
}, -- end of [1]
|
||||||
|
}, -- end of ["points"]
|
||||||
|
}, -- end of ["route"]
|
||||||
|
["groupId"] = nil,
|
||||||
|
["hidden"] = false,
|
||||||
|
["units"] =
|
||||||
|
{
|
||||||
|
[1] =
|
||||||
|
{
|
||||||
|
["transportable"] =
|
||||||
|
{
|
||||||
|
["randomTransportable"] = false,
|
||||||
|
}, -- end of ["transportable"]
|
||||||
|
["skill"] = "Average",
|
||||||
|
["type"] = "Infantry AK",
|
||||||
|
["unitId"] = nil,
|
||||||
|
["y"] = 0,
|
||||||
|
["x"] = 0,
|
||||||
|
["name"] = "Infantry AK-47 Rus",
|
||||||
|
["heading"] = 0,
|
||||||
|
["playerCanDrive"] = false,
|
||||||
|
}, -- end of [1]
|
||||||
|
}, -- end of ["units"]
|
||||||
|
["y"] = 0,
|
||||||
|
["x"] = 0,
|
||||||
|
["name"] = "Infantry AK-47 Rus",
|
||||||
|
["start_time"] = 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Generic Ship Template
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
TEMPLATE.GenericNaval=
|
||||||
|
{
|
||||||
|
["visible"] = false,
|
||||||
|
["tasks"] = {}, -- end of ["tasks"]
|
||||||
|
["uncontrollable"] = false,
|
||||||
|
["route"] =
|
||||||
|
{
|
||||||
|
["points"] =
|
||||||
|
{
|
||||||
|
[1] =
|
||||||
|
{
|
||||||
|
["alt"] = 0,
|
||||||
|
["type"] = "Turning Point",
|
||||||
|
["ETA"] = 0,
|
||||||
|
["alt_type"] = "BARO",
|
||||||
|
["formation_template"] = "",
|
||||||
|
["y"] = 0,
|
||||||
|
["x"] = 0,
|
||||||
|
["ETA_locked"] = true,
|
||||||
|
["speed"] = 0,
|
||||||
|
["action"] = "Turning Point",
|
||||||
|
["task"] =
|
||||||
|
{
|
||||||
|
["id"] = "ComboTask",
|
||||||
|
["params"] =
|
||||||
|
{
|
||||||
|
["tasks"] =
|
||||||
|
{
|
||||||
|
}, -- end of ["tasks"]
|
||||||
|
}, -- end of ["params"]
|
||||||
|
}, -- end of ["task"]
|
||||||
|
["speed_locked"] = true,
|
||||||
|
}, -- end of [1]
|
||||||
|
}, -- end of ["points"]
|
||||||
|
}, -- end of ["route"]
|
||||||
|
["groupId"] = nil,
|
||||||
|
["hidden"] = false,
|
||||||
|
["units"] =
|
||||||
|
{
|
||||||
|
[1] =
|
||||||
|
{
|
||||||
|
["transportable"] =
|
||||||
|
{
|
||||||
|
["randomTransportable"] = false,
|
||||||
|
}, -- end of ["transportable"]
|
||||||
|
["skill"] = "Average",
|
||||||
|
["type"] = "TICONDEROG",
|
||||||
|
["unitId"] = nil,
|
||||||
|
["y"] = 0,
|
||||||
|
["x"] = 0,
|
||||||
|
["name"] = "Naval-1-1",
|
||||||
|
["heading"] = 0,
|
||||||
|
["modulation"] = 0,
|
||||||
|
["frequency"] = 127500000,
|
||||||
|
}, -- end of [1]
|
||||||
|
}, -- end of ["units"]
|
||||||
|
["y"] = 0,
|
||||||
|
["x"] = 0,
|
||||||
|
["name"] = "Naval-1",
|
||||||
|
["start_time"] = 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Generic Aircraft Template
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
TEMPLATE.GenericAircraft=
|
||||||
|
{
|
||||||
|
["groupId"] = nil,
|
||||||
|
["name"] = "Rotary-1",
|
||||||
|
["uncontrolled"] = false,
|
||||||
|
["hidden"] = false,
|
||||||
|
["task"] = "Nothing",
|
||||||
|
["y"] = 0,
|
||||||
|
["x"] = 0,
|
||||||
|
["start_time"] = 0,
|
||||||
|
["communication"] = true,
|
||||||
|
["radioSet"] = false,
|
||||||
|
["frequency"] = 127.5,
|
||||||
|
["modulation"] = 0,
|
||||||
|
["taskSelected"] = true,
|
||||||
|
["tasks"] = {}, -- end of ["tasks"]
|
||||||
|
["route"] =
|
||||||
|
{
|
||||||
|
["points"] =
|
||||||
|
{
|
||||||
|
[1] =
|
||||||
|
{
|
||||||
|
["y"] = 0,
|
||||||
|
["x"] = 0,
|
||||||
|
["alt"] = 1000,
|
||||||
|
["alt_type"] = "BARO",
|
||||||
|
["action"] = "Turning Point",
|
||||||
|
["type"] = "Turning Point",
|
||||||
|
["airdromeId"] = nil,
|
||||||
|
["task"] =
|
||||||
|
{
|
||||||
|
["id"] = "ComboTask",
|
||||||
|
["params"] =
|
||||||
|
{
|
||||||
|
["tasks"] = {}, -- end of ["tasks"]
|
||||||
|
}, -- end of ["params"]
|
||||||
|
}, -- end of ["task"]
|
||||||
|
["ETA"] = 0,
|
||||||
|
["ETA_locked"] = true,
|
||||||
|
["speed"] = 100,
|
||||||
|
["speed_locked"] = true,
|
||||||
|
["formation_template"] = "",
|
||||||
|
}, -- end of [1]
|
||||||
|
}, -- end of ["points"]
|
||||||
|
}, -- end of ["route"]
|
||||||
|
["units"] =
|
||||||
|
{
|
||||||
|
[1] =
|
||||||
|
{
|
||||||
|
["name"] = "Rotary-1-1",
|
||||||
|
["unitId"] = nil,
|
||||||
|
["type"] = "AH-1W",
|
||||||
|
["onboard_num"] = "050",
|
||||||
|
["livery_id"] = "USA X Black",
|
||||||
|
["skill"] = "High",
|
||||||
|
["ropeLength"] = 15,
|
||||||
|
["speed"] = 0,
|
||||||
|
["x"] = 0,
|
||||||
|
["y"] = 0,
|
||||||
|
["alt"] = 10,
|
||||||
|
["alt_type"] = "BARO",
|
||||||
|
["heading"] = 0,
|
||||||
|
["psi"] = 0,
|
||||||
|
["parking"] = nil,
|
||||||
|
["parking_id"] = nil,
|
||||||
|
["payload"] =
|
||||||
|
{
|
||||||
|
["pylons"] = {}, -- end of ["pylons"]
|
||||||
|
["fuel"] = "1250.0",
|
||||||
|
["flare"] = 30,
|
||||||
|
["chaff"] = 30,
|
||||||
|
["gun"] = 100,
|
||||||
|
}, -- end of ["payload"]
|
||||||
|
["callsign"] =
|
||||||
|
{
|
||||||
|
[1] = 2,
|
||||||
|
[2] = 1,
|
||||||
|
[3] = 1,
|
||||||
|
["name"] = "Springfield11",
|
||||||
|
}, -- end of ["callsign"]
|
||||||
|
}, -- end of [1]
|
||||||
|
}, -- end of ["units"]
|
||||||
|
}
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -97,7 +97,7 @@ CALLSIGN={
|
|||||||
JTAC={
|
JTAC={
|
||||||
Axeman=1,
|
Axeman=1,
|
||||||
Darknight=2,
|
Darknight=2,
|
||||||
Warrier=3,
|
Warrior=3,
|
||||||
Pointer=4,
|
Pointer=4,
|
||||||
Eyeball=5,
|
Eyeball=5,
|
||||||
Moonbeam=6,
|
Moonbeam=6,
|
||||||
@@ -408,6 +408,14 @@ UTILS.hPa2inHg = function( hPa )
|
|||||||
return hPa * 0.0295299830714
|
return hPa * 0.0295299830714
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Convert knots to alitude corrected KIAS, e.g. for tankers.
|
||||||
|
-- @param #number knots Speed in knots.
|
||||||
|
-- @param #number altitude Altitude in feet
|
||||||
|
-- @return #number Corrected KIAS
|
||||||
|
UTILS.KnotsToAltKIAS = function( knots, altitude )
|
||||||
|
return (knots * 0.018 * (altitude / 1000)) + knots
|
||||||
|
end
|
||||||
|
|
||||||
--- Convert pressure from hecto Pascal (hPa) to millimeters of mercury (mmHg).
|
--- Convert pressure from hecto Pascal (hPa) to millimeters of mercury (mmHg).
|
||||||
-- @param #number hPa Pressure in hPa.
|
-- @param #number hPa Pressure in hPa.
|
||||||
-- @return #number Pressure in mmHg.
|
-- @return #number Pressure in mmHg.
|
||||||
@@ -644,6 +652,17 @@ function UTILS.GetMarkID()
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Remove an object (marker, circle, arrow, text, quad, ...) on the F10 map.
|
||||||
|
-- @param #number MarkID Unique ID of the object.
|
||||||
|
-- @param #number Delay (Optional) Delay in seconds before the mark is removed.
|
||||||
|
function UTILS.RemoveMark(MarkID, Delay)
|
||||||
|
if Delay and Delay>0 then
|
||||||
|
TIMER:New(UTILS.RemoveMark, MarkID):Start(Delay)
|
||||||
|
else
|
||||||
|
trigger.action.removeMark(MarkID)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-- Test if a Vec2 is in a radius of another Vec2
|
-- Test if a Vec2 is in a radius of another Vec2
|
||||||
function UTILS.IsInRadius( InVec2, Vec2, Radius )
|
function UTILS.IsInRadius( InVec2, Vec2, Radius )
|
||||||
@@ -1457,4 +1476,4 @@ function UTILS.GetOSTime()
|
|||||||
end
|
end
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -361,6 +361,14 @@ AIRBASE.TheChannel = {
|
|||||||
-- * AIRBASE.Syria.Beirut_Rafic_Hariri
|
-- * AIRBASE.Syria.Beirut_Rafic_Hariri
|
||||||
-- * AIRBASE.Syria.An_Nasiriyah
|
-- * AIRBASE.Syria.An_Nasiriyah
|
||||||
-- * AIRBASE.Syria.Abu_al_Duhur
|
-- * AIRBASE.Syria.Abu_al_Duhur
|
||||||
|
-- * AIRBASE.Syria.H4
|
||||||
|
-- * AIRBASE.Syria.Gaziantep
|
||||||
|
-- * AIRBASE.Syria.Rosh_Pina
|
||||||
|
-- * AIRBASE.Syria.Sayqal
|
||||||
|
-- * AIRBASE.Syria.Shayrat
|
||||||
|
-- * AIRBASE.Syria.Tiyas
|
||||||
|
-- * AIRBASE.Syria.Tha_lah
|
||||||
|
-- * AIRBASE.Syria.Naqoura
|
||||||
--
|
--
|
||||||
-- @field Syria
|
-- @field Syria
|
||||||
AIRBASE.Syria={
|
AIRBASE.Syria={
|
||||||
@@ -397,6 +405,14 @@ AIRBASE.Syria={
|
|||||||
["Beirut_Rafic_Hariri"]="Beirut-Rafic Hariri",
|
["Beirut_Rafic_Hariri"]="Beirut-Rafic Hariri",
|
||||||
["An_Nasiriyah"]="An Nasiriyah",
|
["An_Nasiriyah"]="An Nasiriyah",
|
||||||
["Abu_al_Duhur"]="Abu al-Duhur",
|
["Abu_al_Duhur"]="Abu al-Duhur",
|
||||||
|
["H4"]="H4",
|
||||||
|
["Gaziantep"]="Gaziantep",
|
||||||
|
["Rosh_Pina"]="Rosh Pina",
|
||||||
|
["Sayqal"]="Sayqal",
|
||||||
|
["Shayrat"]="Shayrat",
|
||||||
|
["Tiyas"]="Tiyas",
|
||||||
|
["Tha_lah"]="Tha'lah",
|
||||||
|
["Naqoura"]="Naqoura",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -592,7 +608,7 @@ end
|
|||||||
|
|
||||||
--- Get all airbase names of the current map. This includes ships and FARPS.
|
--- Get all airbase names of the current map. This includes ships and FARPS.
|
||||||
-- @param DCS#Coalition coalition (Optional) Return only airbases belonging to the specified coalition. By default, all airbases of the map are returned.
|
-- @param DCS#Coalition coalition (Optional) Return only airbases belonging to the specified coalition. By default, all airbases of the map are returned.
|
||||||
-- @param #number category (Optional) Return only airbases of a certain category, e.g. Airbase.Category.FARP
|
-- @param #number category (Optional) Return only airbases of a certain category, e.g. `Airbase.Category.HELIPAD`.
|
||||||
-- @return #table Table containing all airbase names of the current map.
|
-- @return #table Table containing all airbase names of the current map.
|
||||||
function AIRBASE.GetAllAirbaseNames(coalition, category)
|
function AIRBASE.GetAllAirbaseNames(coalition, category)
|
||||||
|
|
||||||
|
|||||||
@@ -175,11 +175,8 @@
|
|||||||
-- * @{#CONTROLLABLE.OptionKeepWeaponsOnThreat}
|
-- * @{#CONTROLLABLE.OptionKeepWeaponsOnThreat}
|
||||||
--
|
--
|
||||||
-- ## 5.5) Air-2-Air missile attack range:
|
-- ## 5.5) Air-2-Air missile attack range:
|
||||||
-- * @{#CONTROLLABLE.OptionAAAttackRange}(): Defines the usage of A2A missiles against possible targets.
|
-- * @{#CONTROLLABLE.OptionAAAttackRange}(): Defines the usage of A2A missiles against possible targets .
|
||||||
--
|
--
|
||||||
-- ## 5.6) GROUND units attack range:
|
|
||||||
-- * @{#CONTROLLABLE.OptionEngageRange}(): Engage range limit in percent (a number between 0 and 100). Default 100. Defines the range at which a GROUND unit/group (e.g. a SAM site) is allowed to use its weapons automatically.
|
|
||||||
--
|
|
||||||
-- @field #CONTROLLABLE
|
-- @field #CONTROLLABLE
|
||||||
CONTROLLABLE = {
|
CONTROLLABLE = {
|
||||||
ClassName = "CONTROLLABLE",
|
ClassName = "CONTROLLABLE",
|
||||||
@@ -507,7 +504,7 @@ function CONTROLLABLE:TaskCombo( DCSTasks )
|
|||||||
tasks = DCSTasks
|
tasks = DCSTasks
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DCSTaskCombo
|
return DCSTaskCombo
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -805,12 +802,12 @@ end
|
|||||||
-- @return #CONTROLLABLE self
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:CommandSetFrequency(Frequency, Modulation, Delay)
|
function CONTROLLABLE:CommandSetFrequency(Frequency, Modulation, Delay)
|
||||||
|
|
||||||
local CommandSetFrequency = {
|
local CommandSetFrequency = {
|
||||||
id = 'SetFrequency',
|
id = 'SetFrequency',
|
||||||
params = {
|
params = {
|
||||||
frequency = Frequency*1000000,
|
frequency = Frequency*1000000,
|
||||||
modulation = Modulation or radio.modulation.AM,
|
modulation = Modulation or radio.modulation.AM,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if Delay and Delay>0 then
|
if Delay and Delay>0 then
|
||||||
@@ -884,7 +881,7 @@ function CONTROLLABLE:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, At
|
|||||||
groupId = AttackGroup:GetID(),
|
groupId = AttackGroup:GetID(),
|
||||||
weaponType = WeaponType or 1073741822,
|
weaponType = WeaponType or 1073741822,
|
||||||
expend = WeaponExpend or "Auto",
|
expend = WeaponExpend or "Auto",
|
||||||
attackQtyLimit = AttackQty and true or false,
|
attackQtyLimit = AttackQty and true or false,
|
||||||
attackQty = AttackQty or 1,
|
attackQty = AttackQty or 1,
|
||||||
directionEnabled = Direction and true or false,
|
directionEnabled = Direction and true or false,
|
||||||
direction = Direction and math.rad(Direction) or 0,
|
direction = Direction and math.rad(Direction) or 0,
|
||||||
@@ -924,7 +921,7 @@ function CONTROLLABLE:TaskAttackUnit(AttackUnit, GroupAttack, WeaponExpend, Atta
|
|||||||
weaponType = WeaponType or 1073741822,
|
weaponType = WeaponType or 1073741822,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DCSTask
|
return DCSTask
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1088,7 +1085,7 @@ function CONTROLLABLE:TaskEmbarking(Coordinate, GroupSetForEmbarking, Duration,
|
|||||||
-- Distribution
|
-- Distribution
|
||||||
--local distribution={}
|
--local distribution={}
|
||||||
--distribution[id]=gids
|
--distribution[id]=gids
|
||||||
|
|
||||||
local groupID=self and self:GetID()
|
local groupID=self and self:GetID()
|
||||||
|
|
||||||
local DCSTask = {
|
local DCSTask = {
|
||||||
@@ -1317,7 +1314,7 @@ function CONTROLLABLE:TaskLandAtVec2(Vec2, Duration)
|
|||||||
duration = Duration,
|
duration = Duration,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return DCSTask
|
return DCSTask
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1431,16 +1428,22 @@ end
|
|||||||
-- @param DCS#Distance Radius The radius of the zone to deploy the fire at.
|
-- @param DCS#Distance Radius The radius of the zone to deploy the fire at.
|
||||||
-- @param #number AmmoCount (optional) Quantity of ammunition to expand (omit to fire until ammunition is depleted).
|
-- @param #number AmmoCount (optional) Quantity of ammunition to expand (omit to fire until ammunition is depleted).
|
||||||
-- @param #number WeaponType (optional) Enum for weapon type ID. This value is only required if you want the group firing to use a specific weapon, for instance using the task on a ship to force it to fire guided missiles at targets within cannon range. See http://wiki.hoggit.us/view/DCS_enum_weapon_flag
|
-- @param #number WeaponType (optional) Enum for weapon type ID. This value is only required if you want the group firing to use a specific weapon, for instance using the task on a ship to force it to fire guided missiles at targets within cannon range. See http://wiki.hoggit.us/view/DCS_enum_weapon_flag
|
||||||
|
-- @param #number Altitude (Optional) Altitude in meters.
|
||||||
|
-- @param #number ASL Altitude is above mean sea level. Default is above ground level.
|
||||||
-- @return DCS#Task The DCS task structure.
|
-- @return DCS#Task The DCS task structure.
|
||||||
function CONTROLLABLE:TaskFireAtPoint( Vec2, Radius, AmmoCount, WeaponType )
|
function CONTROLLABLE:TaskFireAtPoint( Vec2, Radius, AmmoCount, WeaponType, Altitude, ASL )
|
||||||
|
|
||||||
local DCSTask = {
|
local DCSTask = {
|
||||||
id = 'FireAtPoint',
|
id = 'FireAtPoint',
|
||||||
params = {
|
params = {
|
||||||
point = Vec2,
|
point = Vec2,
|
||||||
|
x=Vec2.x,
|
||||||
|
y=Vec2.y,
|
||||||
zoneRadius = Radius,
|
zoneRadius = Radius,
|
||||||
|
radius = Radius,
|
||||||
expendQty = 100, -- dummy value
|
expendQty = 100, -- dummy value
|
||||||
expendQtyEnabled = false,
|
expendQtyEnabled = false,
|
||||||
|
alt_type = ASL and 0 or 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1449,10 +1452,16 @@ function CONTROLLABLE:TaskFireAtPoint( Vec2, Radius, AmmoCount, WeaponType )
|
|||||||
DCSTask.params.expendQtyEnabled = true
|
DCSTask.params.expendQtyEnabled = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if Altitude then
|
||||||
|
DCSTask.params.altitude=Altitude
|
||||||
|
end
|
||||||
|
|
||||||
if WeaponType then
|
if WeaponType then
|
||||||
DCSTask.params.weaponType=WeaponType
|
DCSTask.params.weaponType=WeaponType
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--self:I(DCSTask)
|
||||||
|
|
||||||
return DCSTask
|
return DCSTask
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1470,6 +1479,7 @@ end
|
|||||||
--- (AIR + GROUND) The task makes the controllable/unit a FAC and orders the FAC to control the target (enemy ground controllable) destruction.
|
--- (AIR + GROUND) The task makes the controllable/unit a FAC and orders the FAC to control the target (enemy ground controllable) destruction.
|
||||||
-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC.
|
-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC.
|
||||||
-- If the task is assigned to the controllable lead unit will be a FAC.
|
-- If the task is assigned to the controllable lead unit will be a FAC.
|
||||||
|
-- It's important to note that depending on the type of unit that is being assigned the task (AIR or GROUND), you must choose the correct type of callsign enumerator. For airborne controllables use CALLSIGN.Aircraft and for ground based use CALLSIGN.JTAC enumerators.
|
||||||
-- @param #CONTROLLABLE self
|
-- @param #CONTROLLABLE self
|
||||||
-- @param Wrapper.Group#GROUP AttackGroup Target GROUP object.
|
-- @param Wrapper.Group#GROUP AttackGroup Target GROUP object.
|
||||||
-- @param #number WeaponType Bitmask of weapon types, which are allowed to use.
|
-- @param #number WeaponType Bitmask of weapon types, which are allowed to use.
|
||||||
@@ -1477,7 +1487,7 @@ end
|
|||||||
-- @param #boolean Datalink (Optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default.
|
-- @param #boolean Datalink (Optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default.
|
||||||
-- @param #number Frequency Frequency in MHz used to communicate with the FAC. Default 133 MHz.
|
-- @param #number Frequency Frequency in MHz used to communicate with the FAC. Default 133 MHz.
|
||||||
-- @param #number Modulation Modulation of radio for communication. Default 0=AM.
|
-- @param #number Modulation Modulation of radio for communication. Default 0=AM.
|
||||||
-- @param #number CallsignName Callsign enumerator name of the FAC.
|
-- @param #number CallsignName Callsign enumerator name of the FAC. (CALLSIGN.Aircraft.{name} for airborne controllables, CALLSIGN.JTACS.{name} for ground units)
|
||||||
-- @param #number CallsignNumber Callsign number, e.g. Axeman-**1**.
|
-- @param #number CallsignNumber Callsign number, e.g. Axeman-**1**.
|
||||||
-- @return DCS#Task The DCS task structure.
|
-- @return DCS#Task The DCS task structure.
|
||||||
function CONTROLLABLE:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink, Frequency, Modulation, CallsignName, CallsignNumber )
|
function CONTROLLABLE:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink, Frequency, Modulation, CallsignName, CallsignNumber )
|
||||||
@@ -1799,7 +1809,7 @@ function CONTROLLABLE:TaskFunction( FunctionString, ... )
|
|||||||
|
|
||||||
-- DCS task.
|
-- DCS task.
|
||||||
local DCSTask = self:TaskWrappedAction(self:CommandDoScript(table.concat( DCSScript )))
|
local DCSTask = self:TaskWrappedAction(self:CommandDoScript(table.concat( DCSScript )))
|
||||||
|
|
||||||
return DCSTask
|
return DCSTask
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1841,8 +1851,27 @@ do -- Patrol methods
|
|||||||
|
|
||||||
-- Calculate the new Route.
|
-- Calculate the new Route.
|
||||||
local FromCoord = PatrolGroup:GetCoordinate()
|
local FromCoord = PatrolGroup:GetCoordinate()
|
||||||
local From = FromCoord:WaypointGround( 120 )
|
|
||||||
|
-- test for submarine
|
||||||
|
local depth = 0
|
||||||
|
local IsSub = false
|
||||||
|
if PatrolGroup:IsShip() then
|
||||||
|
local navalvec3 = FromCoord:GetVec3()
|
||||||
|
if navalvec3.y < 0 then
|
||||||
|
depth = navalvec3.y
|
||||||
|
IsSub = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local Waypoint = Waypoints[1]
|
||||||
|
local Speed = Waypoint.speed or (20 / 3.6)
|
||||||
|
local From = FromCoord:WaypointGround( Speed )
|
||||||
|
|
||||||
|
if IsSub then
|
||||||
|
From = FromCoord:WaypointNaval( Speed, Waypoint.alt )
|
||||||
|
end
|
||||||
|
|
||||||
table.insert( Waypoints, 1, From )
|
table.insert( Waypoints, 1, From )
|
||||||
|
|
||||||
local TaskRoute = PatrolGroup:TaskFunction( "CONTROLLABLE.PatrolRoute" )
|
local TaskRoute = PatrolGroup:TaskFunction( "CONTROLLABLE.PatrolRoute" )
|
||||||
@@ -1882,7 +1911,16 @@ do -- Patrol methods
|
|||||||
if ToWaypoint then
|
if ToWaypoint then
|
||||||
FromWaypoint = ToWaypoint
|
FromWaypoint = ToWaypoint
|
||||||
end
|
end
|
||||||
|
-- test for submarine
|
||||||
|
local depth = 0
|
||||||
|
local IsSub = false
|
||||||
|
if PatrolGroup:IsShip() then
|
||||||
|
local navalvec3 = FromCoord:GetVec3()
|
||||||
|
if navalvec3.y < 0 then
|
||||||
|
depth = navalvec3.y
|
||||||
|
IsSub = true
|
||||||
|
end
|
||||||
|
end
|
||||||
-- Loop until a waypoint has been found that is not the same as the current waypoint.
|
-- Loop until a waypoint has been found that is not the same as the current waypoint.
|
||||||
-- Otherwise the object zon't move or drive in circles and the algorithm would not do exactly
|
-- Otherwise the object zon't move or drive in circles and the algorithm would not do exactly
|
||||||
-- what it is supposed to do, which is making groups drive around.
|
-- what it is supposed to do, which is making groups drive around.
|
||||||
@@ -1897,9 +1935,13 @@ do -- Patrol methods
|
|||||||
local ToCoord = COORDINATE:NewFromVec2( { x = Waypoint.x, y = Waypoint.y } )
|
local ToCoord = COORDINATE:NewFromVec2( { x = Waypoint.x, y = Waypoint.y } )
|
||||||
-- Create a "ground route point", which is a "point" structure that can be given as a parameter to a Task
|
-- Create a "ground route point", which is a "point" structure that can be given as a parameter to a Task
|
||||||
local Route = {}
|
local Route = {}
|
||||||
Route[#Route+1] = FromCoord:WaypointGround( Speed, Formation )
|
if IsSub then
|
||||||
Route[#Route+1] = ToCoord:WaypointGround( Speed, Formation )
|
Route[#Route+1] = FromCoord:WaypointNaval( Speed, depth )
|
||||||
|
Route[#Route+1] = ToCoord:WaypointNaval( Speed, Waypoint.alt )
|
||||||
|
else
|
||||||
|
Route[#Route+1] = FromCoord:WaypointGround( Speed, Formation )
|
||||||
|
Route[#Route+1] = ToCoord:WaypointGround( Speed, Formation )
|
||||||
|
end
|
||||||
|
|
||||||
local TaskRouteToZone = PatrolGroup:TaskFunction( "CONTROLLABLE.PatrolRouteRandom", Speed, Formation, ToWaypoint )
|
local TaskRouteToZone = PatrolGroup:TaskFunction( "CONTROLLABLE.PatrolRouteRandom", Speed, Formation, ToWaypoint )
|
||||||
|
|
||||||
@@ -1940,9 +1982,20 @@ do -- Patrol methods
|
|||||||
self:F( { PatrolGroup = PatrolGroup:GetName() } )
|
self:F( { PatrolGroup = PatrolGroup:GetName() } )
|
||||||
|
|
||||||
if PatrolGroup:IsGround() or PatrolGroup:IsShip() then
|
if PatrolGroup:IsGround() or PatrolGroup:IsShip() then
|
||||||
|
|
||||||
-- Calculate the new Route.
|
-- Calculate the new Route.
|
||||||
local FromCoord = PatrolGroup:GetCoordinate()
|
local FromCoord = PatrolGroup:GetCoordinate()
|
||||||
|
|
||||||
|
-- test for submarine
|
||||||
|
local depth = 0
|
||||||
|
local IsSub = false
|
||||||
|
if PatrolGroup:IsShip() then
|
||||||
|
local navalvec3 = FromCoord:GetVec3()
|
||||||
|
if navalvec3.y < 0 then
|
||||||
|
depth = navalvec3.y
|
||||||
|
IsSub = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Select a random Zone and get the Coordinate of the new Zone.
|
-- Select a random Zone and get the Coordinate of the new Zone.
|
||||||
local RandomZone = ZoneList[ math.random( 1, #ZoneList ) ] -- Core.Zone#ZONE
|
local RandomZone = ZoneList[ math.random( 1, #ZoneList ) ] -- Core.Zone#ZONE
|
||||||
@@ -1950,9 +2003,13 @@ do -- Patrol methods
|
|||||||
|
|
||||||
-- Create a "ground route point", which is a "point" structure that can be given as a parameter to a Task
|
-- Create a "ground route point", which is a "point" structure that can be given as a parameter to a Task
|
||||||
local Route = {}
|
local Route = {}
|
||||||
Route[#Route+1] = FromCoord:WaypointGround( Speed, Formation )
|
if IsSub then
|
||||||
Route[#Route+1] = ToCoord:WaypointGround( Speed, Formation )
|
Route[#Route+1] = FromCoord:WaypointNaval( Speed, depth )
|
||||||
|
Route[#Route+1] = ToCoord:WaypointNaval( Speed, depth )
|
||||||
|
else
|
||||||
|
Route[#Route+1] = FromCoord:WaypointGround( Speed, Formation )
|
||||||
|
Route[#Route+1] = ToCoord:WaypointGround( Speed, Formation )
|
||||||
|
end
|
||||||
|
|
||||||
local TaskRouteToZone = PatrolGroup:TaskFunction( "CONTROLLABLE.PatrolZones", ZoneList, Speed, Formation, DelayMin, DelayMax )
|
local TaskRouteToZone = PatrolGroup:TaskFunction( "CONTROLLABLE.PatrolZones", ZoneList, Speed, Formation, DelayMin, DelayMax )
|
||||||
|
|
||||||
@@ -1976,7 +2033,7 @@ function CONTROLLABLE:TaskRoute( Points )
|
|||||||
id = 'Mission',
|
id = 'Mission',
|
||||||
params = {
|
params = {
|
||||||
airborne = self:IsAir(),
|
airborne = self:IsAir(),
|
||||||
route = {points = Points},
|
route = {points = Points},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2898,13 +2955,13 @@ end
|
|||||||
--- Set option for Rules of Engagement (ROE).
|
--- Set option for Rules of Engagement (ROE).
|
||||||
-- @param Wrapper.Controllable#CONTROLLABLE self
|
-- @param Wrapper.Controllable#CONTROLLABLE self
|
||||||
-- @param #number ROEvalue ROE value. See ENUMS.ROE.
|
-- @param #number ROEvalue ROE value. See ENUMS.ROE.
|
||||||
-- @return Wrapper.Controllable#CONTROLLABLE self
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:OptionROE(ROEvalue)
|
function CONTROLLABLE:OptionROE(ROEvalue)
|
||||||
|
|
||||||
local DCSControllable = self:GetDCSObject()
|
local DCSControllable = self:GetDCSObject()
|
||||||
|
|
||||||
if DCSControllable then
|
if DCSControllable then
|
||||||
|
|
||||||
local Controller = self:_GetController()
|
local Controller = self:_GetController()
|
||||||
|
|
||||||
if self:IsAir() then
|
if self:IsAir() then
|
||||||
@@ -2940,8 +2997,8 @@ function CONTROLLABLE:OptionROEHoldFirePossible()
|
|||||||
end
|
end
|
||||||
|
|
||||||
--- Weapons Hold: AI will hold fire under all circumstances.
|
--- Weapons Hold: AI will hold fire under all circumstances.
|
||||||
-- @param Wrapper.Controllable#CONTROLLABLE self
|
-- @param #CONTROLLABLE self
|
||||||
-- @return Wrapper.Controllable#CONTROLLABLE self
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:OptionROEHoldFire()
|
function CONTROLLABLE:OptionROEHoldFire()
|
||||||
self:F2( { self.ControllableName } )
|
self:F2( { self.ControllableName } )
|
||||||
|
|
||||||
@@ -3468,13 +3525,13 @@ end
|
|||||||
-- @return #CONTROLLABLE self
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:OptionProhibitAfterburner(Prohibit)
|
function CONTROLLABLE:OptionProhibitAfterburner(Prohibit)
|
||||||
self:F2( { self.ControllableName } )
|
self:F2( { self.ControllableName } )
|
||||||
|
|
||||||
if Prohibit==nil then
|
if Prohibit==nil then
|
||||||
Prohibit=true
|
Prohibit=true
|
||||||
end
|
end
|
||||||
|
|
||||||
if self:IsAir() then
|
if self:IsAir() then
|
||||||
self:SetOption(AI.Option.Air.id.PROHIBIT_AB, Prohibit)
|
self:SetOption(AI.Option.Air.id.PROHIBIT_AB, Prohibit)
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
@@ -3485,9 +3542,9 @@ end
|
|||||||
-- @return #CONTROLLABLE self
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:OptionECM_Never()
|
function CONTROLLABLE:OptionECM_Never()
|
||||||
self:F2( { self.ControllableName } )
|
self:F2( { self.ControllableName } )
|
||||||
|
|
||||||
if self:IsAir() then
|
if self:IsAir() then
|
||||||
self:SetOption(AI.Option.Air.id.ECM_USING, 0)
|
self:SetOption(AI.Option.Air.id.ECM_USING, 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
@@ -3498,9 +3555,9 @@ end
|
|||||||
-- @return #CONTROLLABLE self
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:OptionECM_OnlyLockByRadar()
|
function CONTROLLABLE:OptionECM_OnlyLockByRadar()
|
||||||
self:F2( { self.ControllableName } )
|
self:F2( { self.ControllableName } )
|
||||||
|
|
||||||
if self:IsAir() then
|
if self:IsAir() then
|
||||||
self:SetOption(AI.Option.Air.id.ECM_USING, 1)
|
self:SetOption(AI.Option.Air.id.ECM_USING, 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
@@ -3512,9 +3569,9 @@ end
|
|||||||
-- @return #CONTROLLABLE self
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:OptionECM_DetectedLockByRadar()
|
function CONTROLLABLE:OptionECM_DetectedLockByRadar()
|
||||||
self:F2( { self.ControllableName } )
|
self:F2( { self.ControllableName } )
|
||||||
|
|
||||||
if self:IsAir() then
|
if self:IsAir() then
|
||||||
self:SetOption(AI.Option.Air.id.ECM_USING, 2)
|
self:SetOption(AI.Option.Air.id.ECM_USING, 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
@@ -3525,9 +3582,9 @@ end
|
|||||||
-- @return #CONTROLLABLE self
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:OptionECM_AlwaysOn()
|
function CONTROLLABLE:OptionECM_AlwaysOn()
|
||||||
self:F2( { self.ControllableName } )
|
self:F2( { self.ControllableName } )
|
||||||
|
|
||||||
if self:IsAir() then
|
if self:IsAir() then
|
||||||
self:SetOption(AI.Option.Air.id.ECM_USING, 3)
|
self:SetOption(AI.Option.Air.id.ECM_USING, 3)
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
@@ -3539,7 +3596,7 @@ end
|
|||||||
-- Note that when WayPointInitialize is called, the Mission of the controllable is RESTARTED!
|
-- Note that when WayPointInitialize is called, the Mission of the controllable is RESTARTED!
|
||||||
-- @param #CONTROLLABLE self
|
-- @param #CONTROLLABLE self
|
||||||
-- @param #table WayPoints If WayPoints is given, then use the route.
|
-- @param #table WayPoints If WayPoints is given, then use the route.
|
||||||
-- @return #CONTROLLABLE
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:WayPointInitialize( WayPoints )
|
function CONTROLLABLE:WayPointInitialize( WayPoints )
|
||||||
self:F( { WayPoints } )
|
self:F( { WayPoints } )
|
||||||
|
|
||||||
@@ -3570,7 +3627,7 @@ end
|
|||||||
-- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1!
|
-- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1!
|
||||||
-- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions.
|
-- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions.
|
||||||
-- @param #function WayPointFunction The waypoint function to be called when the controllable moves over the waypoint. The waypoint function takes variable parameters.
|
-- @param #function WayPointFunction The waypoint function to be called when the controllable moves over the waypoint. The waypoint function takes variable parameters.
|
||||||
-- @return #CONTROLLABLE
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... )
|
function CONTROLLABLE:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... )
|
||||||
self:F2( { WayPoint, WayPointIndex, WayPointFunction } )
|
self:F2( { WayPoint, WayPointIndex, WayPointFunction } )
|
||||||
|
|
||||||
@@ -3586,7 +3643,7 @@ end
|
|||||||
-- @param #CONTROLLABLE self
|
-- @param #CONTROLLABLE self
|
||||||
-- @param #number WayPoint The WayPoint from where to execute the mission.
|
-- @param #number WayPoint The WayPoint from where to execute the mission.
|
||||||
-- @param #number WaitTime The amount seconds to wait before initiating the mission.
|
-- @param #number WaitTime The amount seconds to wait before initiating the mission.
|
||||||
-- @return #CONTROLLABLE
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:WayPointExecute( WayPoint, WaitTime )
|
function CONTROLLABLE:WayPointExecute( WayPoint, WaitTime )
|
||||||
self:F( { WayPoint, WaitTime } )
|
self:F( { WayPoint, WaitTime } )
|
||||||
|
|
||||||
@@ -3669,21 +3726,22 @@ end
|
|||||||
|
|
||||||
--- Sets Controllable Option for A2A attack range for AIR FIGHTER units.
|
--- Sets Controllable Option for A2A attack range for AIR FIGHTER units.
|
||||||
-- @param #CONTROLLABLE self
|
-- @param #CONTROLLABLE self
|
||||||
-- @param #number range Defines the range
|
-- @param #number range Defines the range
|
||||||
|
-- @return #CONTROLLABLE self
|
||||||
-- @usage Range can be one of MAX_RANGE = 0, NEZ_RANGE = 1, HALF_WAY_RMAX_NEZ = 2, TARGET_THREAT_EST = 3, RANDOM_RANGE = 4. Defaults to 3. See: https://wiki.hoggitworld.com/view/DCS_option_missileAttack
|
-- @usage Range can be one of MAX_RANGE = 0, NEZ_RANGE = 1, HALF_WAY_RMAX_NEZ = 2, TARGET_THREAT_EST = 3, RANDOM_RANGE = 4. Defaults to 3. See: https://wiki.hoggitworld.com/view/DCS_option_missileAttack
|
||||||
function CONTROLLABLE:OptionAAAttackRange(range)
|
function CONTROLLABLE:OptionAAAttackRange(range)
|
||||||
self:F2( { self.ControllableName } )
|
self:F2( { self.ControllableName } )
|
||||||
-- defaults to 3
|
-- defaults to 3
|
||||||
local range = range or 3
|
local range = range or 3
|
||||||
if range < 0 or range > 4 then
|
if range < 0 or range > 4 then
|
||||||
range = 3
|
range = 3
|
||||||
end
|
end
|
||||||
local DCSControllable = self:GetDCSObject()
|
local DCSControllable = self:GetDCSObject()
|
||||||
if DCSControllable then
|
if DCSControllable then
|
||||||
local Controller = self:_GetController()
|
local Controller = self:_GetController()
|
||||||
if Controller then
|
if Controller then
|
||||||
if self:IsAir() then
|
if self:IsAir() then
|
||||||
self:SetOption(AI.Option.Air.val.MISSILE_ATTACK, range)
|
self:SetOption(AI.Option.Air.val.MISSILE_ATTACK, range)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return self
|
return self
|
||||||
@@ -3696,7 +3754,7 @@ end
|
|||||||
-- @param #number EngageRange Engage range limit in percent (a number between 0 and 100). Default 100.
|
-- @param #number EngageRange Engage range limit in percent (a number between 0 and 100). Default 100.
|
||||||
-- @return #CONTROLLABLE self
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:OptionEngageRange(EngageRange)
|
function CONTROLLABLE:OptionEngageRange(EngageRange)
|
||||||
self:F2( { self.ControllableName } )
|
self:F2( { self.ControllableName } )
|
||||||
-- Set default if not specified.
|
-- Set default if not specified.
|
||||||
EngageRange=EngageRange or 100
|
EngageRange=EngageRange or 100
|
||||||
if EngageRange < 0 or EngageRange > 100 then
|
if EngageRange < 0 or EngageRange > 100 then
|
||||||
@@ -3705,9 +3763,9 @@ function CONTROLLABLE:OptionEngageRange(EngageRange)
|
|||||||
local DCSControllable = self:GetDCSObject()
|
local DCSControllable = self:GetDCSObject()
|
||||||
if DCSControllable then
|
if DCSControllable then
|
||||||
local Controller = self:_GetController()
|
local Controller = self:_GetController()
|
||||||
if Controller then
|
if Controller then
|
||||||
if self:IsGround() then
|
if self:IsGround() then
|
||||||
self:SetOption(AI.Option.Ground.id.AC_ENGAGEMENT_RANGE_RESTRICTION, EngageRange)
|
self:SetOption(AI.Option.Ground.id.AC_ENGAGEMENT_RANGE_RESTRICTION, EngageRange)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return self
|
return self
|
||||||
@@ -3721,10 +3779,11 @@ end
|
|||||||
-- @param #number radius Radius of the relocation zone, default 500
|
-- @param #number radius Radius of the relocation zone, default 500
|
||||||
-- @param #boolean onroad If true, route on road (less problems with AI way finding), default true
|
-- @param #boolean onroad If true, route on road (less problems with AI way finding), default true
|
||||||
-- @param #boolean shortcut If true and onroad is set, take a shorter route - if available - off road, default false
|
-- @param #boolean shortcut If true and onroad is set, take a shorter route - if available - off road, default false
|
||||||
|
-- @return #CONTROLLABLE self
|
||||||
function CONTROLLABLE:RelocateGroundRandomInRadius(speed, radius, onroad, shortcut)
|
function CONTROLLABLE:RelocateGroundRandomInRadius(speed, radius, onroad, shortcut)
|
||||||
self:F2( { self.ControllableName } )
|
self:F2( { self.ControllableName } )
|
||||||
|
|
||||||
local _coord = self:GetCoordinate()
|
local _coord = self:GetCoordinate()
|
||||||
local _radius = radius or 500
|
local _radius = radius or 500
|
||||||
local _speed = speed or 20
|
local _speed = speed or 20
|
||||||
local _tocoord = _coord:GetRandomCoordinateInRadius(_radius,100)
|
local _tocoord = _coord:GetRandomCoordinateInRadius(_radius,100)
|
||||||
@@ -3732,7 +3791,7 @@ function CONTROLLABLE:RelocateGroundRandomInRadius(speed, radius, onroad, shortc
|
|||||||
local _grptsk = {}
|
local _grptsk = {}
|
||||||
local _candoroad = false
|
local _candoroad = false
|
||||||
local _shortcut = shortcut or false
|
local _shortcut = shortcut or false
|
||||||
|
|
||||||
-- create a DCS Task an push it on the group
|
-- create a DCS Task an push it on the group
|
||||||
-- TaskGroundOnRoad(ToCoordinate,Speed,OffRoadFormation,Shortcut,FromCoordinate,WaypointFunction,WaypointFunctionArguments)
|
-- TaskGroundOnRoad(ToCoordinate,Speed,OffRoadFormation,Shortcut,FromCoordinate,WaypointFunction,WaypointFunctionArguments)
|
||||||
if onroad then
|
if onroad then
|
||||||
@@ -3742,5 +3801,46 @@ function CONTROLLABLE:RelocateGroundRandomInRadius(speed, radius, onroad, shortc
|
|||||||
self:TaskRouteToVec2(_tocoord:GetVec2(),_speed,"Off Road")
|
self:TaskRouteToVec2(_tocoord:GetVec2(),_speed,"Off Road")
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Defines how long a GROUND unit/group will move to avoid an ongoing attack.
|
||||||
|
-- @param #CONTROLLABLE self
|
||||||
|
-- @param #number Seconds Any positive number: AI will disperse, but only for the specified time before continuing their route. 0: AI will not disperse.
|
||||||
|
-- @return #CONTROLLABLE self
|
||||||
|
function CONTROLLABLE:OptionDisperseOnAttack(Seconds)
|
||||||
|
self:F2( { self.ControllableName } )
|
||||||
|
-- Set default if not specified.
|
||||||
|
local seconds = Seconds or 0
|
||||||
|
local DCSControllable = self:GetDCSObject()
|
||||||
|
if DCSControllable then
|
||||||
|
local Controller = self:_GetController()
|
||||||
|
if Controller then
|
||||||
|
if self:IsGround() then
|
||||||
|
self:SetOption(AI.Option.Ground.id.DISPERSE_ON_ATTACK, seconds)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Returns if the unit is a submarine.
|
||||||
|
-- @param #POSITIONABLE self
|
||||||
|
-- @return #boolean Submarines attributes result.
|
||||||
|
function POSITIONABLE:IsSubmarine()
|
||||||
|
self:F2()
|
||||||
|
|
||||||
|
local DCSUnit = self:GetDCSObject()
|
||||||
|
|
||||||
|
if DCSUnit then
|
||||||
|
local UnitDescriptor = DCSUnit:getDesc()
|
||||||
|
if UnitDescriptor.attributes["Submarines"] == true then
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return nil
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2551,6 +2551,25 @@ do -- Players
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- GROUND - Switch on/off radar emissions for the group.
|
||||||
|
-- @param #GROUP self
|
||||||
|
-- @param #boolean switch If true, emission is enabled. If false, emission is disabled.
|
||||||
|
-- @return #GROUP self
|
||||||
|
function GROUP:EnableEmission(switch)
|
||||||
|
self:F2( self.GroupName )
|
||||||
|
local switch = switch or false
|
||||||
|
|
||||||
|
local DCSUnit = self:GetDCSObject()
|
||||||
|
|
||||||
|
if DCSUnit then
|
||||||
|
|
||||||
|
DCSUnit:enableEmission(switch)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
--do -- Smoke
|
--do -- Smoke
|
||||||
--
|
--
|
||||||
----- Signal a flare at the position of the GROUP.
|
----- Signal a flare at the position of the GROUP.
|
||||||
@@ -2641,4 +2660,4 @@ end
|
|||||||
--
|
--
|
||||||
--
|
--
|
||||||
--
|
--
|
||||||
--end
|
--end
|
||||||
|
|||||||
@@ -1457,11 +1457,14 @@ do -- Cargo
|
|||||||
self:F({Desc=Desc})
|
self:F({Desc=Desc})
|
||||||
|
|
||||||
local Weights = {
|
local Weights = {
|
||||||
["Type_071"] = 245000,
|
["Type_071"] = 245000,
|
||||||
["LHA_Tarawa"] = 500000,
|
["LHA_Tarawa"] = 500000,
|
||||||
["Ropucha-class"] = 150000,
|
["Ropucha-class"] = 150000,
|
||||||
["Dry-cargo ship-1"] = 70000,
|
["Dry-cargo ship-1"] = 70000,
|
||||||
["Dry-cargo ship-2"] = 70000,
|
["Dry-cargo ship-2"] = 70000,
|
||||||
|
["Higgins_boat"] = 3700, -- Higgins Boat can load 3700 kg of general cargo or 36 men (source wikipedia).
|
||||||
|
["USS_Samuel_Chase"] = 25000, -- Let's say 25 tons for now. Wiki says 33 Higgins boats, which would be 264 tons (can't be right!) and/or 578 troops.
|
||||||
|
["LST_Mk2"] =2100000, -- Can carry 2100 tons according to wiki source!
|
||||||
}
|
}
|
||||||
self.__.CargoBayWeightLimit = ( Weights[Desc.typeName] or 50000 )
|
self.__.CargoBayWeightLimit = ( Weights[Desc.typeName] or 50000 )
|
||||||
|
|
||||||
@@ -1469,40 +1472,47 @@ do -- Cargo
|
|||||||
local Desc = self:GetDesc()
|
local Desc = self:GetDesc()
|
||||||
|
|
||||||
local Weights = {
|
local Weights = {
|
||||||
["M1126 Stryker ICV"] = 9,
|
|
||||||
["M-113"] = 9,
|
|
||||||
["AAV7"] = 25,
|
["AAV7"] = 25,
|
||||||
["M2A1_halftrack"] = 9,
|
["Bedford_MWD"] = 8, -- new by kappa
|
||||||
["BMD-1"] = 9,
|
["Blitz_36-6700A"] = 10, -- new by kappa
|
||||||
|
["BMD-1"] = 9, -- IRL should be 4 passengers
|
||||||
["BMP-1"] = 8,
|
["BMP-1"] = 8,
|
||||||
["BMP-2"] = 7,
|
["BMP-2"] = 7,
|
||||||
["BMP-3"] = 8,
|
["BMP-3"] = 8, -- IRL should be 7+2 passengers
|
||||||
["Boman"] = 25,
|
["Boman"] = 25,
|
||||||
["BTR-80"] = 9,
|
["BTR-80"] = 9, -- IRL should be 7 passengers
|
||||||
["BTR_D"] = 12,
|
["BTR-82A"] = 9, -- new by kappa -- IRL should be 7 passengers
|
||||||
|
["BTR_D"] = 12, -- IRL should be 10 passengers
|
||||||
["Cobra"] = 8,
|
["Cobra"] = 8,
|
||||||
|
["Land_Rover_101_FC"] = 11, -- new by kappa
|
||||||
|
["Land_Rover_109_S3"] = 7, -- new by kappa
|
||||||
["LAV-25"] = 6,
|
["LAV-25"] = 6,
|
||||||
["M-2 Bradley"] = 6,
|
["M-2 Bradley"] = 6,
|
||||||
["M1043 HMMWV Armament"] = 4,
|
["M1043 HMMWV Armament"] = 4,
|
||||||
["M1045 HMMWV TOW"] = 4,
|
["M1045 HMMWV TOW"] = 4,
|
||||||
["M1126 Stryker ICV"] = 9,
|
["M1126 Stryker ICV"] = 9,
|
||||||
["M1134 Stryker ATGM"] = 9,
|
["M1134 Stryker ATGM"] = 9,
|
||||||
|
["M2A1_halftrack"] = 9,
|
||||||
|
["M-113"] = 9, -- IRL should be 11 passengers
|
||||||
["Marder"] = 6,
|
["Marder"] = 6,
|
||||||
["MCV-80"] = 9,
|
["MCV-80"] = 9, -- IRL should be 7 passengers
|
||||||
["MLRS FDDM"] = 4,
|
["MLRS FDDM"] = 4,
|
||||||
["MTLB"] = 25,
|
["MTLB"] = 25, -- IRL should be 11 passengers
|
||||||
["TPZ"] = 10,
|
|
||||||
["Ural-4320 APA-5D"] = 10,
|
|
||||||
["GAZ-66"] = 8,
|
["GAZ-66"] = 8,
|
||||||
["GAZ-3307"] = 12,
|
["GAZ-3307"] = 12,
|
||||||
["GAZ-3308"] = 14,
|
["GAZ-3308"] = 14,
|
||||||
["Tigr_233036"] = 6,
|
["Grad_FDDM"] = 6, -- new by kappa
|
||||||
["KAMAZ Truck"] = 12,
|
["KAMAZ Truck"] = 12,
|
||||||
["KrAZ6322"] = 12,
|
["KrAZ6322"] = 12,
|
||||||
["M 818"] = 12,
|
["M 818"] = 12,
|
||||||
|
["Tigr_233036"] = 6,
|
||||||
|
["TPZ"] = 10,
|
||||||
|
["UAZ-469"] = 4, -- new by kappa
|
||||||
["Ural-375"] = 12,
|
["Ural-375"] = 12,
|
||||||
["Ural-4320-31"] = 14,
|
["Ural-4320-31"] = 14,
|
||||||
|
["Ural-4320 APA-5D"] = 10,
|
||||||
["Ural-4320T"] = 14,
|
["Ural-4320T"] = 14,
|
||||||
|
["ZBD04A"] = 7, -- new by kappa
|
||||||
}
|
}
|
||||||
|
|
||||||
local CargoBayWeightLimit = ( Weights[Desc.typeName] or 0 ) * 95
|
local CargoBayWeightLimit = ( Weights[Desc.typeName] or 0 ) * 95
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
--
|
--
|
||||||
-- The UNIT class provides methods to obtain the current point or position of the DCS Unit.
|
-- The UNIT class provides methods to obtain the current point or position of the DCS Unit.
|
||||||
-- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetVec3}() will obtain the current **location** of the DCS Unit in a Vec2 (2D) or a **point** in a Vec3 (3D) vector respectively.
|
-- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetVec3}() will obtain the current **location** of the DCS Unit in a Vec2 (2D) or a **point** in a Vec3 (3D) vector respectively.
|
||||||
-- If you want to obtain the complete **3D position** including ori<EFBFBD>ntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively.
|
-- If you want to obtain the complete **3D position** including orientation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively.
|
||||||
--
|
--
|
||||||
-- ## Test if alive
|
-- ## Test if alive
|
||||||
--
|
--
|
||||||
@@ -154,8 +154,8 @@ function UNIT:Name()
|
|||||||
return self.UnitName
|
return self.UnitName
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Get the DCS unit object.
|
||||||
--- @param #UNIT self
|
-- @param #UNIT self
|
||||||
-- @return DCS#Unit
|
-- @return DCS#Unit
|
||||||
function UNIT:GetDCSObject()
|
function UNIT:GetDCSObject()
|
||||||
|
|
||||||
@@ -527,8 +527,7 @@ end
|
|||||||
|
|
||||||
--- Returns the unit's group if it exist and nil otherwise.
|
--- Returns the unit's group if it exist and nil otherwise.
|
||||||
-- @param Wrapper.Unit#UNIT self
|
-- @param Wrapper.Unit#UNIT self
|
||||||
-- @return Wrapper.Group#GROUP The Group of the Unit.
|
-- @return Wrapper.Group#GROUP The Group of the Unit or `nil` if the unit does not exist.
|
||||||
-- @return #nil The DCS Unit is not existing or alive.
|
|
||||||
function UNIT:GetGroup()
|
function UNIT:GetGroup()
|
||||||
self:F2( self.UnitName )
|
self:F2( self.UnitName )
|
||||||
|
|
||||||
@@ -762,6 +761,7 @@ function UNIT:GetFuel()
|
|||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Returns a list of one @{Wrapper.Unit}.
|
--- Returns a list of one @{Wrapper.Unit}.
|
||||||
-- @param #UNIT self
|
-- @param #UNIT self
|
||||||
-- @return #list<Wrapper.Unit#UNIT> A list of one @{Wrapper.Unit}.
|
-- @return #list<Wrapper.Unit#UNIT> A list of one @{Wrapper.Unit}.
|
||||||
@@ -1175,8 +1175,9 @@ end
|
|||||||
|
|
||||||
--- Returns true if the UNIT is in the air.
|
--- Returns true if the UNIT is in the air.
|
||||||
-- @param #UNIT self
|
-- @param #UNIT self
|
||||||
|
-- @param #boolean NoHeloCheck If true, no additonal checks for helos are performed.
|
||||||
-- @return #boolean Return true if in the air or #nil if the UNIT is not existing or alive.
|
-- @return #boolean Return true if in the air or #nil if the UNIT is not existing or alive.
|
||||||
function UNIT:InAir()
|
function UNIT:InAir(NoHeloCheck)
|
||||||
self:F2( self.UnitName )
|
self:F2( self.UnitName )
|
||||||
|
|
||||||
-- Get DCS unit object.
|
-- Get DCS unit object.
|
||||||
@@ -1186,14 +1187,14 @@ function UNIT:InAir()
|
|||||||
|
|
||||||
-- Get DCS result of whether unit is in air or not.
|
-- Get DCS result of whether unit is in air or not.
|
||||||
local UnitInAir = DCSUnit:inAir()
|
local UnitInAir = DCSUnit:inAir()
|
||||||
|
|
||||||
-- Get unit category.
|
-- Get unit category.
|
||||||
local UnitCategory = DCSUnit:getDesc().category
|
local UnitCategory = DCSUnit:getDesc().category
|
||||||
|
|
||||||
-- If DCS says that it is in air, check if this is really the case, since we might have landed on a building where inAir()=true but actually is not.
|
-- If DCS says that it is in air, check if this is really the case, since we might have landed on a building where inAir()=true but actually is not.
|
||||||
-- This is a workaround since DCS currently does not acknoledge that helos land on buildings.
|
-- This is a workaround since DCS currently does not acknoledge that helos land on buildings.
|
||||||
-- Note however, that the velocity check will fail if the ground is moving, e.g. on an aircraft carrier!
|
-- Note however, that the velocity check will fail if the ground is moving, e.g. on an aircraft carrier!
|
||||||
if UnitInAir==true and UnitCategory == Unit.Category.HELICOPTER then
|
if UnitInAir==true and UnitCategory == Unit.Category.HELICOPTER and (not NoHeloCheck) then
|
||||||
local VelocityVec3 = DCSUnit:getVelocity()
|
local VelocityVec3 = DCSUnit:getVelocity()
|
||||||
local Velocity = UTILS.VecNorm(VelocityVec3)
|
local Velocity = UTILS.VecNorm(VelocityVec3)
|
||||||
local Coordinate = DCSUnit:getPoint()
|
local Coordinate = DCSUnit:getPoint()
|
||||||
@@ -1393,3 +1394,23 @@ function UNIT:GetTemplateFuel()
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- GROUND - Switch on/off radar emissions of a unit.
|
||||||
|
-- @param #UNIT self
|
||||||
|
-- @param #boolean switch If true, emission is enabled. If false, emission is disabled.
|
||||||
|
-- @return #UNIT self
|
||||||
|
function UNIT:EnableEmission(switch)
|
||||||
|
self:F2( self.UnitName )
|
||||||
|
|
||||||
|
local switch = switch or false
|
||||||
|
|
||||||
|
local DCSUnit = self:GetDCSObject()
|
||||||
|
|
||||||
|
if DCSUnit then
|
||||||
|
|
||||||
|
DCSUnit:enableEmission(switch)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ Utilities/Routines.lua
|
|||||||
Utilities/Utils.lua
|
Utilities/Utils.lua
|
||||||
Utilities/Enums.lua
|
Utilities/Enums.lua
|
||||||
Utilities/Profiler.lua
|
Utilities/Profiler.lua
|
||||||
|
Utilities/Templates.lua
|
||||||
|
|
||||||
Core/Base.lua
|
Core/Base.lua
|
||||||
Core/UserFlag.lua
|
Core/UserFlag.lua
|
||||||
@@ -68,6 +69,8 @@ Functional/Suppression.lua
|
|||||||
Functional/PseudoATC.lua
|
Functional/PseudoATC.lua
|
||||||
Functional/Warehouse.lua
|
Functional/Warehouse.lua
|
||||||
Functional/Fox.lua
|
Functional/Fox.lua
|
||||||
|
Functional/Mantis.lua
|
||||||
|
Functional/Shorad.lua
|
||||||
|
|
||||||
Ops/Airboss.lua
|
Ops/Airboss.lua
|
||||||
Ops/RecoveryTanker.lua
|
Ops/RecoveryTanker.lua
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
[](https://ci.appveyor.com/project/Applevangelist/MOOSE)
|
||||||
|
|
||||||
# MOOSE framework
|
# MOOSE framework
|
||||||
|
|
||||||
MOOSE is a **M**ission **O**bject **O**riented **S**cripting **E**nvironment, and is meant for mission designers in DCS World.
|
MOOSE is a **M**ission **O**bject **O**riented **S**cripting **E**nvironment, and is meant for mission designers in DCS World.
|
||||||
@@ -28,7 +30,7 @@ This repository contains the source lua code of the MOOSE framework.
|
|||||||
|
|
||||||
### [MOOSE_INCLUDE](https://github.com/FlightControl-Master/MOOSE_INCLUDE) - For use and generated
|
### [MOOSE_INCLUDE](https://github.com/FlightControl-Master/MOOSE_INCLUDE) - For use and generated
|
||||||
|
|
||||||
This repository contains the Moose.lua file to be included within your missions.
|
This repository contains the Moose.lua file to be included within your missions. Note that the Moose\_.lua is technically the same as Moose.lua, but without any commentary or unnecessary whitespace in it. You only need to load **one** of those at the beginning of your mission.
|
||||||
|
|
||||||
|
|
||||||
### [MOOSE_DOCS](https://github.com/FlightControl-Master/MOOSE_DOCS) - Not for use
|
### [MOOSE_DOCS](https://github.com/FlightControl-Master/MOOSE_DOCS) - Not for use
|
||||||
@@ -50,9 +52,7 @@ This repository contains all the demonstration missions in packed format (*.miz)
|
|||||||
|
|
||||||
This repository contains all the demonstration missions in unpacked format. That means that there is no .miz file included, but all the .miz contents are unpacked.
|
This repository contains all the demonstration missions in unpacked format. That means that there is no .miz file included, but all the .miz contents are unpacked.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [MOOSE Web Site](https://flightcontrol-master.github.io/MOOSE_DOCS/)
|
## [MOOSE Web Site](https://flightcontrol-master.github.io/MOOSE_DOCS/)
|
||||||
|
|
||||||
Documentation on the MOOSE class hierarchy, usage guides and background information can be found here for normal users, beta testers and contributors.
|
Documentation on the MOOSE class hierarchy, usage guides and background information can be found here for normal users, beta testers and contributors.
|
||||||
|
|||||||
Reference in New Issue
Block a user