mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
Merge branch 'FF/Ops' into FF/OpsDev
This commit is contained in:
@@ -27,11 +27,11 @@
|
||||
-- **Supported Carriers:**
|
||||
--
|
||||
-- * [USS John C. Stennis](https://en.wikipedia.org/wiki/USS_John_C._Stennis) (CVN-74)
|
||||
-- * [USS Theodore Roosevelt](https://en.wikipedia.org/wiki/USS_Theodore_Roosevelt_(CVN-71)) (CVN-71) [Super Carrier Module]
|
||||
-- * [USS Abraham Lincoln](https://en.wikipedia.org/wiki/USS_Abraham_Lincoln_(CVN-72)) (CVN-72) [Super Carrier Module]
|
||||
-- * [USS George Washington](https://en.wikipedia.org/wiki/USS_George_Washington_(CVN-73)) (CVN-73) [Super Carrier Module]
|
||||
-- * [USS Harry S. Truman](https://en.wikipedia.org/wiki/USS_Harry_S._Truman) (CVN-75) [Super Carrier Module]
|
||||
-- * [USS Forrestal](https://en.wikipedia.org/wiki/USS_Forrestal_(CV-59)) (CV-59) [Heatblur Carrier Module]
|
||||
-- * [USS Theodore Roosevelt](https://en.wikipedia.org/wiki/USS_Theodore_Roosevelt_(CVN-71)) (CVN-71) [Super Carrier Module]
|
||||
-- * [USS Abraham Lincoln](https://en.wikipedia.org/wiki/USS_Abraham_Lincoln_(CVN-72)) (CVN-72) [Super Carrier Module]
|
||||
-- * [USS George Washington](https://en.wikipedia.org/wiki/USS_George_Washington_(CVN-73)) (CVN-73) [Super Carrier Module]
|
||||
-- * [USS Harry S. Truman](https://en.wikipedia.org/wiki/USS_Harry_S._Truman) (CVN-75) [Super Carrier Module]
|
||||
-- * [USS Forrestal](https://en.wikipedia.org/wiki/USS_Forrestal_(CV-59)) (CV-59) [Heatblur Carrier Module]
|
||||
-- * [USS Tarawa](https://en.wikipedia.org/wiki/USS_Tarawa_(LHA-1)) (LHA-1) [**WIP**]
|
||||
-- * [USS America](https://en.wikipedia.org/wiki/USS_America_(LHA-6)) (LHA-6) [**WIP**]
|
||||
-- * [Juan Carlos I](https://en.wikipedia.org/wiki/Spanish_amphibious_assault_ship_Juan_Carlos_I) (L61) [**WIP**]
|
||||
@@ -51,7 +51,7 @@
|
||||
--
|
||||
-- At the moment, optimized parameters are available for the F/A-18C Hornet (Lot 20) and A-4E community mod as aircraft and the USS John C. Stennis as carrier.
|
||||
--
|
||||
-- The AV-8B Harrier, the USS Tarawa, USS America and Juan Carlos I are WIP. The AV-8B harrier and the LHA's and LHD can only be used together, i.e. these ships are the only carriers the harrier is supposed to land on and
|
||||
-- The AV-8B Harrier, the USS Tarawa, USS America, HMAS Canberra and Juan Carlos I are WIP. The AV-8B harrier and the LHA's and LHD can only be used together, i.e. these ships are the only carriers the harrier is supposed to land on and
|
||||
-- no other fixed wing aircraft (human or AI controlled) are supposed to land on these ships. Currently only Case I is supported. Case II/III take slightly different steps from the CVN carrier.
|
||||
-- However, the two Case II/III pattern are very similar so this is not a big drawback.
|
||||
--
|
||||
@@ -108,9 +108,10 @@
|
||||
-- * [DCS: F/A-18C Hornet – Episode 16: CASE III Introduction](https://www.youtube.com/watch?v=DvlMHnLjbDQ)
|
||||
-- * [DCS: F/A-18C Hornet Case I Carrier Landing Training Lesson Recording](https://www.youtube.com/watch?v=D33uM9q4xgA)
|
||||
--
|
||||
-- ### AV-8B Harrier at USS Tarawa
|
||||
-- ### AV-8B Harrier and V/STOL Operations:
|
||||
--
|
||||
-- * [Harrier Ship Landing Mission with Auto LSO!](https://www.youtube.com/watch?v=lqmVvpunk2c)
|
||||
-- * [Updated Airboss V/STOL Features USS Tarawa](https://youtu.be/K7I4pU6j718)
|
||||
-- * [Harrier Practice pattern USS America](https://youtu.be/99NigITYmcI)
|
||||
--
|
||||
-- ===
|
||||
@@ -300,7 +301,7 @@
|
||||
--
|
||||
-- Once the aircraft reaches the Initial, the landing pattern begins. The important steps of the pattern are shown in the image above.
|
||||
-- The AV-8B Harrier pattern is very similar, the only differences are as there is no angled deck there is no wake check. from the ninety you wil fly a straight approach offset 26 ft to port (left) of the tram line.
|
||||
-- The aim is to arrive abeam the landing spot in a stable hover at 120 ft with forward speed matched to the boat. From there the LSO will call "cleared to land". You then level cross to the tram line at the designated landing spot at land vertcally.
|
||||
-- The aim is to arrive abeam the landing spot in a stable hover at 120 ft with forward speed matched to the boat. From there the LSO will call "cleared to land". You then level cross to the tram line at the designated landing spot at land vertcally. When you stabalise over the landing spot LSO will call Stabalise to indicate you are centered at the correct spot.
|
||||
--
|
||||
--
|
||||
-- ## CASE III
|
||||
@@ -634,12 +635,12 @@
|
||||
--
|
||||
-- Furthermore, we have the cases:
|
||||
--
|
||||
-- * 2.5 Points **B**: "Bolder", when the player landed but did not catch a wire.
|
||||
-- * 2.5 Points **B**: "Bolter", when the player landed but did not catch a wire.
|
||||
-- * 2.0 Points **WOP**: "Pattern Wave-Off", when pilot was far away from where he should be in the pattern.
|
||||
-- * 2.0 Points **OWO**: "Own Wave-Off**, when pilot flies past the deck without touching it.
|
||||
-- * 1.0 Points **WO**: "Technique Wave-Off": Player got waved off in the final parts of the groove.
|
||||
-- * 1.0 Points **LIG**: "Long In the Groove", when pilot extents the downwind leg too far and screws up the timing for the following aircraft.
|
||||
-- * 0.0 Points **CUT**: "Cut pass", when player was waved off but landed anyway.
|
||||
-- * 0.0 Points **CUT**: "Cut pass", when player was waved off but landed anyway. In addition if a V/STOL lands without having been Cleared to Land.
|
||||
--
|
||||
-- ## Foul Deck Waveoff
|
||||
--
|
||||
@@ -1298,9 +1299,10 @@ AIRBOSS.AircraftCarrier={
|
||||
-- @field #string TRUMAN USS Harry S. Truman (CVN-75) [Super Carrier Module]
|
||||
-- @field #string FORRESTAL USS Forrestal (CV-59) [Heatblur Carrier Module]
|
||||
-- @field #string VINSON USS Carl Vinson (CVN-70) [Obsolete]
|
||||
-- @field #string TARAWA USS Tarawa (LHA-1)
|
||||
-- @field #string AMERICA USS America (LHA-6)
|
||||
-- @field #string JCARLOS Juan Carlos I (L61)
|
||||
-- @field #string TARAWA USS Tarawa (LHA-1) [V/STOL Carrier]
|
||||
-- @field #string AMERICA USS America (LHA-6) [V/STOL Carrier]
|
||||
-- @field #string JCARLOS Juan Carlos I (L61) [V/STOL Carrier]
|
||||
-- @field #string HMAS Canberra (L02) [V/STOL Carrier]
|
||||
-- @field #string KUZNETSOV Admiral Kuznetsov (CV 1143.5)
|
||||
AIRBOSS.CarrierType={
|
||||
ROOSEVELT="CVN_71",
|
||||
@@ -1313,6 +1315,7 @@ AIRBOSS.CarrierType={
|
||||
TARAWA="LHA_Tarawa",
|
||||
AMERICA="USS America LHA-6",
|
||||
JCARLOS="L61",
|
||||
CANBERRA="L02",
|
||||
KUZNETSOV="KUZNECOW",
|
||||
}
|
||||
|
||||
@@ -1726,7 +1729,7 @@ AIRBOSS.MenuF10Root=nil
|
||||
|
||||
--- Airboss class version.
|
||||
-- @field #string version
|
||||
AIRBOSS.version="1.2.0"
|
||||
AIRBOSS.version="1.2.1"
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- TODO list
|
||||
@@ -1991,6 +1994,9 @@ function AIRBOSS:New(carriername, alias)
|
||||
elseif self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
-- Use Juan Carlos parameters.
|
||||
self:_InitJcarlos()
|
||||
elseif self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
-- Use Juan Carlos parameters at this stage --TODO Check primary Landing spot.
|
||||
self:_InitJcarlos()
|
||||
elseif self.carriertype==AIRBOSS.CarrierType.KUZNETSOV then
|
||||
-- Kusnetsov parameters - maybe...
|
||||
self:_InitStennis()
|
||||
@@ -2028,10 +2034,10 @@ function AIRBOSS:New(carriername, alias)
|
||||
self:_GetZonePlatform(case):SmokeZone(SMOKECOLOR.Blue, 45)
|
||||
self:_GetZoneCorridor(case):SmokeZone(SMOKECOLOR.Green, 45)
|
||||
self:_GetZoneHolding(case, 1):SmokeZone(SMOKECOLOR.White, 45)
|
||||
self:_GetZoneHolding(case, 2):SmokeZone(SMOKECOLOR.White, 45)
|
||||
self:_GetZoneHolding(case, 2):SmokeZone(SMOKECOLOR.White, 45)
|
||||
self:_GetZoneInitial(case):SmokeZone(SMOKECOLOR.Orange, 45)
|
||||
self:_GetZoneCommence(case, 1):SmokeZone(SMOKECOLOR.Red, 45)
|
||||
self:_GetZoneCommence(case, 2):SmokeZone(SMOKECOLOR.Red, 45)
|
||||
self:_GetZoneCommence(case, 2):SmokeZone(SMOKECOLOR.Red, 45)
|
||||
self:_GetZoneAbeamLandingSpot():SmokeZone(SMOKECOLOR.Red, 5)
|
||||
self:_GetZoneLandingSpot():SmokeZone(SMOKECOLOR.Red, 5)
|
||||
end
|
||||
@@ -2082,7 +2088,7 @@ function AIRBOSS:New(carriername, alias)
|
||||
|
||||
|
||||
-- Carrier specific.
|
||||
if self.carrier:GetTypeName()~=AIRBOSS.CarrierType.TARAWA or self.carrier:GetTypeName()~=AIRBOSS.CarrierType.AMERICA or self.carrier:GetTypeName()~=AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carrier:GetTypeName()~=AIRBOSS.CarrierType.TARAWA or self.carrier:GetTypeName()~=AIRBOSS.CarrierType.AMERICA or self.carrier:GetTypeName()~=AIRBOSS.CarrierType.JCARLOS or self.carrier:GetTypeName()~=AIRBOSS.CarrierType.CANBERRA then
|
||||
|
||||
-- Flare wires.
|
||||
local w1=stern:Translate(self.carrierparam.wire1, FB, true)
|
||||
@@ -4407,10 +4413,10 @@ function AIRBOSS:_InitForrestal()
|
||||
self.carrierparam.rwywidth = 25
|
||||
|
||||
-- Wires.
|
||||
self.carrierparam.wire1 = 42 -- Distance from stern to first wire.
|
||||
self.carrierparam.wire2 = 51.5
|
||||
self.carrierparam.wire3 = 62
|
||||
self.carrierparam.wire4 = 72.5
|
||||
self.carrierparam.wire1 = 44 -- Distance from stern to first wire. Original from Frank - 42
|
||||
self.carrierparam.wire2 = 54 --51.5
|
||||
self.carrierparam.wire3 = 64 --62
|
||||
self.carrierparam.wire4 = 74 --72.5
|
||||
|
||||
end
|
||||
|
||||
@@ -5015,7 +5021,7 @@ function AIRBOSS:_InitVoiceOvers()
|
||||
duration=2.0,
|
||||
subduration=5,
|
||||
},
|
||||
EXPECTSPOT5={
|
||||
EXPECTSPOT5={
|
||||
file="LSO-ExpectSpot5",
|
||||
suffix="ogg",
|
||||
loud=false,
|
||||
@@ -5854,8 +5860,8 @@ function AIRBOSS:_GetAircraftParameters(playerData, step)
|
||||
elseif skyhawk then
|
||||
alt=UTILS.FeetToMeters(600)
|
||||
speed=UTILS.KnotsToMps(250)
|
||||
elseif goshawk then
|
||||
alt=UTILS.FeetToMeters(800)
|
||||
elseif goshawk then
|
||||
alt=UTILS.FeetToMeters(800)
|
||||
speed=UTILS.KnotsToMps(300)
|
||||
end
|
||||
|
||||
@@ -5867,8 +5873,8 @@ function AIRBOSS:_GetAircraftParameters(playerData, step)
|
||||
elseif skyhawk then
|
||||
alt=UTILS.FeetToMeters(600)
|
||||
speed=UTILS.KnotsToMps(250)
|
||||
elseif goshawk then
|
||||
alt=UTILS.FeetToMeters(800)
|
||||
elseif goshawk then
|
||||
alt=UTILS.FeetToMeters(800)
|
||||
speed=UTILS.KnotsToMps(300)
|
||||
end
|
||||
|
||||
@@ -5905,7 +5911,7 @@ function AIRBOSS:_GetAircraftParameters(playerData, step)
|
||||
dist=UTILS.NMToMeters(1.2)
|
||||
end
|
||||
|
||||
if goshawk then
|
||||
if goshawk then
|
||||
-- 0.9 to 1.1 NM per natops ch.4 page 48
|
||||
dist=UTILS.NMToMeters(0.9)
|
||||
else
|
||||
@@ -5916,7 +5922,7 @@ function AIRBOSS:_GetAircraftParameters(playerData, step)
|
||||
|
||||
if hornet or tomcat then
|
||||
alt=UTILS.FeetToMeters(500)
|
||||
elseif goshawk then
|
||||
elseif goshawk then
|
||||
alt=UTILS.FeetToMeters(450)
|
||||
elseif skyhawk then
|
||||
alt=UTILS.FeetToMeters(500)
|
||||
@@ -6420,8 +6426,8 @@ function AIRBOSS:_MarshalPlayer(playerData, stack)
|
||||
-- Set stack flag.
|
||||
flight.flag=stack
|
||||
|
||||
-- Trigger Marshal event.
|
||||
self:Marshal(flight)
|
||||
-- Trigger Marshal event.
|
||||
self:Marshal(flight)
|
||||
end
|
||||
|
||||
else
|
||||
@@ -6891,7 +6897,7 @@ function AIRBOSS:_GetMarshalAltitude(stack, case)
|
||||
p2=Carrier:Translate(UTILS.NMToMeters(1.5), hdg)
|
||||
|
||||
-- Tarawa,LHA,LHD Delta patterns.
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
|
||||
-- Pattern is directly overhead the carrier.
|
||||
p1=Carrier:Translate(UTILS.NMToMeters(1.0), hdg+90)
|
||||
@@ -7719,6 +7725,8 @@ function AIRBOSS:_InitPlayer(playerData, step)
|
||||
playerData.wofd=false
|
||||
playerData.owo=false
|
||||
playerData.boltered=false
|
||||
playerData.hover=false
|
||||
playerData.stable=false
|
||||
playerData.landed=false
|
||||
playerData.Tlso=timer.getTime()
|
||||
playerData.Tgroove=nil
|
||||
@@ -8736,7 +8744,7 @@ function AIRBOSS:OnEventLand(EventData)
|
||||
self:T(self.lid..text)
|
||||
|
||||
-- Check carrier type.
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
|
||||
-- Power "Idle".
|
||||
self:RadioTransmission(self.LSORadio, self.LSOCall.IDLE, false, 1, nil, true)
|
||||
@@ -8771,7 +8779,7 @@ function AIRBOSS:OnEventLand(EventData)
|
||||
-- AI unit landed --
|
||||
--------------------
|
||||
|
||||
if self.carriertype~=AIRBOSS.CarrierType.TARAWA or self.carriertype~=AIRBOSS.CarrierType.AMERICA or self.carriertype~=AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype~=AIRBOSS.CarrierType.TARAWA or self.carriertype~=AIRBOSS.CarrierType.AMERICA or self.carriertype~=AIRBOSS.CarrierType.JCARLOS or self.carriertype~=AIRBOSS.CarrierType.CANBERRA then
|
||||
|
||||
-- Coordinate at landing event
|
||||
local coord=EventData.IniUnit:GetCoordinate()
|
||||
@@ -9679,7 +9687,9 @@ function AIRBOSS:_Bullseye(playerData)
|
||||
self:_PlayerHint(playerData)
|
||||
|
||||
-- LSO expect spot 5 or 7.5 call
|
||||
if playerData.actype==AIRBOSS.AircraftCarrier.AV8B and self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if playerData.actype==AIRBOSS.AircraftCarrier.AV8B and self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
self:RadioTransmission(self.LSORadio, self.LSOCall.EXPECTSPOT5, nil, nil, nil, true)
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
self:RadioTransmission(self.LSORadio, self.LSOCall.EXPECTSPOT5, nil, nil, nil, true)
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B then
|
||||
self:RadioTransmission(self.LSORadio, self.LSOCall.EXPECTSPOT75, nil, nil, nil, true)
|
||||
@@ -9818,7 +9828,7 @@ function AIRBOSS:_CheckForLongDownwind(playerData)
|
||||
local limit=UTILS.NMToMeters(-1.6)
|
||||
|
||||
-- For the tarawa, other LHA and LHD we give a bit more space.
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
limit=UTILS.NMToMeters(-2.0)
|
||||
end
|
||||
|
||||
@@ -9864,9 +9874,11 @@ function AIRBOSS:_Abeam(playerData)
|
||||
self:RadioTransmission(self.LSORadio, self.LSOCall.PADDLESCONTACT, nil, nil, nil, true)
|
||||
|
||||
-- LSO expect spot 5 or 7.5 call
|
||||
if playerData.actype==AIRBOSS.AircraftCarrier.AV8B and self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if playerData.actype==AIRBOSS.AircraftCarrier.AV8B and self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
self:RadioTransmission(self.LSORadio, self.LSOCall.EXPECTSPOT5, false, 5, nil, true)
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B then
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
self:RadioTransmission(self.LSORadio, self.LSOCall.EXPECTSPOT5, false, 5, nil, true)
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B then
|
||||
self:RadioTransmission(self.LSORadio, self.LSOCall.EXPECTSPOT75, false, 5, nil, true)
|
||||
end
|
||||
|
||||
@@ -9903,7 +9915,7 @@ function AIRBOSS:_Ninety(playerData)
|
||||
self:_PlayerHint(playerData)
|
||||
|
||||
-- Next step: wake.
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
-- Harrier has no wake stop. It stays port of the boat.
|
||||
self:_SetPlayerStep(playerData, AIRBOSS.PatternStep.FINAL)
|
||||
else
|
||||
@@ -10160,8 +10172,8 @@ function AIRBOSS:_Groove(playerData)
|
||||
-- Speed difference.
|
||||
local dv=math.abs(vplayer-vcarrier)
|
||||
|
||||
-- Stable when speed difference < 10 km/h.
|
||||
local stable=dv<10
|
||||
-- Stable when speed difference < 20 km/h.
|
||||
local stable=dv<20
|
||||
|
||||
-- Check if player is inside the zone.
|
||||
if playerData.unit:IsInZone(ZoneALS) and stable then
|
||||
@@ -10171,6 +10183,9 @@ function AIRBOSS:_Groove(playerData)
|
||||
|
||||
-- Next step: Level cross.
|
||||
self:_SetPlayerStep(playerData, AIRBOSS.PatternStep.GROOVE_LC)
|
||||
-- Set Stable Hover
|
||||
playerData.stable=true
|
||||
playerData.hover=true
|
||||
end
|
||||
|
||||
elseif rho<=RAR and playerData.step==AIRBOSS.PatternStep.GROOVE_LC then
|
||||
@@ -10190,13 +10205,14 @@ function AIRBOSS:_Groove(playerData)
|
||||
-- Speed difference.
|
||||
local dv=math.abs(vplayer-vcarrier)
|
||||
|
||||
-- Stable when v<7.5 km/h.
|
||||
local stable=dv<7.5
|
||||
-- Stable when v<10 km/h.
|
||||
local stable=dv<10
|
||||
|
||||
-- Radio Transmission "Cleared to land" once the aircraft is inside the zone.
|
||||
if playerData.unit:IsInZone(ZoneLS) and stable and playerData.warning==false then
|
||||
self:RadioTransmission(self.LSORadio, self.LSOCall.STABILIZED, nil, nil, nil, true)
|
||||
playerData.warning=true
|
||||
-- Radio Transmission "Stabilized" once the aircraft has been cleared to cross and is over the Landing Spot and stable.
|
||||
if playerData.unit:IsInZone(ZoneLS) and stable and playerData.stable==true then
|
||||
self:RadioTransmission(self.LSORadio, self.LSOCall.STABILIZED, nil, nil, nil, false)
|
||||
playerData.stable=false
|
||||
playerData.warning=true
|
||||
end
|
||||
|
||||
-- We keep it in this step until landed.
|
||||
@@ -10229,8 +10245,25 @@ function AIRBOSS:_Groove(playerData)
|
||||
-- Nothing else necessary.
|
||||
return
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
-- Long V/STOL groove time Wave Off over 75 seconds to IC - TOPGUN level Only. --pene testing (WIP)
|
||||
|
||||
--if rho>=RAR and rho<=RIC and not playerData.waveoff and playerData.difficulty==AIRBOSS.Difficulty.HARD and playerData.actype== AIRBOSS.AircraftCarrier.AV8B then
|
||||
-- Get groove time
|
||||
--local vSlow=groovedata.time
|
||||
-- If too slow wave off.
|
||||
--if vSlow >75 then
|
||||
|
||||
-- LSO Wave off!
|
||||
--self:RadioTransmission(self.LSORadio, self.LSOCall.WAVEOFF, nil, nil, nil, true)
|
||||
--playerData.Tlso=timer.getTime()
|
||||
|
||||
-- Player was waved Off
|
||||
--playerData.waveoff=true
|
||||
--return
|
||||
--end
|
||||
--end
|
||||
|
||||
-- Groovedata step.
|
||||
groovedata.Step=playerData.step
|
||||
@@ -10254,25 +10287,25 @@ function AIRBOSS:_Groove(playerData)
|
||||
-- Distance in NM.
|
||||
local d=UTILS.MetersToNM(rho)
|
||||
|
||||
-- Drift on lineup.
|
||||
if rho>=RAR and rho<=RIM then
|
||||
if gd.LUE>0.22 and lineupError<-0.22 then
|
||||
env.info" Drift Right across centre ==> DR-"
|
||||
gd.Drift=" DR"
|
||||
self:T(self.lid..string.format("Got Drift Right across centre step %s, d=%.3f: Max LUE=%.3f, lower LUE=%.3f", gs, d, gd.LUE, lineupError))
|
||||
elseif gd.LUE<-0.22 and lineupError>0.22 then
|
||||
env.info" Drift Left ==> DL-"
|
||||
gd.Drift=" DL"
|
||||
self:T(self.lid..string.format("Got Drift Left across centre at step %s, d=%.3f: Min LUE=%.3f, lower LUE=%.3f", gs, d, gd.LUE, lineupError))
|
||||
elseif gd.LUE>0.13 and lineupError<-0.14 then
|
||||
env.info" Little Drift Right across centre ==> (DR-)"
|
||||
gd.Drift=" (DR)"
|
||||
self:T(self.lid..string.format("Got Little Drift Right across centre at step %s, d=%.3f: Max LUE=%.3f, lower LUE=%.3f", gs, d, gd.LUE, lineupError))
|
||||
elseif gd.LUE<-0.13 and lineupError>0.14 then
|
||||
env.info" Little Drift Left across centre ==> (DL-)"
|
||||
gd.Drift=" (DL)"
|
||||
self:E(self.lid..string.format("Got Little Drift Left across centre at step %s, d=%.3f: Min LUE=%.3f, lower LUE=%.3f", gs, d, gd.LUE, lineupError))
|
||||
end
|
||||
-- Drift on lineup.
|
||||
if rho>=RAR and rho<=RIM then
|
||||
if gd.LUE>0.22 and lineupError<-0.22 then
|
||||
env.info" Drift Right across centre ==> DR-"
|
||||
gd.Drift=" DR"
|
||||
self:T(self.lid..string.format("Got Drift Right across centre step %s, d=%.3f: Max LUE=%.3f, lower LUE=%.3f", gs, d, gd.LUE, lineupError))
|
||||
elseif gd.LUE<-0.22 and lineupError>0.22 then
|
||||
env.info" Drift Left ==> DL-"
|
||||
gd.Drift=" DL"
|
||||
self:T(self.lid..string.format("Got Drift Left across centre at step %s, d=%.3f: Min LUE=%.3f, lower LUE=%.3f", gs, d, gd.LUE, lineupError))
|
||||
elseif gd.LUE>0.13 and lineupError<-0.14 then
|
||||
env.info" Little Drift Right across centre ==> (DR-)"
|
||||
gd.Drift=" (DR)"
|
||||
self:T(self.lid..string.format("Got Little Drift Right across centre at step %s, d=%.3f: Max LUE=%.3f, lower LUE=%.3f", gs, d, gd.LUE, lineupError))
|
||||
elseif gd.LUE<-0.13 and lineupError>0.14 then
|
||||
env.info" Little Drift Left across centre ==> (DL-)"
|
||||
gd.Drift=" (DL)"
|
||||
self:E(self.lid..string.format("Got Little Drift Left across centre at step %s, d=%.3f: Min LUE=%.3f, lower LUE=%.3f", gs, d, gd.LUE, lineupError))
|
||||
end
|
||||
end
|
||||
|
||||
-- Update max deviation of line up error.
|
||||
@@ -10400,11 +10433,10 @@ function AIRBOSS:_CheckWaveOff(glideslopeError, lineupError, AoA, playerData)
|
||||
|
||||
-- For the harrier, we allow a bit more room.
|
||||
if playerData.actype==AIRBOSS.AircraftCarrier.AV8B then
|
||||
glMax= 4.0
|
||||
glMin=-3.0
|
||||
luAbs= 5.0
|
||||
-- No waveoff for harrier pilots at the moment.
|
||||
return false
|
||||
glMax= 2.6
|
||||
glMin=-2.0
|
||||
luAbs= 4.1 -- Testing Pene (WIP) needs feedback to tighten up tolerences.
|
||||
|
||||
end
|
||||
|
||||
-- Too high or too low?
|
||||
@@ -10428,9 +10460,10 @@ function AIRBOSS:_CheckWaveOff(glideslopeError, lineupError, AoA, playerData)
|
||||
waveoff=true
|
||||
end
|
||||
|
||||
-- Too slow or too fast? Only for pros.
|
||||
if playerData.difficulty==AIRBOSS.Difficulty.HARD then
|
||||
-- Get aircraft specific AoA values
|
||||
-- Too slow or too fast? Only for pros.
|
||||
|
||||
if playerData.difficulty==AIRBOSS.Difficulty.HARD and playerData.actype~=AIRBOSS.AircraftCarrier.AV8B then
|
||||
-- Get aircraft specific AoA values. Not for AV-8B due to transition to Stable Hover.
|
||||
local aoaac=self:_GetAircraftAoA(playerData)
|
||||
-- Check too slow or too fast.
|
||||
if AoA<aoaac.FAST then
|
||||
@@ -10443,6 +10476,7 @@ function AIRBOSS:_CheckWaveOff(glideslopeError, lineupError, AoA, playerData)
|
||||
self:T(self.lid..string.format("%s: %s", playerData.name, text))
|
||||
self:_AddToDebrief(playerData, text)
|
||||
waveoff=true
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -10577,7 +10611,7 @@ function AIRBOSS:_GetSternCoord()
|
||||
--local stern=self:GetCoordinate()
|
||||
|
||||
-- Stern coordinate (sterndist<0).
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
-- Tarawa: Translate 8 meters port.
|
||||
self.sterncoord:Translate(self.carrierparam.sterndist, hdg, true, true):Translate(8, FB-90, true, true)
|
||||
elseif self.carriertype==AIRBOSS.CarrierType.STENNIS then
|
||||
@@ -10621,7 +10655,7 @@ function AIRBOSS:_GetWire(Lcoord, dc)
|
||||
|
||||
-- Multiplayer wire correction.
|
||||
if self.mpWireCorrection then
|
||||
d=d-self.mpWireCorrection
|
||||
d=d-self.mpWireCorrection
|
||||
end
|
||||
|
||||
-- Shift wires from stern to their correct position.
|
||||
@@ -10714,7 +10748,7 @@ function AIRBOSS:_Trapped(playerData)
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.A4EC then
|
||||
-- A-4E gets slowed down much faster the the F/A-18C!
|
||||
dcorr=56
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.T45C then
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.T45C then
|
||||
-- T-45 also gets slowed down much faster the the F/A-18C.
|
||||
dcorr=56
|
||||
end
|
||||
@@ -11218,7 +11252,8 @@ function AIRBOSS:_GetZoneRunwayBox()
|
||||
end
|
||||
|
||||
|
||||
--- Get zone of primary abeam landing position of USS Tarawa. Box length and width 30 meters.
|
||||
--- Get zone of primary abeam landing position of USS Tarawa, USS America and Juan Carlos. Box length 50 meters and width 30 meters.
|
||||
--- Allow for Clear to land call from LSO approaching abeam the landing spot if stable as per NATOPS 00-80T
|
||||
-- @param #AIRBOSS self
|
||||
-- @return Core.Zone#ZONE_POLYGON Zone surrounding landing runway.
|
||||
function AIRBOSS:_GetZoneAbeamLandingSpot()
|
||||
@@ -11234,8 +11269,8 @@ function AIRBOSS:_GetZoneAbeamLandingSpot()
|
||||
|
||||
-- Points.
|
||||
p[1]=S:Translate( 15, FB):Translate(15, FB+90) -- Top-Right
|
||||
p[2]=S:Translate(-15, FB):Translate(15, FB+90) -- Bottom-Right
|
||||
p[3]=S:Translate(-15, FB):Translate(15, FB-90) -- Bottom-Left
|
||||
p[2]=S:Translate(-45, FB):Translate(15, FB+90) -- Bottom-Right
|
||||
p[3]=S:Translate(-45, FB):Translate(15, FB-90) -- Bottom-Left
|
||||
p[4]=S:Translate( 15, FB):Translate(15, FB-90) -- Top-Left
|
||||
|
||||
-- Convert to vec2.
|
||||
@@ -11323,7 +11358,7 @@ function AIRBOSS:_GetZoneHolding(case, stack)
|
||||
self.zoneHolding=ZONE_RADIUS:New("CASE I Holding Zone", Post:GetVec2(), self.marshalradius)
|
||||
|
||||
-- Delta pattern.
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
self.zoneHolding=ZONE_RADIUS:New("CASE I Holding Zone", self.carrier:GetVec2(), UTILS.NMToMeters(5))
|
||||
end
|
||||
|
||||
@@ -11345,7 +11380,7 @@ function AIRBOSS:_GetZoneHolding(case, stack)
|
||||
-- So stay 0-5 NM (+1 NM error margin) port of carrier.
|
||||
self.zoneHolding=self.zoneHolding or ZONE_POLYGON_BASE:New("CASE II/III Holding Zone")
|
||||
|
||||
self.zoneHolding:UpdateFromVec2(p)
|
||||
self.zoneHolding:UpdateFromVec2(p)
|
||||
end
|
||||
|
||||
return self.zoneHolding
|
||||
@@ -11376,7 +11411,7 @@ function AIRBOSS:_GetZoneCommence(case, stack)
|
||||
-- Three position
|
||||
local Three=self:GetCoordinate():Translate(D, hdg+275)
|
||||
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
|
||||
local Dx=UTILS.NMToMeters(2.25)
|
||||
|
||||
@@ -11391,12 +11426,12 @@ function AIRBOSS:_GetZoneCommence(case, stack)
|
||||
-- Create holding zone.
|
||||
self.zoneCommence=self.zoneCommence or ZONE_RADIUS:New("CASE I Commence Zone")
|
||||
|
||||
self.zoneCommence:UpdateFromVec2(Three:GetVec2(), R)
|
||||
self.zoneCommence:UpdateFromVec2(Three:GetVec2(), R)
|
||||
|
||||
else
|
||||
-- Case II/III
|
||||
|
||||
stack=stack or 1
|
||||
stack=stack or 1
|
||||
|
||||
-- Start point at 21 NM for stack=1.
|
||||
local l=20+stack
|
||||
@@ -11424,7 +11459,7 @@ function AIRBOSS:_GetZoneCommence(case, stack)
|
||||
-- Zone polygon.
|
||||
self.zoneCommence=self.zoneCommence or ZONE_POLYGON_BASE:New("CASE II/III Commence Zone")
|
||||
|
||||
self.zoneCommence:UpdateFromVec2(p)
|
||||
self.zoneCommence:UpdateFromVec2(p)
|
||||
|
||||
end
|
||||
|
||||
@@ -11684,7 +11719,7 @@ function AIRBOSS:_GetOptLandingCoordinate()
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA then
|
||||
|
||||
-- Landing 100 ft abeam, 120 ft alt.
|
||||
self.landingcoord:UpdateFromCoordinate(self:_GetLandingSpotCoordinate()):Translate(35, FB-90, true, true)
|
||||
self.landingcoord:UpdateFromCoordinate(self:_GetLandingSpotCoordinate()):Translate(35, FB-90, true, true)
|
||||
--stern=self:_GetLandingSpotCoordinate():Translate(35, FB-90)
|
||||
|
||||
-- Alitude 120 ft.
|
||||
@@ -11692,7 +11727,7 @@ function AIRBOSS:_GetOptLandingCoordinate()
|
||||
elseif self.carriertype==AIRBOSS.CarrierType.AMERICA then
|
||||
|
||||
-- Landing 100 ft abeam, 120 ft alt. To allow adjustments to match different deck configurations.
|
||||
self.landingcoord:UpdateFromCoordinate(self:_GetLandingSpotCoordinate()):Translate(35, FB-90, true, true)
|
||||
self.landingcoord:UpdateFromCoordinate(self:_GetLandingSpotCoordinate()):Translate(35, FB-90, true, true)
|
||||
--stern=self:_GetLandingSpotCoordinate():Translate(35, FB-90)
|
||||
|
||||
-- Alitude 120 ft.
|
||||
@@ -11701,12 +11736,21 @@ function AIRBOSS:_GetOptLandingCoordinate()
|
||||
elseif self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
|
||||
-- Landing 100 ft abeam, 120 ft alt.
|
||||
self.landingcoord:UpdateFromCoordinate(self:_GetLandingSpotCoordinate()):Translate(35, FB-100, true, true)
|
||||
--stern=self:_GetLandingSpotCoordinate():Translate(35, FB-100)
|
||||
self.landingcoord:UpdateFromCoordinate(self:_GetLandingSpotCoordinate()):Translate(35, FB-90, true, true)
|
||||
--stern=self:_GetLandingSpotCoordinate():Translate(35, FB-90)
|
||||
|
||||
-- Alitude 120 ft.
|
||||
self.landingcoord:SetAltitude(UTILS.FeetToMeters(120))
|
||||
|
||||
elseif self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
|
||||
-- Landing 100 ft abeam, 120 ft alt.
|
||||
self.landingcoord:UpdateFromCoordinate(self:_GetLandingSpotCoordinate()):Translate(35, FB-90, true, true)
|
||||
--stern=self:_GetLandingSpotCoordinate():Translate(35, FB-90)
|
||||
|
||||
-- Alitude 120 ft.
|
||||
self.landingcoord:SetAltitude(UTILS.FeetToMeters(120))
|
||||
|
||||
else
|
||||
|
||||
-- Ideally we want to land between 2nd and 3rd wire.
|
||||
@@ -11754,9 +11798,16 @@ function AIRBOSS:_GetLandingSpotCoordinate()
|
||||
-- Landing 100 ft abeam, 120 alt.
|
||||
local hdg=self:GetHeading()
|
||||
|
||||
-- Primary landing spot 5.0 -- TODO voice for different landing Spots.
|
||||
-- Primary landing spot 5.0 -- Done voice for different landing Spots.
|
||||
self.landingspotcoord:Translate(89, hdg, true, true):SetAltitude(self.carrierparam.deckheight)
|
||||
|
||||
elseif self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
|
||||
-- Landing 100 ft abeam, 120 alt.
|
||||
local hdg=self:GetHeading()
|
||||
|
||||
-- Primary landing spot 5.0 -- Done voice for different landing Spots.
|
||||
self.landingspotcoord:Translate(89, hdg, true, true):SetAltitude(self.carrierparam.deckheight)
|
||||
end
|
||||
|
||||
return self.landingspotcoord
|
||||
@@ -12249,10 +12300,14 @@ end
|
||||
--
|
||||
-- If you manage to be between 16.4 and and 16.6 seconds, you will even get and okay underline "\_OK\_".
|
||||
-- No groove time for Harrier on LHA, LHD set to Tgroove Unicorn as starting point to allow possible _OK_ 5.0.
|
||||
--
|
||||
-- If time in the AV-8B
|
||||
--
|
||||
-- * < 90 seconds: OK V/STOL
|
||||
-- * > 91 Seconds: SLOW V/STOL (Early hover stop selection)
|
||||
-- * < 55 seconds: Fast V/STOL
|
||||
-- * < 75 seconds: OK V/STOL
|
||||
-- * > 76 Seconds: SLOW V/STOL (Early hover stop selection)
|
||||
--
|
||||
-- If you manage to be between 60.0 and 65.0 seconds in the AV-8B, you will even get and okay underline "\_OK\_"
|
||||
--
|
||||
-- @param #AIRBOSS self
|
||||
-- @param #AIRBOSS.PlayerData playerData Player data table.
|
||||
@@ -12274,9 +12329,9 @@ function AIRBOSS:_EvalGrooveTime(playerData)
|
||||
-- Time in groove for AV-8B
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and t<55 then -- VSTOL Late Hover stop selection too fast to Abeam LDG Spot AV-8B.
|
||||
grade="FAST V/STOL Groove"
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and t<90 then -- VSTOL Operations with AV-8B.
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and t<75 then -- VSTOL Operations with AV-8B.
|
||||
grade="OK V/STOL Groove"
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and t>=91 then -- VSTOL Early Hover stop selection slow to Abeam LDG Spot AV-8B.
|
||||
elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and t>=76 then -- VSTOL Early Hover stop selection slow to Abeam LDG Spot AV-8B.
|
||||
grade="SLOW V/STOL Groove"
|
||||
else
|
||||
grade="LIG"
|
||||
@@ -12288,7 +12343,7 @@ function AIRBOSS:_EvalGrooveTime(playerData)
|
||||
end
|
||||
|
||||
-- V/STOL Unicorn!
|
||||
if playerData.actype==AIRBOSS.AircraftCarrier.AV8B and (t>=65.0 and t<=75.0) then
|
||||
if playerData.actype==AIRBOSS.AircraftCarrier.AV8B and (t>=60.0 and t<=65.0) then
|
||||
grade="_OK_ V/STOL"
|
||||
end
|
||||
|
||||
@@ -12317,7 +12372,7 @@ function AIRBOSS:_LSOgrade(playerData)
|
||||
-- Put everything together.
|
||||
local G=GXX.." "..GIM.." ".." "..GIC.." "..GAR
|
||||
|
||||
-- Count number of minor, normal and major deviations. TODO - work on Harrier counts due slower approach speed.
|
||||
-- Count number of minor, normal and major deviations.
|
||||
local N=nXX+nIM+nIC+nAR
|
||||
local nL=count(G, '_')/2
|
||||
local nS=count(G, '%(')
|
||||
@@ -12326,7 +12381,7 @@ function AIRBOSS:_LSOgrade(playerData)
|
||||
-- Groove time 15-18.99 sec for a unicorn. Or 65-70 for V/STOL unicorn.
|
||||
local Tgroove=playerData.Tgroove
|
||||
local TgrooveUnicorn=Tgroove and (Tgroove>=15.0 and Tgroove<=18.99) or false
|
||||
local TgrooveVstolUnicorn=Tgroove and (Tgroove>=65.0 and Tgroove<=70.0)and playerData.actype==AIRBOSS.AircraftCarrier.AV8B or false
|
||||
local TgrooveVstolUnicorn=Tgroove and (Tgroove>=60.0 and Tgroove<=65.0)and playerData.actype==AIRBOSS.AircraftCarrier.AV8B or false
|
||||
|
||||
local grade
|
||||
local points
|
||||
@@ -12337,17 +12392,17 @@ function AIRBOSS:_LSOgrade(playerData)
|
||||
G="Unicorn"
|
||||
else
|
||||
|
||||
-- Add AV-8B Harrier devation allowances due to lower groundspeed and 3x conventional groove time, this allows to maintain LSO tolerances while respecting the deviations are not unsafe. (WIP requires feedback)
|
||||
-- Add AV-8B Harrier devation allowances due to lower groundspeed and 3x conventional groove time, this allows to maintain LSO tolerances while respecting the deviations are not unsafe. (WIP requires feedback)
|
||||
-- Large devaitions still result in a No Grade, A Unicorn still requires a clean pass with no deviation.
|
||||
if nL>3 and playerData.actype==AIRBOSS.AircraftCarrier.AV8B then
|
||||
if nL>3 and playerData.actype==AIRBOSS.AircraftCarrier.AV8B then
|
||||
-- Larger deviations ==> "No grade" 2.0 points.
|
||||
grade="--"
|
||||
points=2.0
|
||||
elseif nN>2 and playerData.actype==AIRBOSS.AircraftCarrier.AV8B then
|
||||
elseif nN>2 and playerData.actype==AIRBOSS.AircraftCarrier.AV8B then
|
||||
-- Only average deviations ==> "Fair Pass" Pass with average deviations and corrections.
|
||||
grade="(OK)"
|
||||
points=3.0
|
||||
elseif nL>0 then
|
||||
elseif nL>0 then
|
||||
-- Larger deviations ==> "No grade" 2.0 points.
|
||||
grade="--"
|
||||
points=2.0
|
||||
@@ -12376,7 +12431,7 @@ end
|
||||
text=text.."# of normal deviations = "..nN.."\n"
|
||||
text=text.."# of small deviations ( = "..nS.."\n"
|
||||
self:T2(self.lid..text)
|
||||
|
||||
|
||||
-- Special cases.
|
||||
if playerData.wop then
|
||||
---------------------
|
||||
@@ -12432,8 +12487,18 @@ end
|
||||
-- Bolter
|
||||
grade="-- (BOLTER)"
|
||||
points=2.5
|
||||
end
|
||||
|
||||
|
||||
elseif not playerData.hover and playerData.actype==AIRBOSS.AircraftCarrier.AV8B then
|
||||
-------------------------------
|
||||
-- AV-8B not cleared to land -- -- Landing clearence is carrier from LC to Landing
|
||||
-------------------------------
|
||||
if playerData.landed then
|
||||
-- AIRBOSS wants your balls!
|
||||
grade="CUT"
|
||||
points=0.0
|
||||
end
|
||||
|
||||
end
|
||||
return grade, points, G
|
||||
end
|
||||
|
||||
@@ -12475,29 +12540,29 @@ function AIRBOSS:_Flightdata2Text(playerData, groovestep)
|
||||
--Angled Approach.
|
||||
local P=nil
|
||||
if step==AIRBOSS.PatternStep.GROOVE_XX and ROL<=4.0 and playerData.case<3 then
|
||||
if LUE>self.lue.RIGHT then
|
||||
P=underline("AA")
|
||||
elseif
|
||||
LUE>self.lue.RightMed then
|
||||
P="AA "
|
||||
elseif
|
||||
LUE>self.lue.Right then
|
||||
P=little("AA")
|
||||
end
|
||||
if LUE>self.lue.RIGHT then
|
||||
P=underline("AA")
|
||||
elseif
|
||||
LUE>self.lue.RightMed then
|
||||
P="AA "
|
||||
elseif
|
||||
LUE>self.lue.Right then
|
||||
P=little("AA")
|
||||
end
|
||||
end
|
||||
|
||||
--Overshoot Start.
|
||||
local O=nil
|
||||
if step==AIRBOSS.PatternStep.GROOVE_XX then
|
||||
if LUE<self.lue.LEFT then
|
||||
O=underline("OS")
|
||||
elseif
|
||||
LUE<self.lue.Left then
|
||||
O="OS"
|
||||
elseif
|
||||
LUE<self.lue._min then
|
||||
O=little("OS")
|
||||
end
|
||||
if LUE<self.lue.LEFT then
|
||||
O=underline("OS")
|
||||
elseif
|
||||
LUE<self.lue.Left then
|
||||
O="OS"
|
||||
elseif
|
||||
LUE<self.lue._min then
|
||||
O=little("OS")
|
||||
end
|
||||
end
|
||||
|
||||
-- Speed via AoA. Depends on aircraft type.
|
||||
@@ -12541,21 +12606,21 @@ function AIRBOSS:_Flightdata2Text(playerData, groovestep)
|
||||
elseif LUE>self.lue._max then
|
||||
D=little("LUL")
|
||||
elseif playerData.case<3 then
|
||||
if LUE<self.lue.LEFT and step~=AIRBOSS.PatternStep.GROOVE_XX then
|
||||
D=underline("LUR")
|
||||
elseif LUE<self.lue.Left and step~=AIRBOSS.PatternStep.GROOVE_XX then
|
||||
D="LUR"
|
||||
elseif LUE<self.lue._min and step~=AIRBOSS.PatternStep.GROOVE_XX then
|
||||
D=little("LUR")
|
||||
end
|
||||
if LUE<self.lue.LEFT and step~=AIRBOSS.PatternStep.GROOVE_XX then
|
||||
D=underline("LUR")
|
||||
elseif LUE<self.lue.Left and step~=AIRBOSS.PatternStep.GROOVE_XX then
|
||||
D="LUR"
|
||||
elseif LUE<self.lue._min and step~=AIRBOSS.PatternStep.GROOVE_XX then
|
||||
D=little("LUR")
|
||||
end
|
||||
elseif playerData.case==3 then
|
||||
if LUE<self.lue.LEFT then
|
||||
D=underline("LUR")
|
||||
elseif LUE<self.lue.Left then
|
||||
D="LUR"
|
||||
elseif LUE<self.lue._min then
|
||||
D=little("LUR")
|
||||
end
|
||||
if LUE<self.lue.LEFT then
|
||||
D=underline("LUR")
|
||||
elseif LUE<self.lue.Left then
|
||||
D="LUR"
|
||||
elseif LUE<self.lue._min then
|
||||
D=little("LUR")
|
||||
end
|
||||
end
|
||||
|
||||
-- Compile.
|
||||
@@ -12588,7 +12653,7 @@ function AIRBOSS:_Flightdata2Text(playerData, groovestep)
|
||||
--Drift in Lineup
|
||||
if fdata.Drift then
|
||||
G=G..fdata.Drift
|
||||
n=n -- Drift doesn't affect score, advisory only.
|
||||
n=n -- Drift doesn't affect score, advisory only.
|
||||
end
|
||||
-- Overshoot.
|
||||
if O then
|
||||
@@ -12657,7 +12722,7 @@ function AIRBOSS:_GS(step, n)
|
||||
if n==-1 then
|
||||
gp=AIRBOSS.GroovePos.IC
|
||||
elseif n==1 then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
gp=AIRBOSS.GroovePos.AL
|
||||
else
|
||||
gp=AIRBOSS.GroovePos.IW
|
||||
@@ -14549,7 +14614,7 @@ function AIRBOSS:_IsCarrierAircraft(unit)
|
||||
|
||||
-- Special case for Harrier which can only land on Tarawa, LHA and LHD.
|
||||
if aircrafttype==AIRBOSS.AircraftCarrier.AV8B then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
@@ -14557,7 +14622,7 @@ function AIRBOSS:_IsCarrierAircraft(unit)
|
||||
end
|
||||
|
||||
-- Also only Harriers can land on the Tarawa, LHA and LHD.
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
if aircrafttype~=AIRBOSS.AircraftCarrier.AV8B then
|
||||
return false
|
||||
end
|
||||
@@ -14860,8 +14925,8 @@ end
|
||||
-- @param #table param Parameters.
|
||||
-- @param #number time Time.
|
||||
function AIRBOSS._CheckRadioQueueT(param, time)
|
||||
AIRBOSS._CheckRadioQueue(param.airboss, param.radioqueue, param.name)
|
||||
return time+0.05
|
||||
AIRBOSS._CheckRadioQueue(param.airboss, param.radioqueue, param.name)
|
||||
return time+0.05
|
||||
end
|
||||
|
||||
--- Radio queue item.
|
||||
@@ -14885,15 +14950,15 @@ function AIRBOSS:_CheckRadioQueue(radioqueue, name)
|
||||
-- Check if queue is empty.
|
||||
if #radioqueue==0 then
|
||||
|
||||
if name=="LSO" then
|
||||
self:T(self.lid..string.format("Stopping LSO radio queue."))
|
||||
self.radiotimer:Stop(self.RQLid)
|
||||
self.RQLid=nil
|
||||
elseif name=="MARSHAL" then
|
||||
self:T(self.lid..string.format("Stopping Marshal radio queue."))
|
||||
self.radiotimer:Stop(self.RQMid)
|
||||
self.RQMid=nil
|
||||
end
|
||||
if name=="LSO" then
|
||||
self:T(self.lid..string.format("Stopping LSO radio queue."))
|
||||
self.radiotimer:Stop(self.RQLid)
|
||||
self.RQLid=nil
|
||||
elseif name=="MARSHAL" then
|
||||
self:T(self.lid..string.format("Stopping Marshal radio queue."))
|
||||
self.radiotimer:Stop(self.RQMid)
|
||||
self.RQMid=nil
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
@@ -15035,11 +15100,11 @@ function AIRBOSS:RadioTransmission(radio, call, loud, delay, interval, click, pi
|
||||
|
||||
caller="LSOCall"
|
||||
|
||||
-- Schedule radio queue checks.
|
||||
if not self.RQLid then
|
||||
-- Schedule radio queue checks.
|
||||
if not self.RQLid then
|
||||
self:T(self.lid..string.format("Starting LSO radio queue."))
|
||||
self.RQLid=self.radiotimer:Schedule(nil, AIRBOSS._CheckRadioQueue, {self, self.RQLSO, "LSO"}, 0.02, 0.05)
|
||||
end
|
||||
self.RQLid=self.radiotimer:Schedule(nil, AIRBOSS._CheckRadioQueue, {self, self.RQLSO, "LSO"}, 0.02, 0.05)
|
||||
end
|
||||
|
||||
elseif radio.alias=="MARSHAL" then
|
||||
|
||||
@@ -15047,10 +15112,10 @@ function AIRBOSS:RadioTransmission(radio, call, loud, delay, interval, click, pi
|
||||
|
||||
caller="MarshalCall"
|
||||
|
||||
if not self.RQMid then
|
||||
self:T(self.lid..string.format("Starting Marhal radio queue."))
|
||||
self.RQMid=self.radiotimer:Schedule(nil, AIRBOSS._CheckRadioQueue, {self, self.RQMarshal, "MARSHAL"}, 0.02, 0.05)
|
||||
end
|
||||
if not self.RQMid then
|
||||
self:T(self.lid..string.format("Starting Marhal radio queue."))
|
||||
self.RQMid=self.radiotimer:Schedule(nil, AIRBOSS._CheckRadioQueue, {self, self.RQMarshal, "MARSHAL"}, 0.02, 0.05)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -16217,9 +16282,9 @@ function AIRBOSS:_SkipperStartRecovery(_unitName, case)
|
||||
|
||||
-- Inform player.
|
||||
local text=string.format("affirm, Case %d recovery will start in 5 min for %d min. Wind on deck %d knots. U-turn=%s.", case, self.skipperTime, self.skipperSpeed, tostring(self.skipperUturn))
|
||||
if case>1 then
|
||||
text=text..string.format(" Marshal radial %d°.", self.skipperOffset)
|
||||
end
|
||||
if case>1 then
|
||||
text=text..string.format(" Marshal radial %d°.", self.skipperOffset)
|
||||
end
|
||||
if self:IsRecovering() then
|
||||
text="negative, carrier is already recovering."
|
||||
self:MessageToPlayer(playerData, text, "AIRBOSS")
|
||||
@@ -17927,7 +17992,7 @@ function AIRBOSS:_MarkCaseZones(_unitName, flare)
|
||||
end
|
||||
|
||||
-- Tarawa, LHA and LHD landing spots.
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS then
|
||||
if self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
|
||||
text=text.."\n* abeam landing stop with RED flares"
|
||||
-- Abeam landing spot zone.
|
||||
local ALSPT=self:_GetZoneAbeamLandingSpot()
|
||||
@@ -18070,12 +18135,12 @@ function AIRBOSS:_SaveTrapSheet(playerData, grade)
|
||||
for i=1,9999 do
|
||||
|
||||
-- Create file name
|
||||
if self.trapprefix then
|
||||
filename=string.format("%s_%s-%04d.csv", self.trapprefix, playerData.actype, i)
|
||||
else
|
||||
local name=UTILS.ReplaceIllegalCharacters(playerData.name, "_")
|
||||
filename=string.format("AIRBOSS-%s_Trapsheet-%s_%s-%04d.csv", self.alias, name, playerData.actype, i)
|
||||
end
|
||||
if self.trapprefix then
|
||||
filename=string.format("%s_%s-%04d.csv", self.trapprefix, playerData.actype, i)
|
||||
else
|
||||
local name=UTILS.ReplaceIllegalCharacters(playerData.name, "_")
|
||||
filename=string.format("AIRBOSS-%s_Trapsheet-%s_%s-%04d.csv", self.alias, name, playerData.actype, i)
|
||||
end
|
||||
|
||||
-- Set path.
|
||||
if path~=nil then
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
-- * Object oriented refactoring of Ciribob\'s fantastic CSAR script.
|
||||
-- * No need for extra MIST loading.
|
||||
-- * Additional events to tailor your mission.
|
||||
-- * Optional SpawnCASEVAC to create casualties without beacon (e.g. handling dead ground vehicles and create CASVAC requests).
|
||||
--
|
||||
-- ## 0. Prerequisites
|
||||
--
|
||||
@@ -105,7 +106,7 @@
|
||||
-- self.countryblue= country.id.USA
|
||||
-- self.countryred = country.id.RUSSIA
|
||||
-- self.countryneutral = country.id.UN_PEACEKEEPERS
|
||||
--
|
||||
--
|
||||
-- ## 2.1 Experimental Features
|
||||
--
|
||||
-- WARNING - Here\'ll be dragons!
|
||||
@@ -115,7 +116,9 @@
|
||||
-- self.SRSPath = "E:\\Progra~1\\DCS-SimpleRadio-Standalone\\" -- adjust your own path in your SRS installation -- server(!)
|
||||
-- self.SRSchannel = 300 -- radio channel
|
||||
-- self.SRSModulation = radio.modulation.AM -- modulation
|
||||
--
|
||||
-- --
|
||||
-- self.csarUsePara = false -- If set to true, will use the LandingAfterEjection Event instead of Ejection --shagrat
|
||||
--
|
||||
-- ## 3. Results
|
||||
--
|
||||
-- Number of successful landings with save pilots and aggregated number of saved pilots is stored in these variables in the object:
|
||||
@@ -175,6 +178,8 @@
|
||||
-- -- Create downed "Pilot Wagner" in #ZONE "CSAR_Start_1" at a random point for the blue coalition
|
||||
-- my_csar:SpawnCSARAtZone( "CSAR_Start_1", coalition.side.BLUE, "Pilot Wagner", true )
|
||||
--
|
||||
-- --Create a casualty and CASEVAC request from a "Point" (VEC2) for the blue coalition --shagrat
|
||||
-- my_csar:SpawnCASEVAC(Point, coalition.side.BLUE)
|
||||
--
|
||||
-- @field #CSAR
|
||||
CSAR = {
|
||||
@@ -238,10 +243,11 @@ CSAR.AircraftType["Mi-8MTV2"] = 12
|
||||
CSAR.AircraftType["Mi-8MT"] = 12
|
||||
CSAR.AircraftType["Mi-24P"] = 8
|
||||
CSAR.AircraftType["Mi-24V"] = 8
|
||||
CSAR.AircraftType["Bell-47"] = 2
|
||||
|
||||
--- CSAR class version.
|
||||
-- @field #string version
|
||||
CSAR.version="0.1.11r1"
|
||||
CSAR.version="0.1.12r2"
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- ToDo list
|
||||
@@ -249,7 +255,7 @@ CSAR.version="0.1.11r1"
|
||||
|
||||
-- DONE: SRS Integration (to be tested)
|
||||
-- TODO: Maybe - add option to smoke/flare closest MASH
|
||||
|
||||
-- TODO: shagrat Add cargoWeight to helicopter when pilot boarded
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Constructor
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
@@ -379,7 +385,10 @@ function CSAR:New(Coalition, Template, Alias)
|
||||
self.countryblue= country.id.USA
|
||||
self.countryred = country.id.RUSSIA
|
||||
self.countryneutral = country.id.UN_PEACEKEEPERS
|
||||
|
||||
|
||||
-- added 0.1.3
|
||||
self.csarUsePara = true -- shagrat set to true, will use the LandingAfterEjection Event instead of Ejection
|
||||
|
||||
-- WARNING - here\'ll be dragons
|
||||
-- for this to work you need to de-sanitize your mission environment in <DCS root>\Scripts\MissionScripting.lua
|
||||
-- needs SRS => 1.9.6 to work (works on the *server* side)
|
||||
@@ -644,10 +653,14 @@ function CSAR:_AddCsar(_coalition , _country, _point, _typeName, _unitName, _pla
|
||||
local _typeName = _typeName or "Pilot"
|
||||
|
||||
if not noMessage then
|
||||
self:_DisplayToAllSAR("MAYDAY MAYDAY! " .. _typeName .. " is down. ", self.coalition, self.messageTime)
|
||||
if _freq ~= 0 then --shagrat different CASEVAC msg
|
||||
self:_DisplayToAllSAR("MAYDAY MAYDAY! " .. _typeName .. " is down. ", self.coalition, self.messageTime)
|
||||
else
|
||||
self:_DisplayToAllSAR("Troops In Contact. " .. _typeName .. " requests CASEVAC. ", self.coalition, self.messageTime)
|
||||
end
|
||||
end
|
||||
|
||||
if _freq then
|
||||
if (_freq and _freq ~= 0) then --shagrat only add beacon if _freq is NOT 0
|
||||
self:_AddBeaconToGroup(_spawnedGroup, _freq)
|
||||
end
|
||||
|
||||
@@ -656,10 +669,18 @@ function CSAR:_AddCsar(_coalition , _country, _point, _typeName, _unitName, _pla
|
||||
local _text = _description
|
||||
if not forcedesc then
|
||||
if _playerName ~= nil then
|
||||
_text = "Pilot " .. _playerName
|
||||
if _freq ~= 0 then --shagrat
|
||||
_text = "Pilot " .. _playerName
|
||||
else
|
||||
_text = "TIC - " .. _playerName
|
||||
end
|
||||
elseif _unitName ~= nil then
|
||||
_text = "AI Pilot of " .. _unitName
|
||||
end
|
||||
if _freq ~= 0 then --shagrat
|
||||
_text = "AI Pilot of " .. _unitName
|
||||
else
|
||||
_text = "TIC - " .. _unitName
|
||||
end
|
||||
end
|
||||
end
|
||||
self:T({_spawnedGroup, _alias})
|
||||
|
||||
@@ -667,7 +688,7 @@ function CSAR:_AddCsar(_coalition , _country, _point, _typeName, _unitName, _pla
|
||||
|
||||
self:_CreateDownedPilotTrack(_spawnedGroup,_GroupName,_coalition,_unitName,_text,_typeName,_freq,_playerName)
|
||||
|
||||
self:_InitSARForPilot(_spawnedGroup, _GroupName, _freq, noMessage)
|
||||
self:_InitSARForPilot(_spawnedGroup, _unitName, _freq, noMessage) --shagrat use unitName to have the aircraft callsign / descriptive "name" etc.
|
||||
|
||||
return self
|
||||
end
|
||||
@@ -736,6 +757,58 @@ function CSAR:SpawnCSARAtZone(Zone, Coalition, Description, RandomPoint, Nomessa
|
||||
return self
|
||||
end
|
||||
|
||||
--- (Internal) Function to add a CSAR object into the scene at a Point coordinate (VEC_2). For mission designers wanting to add e.g. casualties to the scene, that don't use beacons.
|
||||
-- @param #CSAR self
|
||||
-- @param #string _Point a POINT_VEC2.
|
||||
-- @param #number _coalition Coalition.
|
||||
-- @param #string _description (optional) Description.
|
||||
-- @param #boolean _nomessage (optional) If true, don\'t send a message to SAR.
|
||||
-- @param #string unitname (optional) Name of the lost unit.
|
||||
-- @param #string typename (optional) Type of plane.
|
||||
-- @param #boolean forcedesc (optional) Force to use the description passed only for the pilot track entry. Use to have fully custom names.
|
||||
function CSAR:_SpawnCASEVAC( _Point, _coalition, _description, _nomessage, unitname, typename, forcedesc) --shagrat added internal Function _SpawnCASEVAC
|
||||
self:T(self.lid .. " _SpawnCASEVAC")
|
||||
|
||||
local _description = _description or "CASEVAC"
|
||||
local unitname = unitname or "CASEVAC"
|
||||
local typename = typename or "Ground Commander"
|
||||
|
||||
local pos = {}
|
||||
pos = _Point
|
||||
|
||||
local _country = 0
|
||||
if _coalition == coalition.side.BLUE then
|
||||
_country = self.countryblue
|
||||
elseif _coalition == coalition.side.RED then
|
||||
_country = self.countryred
|
||||
else
|
||||
_country = self.countryneutral
|
||||
end
|
||||
--shagrat set frequency to 0 as "flag" for no beacon
|
||||
self:_AddCsar(_coalition, _country, pos, typename, unitname, _description, 0, _nomessage, _description, forcedesc)
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Function to add a CSAR object into the scene at a zone coordinate. For mission designers wanting to add e.g. PoWs to the scene.
|
||||
-- @param #CSAR self
|
||||
-- @param #string Point a POINT_VEC2.
|
||||
-- @param #number Coalition Coalition.
|
||||
-- @param #string Description (optional) Description.
|
||||
-- @param #boolean addBeacon (optional) yes or no.
|
||||
-- @param #boolean Nomessage (optional) If true, don\'t send a message to SAR.
|
||||
-- @param #string Unitname (optional) Name of the lost unit.
|
||||
-- @param #string Typename (optional) Type of plane.
|
||||
-- @param #boolean Forcedesc (optional) Force to use the **description passed only** for the pilot track entry. Use to have fully custom names.
|
||||
-- @usage If missions designers want to spawn downed pilots into the field, e.g. at mission begin, to give the helicopter guys work, they can do this like so:
|
||||
--
|
||||
-- -- Create casualty "CASEVAC" at Point #POINT_VEC2 for the blue coalition.
|
||||
-- my_csar:SpawnCASEVAC( POINT_VEC2, coalition.side.BLUE )
|
||||
function CSAR:SpawnCASEVAC(Point, Coalition, Description, Nomessage, Unitname, Typename, Forcedesc)
|
||||
self:_SpawnCASEVAC(Point, Coalition, Description, Nomessage, Unitname, Typename, Forcedesc)
|
||||
return self
|
||||
end --shagrat end added CASEVAC
|
||||
|
||||
--- (Internal) Event handler.
|
||||
-- @param #CSAR self
|
||||
function CSAR:_EventHandler(EventData)
|
||||
@@ -747,7 +820,7 @@ function CSAR:_EventHandler(EventData)
|
||||
-- no event
|
||||
if _event == nil or _event.initiator == nil then
|
||||
return false
|
||||
|
||||
|
||||
-- take off
|
||||
elseif _event.id == EVENTS.Takeoff then -- taken off
|
||||
self:T(self.lid .. " Event unit - Takeoff")
|
||||
@@ -823,12 +896,12 @@ function CSAR:_EventHandler(EventData)
|
||||
local _unit = _event.IniUnit
|
||||
local _unitname = _event.IniUnitName
|
||||
local _group = _event.IniGroup
|
||||
|
||||
|
||||
if _unit == nil then
|
||||
return -- error!
|
||||
end
|
||||
|
||||
local _coalition = _unit:GetCoalition()
|
||||
|
||||
local _coalition = _unit:GetCoalition()
|
||||
if _coalition ~= self.coalition then
|
||||
return --ignore!
|
||||
end
|
||||
@@ -851,11 +924,27 @@ function CSAR:_EventHandler(EventData)
|
||||
return
|
||||
end
|
||||
|
||||
-- all checks passed, get going.
|
||||
local _freq = self:_GenerateADFFrequency()
|
||||
self:_AddCsar(_coalition, _unit:GetCountry(), _unit:GetCoordinate() , _unit:GetTypeName(), _unit:GetName(), _event.IniPlayerName, _freq, false, "none")
|
||||
|
||||
return true
|
||||
-- all checks passed, get going.
|
||||
if self.csarUsePara == false then --shagrat check parameter LandingAfterEjection, if true don't spawn a Pilot from EJECTION event, wait for the Chute to land
|
||||
local _freq = self:_GenerateADFFrequency()
|
||||
self:_AddCsar(_coalition, _unit:GetCountry(), _unit:GetCoordinate() , _unit:GetTypeName(), _unit:GetName(), _event.IniPlayerName, _freq, false, "none")
|
||||
return true
|
||||
end
|
||||
---- shagrat on event LANDING_AFTER_EJECTION spawn pilot at parachute location
|
||||
elseif (_event.id == EVENTS.LandingAfterEjection and self.csarUsePara == true) then
|
||||
self:I({EVENT=_event})
|
||||
local _LandingPos = COORDINATE:NewFromVec3(_event.initiator:getPosition().p)
|
||||
local _unitname = "Aircraft" --_event.initiator:getName() or "Aircraft" --shagrat Optional use of Object name which is unfortunately 'f15_Pilot_Parachute'
|
||||
local _typename = "Ejected Pilot" --_event.Initiator.getTypeName() or "Ejected Pilot"
|
||||
local _country = _event.initiator:getCountry()
|
||||
local _coalition = coalition.getCountryCoalition( _country )
|
||||
local _freq = self:_GenerateADFFrequency()
|
||||
self:I({coalition=_coalition,country= _country, coord=_LandingPos, name=_unitname, player=_event.IniPlayerName, freq=_freq})
|
||||
self:_AddCsar(_coalition, _country, _LandingPos, nil, _unitname, _event.IniPlayerName, _freq, false, "none")--shagrat add CSAR at Parachute location.
|
||||
|
||||
Unit.destroy(_event.initiator) -- shagrat remove static Pilot model
|
||||
|
||||
return true
|
||||
|
||||
elseif _event.id == EVENTS.Land then
|
||||
self:T(self.lid .. " Landing")
|
||||
@@ -920,8 +1009,13 @@ function CSAR:_InitSARForPilot(_downedGroup, _GroupName, _freq, _nomessage)
|
||||
local _leadername = _leader:GetName()
|
||||
|
||||
if not _nomessage then
|
||||
local _text = string.format("%s requests SAR at %s, beacon at %.2f KHz", _leadername, _coordinatesText, _freqk)
|
||||
self:_DisplayToAllSAR(_text,self.coalition,self.messageTime)
|
||||
if _freq ~= 0 then --shagrat
|
||||
local _text = string.format("%s requests SAR at %s, beacon at %.2f KHz", _groupName, _coordinatesText, _freqk)--shagrat _groupName to prevent 'f15_Pilot_Parachute'
|
||||
self:_DisplayToAllSAR(_text,self.coalition,self.messageTime)
|
||||
else --shagrat CASEVAC msg
|
||||
local _text = string.format("Pickup Zone at %s.", _coordinatesText )
|
||||
self:_DisplayToAllSAR(_text,self.coalition,self.messageTime)
|
||||
end
|
||||
end
|
||||
|
||||
for _,_heliName in pairs(self.csarUnits) do
|
||||
@@ -1059,7 +1153,7 @@ function CSAR:_PopSmokeForGroup(_woundedGroupName, _woundedLeader)
|
||||
if _lastSmoke == nil or timer.getTime() > _lastSmoke then
|
||||
|
||||
local _smokecolor = self.smokecolor
|
||||
local _smokecoord = _woundedLeader:GetCoordinate()
|
||||
local _smokecoord = _woundedLeader:GetCoordinate():Translate( 6, math.random( 1, 360) ) --shagrat place smoke at a random 6 m distance, so smoke does not obscure the pilot
|
||||
_smokecoord:Smoke(_smokecolor)
|
||||
self.smokeMarkers[_woundedGroupName] = timer.getTime() + 300 -- next smoke time
|
||||
end
|
||||
@@ -1434,7 +1528,11 @@ function CSAR:_DisplayActiveSAR(_unitName)
|
||||
else
|
||||
distancetext = string.format("%.1fkm", _distance/1000.0)
|
||||
end
|
||||
table.insert(_csarList, { dist = _distance, msg = string.format("%s at %s - %.2f KHz ADF - %s ", _value.desc, _coordinatesText, _value.frequency / 1000, distancetext) })
|
||||
if _value.frequency == 0 then--shagrat insert CASEVAC without Frequency
|
||||
table.insert(_csarList, { dist = _distance, msg = string.format("%s at %s - %s ", _value.desc, _coordinatesText, distancetext) })
|
||||
else
|
||||
table.insert(_csarList, { dist = _distance, msg = string.format("%s at %s - %.2f KHz ADF - %s ", _value.desc, _coordinatesText, _value.frequency / 1000, distancetext) })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1875,6 +1973,7 @@ function CSAR:onafterStart(From, Event, To)
|
||||
self:HandleEvent(EVENTS.Takeoff, self._EventHandler)
|
||||
self:HandleEvent(EVENTS.Land, self._EventHandler)
|
||||
self:HandleEvent(EVENTS.Ejection, self._EventHandler)
|
||||
self:HandleEvent(EVENTS.LandingAfterEjection, self._EventHandler) --shagrat
|
||||
self:HandleEvent(EVENTS.PlayerEnterAircraft, self._EventHandler)
|
||||
self:HandleEvent(EVENTS.PlayerEnterUnit, self._EventHandler)
|
||||
self:HandleEvent(EVENTS.PilotDead, self._EventHandler)
|
||||
@@ -1985,6 +2084,7 @@ function CSAR:onafterStop(From, Event, To)
|
||||
self:UnHandleEvent(EVENTS.Takeoff)
|
||||
self:UnHandleEvent(EVENTS.Land)
|
||||
self:UnHandleEvent(EVENTS.Ejection)
|
||||
self:UnHandleEvent(EVENTS.LandingAfterEjection) -- shagrat
|
||||
self:UnHandleEvent(EVENTS.PlayerEnterUnit)
|
||||
self:UnHandleEvent(EVENTS.PlayerEnterAircraft)
|
||||
self:UnHandleEvent(EVENTS.PilotDead)
|
||||
|
||||
@@ -2145,24 +2145,39 @@ function CTLD:_LoadCratesNearby(Group, Unit)
|
||||
self.Loaded_Cargo[unitname] = loaded
|
||||
self:_UpdateUnitCargoMass(Unit)
|
||||
-- clean up real world crates
|
||||
local existingcrates = self.Spawned_Cargo -- #table
|
||||
local newexcrates = {}
|
||||
for _,_crate in pairs(existingcrates) do
|
||||
local excrate = _crate -- #CTLD_CARGO
|
||||
local ID = excrate:GetID()
|
||||
for _,_ID in pairs(crateidsloaded) do
|
||||
if ID ~= _ID then
|
||||
table.insert(newexcrates,_crate)
|
||||
end
|
||||
end
|
||||
end
|
||||
self.Spawned_Cargo = nil
|
||||
self.Spawned_Cargo = newexcrates
|
||||
self:_CleanupTrackedCrates(crateidsloaded)
|
||||
end
|
||||
end
|
||||
return self
|
||||
end
|
||||
|
||||
--- (Internal) Function to clean up tracked cargo crates
|
||||
function CTLD:_CleanupTrackedCrates(crateIdsToRemove)
|
||||
local existingcrates = self.Spawned_Cargo -- #table
|
||||
local newexcrates = {}
|
||||
for _,_crate in pairs(existingcrates) do
|
||||
local excrate = _crate -- #CTLD_CARGO
|
||||
local ID = excrate:GetID()
|
||||
local keep = true
|
||||
for _,_ID in pairs(crateIdsToRemove) do
|
||||
if ID == _ID then
|
||||
keep = false
|
||||
end
|
||||
end
|
||||
-- remove destroyed crates here too
|
||||
local static = _crate:GetPositionable() -- Wrapper.Static#STATIC -- crates
|
||||
if not static or not static:IsAlive() then
|
||||
keep = false
|
||||
end
|
||||
if keep then
|
||||
table.insert(newexcrates,_crate)
|
||||
end
|
||||
end
|
||||
self.Spawned_Cargo = nil
|
||||
self.Spawned_Cargo = newexcrates
|
||||
return self
|
||||
end
|
||||
|
||||
--- (Internal) Function to get current loaded mass
|
||||
-- @param #CTLD self
|
||||
-- @param Wrapper.Unit#UNIT Unit
|
||||
@@ -2849,19 +2864,7 @@ function CTLD:_CleanUpCrates(Crates,Build,Number)
|
||||
if found == numberdest then break end -- got enough
|
||||
end
|
||||
-- loop and remove from real world representation
|
||||
for _,_crate in pairs(existingcrates) do
|
||||
local excrate = _crate -- #CTLD_CARGO
|
||||
local ID = excrate:GetID()
|
||||
for _,_ID in pairs(destIDs) do
|
||||
if ID ~= _ID then
|
||||
table.insert(newexcrates,_crate)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- reset Spawned_Cargo
|
||||
self.Spawned_Cargo = nil
|
||||
self.Spawned_Cargo = newexcrates
|
||||
self:_CleanupTrackedCrates(destIDs)
|
||||
return self
|
||||
end
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user