mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-08-13 17:31:41 +00:00
Merge remote-tracking branch 'origin/master-ng' into branchxx
This commit is contained in:
@@ -40,7 +40,7 @@ jobs:
|
|||||||
# Prepare build environment
|
# Prepare build environment
|
||||||
#########################################################################
|
#########################################################################
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Prepare build output folders
|
- name: Prepare build output folders
|
||||||
run: |
|
run: |
|
||||||
@@ -48,7 +48,7 @@ jobs:
|
|||||||
mkdir -p build/doc
|
mkdir -p build/doc
|
||||||
|
|
||||||
- name: Checkout FlightControls modified luadocumentor
|
- name: Checkout FlightControls modified luadocumentor
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
repository: Applevangelist/luadocumentor
|
repository: Applevangelist/luadocumentor
|
||||||
path: './build/tools/luadocumentor'
|
path: './build/tools/luadocumentor'
|
||||||
@@ -129,7 +129,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Checkout ${{ steps.set_doc_repo.outputs.docrepo }} to folder MOOSE_DOCS
|
- name: Checkout ${{ steps.set_doc_repo.outputs.docrepo }} to folder MOOSE_DOCS
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
repository: ${{ github.repository_owner }}/${{ steps.set_doc_repo.outputs.docrepo }}
|
repository: ${{ github.repository_owner }}/${{ steps.set_doc_repo.outputs.docrepo }}
|
||||||
path: './build/MOOSE_DOCS'
|
path: './build/MOOSE_DOCS'
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ jobs:
|
|||||||
# Prepare build environment
|
# Prepare build environment
|
||||||
#########################################################################
|
#########################################################################
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Prepare build output folders
|
- name: Prepare build output folders
|
||||||
run: |
|
run: |
|
||||||
@@ -115,7 +115,7 @@ jobs:
|
|||||||
# Push to MOOSE_INCLUDE
|
# Push to MOOSE_INCLUDE
|
||||||
#########################################################################
|
#########################################################################
|
||||||
- name: Checkout MOOSE_INCLUDE
|
- name: Checkout MOOSE_INCLUDE
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
repository: ${{ github.repository_owner }}/MOOSE_INCLUDE
|
repository: ${{ github.repository_owner }}/MOOSE_INCLUDE
|
||||||
path: './build/MOOSE_INCLUDE'
|
path: './build/MOOSE_INCLUDE'
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
- name: Setup Ruby
|
- name: Setup Ruby
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
@@ -43,7 +43,7 @@ jobs:
|
|||||||
working-directory: docs/
|
working-directory: docs/
|
||||||
- name: Setup Pages
|
- name: Setup Pages
|
||||||
id: pages
|
id: pages
|
||||||
uses: actions/configure-pages@v4
|
uses: actions/configure-pages@v5
|
||||||
- name: Build with Jekyll
|
- name: Build with Jekyll
|
||||||
# Outputs to the './_site' directory by default
|
# Outputs to the './_site' directory by default
|
||||||
run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}"
|
run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}"
|
||||||
@@ -52,7 +52,7 @@ jobs:
|
|||||||
working-directory: docs/
|
working-directory: docs/
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
# Automatically uploads an artifact from the './_site' directory by default
|
# Automatically uploads an artifact from the './_site' directory by default
|
||||||
uses: actions/upload-pages-artifact@v3
|
uses: actions/upload-pages-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: docs/_site/
|
path: docs/_site/
|
||||||
|
|
||||||
@@ -73,6 +73,6 @@ jobs:
|
|||||||
needs: deploy
|
needs: deploy
|
||||||
steps:
|
steps:
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v5
|
||||||
- run: npm install linkinator
|
- run: npm install linkinator
|
||||||
- run: npx linkinator https://flightcontrol-master.github.io/MOOSE/ --verbosity error --timeout 5000 --recurse --skip "(java.com)" --retry-errors --retry-errors-count 3 --retry-errors-jitter
|
- run: npx linkinator https://flightcontrol-master.github.io/MOOSE/ --verbosity error --timeout 5000 --recurse --skip "(java.com)" --skip 'https:\/\/flightcontrol-master\.github\.io\/MOOSE_DOCS_DEVELOP\/Documentation\/(?:AI|Tasking|Cargo|MissileTrainer)\.[^\/\s]+\.html$' --status-code "404:skip" --retry-errors --retry-errors-count 3 --retry-errors-jitter
|
||||||
|
|||||||
@@ -197,6 +197,7 @@ do
|
|||||||
-- my_ctld.onestepmenu = false -- When set to true, the menu will create Drop and build, Get and load, Pack and remove, Pack and load, Pack. it will be a 1 step solution.
|
-- my_ctld.onestepmenu = false -- When set to true, the menu will create Drop and build, Get and load, Pack and remove, Pack and load, Pack. it will be a 1 step solution.
|
||||||
-- my_ctld.VehicleMoveFormation = AI.Task.VehicleFormation.VEE -- When a group moves to a MOVE zone, then it takes this formation. Can be a table of formations, which are then randomly chosen. Defaults to "Vee".
|
-- my_ctld.VehicleMoveFormation = AI.Task.VehicleFormation.VEE -- When a group moves to a MOVE zone, then it takes this formation. Can be a table of formations, which are then randomly chosen. Defaults to "Vee".
|
||||||
-- my_ctld.validateAndRepositionUnits = false -- Uses Disposition and other logic to find better ground positions for ground units avoiding trees, water, roads, runways, map scenery, statics and other units in the area. (Default is false)
|
-- my_ctld.validateAndRepositionUnits = false -- Uses Disposition and other logic to find better ground positions for ground units avoiding trees, water, roads, runways, map scenery, statics and other units in the area. (Default is false)
|
||||||
|
-- my_ctld.maxUnloadTroopsAllowed = -1 -- Max troops allowed to be unloaded at once. Set to -1 for unlimited (Default). This is a soft limit, that is, if you have more troops in the heli, it will still unload them. Ex. prevent players from spamming troops on the ground and causing performance issues.
|
||||||
-- my_ctld.loadSavedCrates = true -- Load back crates (STATIC) from the save file. Useful for mission restart cleanup. (Default is true)
|
-- my_ctld.loadSavedCrates = true -- Load back crates (STATIC) from the save file. Useful for mission restart cleanup. (Default is true)
|
||||||
-- my_ctld.UseC130LoadAndUnload = false -- When set to true, forces the C-130 player to use the C-130J built system to load the cargo onboard and to unload. (Default is false)
|
-- my_ctld.UseC130LoadAndUnload = false -- When set to true, forces the C-130 player to use the C-130J built system to load the cargo onboard and to unload. (Default is false)
|
||||||
-- my_ctld.UseC130DynamicCargoAutoBuild = false -- When true (and UseC130LoadAndUnload is true), C-130 DynamicCargo unload completion is bridged to CTLD engineer-path auto-build.
|
-- my_ctld.UseC130DynamicCargoAutoBuild = false -- When true (and UseC130LoadAndUnload is true), C-130 DynamicCargo unload completion is bridged to CTLD engineer-path auto-build.
|
||||||
@@ -1028,6 +1029,7 @@ function CTLD:New(Coalition, Prefixes, Alias)
|
|||||||
self.FixedMaxSpeed = 77 -- 280 kph or 150kn eq 77 mps
|
self.FixedMaxSpeed = 77 -- 280 kph or 150kn eq 77 mps
|
||||||
|
|
||||||
self.validateAndRepositionUnits = false -- 280 kph or 150kn eq 77 mps
|
self.validateAndRepositionUnits = false -- 280 kph or 150kn eq 77 mps
|
||||||
|
self.maxUnloadTroopsAllowed = -1
|
||||||
|
|
||||||
-- message suppression
|
-- message suppression
|
||||||
self.suppressmessages = false
|
self.suppressmessages = false
|
||||||
@@ -4994,6 +4996,18 @@ function CTLD:_GetUnitPositions(Coordinate,Radius,Heading,Template)
|
|||||||
return Positions
|
return Positions
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Override this function to check if troops can be unloaded. This does not prevent returning troops to base.
|
||||||
|
-- @param #CTLD self
|
||||||
|
-- @param Wrapper.Group#GROUP The group trying to unload
|
||||||
|
-- @param Wrapper.Unit#UNIT The unit trying to unload
|
||||||
|
-- @param #table LoadedCargo Table of loaded cargo, see #CTLD.LoadedCargo
|
||||||
|
-- @param #boolean IsGrounded Is the unit on the ground
|
||||||
|
-- @param #boolean IsHoverUnload Is the unit hovering in parameters for hover unload
|
||||||
|
-- @return #boolean True if troops can be unloaded, false to prevent unloading
|
||||||
|
function CTLD:CanUnloadAllTroops(Group, Unit, LoadedCargo, IsGrounded, IsHoverUnload)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
--- (Internal) Function to unload troops from heli.
|
--- (Internal) Function to unload troops from heli.
|
||||||
-- @param #CTLD self
|
-- @param #CTLD self
|
||||||
-- @param Wrapper.Group#GROUP Group
|
-- @param Wrapper.Group#GROUP Group
|
||||||
@@ -5029,8 +5043,13 @@ function CTLD:_UnloadTroops(Group, Unit)
|
|||||||
-- Get what we have loaded
|
-- Get what we have loaded
|
||||||
local unitname = Unit:GetName()
|
local unitname = Unit:GetName()
|
||||||
if self.Loaded_Cargo[unitname] and (grounded or hoverunload) then
|
if self.Loaded_Cargo[unitname] and (grounded or hoverunload) then
|
||||||
|
local loadedcargo = self.Loaded_Cargo[unitname] or {} -- #CTLD.LoadedCargo
|
||||||
|
if not self:CanUnloadAllTroops(Group, Unit, loadedcargo, grounded, hoverunload) then
|
||||||
|
-- User can post their own message in the function
|
||||||
|
return self
|
||||||
|
end
|
||||||
if not droppingatbase or self.debug then
|
if not droppingatbase or self.debug then
|
||||||
local loadedcargo = self.Loaded_Cargo[unitname] or {} -- #CTLD.LoadedCargo
|
|
||||||
-- looking for troops
|
-- looking for troops
|
||||||
local cargotable = loadedcargo.Cargo
|
local cargotable = loadedcargo.Cargo
|
||||||
local deployedTroopsByName = {}
|
local deployedTroopsByName = {}
|
||||||
@@ -6374,8 +6393,11 @@ function CTLD:_RefreshF10Menus()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
local dropTroopsMenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_DROP_TROOPS",self.locale),toptroops):Refresh()
|
local dropTroopsMenu=MENU_GROUP:New(_group,self.gettext:GetEntry("MENU_DROP_TROOPS",self.locale),toptroops):Refresh()
|
||||||
MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_DROP_ALL_TROOPS",self.locale),dropTroopsMenu,self._UnloadTroops,self,_group,_unit):Refresh()
|
if self.maxUnloadTroopsAllowed == -1 then
|
||||||
|
MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_DROP_ALL_TROOPS",self.locale),dropTroopsMenu,self._UnloadTroops,self,_group,_unit):Refresh()
|
||||||
|
end
|
||||||
MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_EXTRACT_TROOPS",self.locale),toptroops,self._ExtractTroops,self,_group,_unit):Refresh()
|
MENU_GROUP_COMMAND:New(_group,self.gettext:GetEntry("MENU_EXTRACT_TROOPS",self.locale),toptroops,self._ExtractTroops,self,_group,_unit):Refresh()
|
||||||
|
|
||||||
local uName=_unit:GetName()
|
local uName=_unit:GetName()
|
||||||
local loadedData=self.Loaded_Cargo[uName]
|
local loadedData=self.Loaded_Cargo[uName]
|
||||||
if loadedData and loadedData.Cargo then
|
if loadedData and loadedData.Cargo then
|
||||||
@@ -7300,6 +7322,19 @@ function CTLD:_RefreshDropCratesMenu(Group, Unit)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Override this function to check if we can unload a single Troop group by ID.
|
||||||
|
-- @param #CTLD self
|
||||||
|
-- @param Wrapper.Group#GROUP Group The aircraft group.
|
||||||
|
-- @param Wrapper.Unit#UNIT Unit The aircraft unit.
|
||||||
|
-- @param #number ChunkID the Cargo ID
|
||||||
|
-- @param #number Quantity the quantity to unload
|
||||||
|
-- @param #table LoadedCargo the current loaded cargo table for this unit
|
||||||
|
-- @param #boolean IsGrounded whether the unit is currently grounded
|
||||||
|
-- @param #boolean IsHoverUnload whether the unit is currently in hover-unload state
|
||||||
|
-- @return #boolean true if we can unload, false if not
|
||||||
|
function CTLD:CanUnloadSingleTroopByID(Group, Unit, ChunkID, Quantity, LoadedCargo, IsGrounded, IsHoverUnload)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
--- (Internal) Function to unload a single Troop group by ID.
|
--- (Internal) Function to unload a single Troop group by ID.
|
||||||
-- @param #CTLD self
|
-- @param #CTLD self
|
||||||
@@ -7338,6 +7373,11 @@ function CTLD:_UnloadSingleTroopByID(Group, Unit, chunkID, qty)
|
|||||||
local unitName = Unit:GetName()
|
local unitName = Unit:GetName()
|
||||||
|
|
||||||
if self.Loaded_Cargo[unitName] and (grounded or hoverunload) then
|
if self.Loaded_Cargo[unitName] and (grounded or hoverunload) then
|
||||||
|
local loadedcargo = self.Loaded_Cargo[unitName] or {} -- #CTLD.LoadedCargo
|
||||||
|
if not self:CanUnloadSingleTroopByID(Group, Unit, chunkID, qty, loadedcargo, grounded, hoverunload) then
|
||||||
|
-- User can post their own message in the function
|
||||||
|
return self
|
||||||
|
end
|
||||||
if not droppingatbase or self.debug then
|
if not droppingatbase or self.debug then
|
||||||
if not self.TroopsIDToChunk or not self.TroopsIDToChunk[chunkID] then
|
if not self.TroopsIDToChunk or not self.TroopsIDToChunk[chunkID] then
|
||||||
local msg = self.gettext:GetEntry("NO_TROOP_CHUNK",self.locale)
|
local msg = self.gettext:GetEntry("NO_TROOP_CHUNK",self.locale)
|
||||||
@@ -7532,7 +7572,9 @@ function CTLD:_RefreshDropTroopsMenu(Group, Unit)
|
|||||||
dropTroopsMenu = MENU_GROUP:New(theGroup, self.gettext:GetEntry("MENU_DROP_TROOPS",self.locale), topTroops)
|
dropTroopsMenu = MENU_GROUP:New(theGroup, self.gettext:GetEntry("MENU_DROP_TROOPS",self.locale), topTroops)
|
||||||
topTroops.DropTroopsMenu = dropTroopsMenu
|
topTroops.DropTroopsMenu = dropTroopsMenu
|
||||||
end
|
end
|
||||||
MENU_GROUP_COMMAND:New(theGroup, self.gettext:GetEntry("MENU_DROP_ALL_TROOPS",self.locale), dropTroopsMenu, self._UnloadTroops, self, theGroup, theUnit)
|
if self.maxUnloadTroopsAllowed == -1 then
|
||||||
|
MENU_GROUP_COMMAND:New(theGroup, self.gettext:GetEntry("MENU_DROP_ALL_TROOPS",self.locale), dropTroopsMenu, self._UnloadTroops, self, theGroup, theUnit)
|
||||||
|
end
|
||||||
|
|
||||||
local loadedData = self.Loaded_Cargo[theUnit:GetName()]
|
local loadedData = self.Loaded_Cargo[theUnit:GetName()]
|
||||||
if not loadedData or not loadedData.Cargo then return end
|
if not loadedData or not loadedData.Cargo then return end
|
||||||
@@ -7565,6 +7607,7 @@ function CTLD:_RefreshDropTroopsMenu(Group, Unit)
|
|||||||
else
|
else
|
||||||
local parentMenu = MENU_GROUP:New(theGroup, label, dropTroopsMenu)
|
local parentMenu = MENU_GROUP:New(theGroup, label, dropTroopsMenu)
|
||||||
for q = 1, count do
|
for q = 1, count do
|
||||||
|
if q > self.maxUnloadTroopsAllowed then break end
|
||||||
MENU_GROUP_COMMAND:New(theGroup, string.format(self.gettext:GetEntry("MENU_DROP_N_TROOPS",self.locale), q, tName), parentMenu, self._UnloadSingleTroopByID, self, theGroup, theUnit, chunkID, q)
|
MENU_GROUP_COMMAND:New(theGroup, string.format(self.gettext:GetEntry("MENU_DROP_N_TROOPS",self.locale), q, tName), parentMenu, self._UnloadSingleTroopByID, self, theGroup, theUnit, chunkID, q)
|
||||||
--MENU_GROUP_COMMAND:New(theGroup, string.format("Drop (%d) %s", q, tName), parentMenu, self._UnloadSingleTroopByID, self, theGroup, theUnit, chunkID, q)
|
--MENU_GROUP_COMMAND:New(theGroup, string.format("Drop (%d) %s", q, tName), parentMenu, self._UnloadSingleTroopByID, self, theGroup, theUnit, chunkID, q)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -257,6 +257,7 @@ CHIEF = {
|
|||||||
tacview = false,
|
tacview = false,
|
||||||
Nsuccess = 0,
|
Nsuccess = 0,
|
||||||
Nfailure = 0,
|
Nfailure = 0,
|
||||||
|
LegionRecruitMinRange = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
--- Defence condition.
|
--- Defence condition.
|
||||||
@@ -2465,9 +2466,9 @@ function CHIEF:CheckTargetQueue()
|
|||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
self:T2(self.lid..string.format("Recruiting assets for mission type %s [performance=%d] of target %s", mp.MissionType, mp.Performance, target:GetName()))
|
self:T2(self.lid..string.format("Recruiting assets for mission type %s [performance=%d] of target %s", mp.MissionType, mp.Performance, target:GetName()))
|
||||||
|
local minRange = self.LegionRecruitMinRange[target.category]
|
||||||
-- Recruit assets.
|
-- Recruit assets.
|
||||||
local recruited, assets, legions=self.commander:RecruitAssetsForTarget(target, mp.MissionType, NassetsMin, NassetsMax)
|
local recruited, assets, legions=self.commander:RecruitAssetsForTarget(target, mp.MissionType, NassetsMin, NassetsMax, minRange)
|
||||||
|
|
||||||
if recruited then
|
if recruited then
|
||||||
|
|
||||||
@@ -3369,6 +3370,15 @@ function CHIEF:CanMission(Mission)
|
|||||||
return self.commander and self.commander:CanMission(Mission)
|
return self.commander and self.commander:CanMission(Mission)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Exclude legion recruitment that are below a minimum range to target based on the target category.
|
||||||
|
--- Ex. Prevent intercepts from spawning too close to the target.
|
||||||
|
-- @param #CHIEF self
|
||||||
|
-- @param #string TargetCategory The target category.
|
||||||
|
-- @param #number MinRange Minimum range in meters.
|
||||||
|
function CHIEF:AddLegionRecruitMinRange(TargetCategory, MinRange)
|
||||||
|
self.LegionRecruitMinRange[TargetCategory] = MinRange
|
||||||
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1914,10 +1914,11 @@ end
|
|||||||
-- @param #string MissionType Mission Type.
|
-- @param #string MissionType Mission Type.
|
||||||
-- @param #number NassetsMin Min number of required assets.
|
-- @param #number NassetsMin Min number of required assets.
|
||||||
-- @param #number NassetsMax Max number of required assets.
|
-- @param #number NassetsMax Max number of required assets.
|
||||||
|
-- @param #number (optional) RangeMin Minimum range to target. (Default is 0, which means no minimum range)
|
||||||
-- @return #boolean If `true` enough assets could be recruited.
|
-- @return #boolean If `true` enough assets could be recruited.
|
||||||
-- @return #table Assets that have been recruited from all legions.
|
-- @return #table Assets that have been recruited from all legions.
|
||||||
-- @return #table Legions that have recruited assets.
|
-- @return #table Legions that have recruited assets.
|
||||||
function COMMANDER:RecruitAssetsForTarget(Target, MissionType, NassetsMin, NassetsMax)
|
function COMMANDER:RecruitAssetsForTarget(Target, MissionType, NassetsMin, NassetsMax, RangeMin)
|
||||||
|
|
||||||
-- Cohorts.
|
-- Cohorts.
|
||||||
local Cohorts=self:_GetCohorts()
|
local Cohorts=self:_GetCohorts()
|
||||||
@@ -1926,7 +1927,7 @@ function COMMANDER:RecruitAssetsForTarget(Target, MissionType, NassetsMin, Nasse
|
|||||||
local TargetVec2=Target:GetVec2()
|
local TargetVec2=Target:GetVec2()
|
||||||
|
|
||||||
-- Recruite assets.
|
-- Recruite assets.
|
||||||
local recruited, assets, legions=LEGION.RecruitCohortAssets(Cohorts, MissionType, nil, NassetsMin, NassetsMax, TargetVec2)
|
local recruited, assets, legions=LEGION.RecruitCohortAssets(Cohorts, MissionType, nil, NassetsMin, NassetsMax, TargetVec2, nil, nil, nil , nil, nil, nil, nil, nil, nil, nil, RangeMin)
|
||||||
|
|
||||||
|
|
||||||
return recruited, assets, legions
|
return recruited, assets, legions
|
||||||
|
|||||||
@@ -111,12 +111,12 @@ INTEL = {
|
|||||||
DetectAccoustic = false,
|
DetectAccoustic = false,
|
||||||
DetectAccousticRadius = 1000,
|
DetectAccousticRadius = 1000,
|
||||||
DetectAccousticUnitTypes = {Unit.Category.HELICOPTER},
|
DetectAccousticUnitTypes = {Unit.Category.HELICOPTER},
|
||||||
DopplerRadar = true,
|
DopplerRadar = false,
|
||||||
DopplerMinAltAGL = 500,
|
DopplerMinAltAGL = 500,
|
||||||
DopplerNotchSin = math.sin(math.rad(15)),
|
DopplerNotchSin = math.sin(math.rad(15)),
|
||||||
DopplerMinSpeedMps = 50,
|
DopplerMinSpeedMps = 50,
|
||||||
DopplerRCS = true,
|
DopplerRCS = true,
|
||||||
DopplerRadarRangeM = 200 * 1000,
|
RangeM = 200 * 1000,
|
||||||
}
|
}
|
||||||
|
|
||||||
--- Detected item info.
|
--- Detected item info.
|
||||||
@@ -319,7 +319,7 @@ INTEL.RCS_CategoryDefault = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
---
|
---
|
||||||
-- Reference RCS (m²) for range scaling. Detection range in SetDopplerRadar
|
-- Reference RCS (m²) for range scaling. Detection range in Set
|
||||||
-- is the range at which this reference aircraft is reliably detected.
|
-- is the range at which this reference aircraft is reliably detected.
|
||||||
-- @field INTEL.RCS_Reference
|
-- @field INTEL.RCS_Reference
|
||||||
INTEL.RCS_Reference = 5.0 -- m²
|
INTEL.RCS_Reference = 5.0 -- m²
|
||||||
@@ -439,6 +439,7 @@ function INTEL:New(DetectionSet, Coalition, Alias)
|
|||||||
self:SetRejectZones()
|
self:SetRejectZones()
|
||||||
self:SetCorridorZones()
|
self:SetCorridorZones()
|
||||||
self:SetConflictZones()
|
self:SetConflictZones()
|
||||||
|
self.DopplerRadar = false
|
||||||
|
|
||||||
------------------------
|
------------------------
|
||||||
--- Pseudo Functions ---
|
--- Pseudo Functions ---
|
||||||
@@ -2629,7 +2630,7 @@ end
|
|||||||
-- Default true.
|
-- Default true.
|
||||||
-- @return #INTEL self
|
-- @return #INTEL self
|
||||||
function INTEL:SetDopplerRadar(MinAltAGL, NotchHalfDeg, MinSpeedMps, RadarRangeKm, RCS)
|
function INTEL:SetDopplerRadar(MinAltAGL, NotchHalfDeg, MinSpeedMps, RadarRangeKm, RCS)
|
||||||
self:I(self.lid .. "SetDopplerRadar")
|
self:T(self.lid .. "SetDopplerRadar")
|
||||||
self.DopplerRadar = true
|
self.DopplerRadar = true
|
||||||
self.DopplerMinAltAGL = MinAltAGL or 500
|
self.DopplerMinAltAGL = MinAltAGL or 500
|
||||||
self.DopplerNotchSin = math.sin(math.rad(NotchHalfDeg or 15))
|
self.DopplerNotchSin = math.sin(math.rad(NotchHalfDeg or 15))
|
||||||
@@ -2643,7 +2644,7 @@ end
|
|||||||
-- @param #INTEL self
|
-- @param #INTEL self
|
||||||
-- @return #INTEL self
|
-- @return #INTEL self
|
||||||
function INTEL:SetDopplerRadarOff()
|
function INTEL:SetDopplerRadarOff()
|
||||||
self:I(self.lid .. "SetDopplerRadarOff")
|
self:T(self.lid .. "SetDopplerRadarOff")
|
||||||
self.DopplerRadar = false
|
self.DopplerRadar = false
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@@ -2655,7 +2656,7 @@ end
|
|||||||
-- @param #number RCS_m2 Side-on RCS in m²
|
-- @param #number RCS_m2 Side-on RCS in m²
|
||||||
-- @return #INTEL self
|
-- @return #INTEL self
|
||||||
function INTEL:SetTypeRCS(TypeName, RCS_m2)
|
function INTEL:SetTypeRCS(TypeName, RCS_m2)
|
||||||
self:I(self.lid .. "SetTypeRCS")
|
self:T(self.lid .. "SetTypeRCS")
|
||||||
INTEL.RCS_Table[TypeName] = RCS_m2
|
INTEL.RCS_Table[TypeName] = RCS_m2
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@@ -2678,7 +2679,7 @@ end
|
|||||||
-- @param DCS#Vec3 tvel Target velocity vector (pre-computed)
|
-- @param DCS#Vec3 tvel Target velocity vector (pre-computed)
|
||||||
-- @return #number Effective RCS in m²
|
-- @return #number Effective RCS in m²
|
||||||
function INTEL:_GetAspectRCS(TargetUnit, rpos, spd, tvel)
|
function INTEL:_GetAspectRCS(TargetUnit, rpos, spd, tvel)
|
||||||
self:I(self.lid .. "_GetAspectRCS")
|
self:T(self.lid .. "_GetAspectRCS")
|
||||||
-- Look up base (side-on) RCS
|
-- Look up base (side-on) RCS
|
||||||
local typename = TargetUnit:GetTypeName()
|
local typename = TargetUnit:GetTypeName()
|
||||||
local base_rcs = INTEL.RCS_Table[typename]
|
local base_rcs = INTEL.RCS_Table[typename]
|
||||||
@@ -2716,7 +2717,7 @@ end
|
|||||||
-- @return #boolean true = detected
|
-- @return #boolean true = detected
|
||||||
-- @return #string rejection reason: "speed" | "clutter" | "notch" | "rcs"
|
-- @return #string rejection reason: "speed" | "clutter" | "notch" | "rcs"
|
||||||
function INTEL:_CheckDopplerDetection(TargetUnit, RadarUnit)
|
function INTEL:_CheckDopplerDetection(TargetUnit, RadarUnit)
|
||||||
self:I(self.lid .. "_CheckDopplerDetection")
|
self:T(self.lid .. "_CheckDopplerDetection")
|
||||||
-- Pre-compute common geometry (shared by notch + RCS checks)
|
-- Pre-compute common geometry (shared by notch + RCS checks)
|
||||||
local spd = TargetUnit:GetVelocityMPS()
|
local spd = TargetUnit:GetVelocityMPS()
|
||||||
local rpos = RadarUnit:GetVec3()
|
local rpos = RadarUnit:GetVec3()
|
||||||
@@ -2799,7 +2800,7 @@ end
|
|||||||
-- @param #boolean DetectRWR (Optional) If *false*, do not include targets detected by RWR.
|
-- @param #boolean DetectRWR (Optional) If *false*, do not include targets detected by RWR.
|
||||||
-- @param #boolean DetectDLINK (Optional) If *false*, do not include targets detected by data link.
|
-- @param #boolean DetectDLINK (Optional) If *false*, do not include targets detected by data link.
|
||||||
function INTEL:GetDetectedUnitsDoppler(Unit, DetectedUnits, RecceDetecting,DetectVisual, DetectOptical, DetectRadar,DetectIRST, DetectRWR, DetectDLINK)
|
function INTEL:GetDetectedUnitsDoppler(Unit, DetectedUnits, RecceDetecting,DetectVisual, DetectOptical, DetectRadar,DetectIRST, DetectRWR, DetectDLINK)
|
||||||
self:I(self.lid .. "GetDetectedUnitsDoppler")
|
self:T(self.lid .. "GetDetectedUnitsDoppler")
|
||||||
-- Run the original detection
|
-- Run the original detection
|
||||||
self:GetDetectedUnits(Unit,DetectedUnits,RecceDetecting,DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK)
|
self:GetDetectedUnits(Unit,DetectedUnits,RecceDetecting,DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK)
|
||||||
|
|
||||||
@@ -2815,7 +2816,7 @@ function INTEL:GetDetectedUnitsDoppler(Unit, DetectedUnits, RecceDetecting,Detec
|
|||||||
if not ok then
|
if not ok then
|
||||||
table.insert(remove, name)
|
table.insert(remove, name)
|
||||||
--if self.verbose and self.verbose >= 2 then
|
--if self.verbose and self.verbose >= 2 then
|
||||||
self:I(string.format("%sDoppler: suppressed %s [%s] by %s",self.lid, name, reason, Unit:GetName()))
|
self:T(string.format("%sDoppler: suppressed %s [%s] by %s",self.lid, name, reason, Unit:GetName()))
|
||||||
--end
|
--end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -3027,7 +3028,7 @@ end
|
|||||||
-- @return #INTEL_DLINK self
|
-- @return #INTEL_DLINK self
|
||||||
function INTEL_DLINK:SetDLinkCacheTime(seconds)
|
function INTEL_DLINK:SetDLinkCacheTime(seconds)
|
||||||
self.cachetime = math.abs(seconds or 120)
|
self.cachetime = math.abs(seconds or 120)
|
||||||
self:I(self.lid.."Caching for "..self.cachetime.." seconds.")
|
self:T(self.lid.."Caching for "..self.cachetime.." seconds.")
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -3117,7 +3118,7 @@ end
|
|||||||
function INTEL_DLINK:onafterStop(From, Event, To)
|
function INTEL_DLINK:onafterStop(From, Event, To)
|
||||||
self:T({From, Event, To})
|
self:T({From, Event, To})
|
||||||
local text = string.format("Version %s stopped.", self.version)
|
local text = string.format("Version %s stopped.", self.version)
|
||||||
self:I(self.lid .. text)
|
self:T(self.lid .. text)
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -2577,8 +2577,11 @@ end
|
|||||||
-- @param #number RefuelSystem Refueling system (boom or probe).
|
-- @param #number RefuelSystem Refueling system (boom or probe).
|
||||||
-- @param #number CargoWeight Cargo weight [kg]. This checks the cargo bay of the cohort assets and ensures that it is large enough to carry the given cargo weight.
|
-- @param #number CargoWeight Cargo weight [kg]. This checks the cargo bay of the cohort assets and ensures that it is large enough to carry the given cargo weight.
|
||||||
-- @param #number MaxWeight Max weight [kg]. This checks whether the cohort asset group is not too heavy.
|
-- @param #number MaxWeight Max weight [kg]. This checks whether the cohort asset group is not too heavy.
|
||||||
|
-- @param RangeMin Min range in meters. (Default is 0, i.e. no minimum range.)
|
||||||
-- @return #boolean Returns `true` if given cohort can meet all requirements.
|
-- @return #boolean Returns `true` if given cohort can meet all requirements.
|
||||||
function LEGION._CohortCan(Cohort, MissionType, Categories, Attributes, Properties, WeaponTypes, TargetVec2, RangeMax, RefuelSystem, CargoWeight, MaxWeight)
|
function LEGION._CohortCan(Cohort, MissionType, Categories, Attributes, Properties, WeaponTypes, TargetVec2, RangeMax, RefuelSystem, CargoWeight, MaxWeight, RangeMin)
|
||||||
|
|
||||||
|
RangeMin = RangeMin or 0
|
||||||
|
|
||||||
--- Function to check category.
|
--- Function to check category.
|
||||||
local function CheckCategory(_cohort)
|
local function CheckCategory(_cohort)
|
||||||
@@ -2656,8 +2659,8 @@ function LEGION._CohortCan(Cohort, MissionType, Categories, Attributes, Properti
|
|||||||
-- Is in range?
|
-- Is in range?
|
||||||
local Rmax=cohort:GetMissionRange(WeaponTypes)
|
local Rmax=cohort:GetMissionRange(WeaponTypes)
|
||||||
local RangeMax = RangeMax or 0
|
local RangeMax = RangeMax or 0
|
||||||
local InRange=(RangeMax and math.max(RangeMax, Rmax) or Rmax) >= TargetDistance
|
local InRange=(RangeMax and math.max(RangeMax, Rmax) or Rmax) >= TargetDistance and TargetDistance > RangeMin
|
||||||
|
|
||||||
--env.info(string.format("Range TargetDist=%.1f Rmax=%.1f RangeMax=%.1f InRange=%s", TargetDistance, Rmax, RangeMax, tostring(InRange)))
|
--env.info(string.format("Range TargetDist=%.1f Rmax=%.1f RangeMax=%.1f InRange=%s", TargetDistance, Rmax, RangeMax, tostring(InRange)))
|
||||||
|
|
||||||
return InRange
|
return InRange
|
||||||
@@ -2803,10 +2806,11 @@ end
|
|||||||
-- @param #table Attributes Group attributes. See `GROUP.Attribute.`
|
-- @param #table Attributes Group attributes. See `GROUP.Attribute.`
|
||||||
-- @param #table Properties DCS attributes.
|
-- @param #table Properties DCS attributes.
|
||||||
-- @param #table WeaponTypes Bit of weapon types.
|
-- @param #table WeaponTypes Bit of weapon types.
|
||||||
|
-- @param #number RangeMin Min range in meters. (Default is 0, i.e. no minimum range.)
|
||||||
-- @return #boolean If `true` enough assets could be recruited.
|
-- @return #boolean If `true` enough assets could be recruited.
|
||||||
-- @return #table Recruited assets. **NOTE** that we set the `asset.isReserved=true` flag so it cant be recruited by anyone else.
|
-- @return #table Recruited assets. **NOTE** that we set the `asset.isReserved=true` flag so it cant be recruited by anyone else.
|
||||||
-- @return #table Legions of recruited assets.
|
-- @return #table Legions of recruited assets.
|
||||||
function LEGION.RecruitCohortAssets(Cohorts, MissionTypeRecruit, MissionTypeOpt, NreqMin, NreqMax, TargetVec2, Payloads, RangeMax, RefuelSystem, CargoWeight, TotalWeight, MaxWeight, Categories, Attributes, Properties, WeaponTypes)
|
function LEGION.RecruitCohortAssets(Cohorts, MissionTypeRecruit, MissionTypeOpt, NreqMin, NreqMax, TargetVec2, Payloads, RangeMax, RefuelSystem, CargoWeight, TotalWeight, MaxWeight, Categories, Attributes, Properties, WeaponTypes, RangeMin)
|
||||||
|
|
||||||
-- The recruited assets.
|
-- The recruited assets.
|
||||||
local Assets={}
|
local Assets={}
|
||||||
@@ -2824,7 +2828,7 @@ function LEGION.RecruitCohortAssets(Cohorts, MissionTypeRecruit, MissionTypeOpt,
|
|||||||
local cohort=_cohort --Ops.Cohort#COHORT
|
local cohort=_cohort --Ops.Cohort#COHORT
|
||||||
|
|
||||||
-- Check if cohort can do the mission.
|
-- Check if cohort can do the mission.
|
||||||
local can=LEGION._CohortCan(cohort, MissionTypeRecruit, Categories, Attributes, Properties, WeaponTypes, TargetVec2, RangeMax, RefuelSystem, CargoWeight, MaxWeight)
|
local can=LEGION._CohortCan(cohort, MissionTypeRecruit, Categories, Attributes, Properties, WeaponTypes, TargetVec2, RangeMax, RefuelSystem, CargoWeight, MaxWeight, RangeMin)
|
||||||
|
|
||||||
--env.info(string.format("RecruitCohortAssets %s Cohort=%s can=%s", MissionTypeRecruit, cohort:GetName(), tostring(can)))
|
--env.info(string.format("RecruitCohortAssets %s Cohort=%s can=%s", MissionTypeRecruit, cohort:GetName(), tostring(can)))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user