Compare commits

...

29 Commits

Author SHA1 Message Date
Thomas 27fa920a8f Merge pull request #2619 from shaji-Dev/master-ng
[ADDED] New equipment to ENUMS (GBU-24E + more)
2026-07-23 21:11:29 +02:00
shaji-Dev cf65cbf8fc Merge branch 'FlightControl-Master:master-ng' into master-ng 2026-07-23 18:52:35 +03:00
shafik 2f229c1d8c [ADDED] New equipment to ENUMS (GBU-24E + more) 2026-07-23 17:51:51 +02:00
Thomas 7e07f2b4ea Merge pull request #2617 from shaji-Dev/master-ng
CTLD Enhancements
2026-07-23 17:37:00 +02:00
shafik d214d115c6 Merge branch 'master-ng' of https://github.com/shaji-Dev/MOOSE into master-ng 2026-07-23 17:26:24 +02:00
shafik fc1059c5d6 CTLD Enhancements 2026-07-23 17:25:41 +02:00
Thomas 6e09ea7089 Update Airboss.lua
Add F14BU
2026-07-23 15:03:47 +02:00
Thomas 7587119843 Merge pull request #2614 from leka1986/agent/escort-dynamic-cargo-mantis
Fix Escort follow tasks, Dynamic Cargo tracking, and MANTIS checks
2026-07-22 08:05:10 +02:00
leka1986 a5880b89c1 Fix escort, cargo, and MANTIS behavior 2026-07-22 05:07:21 +02:00
Thomas 1be2c92a5c Merge pull request #2612 from shaji-Dev/master-ng
CTLD + ENUMS
2026-07-17 07:19:31 +02:00
shafik 4c8a17fe57 Merge remote-tracking branch 'origin/master-ng' into master-ng 2026-07-16 19:58:51 +02:00
shafik 64dea17982 [FIXED] Hardcoded "blue" coalition in SET filters (Doesn't work for redfor in PvP).
[FIXED] Unnecessary new COORDINATE objects that don't hold reference (used only for distance calc).
2026-07-16 19:58:36 +02:00
shafik b1f86c702d [ADDED] F-100 weapons enums 2026-07-16 19:48:35 +02:00
Thomas 1a9540d0d4 Merge pull request #2611 from FlightControl-Master/develop
Develop
2026-07-16 06:45:05 +02:00
Thomas cdfaac527c Merge pull request #2606 from shaji-Dev/master-ng
[FIX] "Parameter #1 (group id) missed" refreshing menus for dead groups
2026-07-15 19:53:58 +02:00
Thomas 4e3bf9969b Merge pull request #2610 from FlightControl-Master/master-ng
Merge from master
2026-07-15 19:52:43 +02:00
Thomas 74c16bd4f0 Merge pull request #2609 from leka1986/agent/group-change-option-event
Add group option change event support
2026-07-15 19:51:38 +02:00
leka1986 55e048b322 Add group option change event support 2026-07-15 18:39:46 +02:00
Thomas b31fb7ece3 Merge pull request #2608 from FlightControl-Master/master-ng
Merge from master
2026-07-15 18:35:50 +02:00
Thomas 149e3421d9 Merge pull request #2607 from patpatpowercat/develop
Update Mantis.lua
2026-07-15 18:34:53 +02:00
patpatpowercat 338ec34604 Update Mantis.lua
Added ships to MANTIS.

NAVYGROUPs may be integrated. Need to be aware MANTIS doesn't change ROE.

SEAD does not (by default) effect ships.

Ships are individually identified, not as group. Group will react to jamming as a whole, will go live/sleep based upon longest range/best radar.

No longer need prefixes for either ground or naval units.
2026-07-14 21:47:47 -07:00
Shafik 3d79a16d3a [FIX] "Parameter #1 (group id) missed" refreshing menus for dead groups 2026-07-13 11:02:42 +03:00
Thomas efa08c1280 Merge pull request #2605 from FlightControl-Master/master-ng
Merge from master
2026-07-12 17:58:28 +02:00
Thomas 589e65963f Merge pull request #2604 from FlightControl-Master/leka1986-patch-2
Fix aircraft model names for Lancer and Kiowa
2026-07-12 17:57:29 +02:00
leka1986 af4f20af67 Fix aircraft model names for Lancer and Kiowa 2026-07-12 13:30:33 +02:00
Applevangelist b1b8630d21 Merge remote-tracking branch 'origin/master-ng' into develop 2026-06-28 09:31:16 +02:00
Applevangelist 98ed7d50c1 #EASYGCICAP
* Added `SetDefaultINTERCEPTAlt()`
2026-06-28 09:30:45 +02:00
Applevangelist 4ba81cb8bc Merge remote-tracking branch 'origin/master-ng' into develop 2026-06-27 10:57:53 +02:00
Applevangelist 626b12f486 #MSRS #HOUND corrected frequency formatting to allow 1000ths of a frequency 2026-06-27 10:57:27 +02:00
10 changed files with 1114 additions and 169 deletions
+22
View File
@@ -736,6 +736,12 @@ 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.
--- Occurs when an option is changed for an AI group.
-- The event identifies the initiating group, but does not provide the option ID or value.
-- @function [parent=#BASE] OnEventGroupChangeOption
-- @param #BASE self
-- @param Core.Event#EVENTDATA EventData The EventData structure.
--- Occurs when a player creates a dynamic cargo object from the F8 ground crew menu. --- Occurs when a player creates a dynamic cargo object from the F8 ground crew menu.
-- *** NOTE *** this is a workarounf for DCS not creating these events as of Aug 2024. -- *** NOTE *** this is a workarounf for DCS not creating these events as of Aug 2024.
-- @function [parent=#BASE] OnEventNewDynamicCargo -- @function [parent=#BASE] OnEventNewDynamicCargo
@@ -881,6 +887,22 @@ end
world.onEvent(Event) world.onEvent(Event)
end end
--- Creation of a `S_EVENT_GROUP_CHANGE_OPTION` event.
-- @param #BASE self
-- @param DCS#Time EventTime The time stamp of the event.
-- @param DCS#Group Initiator The initiating group of the event.
function BASE:CreateEventGroupChangeOption( EventTime, Initiator )
self:F( { EventTime, Initiator } )
local Event = {
id = EVENTS.GroupChangeOption,
time = EventTime,
initiator = Initiator,
}
world.onEvent( Event )
end
--- Creation of a S_EVENT_NEW_DYNAMIC_CARGO event. --- Creation of a S_EVENT_NEW_DYNAMIC_CARGO event.
-- @param #BASE self -- @param #BASE self
-- @param Wrapper.DynamicCargo#DYNAMICCARGO DynamicCargo the dynamic cargo object -- @param Wrapper.DynamicCargo#DYNAMICCARGO DynamicCargo the dynamic cargo object
+25 -7
View File
@@ -278,6 +278,7 @@ EVENTS = {
SimulationUnfreeze = world.event.S_EVENT_SIMULATION_UNFREEZE or -1, SimulationUnfreeze = world.event.S_EVENT_SIMULATION_UNFREEZE or -1,
HumanAircraftRepairStart = world.event.S_EVENT_HUMAN_AIRCRAFT_REPAIR_START or -1, HumanAircraftRepairStart = world.event.S_EVENT_HUMAN_AIRCRAFT_REPAIR_START or -1,
HumanAircraftRepairFinish = world.event.S_EVENT_HUMAN_AIRCRAFT_REPAIR_FINISH or -1, HumanAircraftRepairFinish = world.event.S_EVENT_HUMAN_AIRCRAFT_REPAIR_FINISH or -1,
GroupChangeOption = world.event.S_EVENT_GROUP_CHANGE_OPTION or -1,
-- dynamic cargo -- dynamic cargo
NewDynamicCargo = world.event.S_EVENT_NEW_DYNAMIC_CARGO or -1, NewDynamicCargo = world.event.S_EVENT_NEW_DYNAMIC_CARGO or -1,
DynamicCargoLoaded = world.event.S_EVENT_DYNAMIC_CARGO_LOADED or -1, DynamicCargoLoaded = world.event.S_EVENT_DYNAMIC_CARGO_LOADED or -1,
@@ -291,23 +292,25 @@ EVENTS = {
-- --
-- * A (Object.Category.)UNIT : A UNIT object type is involved in the Event. -- * A (Object.Category.)UNIT : A UNIT object type is involved in the Event.
-- * A (Object.Category.)STATIC : A STATIC object type is involved in the Event. -- * A (Object.Category.)STATIC : A STATIC object type is involved in the Event.
-- * A GROUP : A DCS Group object is involved in the Event.
-- --
-- @type EVENTDATA -- @type EVENTDATA
-- @field #number id The identifier of the event. -- @field #number id The identifier of the event.
-- --
-- @field DCS#Unit initiator (UNIT/STATIC/SCENERY) The initiating @{DCS#Unit} or @{DCS#StaticObject}. -- @field DCS#Unit initiator (UNIT/STATIC/SCENERY/GROUP) The initiating @{DCS#Unit} or @{DCS#StaticObject}. For `S_EVENT_GROUP_CHANGE_OPTION`, this is a DCS Group.
-- @field DCS#Object.Category IniObjectCategory (UNIT/STATIC/SCENERY) The initiator object category ( Object.Category.UNIT or Object.Category.STATIC ). -- @field DCS#Object.Category IniObjectCategory (UNIT/STATIC/SCENERY) The initiator object category ( Object.Category.UNIT or Object.Category.STATIC ).
-- @field DCS#Unit IniDCSUnit (UNIT/STATIC) The initiating @{DCS#Unit} or @{DCS#StaticObject}. -- @field DCS#Unit IniDCSUnit (UNIT/STATIC) The initiating @{DCS#Unit} or @{DCS#StaticObject}.
-- @field #string IniDCSUnitName (UNIT/STATIC) The initiating Unit name. -- @field #string IniDCSUnitName (UNIT/STATIC) The initiating Unit name.
-- @field Wrapper.Unit#UNIT IniUnit (UNIT/STATIC) The initiating MOOSE wrapper @{Wrapper.Unit#UNIT} of the initiator Unit object. -- @field Wrapper.Unit#UNIT IniUnit (UNIT/STATIC) The initiating MOOSE wrapper @{Wrapper.Unit#UNIT} of the initiator Unit object.
-- @field #string IniUnitName (UNIT/STATIC) The initiating UNIT name (same as IniDCSUnitName). -- @field #string IniUnitName (UNIT/STATIC) The initiating UNIT name (same as IniDCSUnitName).
-- @field DCS#Group IniDCSGroup (UNIT) The initiating {DCSGroup#Group}. -- @field DCS#Group IniDCSGroup (UNIT/GROUP) The initiating @{DCS#Group}.
-- @field #string IniDCSGroupName (UNIT) The initiating Group name. -- @field #string IniDCSGroupName (UNIT/GROUP) The initiating Group name.
-- @field Wrapper.Group#GROUP IniGroup (UNIT) The initiating MOOSE wrapper @{Wrapper.Group#GROUP} of the initiator Group object. -- @field Wrapper.Group#GROUP IniGroup (UNIT/GROUP) The initiating MOOSE wrapper @{Wrapper.Group#GROUP} of the initiator Group object.
-- @field #string IniGroupName UNIT) The initiating GROUP name (same as IniDCSGroupName). -- @field #string IniGroupName (UNIT/GROUP) The initiating GROUP name (same as IniDCSGroupName).
-- @field DCS#Group.Category IniGroupCategory (GROUP) The category of the initiating group.
-- @field #string IniPlayerName (UNIT) The name of the initiating player in case the Unit is a client or player slot. -- @field #string IniPlayerName (UNIT) The name of the initiating player in case the Unit is a client or player slot.
-- @field #string IniPlayerUCID (UNIT) The UCID of the initiating player in case the Unit is a client or player slot and on a multi-player server. -- @field #string IniPlayerUCID (UNIT) The UCID of the initiating player in case the Unit is a client or player slot and on a multi-player server.
-- @field DCS#coalition.side IniCoalition (UNIT) The coalition of the initiator. -- @field DCS#coalition.side IniCoalition (UNIT/GROUP) The coalition of the initiator.
-- @field DCS#Unit.Category IniCategory (UNIT) The category of the initiator. -- @field DCS#Unit.Category IniCategory (UNIT) The category of the initiator.
-- @field #string IniTypeName (UNIT) The type name of the initiator. -- @field #string IniTypeName (UNIT) The type name of the initiator.
-- --
@@ -734,6 +737,12 @@ local _EVENTMETA = {
Side = "I", Side = "I",
Event = "OnEventHumanAircraftRepairFinish", Event = "OnEventHumanAircraftRepairFinish",
Text = "S_EVENT_HUMAN_AIRCRAFT_REPAIR_FINISH" Text = "S_EVENT_HUMAN_AIRCRAFT_REPAIR_FINISH"
},
[EVENTS.GroupChangeOption] = {
Order = 1,
Side = "I",
Event = "OnEventGroupChangeOption",
Text = "S_EVENT_GROUP_CHANGE_OPTION"
}, },
-- dynamic cargo -- dynamic cargo
[EVENTS.NewDynamicCargo] = { [EVENTS.NewDynamicCargo] = {
@@ -1234,7 +1243,16 @@ function EVENT:onEvent( Event )
if Event.initiator then if Event.initiator then
Event.IniObjectCategory = Object.getCategory(Event.initiator) if Event.id == EVENTS.GroupChangeOption then
Event.IniDCSGroup = Event.initiator
Event.IniDCSGroupName = Group.getName(Event.initiator)
Event.IniGroupName = Event.IniDCSGroupName
Event.IniGroup = GROUP:FindByName(Event.IniDCSGroupName)
Event.IniCoalition = Group.getCoalition(Event.initiator)
Event.IniGroupCategory = Group.getCategory(Event.initiator)
else
Event.IniObjectCategory = Object.getCategory(Event.initiator)
end
if Event.IniObjectCategory == Object.Category.STATIC then if Event.IniObjectCategory == Object.Category.STATIC then
--- ---
+2 -1
View File
@@ -87,7 +87,8 @@ do -- world
-- @field S_EVENT_SIMULATION_UNFREEZE = 58 -- @field S_EVENT_SIMULATION_UNFREEZE = 58
-- @field S_EVENT_HUMAN_AIRCRAFT_REPAIR_START = 59 -- @field S_EVENT_HUMAN_AIRCRAFT_REPAIR_START = 59
-- @field S_EVENT_HUMAN_AIRCRAFT_REPAIR_FINISH = 60 -- @field S_EVENT_HUMAN_AIRCRAFT_REPAIR_FINISH = 60
-- @field S_EVENT_MAX = 61 -- @field S_EVENT_GROUP_CHANGE_OPTION = 61
-- @field S_EVENT_MAX = 62
--- The birthplace enumerator is used to define where an aircraft or helicopter has spawned in association with birth events. --- The birthplace enumerator is used to define where an aircraft or helicopter has spawned in association with birth events.
-- @type world.BirthPlace -- @type world.BirthPlace
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -45,7 +45,7 @@
-- **Supported Aircraft:** -- **Supported Aircraft:**
-- --
-- * [F/A-18C Hornet Lot 20](https://forums.eagle.ru/forumdisplay.php?f=557) (Player & AI) -- * [F/A-18C Hornet Lot 20](https://forums.eagle.ru/forumdisplay.php?f=557) (Player & AI)
-- * [F-14A/B/A Early Tomcat](https://forums.eagle.ru/forumdisplay.php?f=395) (Player & AI) -- * [F-14A/B/BU/A Early Tomcat](https://forums.eagle.ru/forumdisplay.php?f=395) (Player & AI)
-- * [A-4E Skyhawk Community Mod](https://forums.eagle.ru/showthread.php?t=224989) (Player & AI) -- * [A-4E Skyhawk Community Mod](https://forums.eagle.ru/showthread.php?t=224989) (Player & AI)
-- * [AV-8B N/A Harrier](https://forums.eagle.ru/forumdisplay.php?f=555) (Player & AI) -- * [AV-8B N/A Harrier](https://forums.eagle.ru/forumdisplay.php?f=555) (Player & AI)
-- * [T-45C Goshawk](https://forum.dcs.world/topic/203816-vnao-t-45-goshawk/) (VNAO mod) (Player & AI) -- * [T-45C Goshawk](https://forum.dcs.world/topic/203816-vnao-t-45-goshawk/) (VNAO mod) (Player & AI)
@@ -1276,6 +1276,7 @@ AIRBOSS = {
-- @field #string A4EC A-4E Community mod. -- @field #string A4EC A-4E Community mod.
-- @field #string HORNET F/A-18C Lot 20 Hornet by Eagle Dynamics. -- @field #string HORNET F/A-18C Lot 20 Hornet by Eagle Dynamics.
-- @field #string F14A F-14A by Heatblur. -- @field #string F14A F-14A by Heatblur.
-- @field #string F14BU F-14BU by Heatblur.
-- @field #string F14A_Early F-14A-135-GR-Early by Heatblur. -- @field #string F14A_Early F-14A-135-GR-Early by Heatblur.
-- @field #string F14B F-14B by Heatblur. -- @field #string F14B F-14B by Heatblur.
-- @field #string F14A_AI F-14A Tomcat (AI). -- @field #string F14A_AI F-14A Tomcat (AI).
@@ -1297,6 +1298,7 @@ AIRBOSS.AircraftCarrier={
F14A="F-14A-135-GR", F14A="F-14A-135-GR",
F14A_Early="F-14A-135-GR-Early", F14A_Early="F-14A-135-GR-Early",
F14B="F-14B", F14B="F-14B",
F14BU="F-14BU",
F14A_AI="F-14A", F14A_AI="F-14A",
FA18C="F/A-18C", FA18C="F/A-18C",
T45C="T-45", T45C="T-45",
+7 -1
View File
@@ -6466,7 +6466,13 @@ function AUFTRAG:GetDCSMissionTask(MissionGroup)
-- ESCORT Mission -- -- ESCORT Mission --
-------------------- --------------------
local DCStask=CONTROLLABLE.TaskEscort(nil, self.engageTarget:GetObject(), self.escortVec3, nil, self.engageMaxDistance, self.engageTargetTypes) local FollowGroup=self.engageTarget:GetObject()
local DCStask=nil
if next(self.engageTargetTypes)==nil then
DCStask=FollowGroup:TaskFollow(FollowGroup, self.escortVec3)
else
DCStask=CONTROLLABLE.TaskEscort(nil, FollowGroup, self.escortVec3, nil, self.engageMaxDistance, self.engageTargetTypes)
end
table.insert(DCStasks, DCStask) table.insert(DCStasks, DCStask)
+68 -62
View File
@@ -183,6 +183,7 @@ do
-- my_ctld.placeCratesAhead = false -- place crates straight ahead of the helicopter, in a random way. If true, crates are more neatly sorted. -- my_ctld.placeCratesAhead = false -- place crates straight ahead of the helicopter, in a random way. If true, crates are more neatly sorted.
-- my_ctld.nobuildinloadzones = true -- forbid players to build stuff in LOAD zones if set to `true` -- my_ctld.nobuildinloadzones = true -- forbid players to build stuff in LOAD zones if set to `true`
-- my_ctld.movecratesbeforebuild = true -- crates must be moved once before they can be build. Set to false for direct builds. -- my_ctld.movecratesbeforebuild = true -- crates must be moved once before they can be build. Set to false for direct builds.
-- my_ctld.useaircraftheadingforbuilds = false -- Matches the heading of the spawned groups from a crate build to the aircraft heading when starting the build. Default is false for template heading.
-- my_ctld.surfacetypes = {land.SurfaceType.LAND,land.SurfaceType.ROAD,land.SurfaceType.RUNWAY,land.SurfaceType.SHALLOW_WATER} -- surfaces for loading back objects. -- my_ctld.surfacetypes = {land.SurfaceType.LAND,land.SurfaceType.ROAD,land.SurfaceType.RUNWAY,land.SurfaceType.SHALLOW_WATER} -- surfaces for loading back objects.
-- my_ctld.nobuildmenu = false -- if set to true effectively enforces to have engineers build/repair stuff for you. -- my_ctld.nobuildmenu = false -- if set to true effectively enforces to have engineers build/repair stuff for you.
-- my_ctld.RadioSound = "beacon.ogg" -- -- this sound will be hearable if you tune in the beacon frequency. Add the sound file to your miz. -- my_ctld.RadioSound = "beacon.ogg" -- -- this sound will be hearable if you tune in the beacon frequency. Add the sound file to your miz.
@@ -2037,7 +2038,7 @@ function CTLD:_C130DcAutoRegisterEntry(SetId, Cargo)
local pos = Cargo:GetPositionable() local pos = Cargo:GetPositionable()
local pname = pos and pos.GetName and pos:GetName() or nil local pname = pos and pos.GetName and pos:GetName() or nil
local pcoord = pos and pos.GetCoordinate and pos:GetCoordinate() or nil local pcoord = pos and pos.GetCoord and pos:GetCoord() or nil
local entryId = string.format("%s#%d", SetId, #setData.entries + 1) local entryId = string.format("%s#%d", SetId, #setData.entries + 1)
local entry = { local entry = {
id = entryId, id = entryId,
@@ -2748,14 +2749,12 @@ function CTLD:_EventHandler(EventData)
loaded = self.Loaded_Cargo[unitname] -- #CTLD.LoadedCargo loaded = self.Loaded_Cargo[unitname] -- #CTLD.LoadedCargo
loaded.Cratesloaded = loaded.Cratesloaded - 1 loaded.Cratesloaded = loaded.Cratesloaded - 1
if loaded.Cratesloaded < 0 then loaded.Cratesloaded = 0 end if loaded.Cratesloaded < 0 then loaded.Cratesloaded = 0 end
-- TODO zap cargo from list
local Loaded = {} local Loaded = {}
for _,_item in pairs (loaded.Cargo or {}) do for _,_item in pairs (loaded.Cargo or {}) do
self:T(self.lid.."UNLOAD checking: ".._item:GetName()) self:T(self.lid.."UNLOAD checking: ".._item:GetName())
self:T(self.lid.."UNLOAD state: ".. tostring(_item:WasDropped())) self:T(self.lid.."UNLOAD state: ".. tostring(_item:WasDropped()))
if _item and _item:GetType() == CTLD_CARGO.Enum.GCLOADABLE and event.IniDynamicCargoName and event.IniDynamicCargoName ~= _item:GetName() and not _item:WasDropped() then local unloadedItem = _item and _item:GetType() == CTLD_CARGO.Enum.GCLOADABLE and event.IniDynamicCargoName and event.IniDynamicCargoName == _item:GetName()
table.insert(Loaded,_item) if not unloadedItem then
else
table.insert(Loaded,_item) table.insert(Loaded,_item)
end end
end end
@@ -3125,14 +3124,14 @@ end
function CTLD:_FindRepairNearby(Group, Unit, Repairtype) function CTLD:_FindRepairNearby(Group, Unit, Repairtype)
self:T(self.lid .. " _FindRepairNearby") self:T(self.lid .. " _FindRepairNearby")
--self:T({Group:GetName(),Unit:GetName(),Repairtype}) --self:T({Group:GetName(),Unit:GetName(),Repairtype})
local unitcoord = Unit:GetCoordinate() local unitcoord = Unit:GetCoord()
-- find nearest group of deployed groups -- find nearest group of deployed groups
local nearestGroup = nil local nearestGroup = nil
local nearestGroupIndex = -1 local nearestGroupIndex = -1
local nearestDistance = 10000 local nearestDistance = 10000
for k,v in pairs(self.DroppedTroops) do for k,v in pairs(self.DroppedTroops) do
local distance = self:_GetDistance(v:GetCoordinate(),unitcoord) local distance = self:_GetDistance(v:GetCoord(),unitcoord)
local unit = v:GetUnit(1) -- Wrapper.Unit#UNIT local unit = v:GetUnit(1) -- Wrapper.Unit#UNIT
local desc = unit:GetDesc() or nil local desc = unit:GetDesc() or nil
if distance < nearestDistance and distance ~= -1 and not desc.attributes.Infantry then if distance < nearestDistance and distance ~= -1 and not desc.attributes.Infantry then
@@ -3277,7 +3276,7 @@ end
local capabilities = self:_GetUnitCapabilities(Unit) local capabilities = self:_GetUnitCapabilities(Unit)
local cantroops = capabilities.troops -- #boolean local cantroops = capabilities.troops -- #boolean
local trooplimit = capabilities.trooplimit -- #number local trooplimit = capabilities.trooplimit -- #number
local unitcoord = unit:GetCoordinate() local unitcoord = unit:GetCoord()
-- find nearest group of deployed troops -- find nearest group of deployed troops
local nearestGroup = nil local nearestGroup = nil
@@ -3288,7 +3287,7 @@ end
local distancekeys = {} local distancekeys = {}
local extractdistance = self.CrateDistance * self.ExtractFactor local extractdistance = self.CrateDistance * self.ExtractFactor
for k,v in pairs(self.DroppedTroops) do for k,v in pairs(self.DroppedTroops) do
local distance = self:_GetDistance(v:GetCoordinate(),unitcoord) local distance = self:_GetDistance(v:GetCoord(),unitcoord)
local TNow = timer.getTime() local TNow = timer.getTime()
local vtime = v.ExtractTime or TNow-310 local vtime = v.ExtractTime or TNow-310
if distance <= extractdistance and distance ~= -1 and (TNow - vtime > 300) then if distance <= extractdistance and distance ~= -1 and (TNow - vtime > 300) then
@@ -3376,7 +3375,7 @@ end
self:_UpdateUnitCargoMass(Unit) self:_UpdateUnitCargoMass(Unit)
local groupname = nearestGroup:GetName() local groupname = nearestGroup:GetName()
self:__TroopsExtracted(running,Group, Unit, nearestGroup, groupname) self:__TroopsExtracted(running,Group, Unit, nearestGroup, groupname)
local coord = Unit:GetCoordinate() or Group:GetCoordinate() -- Core.Point#COORDINATE local coord = Unit:GetCoord() or Group:GetCoord() -- Core.Point#COORDINATE
local Point local Point
if coord then if coord then
local heading = unit:GetHeading() or 0 local heading = unit:GetHeading() or 0
@@ -3747,16 +3746,16 @@ function CTLD:_C130GetUnits(Group, Unit, Name)
return self return self
end end
local coord = Unit:GetCoordinate() or Group:GetCoordinate() local coord = Unit:GetCoord() or Group:GetCoord()
local capabilities = self:_GetUnitCapabilities(Unit) local capabilities = self:_GetUnitCapabilities(Unit)
local innerDist = (capabilities.length and capabilities.length/2) or 15 local innerDist = (capabilities.length and capabilities.length/2) or 15
local maxUnitsNearby = self.maxUnitsNearby or 3 local maxUnitsNearby = self.maxUnitsNearby or 3
local searchRadius = self.UnitDistance or 90 local searchRadius = self.UnitDistance or 90
local checkZone = ZONE_RADIUS:New("CTLD_C130UnitsZone",coord:GetVec2(),searchRadius,false) local checkZone = ZONE_RADIUS:New("CTLD_C130UnitsZone",coord:GetVec2(),searchRadius,false)
local nearGroups = SET_GROUP:New():FilterCoalitions("blue"):FilterZones({checkZone}):FilterOnce() local nearGroups = SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterZones({checkZone}):FilterOnce()
local nearbyCount = 0 local nearbyCount = 0
for _,gr in pairs(nearGroups.Set) do for _,gr in pairs(nearGroups.Set) do
local gc = gr:GetCoordinate() local gc = gr:GetCoord()
if gc then if gc then
local dist = coord:Get2DDistance(gc) local dist = coord:Get2DDistance(gc)
if dist > innerDist then if dist > innerDist then
@@ -3806,6 +3805,7 @@ function CTLD:_C130GetUnits(Group, Unit, Name)
if canmove then if canmove then
SPAWN:NewWithAlias(_template,alias) SPAWN:NewWithAlias(_template,alias)
:InitRandomizeUnits(true,10,2) :InitRandomizeUnits(true,10,2)
:InitCoalition(self.coalition)
:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits, 70) :InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits, 70)
:InitDelayOff() :InitDelayOff()
:OnSpawnGroup(function(grp,TimeStamp) :OnSpawnGroup(function(grp,TimeStamp)
@@ -3819,6 +3819,7 @@ function CTLD:_C130GetUnits(Group, Unit, Name)
SPAWN:NewWithAlias(_template,alias) SPAWN:NewWithAlias(_template,alias)
:InitRandomizeUnits(true,10,2) :InitRandomizeUnits(true,10,2)
:InitDelayOff() :InitDelayOff()
:InitCoalition(self.coalition)
:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits, 70) :InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits, 70)
:OnSpawnGroup(function(grp,TimeStamp) :OnSpawnGroup(function(grp,TimeStamp)
grp.spawntime = TimeStamp or timer.getTime() grp.spawntime = TimeStamp or timer.getTime()
@@ -3925,7 +3926,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet, suppress
-- Check cargo location if available -- Check cargo location if available
local location = Cargo:GetLocation() local location = Cargo:GetLocation()
if location then if location then
local unitcoord = Unit:GetCoordinate() or Group:GetCoordinate() local unitcoord = Unit:GetCoord() or Group:GetCoord()
if unitcoord then if unitcoord then
if not location:IsCoordinateInZone(unitcoord) then if not location:IsCoordinateInZone(unitcoord) then
-- no we're not at the right spot -- no we're not at the right spot
@@ -3972,7 +3973,7 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet, suppress
end end
-- get position and heading of heli -- get position and heading of heli
local position = Unit:GetCoordinate() local position = Unit:GetCoord()
local heading = Unit:GetHeading() + 1 local heading = Unit:GetHeading() + 1
local height = Unit:GetHeight() local height = Unit:GetHeight()
local droppedcargo = {} local droppedcargo = {}
@@ -4136,8 +4137,8 @@ function CTLD:_GetCrates(Group, Unit, Cargo, number, drop, pack, quiet, suppress
if type(ship) == "string" then if type(ship) == "string" then
self:T("Spawning on ship "..ship) self:T("Spawning on ship "..ship)
local Ship = UNIT:FindByName(ship) local Ship = UNIT:FindByName(ship)
local shipcoord = Ship:GetCoordinate() local shipcoord = Ship:GetCoord()
local unitcoord = Unit:GetCoordinate() local unitcoord = Unit:GetCoord()
local dist = shipcoord:Get2DDistance(unitcoord) local dist = shipcoord:Get2DDistance(unitcoord)
dist = dist - (20 + math.random(1, 10)) dist = dist - (20 + math.random(1, 10))
local halfwidth = (width or 20) / 2 local halfwidth = (width or 20) / 2
@@ -4389,17 +4390,17 @@ end
function CTLD:_C130RemoveUnitsNearby(_group,_unit) function CTLD:_C130RemoveUnitsNearby(_group,_unit)
self:T(self.lid .. " _C130RemoveUnitsNearby") self:T(self.lid .. " _C130RemoveUnitsNearby")
if not _group or not _unit then return self end if not _group or not _unit then return self end
local location = _group:GetCoordinate() local location = _group:GetCoord()
if not location then return self end if not location then return self end
local capabilities = self:_GetUnitCapabilities(_unit) local capabilities = self:_GetUnitCapabilities(_unit)
local innerDist = (capabilities.length and capabilities.length/2) or 15 local innerDist = (capabilities.length and capabilities.length/2) or 15
local finddist = self.PackDistance or (self.CrateDistance or 35) local finddist = self.PackDistance or (self.CrateDistance or 35)
local zone = ZONE_RADIUS:New("CTLD_C130RemoveZone",location:GetVec2(),finddist,false) local zone = ZONE_RADIUS:New("CTLD_C130RemoveZone",location:GetVec2(),finddist,false)
local nearestGroups = SET_GROUP:New():FilterCoalitions("blue"):FilterZones({zone}):FilterOnce() local nearestGroups = SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterZones({zone}):FilterOnce()
local removedAny = false local removedAny = false
local removedTable = {} local removedTable = {}
for _, gr in pairs(nearestGroups.Set) do for _, gr in pairs(nearestGroups.Set) do
local gc = gr:GetCoordinate() local gc = gr:GetCoord()
if gc then if gc then
local dist = location:Get2DDistance(gc) local dist = location:Get2DDistance(gc)
if dist > innerDist then if dist > innerDist then
@@ -4533,7 +4534,7 @@ end
function CTLD:_FindCratesNearby( _group, _unit, _dist, _ignoreweight, ignoretype, ignoreHercInner) function CTLD:_FindCratesNearby( _group, _unit, _dist, _ignoreweight, ignoretype, ignoreHercInner)
self:T(self.lid .. " _FindCratesNearby") self:T(self.lid .. " _FindCratesNearby")
local finddist = _dist local finddist = _dist
local location = _group:GetCoordinate() local location = _group:GetCoord()
local existingcrates = self.Spawned_Cargo -- #table local existingcrates = self.Spawned_Cargo -- #table
-- cycle -- cycle
local index = 0 local index = 0
@@ -5159,7 +5160,6 @@ function CTLD:_UnloadTroops(Group, Unit)
-- unload troops -- unload troops
local name = cargo:GetName() or "none" local name = cargo:GetName() or "none"
local temptable = cargo:GetTemplates() or {} local temptable = cargo:GetTemplates() or {}
local position = Group:GetCoordinate()
local zoneradius = self.troopdropzoneradius or 100 -- drop zone radius local zoneradius = self.troopdropzoneradius or 100 -- drop zone radius
local factor = 1 local factor = 1
if IsHerc then if IsHerc then
@@ -5196,6 +5196,7 @@ function CTLD:_UnloadTroops(Group, Unit)
local Positions = self:_GetUnitPositions(randomcoord,rad,heading,_template) local Positions = self:_GetUnitPositions(randomcoord,rad,heading,_template)
self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template,alias) self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template,alias)
:InitDelayOff() :InitDelayOff()
:InitCoalition(self.coalition)
:InitSetUnitAbsolutePositions(Positions) :InitSetUnitAbsolutePositions(Positions)
:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) :InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits)
:OnSpawnGroup(function(grp) grp.spawntime = timer.getTime() end) :OnSpawnGroup(function(grp) grp.spawntime = timer.getTime() end)
@@ -5506,8 +5507,8 @@ function CTLD:_BuildCrates(Group, Unit,Engineering,MultiDrop,NotifyGroup)
local required = Crate:GetCratesNeeded() local required = Crate:GetCratesNeeded()
local template = Crate:GetTemplates() local template = Crate:GetTemplates()
local ctype = Crate:GetType() local ctype = Crate:GetType()
local ccoord = Crate:GetPositionable():GetCoordinate() -- Core.Point#COORDINATE local ccoord = Crate:GetPositionable():GetCoord() -- Core.Point#COORDINATE
local distToUnit=Unit and ccoord:Get2DDistance(Unit:GetCoordinate())or 0 local distToUnit=Unit and ccoord:Get2DDistance(Unit:GetCoord())or 0
local isHercDrop=Crate:WasDropped(true) local isHercDrop=Crate:WasDropped(true)
if not isHercDrop and distToUnit>baseDist then if not isHercDrop and distToUnit>baseDist then
elseif self:IsC130J(Unit) and distToUnit<15 then elseif self:IsC130J(Unit) and distToUnit<15 then
@@ -5526,6 +5527,7 @@ function CTLD:_BuildCrates(Group, Unit,Engineering,MultiDrop,NotifyGroup)
object.Found = 1 object.Found = 1
object.Template = template object.Template = template
object.CanBuild = false object.CanBuild = false
object.Heading = Unit:GetHeading()
object.Type = ctype -- #CTLD_CARGO.Enum object.Type = ctype -- #CTLD_CARGO.Enum
object.Coord = ccoord:GetVec2() object.Coord = ccoord:GetVec2()
buildables[name] = object buildables[name] = object
@@ -5611,7 +5613,7 @@ function CTLD:_BuildCrates(Group, Unit,Engineering,MultiDrop,NotifyGroup)
local sep = self.buildPairSeparation or 25 local sep = self.buildPairSeparation or 25
local hdg = (Unit:GetHeading()+180)%360 local hdg = (Unit:GetHeading()+180)%360
local lat = (hdg+90)%360 local lat = (hdg+90)%360
local base = Unit:GetCoordinate():Translate(20,hdg) local base = Unit:GetCoord():Translate(20,hdg)
if full == 1 then if full == 1 then
local cratesNow, numberNow = self:_FindCratesNearby(Group,Unit, finddist,true,true, not Engineering) local cratesNow, numberNow = self:_FindCratesNearby(Group,Unit, finddist,true,true, not Engineering)
@@ -5645,7 +5647,7 @@ function CTLD:_BuildCrates(Group, Unit,Engineering,MultiDrop,NotifyGroup)
self:_RefreshPackMenus(Group,Unit) self:_RefreshPackMenus(Group,Unit)
local off = start + (n-1)*sep local off = start + (n-1)*sep
local coord = base:Translate(off,lat):GetVec2() local coord = base:Translate(off,lat):GetVec2()
local b = { Name=build.Name, Required=build.Required, Template=build.Template, CanBuild=true, Type=build.Type, Coord=coord } local b = { Name=build.Name, Required=build.Required, Template=build.Template, CanBuild=true, Type=build.Type, Coord=coord, Heading=build.Heading }
if self.buildtime and self.buildtime > 0 then if self.buildtime and self.buildtime > 0 then
local buildtimer = TIMER:New(self._BuildObjectFromCrates,self,Group,Unit,b,false,Group:GetCoordinate(),MultiDrop) local buildtimer = TIMER:New(self._BuildObjectFromCrates,self,Group,Unit,b,false,Group:GetCoordinate(),MultiDrop)
buildtimer:Start(self.buildtime) buildtimer:Start(self.buildtime)
@@ -5683,18 +5685,18 @@ end
-- @return #number Number -- @return #number Number
function CTLD:_FindPackableGroupsNearby(Group, Unit) function CTLD:_FindPackableGroupsNearby(Group, Unit)
self:T(self.lid .. " _FindPackableGroupsNearby") self:T(self.lid .. " _FindPackableGroupsNearby")
local location = Group:GetCoordinate() local location = Group:GetCoord()
if not location then return {}, 0 end if not location then return {}, 0 end
local capabilities = self:_GetUnitCapabilities(Unit) local capabilities = self:_GetUnitCapabilities(Unit)
local innerDist = (capabilities.length and capabilities.length/2) or 15 local innerDist = (capabilities.length and capabilities.length/2) or 15
local finddist = self.PackDistance or (self.CrateDistance or 35) local finddist = self.PackDistance or (self.CrateDistance or 35)
local zone = ZONE_RADIUS:New("CTLD_PackableZone", location:GetVec2(), finddist, false) local zone = ZONE_RADIUS:New("CTLD_PackableZone", location:GetVec2(), finddist, false)
local nearestGroups = SET_GROUP:New():FilterCoalitions("blue"):FilterZones({zone}):FilterOnce() local nearestGroups = SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterZones({zone}):FilterOnce()
local packable = {} local packable = {}
for _, gr in pairs(nearestGroups.Set) do for _, gr in pairs(nearestGroups.Set) do
if gr and gr:GetName() ~= Group:GetName() then if gr and gr:GetName() ~= Group:GetName() then
local gc = gr:GetCoordinate() local gc = gr:GetCoord()
if gc then if gc then
local dist = location:Get2DDistance(gc) local dist = location:Get2DDistance(gc)
if dist > innerDist and dist <= finddist then if dist > innerDist and dist <= finddist then
@@ -5827,12 +5829,12 @@ function CTLD:_LoadPackedCratesByIds(Group, Unit, crateIds, cargoName)
local matchingCrates = {} local matchingCrates = {}
local finddist = self.CrateDistance or 35 local finddist = self.CrateDistance or 35
local location = Group:GetCoordinate() local location = Group:GetCoord()
for _, crateObj in pairs(self.Spawned_Cargo or {}) do for _, crateObj in pairs(self.Spawned_Cargo or {}) do
if crateObj and idLookup[crateObj:GetID()] then if crateObj and idLookup[crateObj:GetID()] then
local pos = crateObj:GetPositionable() local pos = crateObj:GetPositionable()
if pos and pos:IsAlive() then if pos and pos:IsAlive() then
local dist = location:Get2DDistance(pos:GetCoordinate()) local dist = location:Get2DDistance(pos:GetCoord())
if dist <= finddist then if dist <= finddist then
matchingCrates[#matchingCrates + 1] = crateObj matchingCrates[#matchingCrates + 1] = crateObj
end end
@@ -5942,12 +5944,12 @@ function CTLD:_RemovePackedCratesByIds(Group, Unit, crateIds)
local crates = {} local crates = {}
local finddist = self.CrateDistance or 35 local finddist = self.CrateDistance or 35
local location = Group:GetCoordinate() local location = Group:GetCoord()
for _, entry in pairs(self.Spawned_Cargo or {}) do for _, entry in pairs(self.Spawned_Cargo or {}) do
if entry and idLookup[entry:GetID()] then if entry and idLookup[entry:GetID()] then
local pos = entry:GetPositionable() local pos = entry:GetPositionable()
if pos and pos:IsAlive() then if pos and pos:IsAlive() then
local dist = location:Get2DDistance(pos:GetCoordinate()) local dist = location:Get2DDistance(pos:GetCoord())
if dist <= finddist then if dist <= finddist then
crates[#crates + 1] = entry crates[#crates + 1] = entry
end end
@@ -6197,28 +6199,31 @@ function CTLD:_BuildObjectFromCrates(Group,Unit,Build,Repair,RepairLocation,Mult
for _,_template in pairs(temptable) do for _,_template in pairs(temptable) do
self.TroopCounter = self.TroopCounter + 1 self.TroopCounter = self.TroopCounter + 1
local alias = string.format("%s-%d", _template, math.random(1,100000)) local alias = string.format("%s-%d", _template, math.random(1,100000))
local spawn = SPAWN:NewWithAlias(_template,alias)
:InitDelayOff()
:InitCoalition(self.coalition)
:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits)
:OnSpawnGroup(function(grp) grp.spawntime = timer.getTime() end)
if canmove then if canmove then
self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template,alias) --spawn:InitRandomizeUnits(true,20,2)
--:InitRandomizeUnits(true,20,2)
:InitDelayOff()
:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits)
:OnSpawnGroup(function(grp) grp.spawntime = timer.getTime() end)
:SpawnFromVec2(randomcoord)
else -- don't random position of e.g. SAM units build as FOB
self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template,alias)
:InitDelayOff()
:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits)
:OnSpawnGroup(function(grp) grp.spawntime = timer.getTime() end)
:SpawnFromVec2(randomcoord)
end end
if Build.Heading and self.buildcrateswithaircraftheading then
spawn:InitGroupHeading(Build.Heading)
end
local spawnedGroup = spawn:SpawnFromVec2(randomcoord)
self.DroppedTroops[self.TroopCounter] = spawnedGroup
if Repair then if Repair then
self:__CratesRepaired(1,Group,Unit,self.DroppedTroops[self.TroopCounter]) self:__CratesRepaired(1,Group,Unit,spawnedGroup)
else else
self:__CratesBuild(1,Group,Unit,self.DroppedTroops[self.TroopCounter]) self:__CratesBuild(1,Group,Unit,spawnedGroup)
end end
end -- template loop end -- template loop
self:_RefreshLoadCratesMenu(Group, Unit)
self:_RefreshPackMenus(Group, Unit) if Group and Group:IsAlive() and Group:GetID() then
self:_RefreshLoadCratesMenu(Group, Unit)
self:_RefreshPackMenus(Group, Unit)
end
else else
self:T(self.lid.."Group KIA while building!") self:T(self.lid.."Group KIA while building!")
end end
@@ -6241,14 +6246,11 @@ end
-- @param Wrapper.Group#GROUP Group The Group to move. -- @param Wrapper.Group#GROUP Group The Group to move.
function CTLD:_MoveGroupToZone(Group) function CTLD:_MoveGroupToZone(Group)
self:T(self.lid .. " _MoveGroupToZone") self:T(self.lid .. " _MoveGroupToZone")
local groupname = Group:GetName() or "none"
local groupcoord = Group:GetCoordinate()
-- Get closest zone of type -- Get closest zone of type
local outcome, name, zone, distance = self:IsUnitInZone(Group,CTLD.CargoZoneType.MOVE) local outcome, name, zone, distance = self:IsUnitInZone(Group,CTLD.CargoZoneType.MOVE)
self:T({canmove=outcome, name=name, zone=zone, dist=distance,max=self.movetroopsdistance}) self:T({canmove=outcome, name=name, zone=zone, dist=distance,max=self.movetroopsdistance})
if (distance <= self.movetroopsdistance) and outcome == true and zone~= nil then if (distance <= self.movetroopsdistance) and outcome == true and zone~= nil then
-- yes, we can ;) -- yes, we can ;)
local groupname = Group:GetName()
local zonecoord = zone:GetRandomCoordinate(20,125) -- Core.Point#COORDINATE local zonecoord = zone:GetRandomCoordinate(20,125) -- Core.Point#COORDINATE
local formation = self:_GetVehicleFormation() local formation = self:_GetVehicleFormation()
--local coordinate = zonecoord:GetVec2() --local coordinate = zonecoord:GetVec2()
@@ -7931,6 +7933,7 @@ function CTLD:_UnloadSingleTroopByID(Group, Unit, chunkID, qty)
local Positions = self:_GetUnitPositions(randomcoord, rad, heading, _template) local Positions = self:_GetUnitPositions(randomcoord, rad, heading, _template)
self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template, alias) self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template, alias)
:InitDelayOff() :InitDelayOff()
:InitCoalition(self.coalition)
:InitSetUnitAbsolutePositions(Positions) :InitSetUnitAbsolutePositions(Positions)
:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) :InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits)
:OnSpawnGroup(function(grp) grp.spawntime = timer.getTime() end) :OnSpawnGroup(function(grp) grp.spawntime = timer.getTime() end)
@@ -9008,7 +9011,7 @@ function CTLD:IsUnitInZone(Unit,Zonetype)
local zoneret = nil local zoneret = nil
local zonewret = nil local zonewret = nil
local zonenameret = nil local zonenameret = nil
local unitcoord = Unit:GetCoordinate() local unitcoord = Unit:GetCoord()
if not unitcoord then if not unitcoord then
if Zonetype == CTLD.CargoZoneType.SHIP then if Zonetype == CTLD.CargoZoneType.SHIP then
return false, nil, nil, 1000000, nil return false, nil, nil, 1000000, nil
@@ -9029,7 +9032,7 @@ function CTLD:IsUnitInZone(Unit,Zonetype)
self:T("Checking Type Ship: "..zonename) self:T("Checking Type Ship: "..zonename)
local ZoneUNIT = UNIT:FindByName(zonename) local ZoneUNIT = UNIT:FindByName(zonename)
if not ZoneUNIT then return false end if not ZoneUNIT then return false end
zonecoord = ZoneUNIT:GetCoordinate() zonecoord = ZoneUNIT:GetCoord()
zoneradius = czone.shiplength zoneradius = czone.shiplength
zonewidth = czone.shipwidth zonewidth = czone.shipwidth
zone = ZONE_UNIT:New( ZoneUNIT:GetName(), ZoneUNIT, zoneradius/2) zone = ZONE_UNIT:New( ZoneUNIT:GetName(), ZoneUNIT, zoneradius/2)
@@ -9078,7 +9081,7 @@ function CTLD:SmokePositionNow(Unit, Flare, SmokeColor)
end end
local FlareColor = self.FlareColor or FLARECOLOR.Red local FlareColor = self.FlareColor or FLARECOLOR.Red
-- table of #CTLD.CargoZone table -- table of #CTLD.CargoZone table
local unitcoord = Unit:GetCoordinate() -- Core.Point#COORDINATE local unitcoord = Unit:GetCoord() -- Core.Point#COORDINATE
local Group = Unit:GetGroup() local Group = Unit:GetGroup()
if Flare then if Flare then
unitcoord:Flare(FlareColor, 90) unitcoord:Flare(FlareColor, 90)
@@ -9097,7 +9100,7 @@ end
function CTLD:SmokeZoneNearBy(Unit, Flare) function CTLD:SmokeZoneNearBy(Unit, Flare)
self:T(self.lid .. " SmokeZoneNearBy") self:T(self.lid .. " SmokeZoneNearBy")
-- table of #CTLD.CargoZone table -- table of #CTLD.CargoZone table
local unitcoord = Unit:GetCoordinate() local unitcoord = Unit:GetCoord()
local Group = Unit:GetGroup() local Group = Unit:GetGroup()
local smokedistance = self.smokedistance local smokedistance = self.smokedistance
local smoked = false local smoked = false
@@ -9234,7 +9237,7 @@ end
-- get speed and height -- get speed and height
local uspeed = Unit:GetVelocityMPS() local uspeed = Unit:GetVelocityMPS()
local uheight = Unit:GetHeight() local uheight = Unit:GetHeight()
local ucoord = Unit:GetCoordinate() local ucoord = Unit:GetCoord()
if not ucoord then if not ucoord then
return false return false
end end
@@ -9263,7 +9266,7 @@ end
-- get speed and height -- get speed and height
local uspeed = Unit:GetVelocityMPS() local uspeed = Unit:GetVelocityMPS()
local uheight = Unit:GetHeight() local uheight = Unit:GetHeight()
local ucoord = Unit:GetCoordinate() local ucoord = Unit:GetCoord()
if not ucoord then if not ucoord then
return false return false
end end
@@ -9355,7 +9358,7 @@ end
minheight = 5.1 -- herc is 5m AGL on the ground minheight = 5.1 -- herc is 5m AGL on the ground
end end
local uheight = Unit:GetHeight() local uheight = Unit:GetHeight()
local ucoord = Unit:GetCoordinate() local ucoord = Unit:GetCoord()
if not ucoord then if not ucoord then
return false return false
end end
@@ -10141,6 +10144,7 @@ end
local alias = string.format("%s-%d", _template, math.random(1,100000)) local alias = string.format("%s-%d", _template, math.random(1,100000))
self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template,alias) self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template,alias)
:InitRandomizeUnits(randompositions,20,2) :InitRandomizeUnits(randompositions,20,2)
:InitCoalition(self.coalition)
:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) :InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits)
:InitDelayOff() :InitDelayOff()
:OnSpawnGroup(function(grp,TimeStamp) grp.spawntime = TimeStamp or timer.getTime() end,TimeStamp) :OnSpawnGroup(function(grp,TimeStamp) grp.spawntime = TimeStamp or timer.getTime() end,TimeStamp)
@@ -10295,6 +10299,7 @@ end
if canmove then if canmove then
self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template,alias) self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template,alias)
:InitRandomizeUnits(true,20,2) :InitRandomizeUnits(true,20,2)
:InitCoalition(self.coalition)
:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) :InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits)
:InitDelayOff() :InitDelayOff()
:OnSpawnGroup(function(grp,TimeStamp) grp.spawntime = TimeStamp or timer.getTime() end,TimeStamp) :OnSpawnGroup(function(grp,TimeStamp) grp.spawntime = TimeStamp or timer.getTime() end,TimeStamp)
@@ -10302,6 +10307,7 @@ end
else -- don't random position of e.g. SAM units build as FOB else -- don't random position of e.g. SAM units build as FOB
self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template,alias) self.DroppedTroops[self.TroopCounter] = SPAWN:NewWithAlias(_template,alias)
:InitDelayOff() :InitDelayOff()
:InitCoalition(self.coalition)
:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) :InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits)
:OnSpawnGroup(function(grp,TimeStamp) grp.spawntime = TimeStamp or timer.getTime() end,TimeStamp) :OnSpawnGroup(function(grp,TimeStamp) grp.spawntime = TimeStamp or timer.getTime() end,TimeStamp)
:SpawnFromVec2(randomcoord) :SpawnFromVec2(randomcoord)
@@ -10583,7 +10589,7 @@ end
self:T({From, Event, To}) self:T({From, Event, To})
if Unit and Unit:IsPlayer() and self.PlayerTaskQueue then if Unit and Unit:IsPlayer() and self.PlayerTaskQueue then
local playername = Unit:GetPlayerName() local playername = Unit:GetPlayerName()
local dropcoord = Troops:GetCoordinate() or COORDINATE:New(0,0,0) local dropcoord = Troops:GetCoord() or COORDINATE:New(0,0,0)
local dropvec2 = dropcoord:GetVec2() local dropvec2 = dropcoord:GetVec2()
self.PlayerTaskQueue:ForEach( self.PlayerTaskQueue:ForEach(
function (Task) function (Task)
@@ -10640,7 +10646,7 @@ end
for _,_cargo in pairs(Cargotable) do for _,_cargo in pairs(Cargotable) do
local Vehicle = _cargo.Positionable local Vehicle = _cargo.Positionable
if Vehicle then if Vehicle then
local dropcoord = Vehicle:GetCoordinate() or COORDINATE:New(0,0,0) local dropcoord = Vehicle:GetCoord() or COORDINATE:New(0,0,0)
local dropvec2 = dropcoord:GetVec2() local dropvec2 = dropcoord:GetVec2()
self.PlayerTaskQueue:ForEach( self.PlayerTaskQueue:ForEach(
function (Task) function (Task)
@@ -10705,7 +10711,7 @@ end
self:T({From, Event, To}) self:T({From, Event, To})
if Unit and Unit:IsPlayer() and self.PlayerTaskQueue then if Unit and Unit:IsPlayer() and self.PlayerTaskQueue then
local playername = Unit:GetPlayerName() local playername = Unit:GetPlayerName()
local dropcoord = Vehicle:GetCoordinate() or COORDINATE:New(0,0,0) local dropcoord = Vehicle:GetCoord() or COORDINATE:New(0,0,0)
local dropvec2 = dropcoord:GetVec2() local dropvec2 = dropcoord:GetVec2()
self.PlayerTaskQueue:ForEach( self.PlayerTaskQueue:ForEach(
function (Task) function (Task)
+16 -2
View File
@@ -191,9 +191,10 @@
-- * @{#EASYGCICAP.SetDefaultResurrection}: Set how many seconds the AirWing stays inoperable after the AirWing STATIC HQ ist destroyed, default 900 secs. -- * @{#EASYGCICAP.SetDefaultResurrection}: Set how many seconds the AirWing stays inoperable after the AirWing STATIC HQ ist destroyed, default 900 secs.
-- * @{#EASYGCICAP.SetDefaultCAPSpeed}: Set how many knots the CAP flights should do (will be altitude corrected), default 300 kn. -- * @{#EASYGCICAP.SetDefaultCAPSpeed}: Set how many knots the CAP flights should do (will be altitude corrected), default 300 kn.
-- * @{#EASYGCICAP.SetDefaultCAPAlt}: Set at which altitude (ASL) the CAP planes will fly, default 25,000 ft. -- * @{#EASYGCICAP.SetDefaultCAPAlt}: Set at which altitude (ASL) the CAP planes will fly, default 25,000 ft.
-- * @{#EASYGCICAP.SetDefaultINTERCEPTAlt}: Set at which altitude (ASL) the Intercept planes will fly, default 25,000 ft.
-- * @{#EASYGCICAP.SetDefaultCAPDirection}: Set the initial direction from the CAP point the planes will fly in degrees, default is 90°. -- * @{#EASYGCICAP.SetDefaultCAPDirection}: Set the initial direction from the CAP point the planes will fly in degrees, default is 90°.
-- * @{#EASYGCICAP.SetDefaultCAPLeg}: Set the length of the CAP leg, default is 15 NM. -- * @{#EASYGCICAP.SetDefaultCAPLeg}: Set the length of the CAP leg, default is 15 NM.
-- * @{#EASYGCICAP.SetDefaultCAPGrouping}: Set how many planes will be spawned per mission (CVAP/GCI), defaults to 2. -- * @{#EASYGCICAP.SetDefaultCAPGrouping}: Set how many planes will be spawned per mission (CAP/GCI), defaults to 2.
-- * @{#EASYGCICAP.SetDefaultMissionRange}: Set how many NM the planes can go from the home base, defaults to 100. -- * @{#EASYGCICAP.SetDefaultMissionRange}: Set how many NM the planes can go from the home base, defaults to 100.
-- * @{#EASYGCICAP.SetDefaultNumberAlert5Standby}: Set how many planes will be spawned on cold standby (Alert5), default 2. -- * @{#EASYGCICAP.SetDefaultNumberAlert5Standby}: Set how many planes will be spawned on cold standby (Alert5), default 2.
-- * @{#EASYGCICAP.SetDefaultEngageRange}: Set max engage range for CAP flights if they detect intruders, defaults to 50. -- * @{#EASYGCICAP.SetDefaultEngageRange}: Set max engage range for CAP flights if they detect intruders, defaults to 50.
@@ -287,7 +288,7 @@ EASYGCICAP = {
--- EASYGCICAP class version. --- EASYGCICAP class version.
-- @field #string version -- @field #string version
EASYGCICAP.version="0.1.37" EASYGCICAP.version="0.1.38"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- --
@@ -588,6 +589,17 @@ function EASYGCICAP:SetDefaultCAPAlt(Altitude)
return self return self
end end
--- Set default INTERCEPT Altitude in feet
-- @param #EASYGCICAP self
-- @param #number Altitude (Optional) Altitude defaults to 25000
-- @return #EASYGCICAP self
function EASYGCICAP:SetDefaultINTERCEPTAlt(Altitude)
self:T(self.lid.."SetDefaultINTERCEPTAlt")
self.interceptalt = Altitude or 25000
return self
end
--
--- Set default CAP lieg initial direction in degrees --- Set default CAP lieg initial direction in degrees
-- @param #EASYGCICAP self -- @param #EASYGCICAP self
-- @param #number Direction (Optional) Direction defaults to 90 (East) -- @param #number Direction (Optional) Direction defaults to 90 (East)
@@ -1519,6 +1531,7 @@ function EASYGCICAP:_AssignIntercept(Cluster)
local overhead = self.overhead local overhead = self.overhead
local capspeed = self.capspeed + 100 local capspeed = self.capspeed + 100
local capalt = self.capalt local capalt = self.capalt
local interalt = self.interceptalt or self.capalt
local maxsize = self.maxinterceptsize local maxsize = self.maxinterceptsize
local repeatsonfailure = self.repeatsonfailure local repeatsonfailure = self.repeatsonfailure
@@ -1606,6 +1619,7 @@ function EASYGCICAP:_AssignIntercept(Cluster)
:SetRepeatOnFailure(repeats) :SetRepeatOnFailure(repeats)
:SetMissionSpeed(UTILS.KnotsToAltKIAS(capspeed,capalt)) :SetMissionSpeed(UTILS.KnotsToAltKIAS(capspeed,capalt))
:SetMissionAltitude(capalt) :SetMissionAltitude(capalt)
:SetEngageAltitude(interalt)
if nogozoneset:Count() > 0 then if nogozoneset:Count() > 0 then
InterceptAuftrag:AddConditionSuccess( InterceptAuftrag:AddConditionSuccess(
+3 -3
View File
@@ -2108,7 +2108,7 @@ function MSRS:_HoundTextToSpeech(Message,Frequencies,Modulations,Volume,Label,Co
local ffs = {} local ffs = {}
for _,_f in pairs(Frequencies) do for _,_f in pairs(Frequencies) do
table.insert(ffs,string.format("%.1f",_f)) table.insert(ffs,string.format("%.3f",_f))
end end
local freqs = table.concat(ffs, ",") local freqs = table.concat(ffs, ",")
@@ -2214,7 +2214,7 @@ function MSRS:_HoundTestTone(Frequencies, Modulations, Coalition)
local ffs = {} local ffs = {}
for _,_f in pairs(Frequencies or self.frequencies) do for _,_f in pairs(Frequencies or self.frequencies) do
table.insert(ffs,string.format("%.1f",_f)) table.insert(ffs,string.format("%.3f",_f))
end end
local freqs = table.concat(ffs, ",") local freqs = table.concat(ffs, ",")
@@ -2291,7 +2291,7 @@ function MSRS:RadioJammerOn(Frequencies, Modulations, Coalition, Noisetype, Volu
local ffs = {} local ffs = {}
for _,_f in pairs(Frequencies or self.frequencies) do for _,_f in pairs(Frequencies or self.frequencies) do
table.insert(ffs,string.format("%.1f",_f)) table.insert(ffs,string.format("%.3f",_f))
end end
local freqs = table.concat(ffs, ",") local freqs = table.concat(ffs, ",")
+52 -2
View File
@@ -523,7 +523,7 @@ ENUMS.ReportingName =
Tornado = "Tornado", Tornado = "Tornado",
-- Transport / Bomber / Others -- Transport / Bomber / Others
Atlas = "A400", Atlas = "A400",
Lancer = "B1-B", Lancer = "B-1B",
Stratofortress = "B-52H", Stratofortress = "B-52H",
Herc = "C-130", Herc = "C-130",
Hercules = "C-130J-30", Hercules = "C-130J-30",
@@ -568,7 +568,7 @@ ENUMS.ReportingName =
Apache = "AH-64", Apache = "AH-64",
Chinook = "CH-47", Chinook = "CH-47",
Sea_Stallion = "CH-53", Sea_Stallion = "CH-53",
Kiowa = "OH-58", Kiowa = "OH58D",
Seahawk = "SH-60", Seahawk = "SH-60",
Blackhawk = "UH-60", Blackhawk = "UH-60",
Sea_King = "S-61", Sea_King = "S-61",
@@ -2126,6 +2126,56 @@ ENUMS.Storage.weapons.containers.UH60_GAU19_RIGHT = 'weapons.containers.{UH60_GA
ENUMS.Storage.weapons.containers.UH60_M230_RIGHT = 'weapons.containers.{UH60_M230_RIGHT}' ENUMS.Storage.weapons.containers.UH60_M230_RIGHT = 'weapons.containers.{UH60_M230_RIGHT}'
ENUMS.Storage.weapons.containers.UH60L_M2_GUNNER = 'weapons.containers.{UH60L_M2_GUNNER}' ENUMS.Storage.weapons.containers.UH60L_M2_GUNNER = 'weapons.containers.{UH60L_M2_GUNNER}'
ENUMS.Storage.weapons.adapters.GD_F100_SUU_13 = 'weapons.adapters.GD_F100_SUU-13'
ENUMS.Storage.weapons.containers.GPU_5_POD = 'weapons.containers.{GPU_5_POD}'
ENUMS.Storage.weapons.bombs.BOLT_117 = 'weapons.bombs.BOLT-117'
ENUMS.Storage.weapons.shells.F100_M39_20_TP_T = 'weapons.shells.F100_M39_20_TP_T'
ENUMS.Storage.weapons.gunmounts.M_39_F_100 = 'weapons.gunmounts.M-39 F-100'
ENUMS.Storage.weapons.droptanks.GD_F100_TANK_275_L = 'weapons.droptanks.GD_F100_TANK_275_L'
ENUMS.Storage.weapons.bombs.BLU_4B_R_GROUP_R = 'weapons.bombs.BLU-4B_R_GROUP_R'
ENUMS.Storage.weapons.containers.F100_CAMERA_P2 = 'weapons.containers.F100_CAMERA_P2'
ENUMS.Storage.weapons.containers.HB_ORD_SUU_7 = 'weapons.containers.HB_ORD_SUU_7'
ENUMS.Storage.weapons.adapters.SidewinderPylon = 'weapons.adapters.SidewinderPylon'
ENUMS.Storage.weapons.adapters.apu_470 = 'weapons.adapters.apu_470'
ENUMS.Storage.weapons.droptanks.GD_F100_TANK_335_R = 'weapons.droptanks.GD_F100_TANK_335_R'
ENUMS.Storage.weapons.bombs.BLU_3B_R_GROUP_R = 'weapons.bombs.BLU-3B_R_GROUP_R'
ENUMS.Storage.weapons.droptanks.GD_F100_TANK_335_L = 'weapons.droptanks.GD_F100_TANK_335_L'
ENUMS.Storage.weapons.adapters.mbdz_u2t = 'weapons.adapters.mbdz_u2t'
ENUMS.Storage.weapons.containers.ZellRocket = 'weapons.containers.ZellRocket'
ENUMS.Storage.weapons.containers.apu_73 = 'weapons.containers.apu-73'
ENUMS.Storage.weapons.gunmounts.GAU_13 = 'weapons.gunmounts.GAU-13'
ENUMS.Storage.weapons.shells.F100_M39_20_TP = 'weapons.shells.F100_M39_20_TP'
ENUMS.Storage.weapons.shells.F100_M39_20_API = 'weapons.shells.F100_M39_20_API'
ENUMS.Storage.weapons.adapters.bdz_umk2b = 'weapons.adapters.bdz_umk2b'
ENUMS.Storage.weapons.droptanks.GD_F100_TANK_450 = 'weapons.droptanks.GD_F100_TANK_450'
ENUMS.Storage.weapons.droptanks.GD_F100_TANK_275_R = 'weapons.droptanks.GD_F100_TANK_275_R'
ENUMS.Storage.weapons.bombs.BLU_18_B_GROUP = 'weapons.bombs.BLU-18/B_GROUP'
ENUMS.Storage.weapons.containers.ZELL_Booster = 'weapons.containers.ZELL Booster'
ENUMS.Storage.weapons.adapters.apu_60 = 'weapons.adapters.apu_60'
ENUMS.Storage.weapons.gunmounts.GPU_5_POD = 'weapons.gunmounts.{GPU_5_POD}'
ENUMS.Storage.weapons.containers.F100_CAMERA_KA71A = 'weapons.containers.F100_CAMERA_KA71A'
ENUMS.Storage.weapons.bombs.BLU_3_R_GROUP_R = 'weapons.bombs.BLU-3_R_GROUP_R'
ENUMS.Storage.weapons.shells.F100_M39_20_HEI = 'weapons.shells.F100_M39_20_HEI'
ENUMS.Storage.weapons.droptanks.GD_F100_TANK_200 = 'weapons.droptanks.GD_F100_TANK_200'
ENUMS.Storage.weapons.adapters.apu_73 = 'weapons.adapters.apu-73'
ENUMS.Storage.weapons.gunmounts.AKAN_NO_TRC = 'weapons.gunmounts.AKAN_NO_TRC'
ENUMS.Storage.weapons.gunmounts.AKAN = 'weapons.gunmounts.AKAN'
ENUMS.Storage.weapons.shells.F100_M39_20_HEI_T = 'weapons.shells.F100_M39_20_HEI_T'
ENUMS.Storage.weapons.shells.F100_M39_20_API_T = 'weapons.shells.F100_M39_20_API_T'
ENUMS.Storage.weapons.containers.GD_F100_STRIKE_CAMERA = 'weapons.containers.GD_F100_STRIKE_CAMERA'
ENUMS.Storage.weapons.bombs.BLU_49_B = 'weapons.bombs.BLU-49/B'
ENUMS.Storage.weapons.bombs.GBU_24E = 'weapons.bombs.GBU_24E'
ENUMS.Storage.weapons.containers.GD_F100_SUU_13 = 'weapons.containers.GD_F100_SUU-13'
ENUMS.Storage.weapons.gunmounts.AKAN = 'weapons.gunmounts.{AKAN}'
ENUMS.Storage.weapons.gunmounts.AKAN_NO_TRC = 'weapons.gunmounts.{AKAN_NO_TRC}'
ENUMS.Storage.weapons.gunmounts.SUU_23_POD_Wing = 'weapons.gunmounts.{SUU_23_POD_Wing}'
ENUMS.Storage.weapons.containers.SUU_23_POD_Wing = 'weapons.containers.{SUU_23_POD_Wing}'
ENUMS.Storage.weapons.containers.SUU_23_POD_Centerline = 'weapons.containers.{SUU_23_POD_Centerline}'
ENUMS.Storage.weapons.gunmounts.SUU_23_POD_Centerline = 'weapons.gunmounts.{SUU_23_POD_Centerline}'
ENUMS.Storage.weapons.containers.HB_F_4E_BRU_42 = 'weapons.containers.HB_F-4E_BRU-42'
--- ---
-- @type ENUMS.FARPType -- @type ENUMS.FARPType
-- @field #string FARP -- @field #string FARP