From dd5ca93f26a69932407927e161614f57c7475d4e Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Fri, 30 May 2025 11:13:50 +0200 Subject: [PATCH 01/11] CSAR Small addition --- Moose Development/Moose/Ops/CSAR.lua | 30 +++++++--------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/Moose Development/Moose/Ops/CSAR.lua b/Moose Development/Moose/Ops/CSAR.lua index f1a1578ae..98b8a2128 100644 --- a/Moose Development/Moose/Ops/CSAR.lua +++ b/Moose Development/Moose/Ops/CSAR.lua @@ -313,7 +313,7 @@ CSAR.AircraftType["CH-47Fbl1"] = 31 --- CSAR class version. -- @field #string version -CSAR.version="1.0.32" +CSAR.version="1.0.33" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- ToDo list @@ -2116,7 +2116,8 @@ end --- (Internal) Determine distance to closest MASH. -- @param #CSAR self -- @param Wrapper.Unit#UNIT _heli Helicopter #UNIT --- @return #CSAR self +-- @return #number Distance in meters +-- @return #string MASH Name as string function CSAR:_GetClosestMASH(_heli) self:T(self.lid .. " _GetClosestMASH") local _mashset = self.mash -- Core.Set#SET_GROUP @@ -2128,31 +2129,13 @@ function CSAR:_GetClosestMASH(_heli) local _shortestDistance = -1 local _distance = 0 local _helicoord = _heli:GetCoordinate() - - local function GetCloseAirbase(coordinate,Coalition,Category) - - local a=coordinate:GetVec3() - local distmin=math.huge - local airbase=nil - for DCSairbaseID, DCSairbase in pairs(world.getAirbases(Coalition)) do - local b=DCSairbase:getPoint() - - local c=UTILS.VecSubstract(a,b) - local dist=UTILS.VecNorm(c) - - if dist Date: Fri, 30 May 2025 18:37:38 +0200 Subject: [PATCH 02/11] Update CSAR.lua --- Moose Development/Moose/Ops/CSAR.lua | 71 +++++++++++++++++++++------- 1 file changed, 53 insertions(+), 18 deletions(-) diff --git a/Moose Development/Moose/Ops/CSAR.lua b/Moose Development/Moose/Ops/CSAR.lua index 98b8a2128..09af31eb5 100644 --- a/Moose Development/Moose/Ops/CSAR.lua +++ b/Moose Development/Moose/Ops/CSAR.lua @@ -263,6 +263,7 @@ CSAR = { rescuedpilots = 0, limitmaxdownedpilots = true, maxdownedpilots = 10, + useFIFOLimitReplacement = false, -- If true, it will remove the oldest downed pilot when a new one is added, if the limit is reached. allheligroupset = nil, topmenuname = "CSAR", ADFRadioPwr = 1000, @@ -1144,19 +1145,8 @@ function CSAR:_EventHandler(EventData) self:T("Double Ejection!") return self end - - -- limit no of pilots in the field. - if self.limitmaxdownedpilots and self:_ReachedPilotLimit() then - self:T("Maxed Downed Pilot!") - return self - end - - - -- TODO: Over water check --- EVENTS.LandingAfterEjection NOT triggered by DCS, so handle csarUsePara = true case - -- might create dual pilots in edge cases - - local wetfeet = false - + + local initdcscoord = nil local initcoord = nil if _event.id == EVENTS.Ejection then @@ -1168,6 +1158,36 @@ function CSAR:_EventHandler(EventData) initcoord = COORDINATE:NewFromVec3(initdcscoord) self:T({initdcscoord}) end + + -- Remove downed pilot if already exists to replace with new one. + if _event.IniPlayerName then + local PilotTable = self.downedPilots --#CSAR.DownedPilot + local _foundPilot = nil + for _,_pilot in pairs(PilotTable) do + if _pilot.player == _event.IniPlayerName and _pilot.alive == true then + _foundPilot = _pilot + break + end + end + if _foundPilot then + self:T("Downed pilot already exists!") + _foundPilot.group:Destroy(false) + self:_RemoveNameFromDownedPilots(_foundPilot.name) + self:_CheckDownedPilotTable() + end + end + + -- limit no of pilots in the field. + if self.limitmaxdownedpilots and self:_ReachedPilotLimit() then + self:T("Maxed Downed Pilot!") + return self + end + + + -- TODO: Over water check --- EVENTS.LandingAfterEjection NOT triggered by DCS, so handle csarUsePara = true case + -- might create dual pilots in edge cases + + local wetfeet = false --local surface = _unit:GetCoordinate():GetSurfaceType() local surface = initcoord:GetSurfaceType() @@ -2401,11 +2421,26 @@ function CSAR:_ReachedPilotLimit() local limit = self.maxdownedpilots local islimited = self.limitmaxdownedpilots local count = self:_CountActiveDownedPilots() - if islimited and (count >= limit) then - return true - else - return false - end + if islimited and (count >= limit) then + if self.useFIFOLimitReplacement then + local oldIndex = -1 + local oldDownedPilot = nil + for _index, _downedpilot in pairs(self.downedPilots) do + oldIndex = _index + oldDownedPilot = _downedpilot + break + end + if oldDownedPilot then + oldDownedPilot.group:Destroy(false) + oldDownedPilot.alive = false + self:_CheckDownedPilotTable() + return false + end + end + return true + else + return false + end end --- User - Function to add onw SET_GROUP Set-up for pilot filtering and assignment. From f5881eda533a97bae379e3b5d5b81cd6895fa0d1 Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Sun, 1 Jun 2025 12:19:42 +0200 Subject: [PATCH 03/11] AIRBOSS - Remove useless E Messages for non-debug --- Moose Development/Moose/Ops/Airboss.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Moose Development/Moose/Ops/Airboss.lua b/Moose Development/Moose/Ops/Airboss.lua index 5e6f70443..d6d7b03a7 100644 --- a/Moose Development/Moose/Ops/Airboss.lua +++ b/Moose Development/Moose/Ops/Airboss.lua @@ -8741,13 +8741,13 @@ function AIRBOSS:OnEventRemoveUnit( EventData ) -- Nil checks. if EventData == nil then - self:E( self.lid .. "ERROR: EventData=nil in event REMOVEUNIT!" ) - self:E( EventData ) + self:T( self.lid .. "ERROR: EventData=nil in event REMOVEUNIT!" ) + self:T( EventData ) return end if EventData.IniUnit == nil then - self:E( self.lid .. "ERROR: EventData.IniUnit=nil in event REMOVEUNIT!" ) - self:E( EventData ) + self:T( self.lid .. "ERROR: EventData.IniUnit=nil in event REMOVEUNIT!" ) + self:T( EventData ) return end From eeeeda4e5e1550bf2c1b2aaaebe347b93b4eb48f Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Sun, 8 Jun 2025 18:43:01 +0200 Subject: [PATCH 04/11] #POINT - Offset options for smoke --- Moose Development/Moose/Core/Point.lua | 89 ++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/Moose Development/Moose/Core/Point.lua b/Moose Development/Moose/Core/Point.lua index 35ad76b4c..a74356985 100644 --- a/Moose Development/Moose/Core/Point.lua +++ b/Moose Development/Moose/Core/Point.lua @@ -59,6 +59,10 @@ do -- COORDINATE -- * @{#COORDINATE.SmokeOrange}(): To smoke the point in orange. -- * @{#COORDINATE.SmokeWhite}(): To smoke the point in white. -- * @{#COORDINATE.SmokeGreen}(): To smoke the point in green. + -- * @{#COORDINATE.SetSmokeOffsetDirection}(): To set an offset point direction for smoke. + -- * @{#COORDINATE.SetSmokeOffsetDistance}(): To set an offset point distance for smoke. + -- * @{#COORDINATE.SwitchSmokeOffsetOn}(): To set an offset point for smoke to on. + -- * @{#COORDINATE.SwitchSmokeOffsetOff}(): To set an offset point for smoke to off. -- -- ## 2.2) Flare -- @@ -2124,21 +2128,32 @@ do -- COORDINATE -- @param #number Duration (Optional) Duration of the smoke in seconds. DCS stopps the smoke automatically after 5 min. -- @param #number Delay (Optional) Delay before the smoke is started in seconds. -- @param #string Name (Optional) Name if you want to stop the smoke early (normal duration: 5mins) + -- @param #boolean Offset (Optional) If true, offset the smokle a bit. + -- @param #number Direction (Optional) If Offset is true this is the direction of the offset, 1-359 (degrees). Default random. + -- @param #number Distance (Optional) If Offset is true this is the distance of the offset in meters. Default random 10-20. -- @return #COORDINATE self - function COORDINATE:Smoke( SmokeColor, Duration, Delay, Name) - self:F2( { SmokeColor, Name, Duration, Delay } ) + function COORDINATE:Smoke( SmokeColor, Duration, Delay, Name, Offset,Direction,Distance) + self:F2( { SmokeColor, Name, Duration, Delay, Offset } ) SmokeColor=SmokeColor or SMOKECOLOR.Green if Delay and Delay>0 then - self:ScheduleOnce(Delay, COORDINATE.Smoke, self, SmokeColor, Duration, 0, Name) + self:ScheduleOnce(Delay, COORDINATE.Smoke, self, SmokeColor, Duration, 0, Name, Direction,Distance) else -- Create a name which is used to stop the smoke manually self.firename = Name or "Smoke-"..math.random(1,100000) -- Create smoke - trigger.action.smoke( self:GetVec3(), SmokeColor, self.firename ) + if Offset or self.SmokeOffset then + local Angle = Direction or self:GetSmokeOffsetDirection() + local Distance = Distance or self:GetSmokeOffsetDistance() + local newpos = self:Translate(Distance,Angle,true,false) + local newvec3 = newpos:GetVec3() + trigger.action.smoke( newvec3, SmokeColor, self.firename ) + else + trigger.action.smoke( self:GetVec3(), SmokeColor, self.firename ) + end -- Stop smoke if Duration and Duration>0 then @@ -2148,6 +2163,72 @@ do -- COORDINATE return self end + + --- Get the offset direction when using `COORDINATE:Smoke()`. + -- @param #COORDINATE self + -- @return #number Direction in degrees. + function COORDINATE:GetSmokeOffsetDirection() + local direction = self.SmokeOffsetDirection or math.random(1,359) + return direction + end + + --- Set the offset direction when using `COORDINATE:Smoke()`. + -- @param #COORDINATE self + -- @param #number Direction (Optional) This is the direction of the offset, 1-359 (degrees). Default random. + -- @return #COORDINATE self + function COORDINATE:SetSmokeOffsetDirection(Direction) + if self then + self.SmokeOffsetDirection = Direction or math.random(1,359) + return self + else + COORDINATE.SmokeOffsetDirection = Direction or math.random(1,359) + end + end + + --- Get the offset distance when using `COORDINATE:Smoke()`. + -- @param #COORDINATE self + -- @return #number Distance Distance in meters. + function COORDINATE:GetSmokeOffsetDistance() + local distance = self.SmokeOffsetDistance or math.random(10,20) + return distance + end + + --- Set the offset distance when using `COORDINATE:Smoke()`. + -- @param #COORDINATE self + -- @param #number Distance (Optional) This is the distance of the offset in meters. Default random 10-20. + -- @return #COORDINATE self + function COORDINATE:SetSmokeOffsetDistance(Distance) + if self then + self.SmokeOffsetDistance = Distance or math.random(10,20) + return self + else + COORDINATE.SmokeOffsetDistance = Distance or math.random(10,20) + end + end + + --- Set the offset on when using `COORDINATE:Smoke()`. + -- @param #COORDINATE self + -- @return #COORDINATE self + function COORDINATE:SwitchSmokeOffsetOn() + if self then + self.SmokeOffset = true + return self + else + COORDINATE.SmokeOffset = true + end + end + + --- Set the offset off when using `COORDINATE:Smoke()`. + -- @param #COORDINATE self + -- @return #COORDINATE self + function COORDINATE:SwitchSmokeOffsetOff() + if self then + self.SmokeOffset = false + return self + else + COORDINATE.SmokeOffset = false + end + end --- Stops smoking the point in a color. -- @param #COORDINATE self From 0aeb1fc6afc2c3e2fcab252f43925d44b11dd0e7 Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Tue, 10 Jun 2025 18:05:02 +0200 Subject: [PATCH 05/11] #UTILS - Small fix for GetReportingName to distinguish Shark from Mainstay --- Moose Development/Moose/Utilities/Utils.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Moose Development/Moose/Utilities/Utils.lua b/Moose Development/Moose/Utilities/Utils.lua index 19e6889b3..f0c7b4aaf 100644 --- a/Moose Development/Moose/Utilities/Utils.lua +++ b/Moose Development/Moose/Utilities/Utils.lua @@ -1913,6 +1913,13 @@ end function UTILS.GetReportingName(Typename) local typename = string.lower(Typename) + + -- special cases - Shark and Manstay have "A-50" in the name + if string.find(typename,"ka-50",1,true) then + return "Shark" + elseif string.find(typename,"a-50",1,true) then + return "Mainstay" + end for name, value in pairs(ENUMS.ReportingName.NATO) do local svalue = string.lower(value) From a9edb165543c686eae6208a7e355026b79602907 Mon Sep 17 00:00:00 2001 From: Thomas <72444570+Applevangelist@users.noreply.github.com> Date: Sun, 15 Jun 2025 10:17:32 +0200 Subject: [PATCH 06/11] Update CSAR.lua Make static and zone mash SETs dynamic --- Moose Development/Moose/Ops/CSAR.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Ops/CSAR.lua b/Moose Development/Moose/Ops/CSAR.lua index 09af31eb5..817cd19b9 100644 --- a/Moose Development/Moose/Ops/CSAR.lua +++ b/Moose Development/Moose/Ops/CSAR.lua @@ -2488,8 +2488,8 @@ function CSAR:onafterStart(From, Event, To) self.mash = SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(self.mashprefix):FilterStart() - self.staticmashes = SET_STATIC:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(self.mashprefix):FilterOnce() - self.zonemashes = SET_ZONE:New():FilterPrefixes(self.mashprefix):FilterOnce() + self.staticmashes = SET_STATIC:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(self.mashprefix):FilterStart() + self.zonemashes = SET_ZONE:New():FilterPrefixes(self.mashprefix):FilterStart() --[[ if staticmashes:Count() > 0 then From a53763221c4cd17246ae550e6ca8c489289a4b6f Mon Sep 17 00:00:00 2001 From: Thomas <72444570+Applevangelist@users.noreply.github.com> Date: Sun, 15 Jun 2025 13:14:05 +0200 Subject: [PATCH 07/11] Update Airbase.lua Correct afb name gor Borg al arab on Sinai --- Moose Development/Moose/Wrapper/Airbase.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Wrapper/Airbase.lua b/Moose Development/Moose/Wrapper/Airbase.lua index aaab918bd..55bb2f4c3 100644 --- a/Moose Development/Moose/Wrapper/Airbase.lua +++ b/Moose Development/Moose/Wrapper/Airbase.lua @@ -691,7 +691,7 @@ AIRBASE.SouthAtlantic={ -- * AIRBASE.Sinai.Bilbeis_Air_Base -- * AIRBASE.Sinai.Bir_Hasanah -- * AIRBASE.Sinai.Birma_Air_Base --- * AIRBASE.Sinai.Borj_El_Arab_International_Airport +-- * AIRBASE.Sinai.Borg_El_Arab_International_Airport -- * AIRBASE.Sinai.Cairo_International_Airport -- * AIRBASE.Sinai.Cairo_West -- * AIRBASE.Sinai.Difarsuwar_Airfield @@ -739,7 +739,7 @@ AIRBASE.Sinai = { ["Bilbeis_Air_Base"] = "Bilbeis Air Base", ["Bir_Hasanah"] = "Bir Hasanah", ["Birma_Air_Base"] = "Birma Air Base", - ["Borj_El_Arab_International_Airport"] = "Borj El Arab International Airport", + ["Borg_El_Arab_International_Airport"] = "Borg El Arab International Airport", ["Cairo_International_Airport"] = "Cairo International Airport", ["Cairo_West"] = "Cairo West", ["Difarsuwar_Airfield"] = "Difarsuwar Airfield", From 382b049c5fe5f77c423cafdacaf75bca1b656f7e Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Sun, 15 Jun 2025 15:38:07 +0200 Subject: [PATCH 08/11] #AIRBASE - Syria and Sinai few names corrected --- Moose Development/Moose/Wrapper/Airbase.lua | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Moose Development/Moose/Wrapper/Airbase.lua b/Moose Development/Moose/Wrapper/Airbase.lua index 55bb2f4c3..01ae1b1a2 100644 --- a/Moose Development/Moose/Wrapper/Airbase.lua +++ b/Moose Development/Moose/Wrapper/Airbase.lua @@ -449,7 +449,6 @@ AIRBASE.TheChannel = { -- * AIRBASE.Syria.Al_Dumayr -- * AIRBASE.Syria.Al_Qusayr -- * AIRBASE.Syria.Aleppo --- * AIRBASE.Syria.Amman -- * AIRBASE.Syria.An_Nasiriyah -- * AIRBASE.Syria.At_Tanf -- * AIRBASE.Syria.Bassel_Al_Assad @@ -511,7 +510,7 @@ AIRBASE.TheChannel = { -- * AIRBASE.Syria.Wujah_Al_Hajar -- * AIRBASE.Syria.Ben_Gurion -- * AIRBASE.Syria.Hatzor --- * AIRBASE.Syria.Palmashim +-- * AIRBASE.Syria.Palmachim -- * AIRBASE.Syria.Tel_Nof -- * AIRBASE.Syria.Marka -- @@ -523,7 +522,6 @@ AIRBASE.Syria={ ["Al_Dumayr"] = "Al-Dumayr", ["Al_Qusayr"] = "Al Qusayr", ["Aleppo"] = "Aleppo", - ["Amman"] = "Amman", ["An_Nasiriyah"] = "An Nasiriyah", ["At_Tanf"] = "At Tanf", ["Bassel_Al_Assad"] = "Bassel Al-Assad", @@ -555,6 +553,7 @@ AIRBASE.Syria={ ["Kuweires"] = "Kuweires", ["Lakatamia"] = "Lakatamia", ["Larnaca"] = "Larnaca", + ["Marka"] = "Marka", ["Marj_Ruhayyil"] = "Marj Ruhayyil", ["Marj_as_Sultan_North"] = "Marj as Sultan North", ["Marj_as_Sultan_South"] = "Marj as Sultan South", @@ -585,9 +584,8 @@ AIRBASE.Syria={ ["Wujah_Al_Hajar"] = "Wujah Al Hajar", ["Ben_Gurion"] = "Ben Gurion", ["Hatzor"] = "Hatzor", - ["Palmashim"] = "Palmashim", + ["Palmachim"] = "Palmachim", ["Tel_Nof"] = "Tel Nof", - ["Marka"] = "Marka", } --- Airbases of the Mariana Islands map: From cbcc893ce5448885818c2bd43fd8d998ef7a7535 Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Sun, 15 Jun 2025 17:01:58 +0200 Subject: [PATCH 09/11] #CTLD - avoid smoking runways on airbase zones --- Moose Development/Moose/Ops/CTLD.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Ops/CTLD.lua b/Moose Development/Moose/Ops/CTLD.lua index 5b2ecc4ef..78bf8a4fc 100644 --- a/Moose Development/Moose/Ops/CTLD.lua +++ b/Moose Development/Moose/Ops/CTLD.lua @@ -1414,7 +1414,7 @@ CTLD.FixedWingTypes = { --- CTLD class version. -- @field #string version -CTLD.version="1.3.34" +CTLD.version="1.3.35" --- Instantiate a new CTLD. -- @param #CTLD self @@ -5971,16 +5971,22 @@ function CTLD:SmokeZoneNearBy(Unit, Flare) for index,cargozone in pairs(zones[i]) do local CZone = cargozone --#CTLD.CargoZone local zonename = CZone.name - local zone = nil + local zone = nil -- Core.Zone#ZONE_RADIUS + local airbasezone = false if i == 4 then zone = UNIT:FindByName(zonename) else zone = ZONE:FindByName(zonename) if not zone then zone = AIRBASE:FindByName(zonename):GetZone() + airbasezone = true end end local zonecoord = zone:GetCoordinate() + -- Avoid smoke/flares on runways + if (i==1 or 1==3) and airbasezone==true and zone:IsInstanceOf("ZONE_BASE") then + zonecoord = zone:GetRandomCoordinate(inner,outer,{land.SurfaceType.LAND}) + end if zonecoord then local active = CZone.active local color = CZone.color From eb2c6ac6f2f4123265127eefba68e6fdae5b1205 Mon Sep 17 00:00:00 2001 From: Thomas <72444570+Applevangelist@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:19:50 +0200 Subject: [PATCH 10/11] Update SRS.lua #MSRS Voice mapping correction --- Moose Development/Moose/Sound/SRS.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Moose Development/Moose/Sound/SRS.lua b/Moose Development/Moose/Sound/SRS.lua index c2e9cf152..526094f5a 100644 --- a/Moose Development/Moose/Sound/SRS.lua +++ b/Moose Development/Moose/Sound/SRS.lua @@ -513,7 +513,7 @@ MSRS.Voices = { ["en_GB_Wavenet_F"] = 'en-GB-Wavenet-N', -- [13] FEMALE ["en_GB_Wavenet_O"] = 'en-GB-Wavenet-O', -- [12] MALE ["en_GB_Wavenet_N"] = 'en-GB-Wavenet-N', -- [13] FEMALE - ["en_US_Wavenet_A"] = 'en-US-Wavenet-N', -- [14] MALE + ["en_US_Wavenet_A"] = 'en-US-Wavenet-A', -- [14] MALE ["en_US_Wavenet_B"] = 'en-US-Wavenet-B', -- [15] MALE ["en_US_Wavenet_C"] = 'en-US-Wavenet-C', -- [16] FEMALE ["en_US_Wavenet_D"] = 'en-US-Wavenet-D', -- [17] MALE From 8ec86973c66a37871dde49f90ddc38d0989b52a2 Mon Sep 17 00:00:00 2001 From: Thomas <72444570+Applevangelist@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:29:34 +0200 Subject: [PATCH 11/11] Update SpawnStatic.lua Fix SpawnFromZone() --- Moose Development/Moose/Core/SpawnStatic.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Core/SpawnStatic.lua b/Moose Development/Moose/Core/SpawnStatic.lua index f603450d7..38f3b0f87 100644 --- a/Moose Development/Moose/Core/SpawnStatic.lua +++ b/Moose Development/Moose/Core/SpawnStatic.lua @@ -459,8 +459,9 @@ end function SPAWNSTATIC:SpawnFromZone(Zone, Heading, NewName) -- Spawn the new static at the center of the zone. - local Static = self:SpawnFromPointVec2( Zone:GetPointVec2(), Heading, NewName ) - + --local Static = self:SpawnFromPointVec2( Zone:GetPointVec2(), Heading, NewName ) + local Static = self:SpawnFromCoordinate(Zone:GetCoordinate(), Heading, NewName) + return Static end