mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Merge remote-tracking branch 'remotes/dcs-retribution/dcs-retribution/dev' into pretense-generator
This commit is contained in:
Binary file not shown.
@@ -43,11 +43,6 @@ squadrons:
|
||||
aircraft:
|
||||
- AH-64D Apache Longbow
|
||||
size: 4
|
||||
- primary: CAS
|
||||
secondary: any
|
||||
aircraft:
|
||||
- OH-58D(R) Kiowa Warrior
|
||||
size: 4
|
||||
- primary: Refueling
|
||||
aircraft:
|
||||
- KC-135 Stratotanker
|
||||
@@ -101,7 +96,12 @@ squadrons:
|
||||
secondary: air-to-ground
|
||||
aircraft:
|
||||
- AV-8B Harrier II Night Attack
|
||||
size: 18
|
||||
size: 10
|
||||
- primary: CAS
|
||||
secondary: any
|
||||
aircraft:
|
||||
- OH-58D(R) Kiowa Warrior
|
||||
size: 8
|
||||
- primary: Air Assault
|
||||
secondary: any
|
||||
aircraft:
|
||||
|
||||
Binary file not shown.
@@ -32,7 +32,7 @@ squadrons:
|
||||
aircraft:
|
||||
- C-130J-30 Super Hercules
|
||||
- C-130
|
||||
size: 8
|
||||
size: 4
|
||||
# Tel Nof
|
||||
23:
|
||||
- primary: SEAD
|
||||
@@ -53,20 +53,20 @@ squadrons:
|
||||
secondary: any
|
||||
aircraft:
|
||||
- UH-1H Iroquois
|
||||
size: 8
|
||||
size: 4
|
||||
# Hatzor
|
||||
20:
|
||||
- primary: BAI
|
||||
secondary: any
|
||||
aircraft:
|
||||
- A-4E Skyhawk
|
||||
- F-4E Phantom II
|
||||
- F-4E-45MC Phantom II
|
||||
size: 20
|
||||
- primary: Strike
|
||||
secondary: any
|
||||
aircraft:
|
||||
- A-4E Skyhawk
|
||||
- F-4E Phantom II
|
||||
- F-4E-45MC Phantom II
|
||||
size: 20
|
||||
# El Arish
|
||||
29:
|
||||
@@ -83,7 +83,7 @@ squadrons:
|
||||
secondary: any
|
||||
aircraft:
|
||||
- MiG-15bis Fagot
|
||||
size: 8
|
||||
size: 16
|
||||
- primary: Air Assault
|
||||
secondary: any
|
||||
aircraft:
|
||||
@@ -91,50 +91,31 @@ squadrons:
|
||||
size: 4
|
||||
# Al Mansurah
|
||||
14:
|
||||
- primary: Escort
|
||||
secondary:
|
||||
- BAI
|
||||
- BARCAP
|
||||
- Escort
|
||||
- Fighter sweep
|
||||
- Intercept
|
||||
- TARCAP
|
||||
- primary: BARCAP
|
||||
secondary: any
|
||||
aircraft:
|
||||
- MiG-21bis Fishbed-N
|
||||
size: 20
|
||||
size: 16
|
||||
- primary: BAI
|
||||
secondary: any
|
||||
aircraft:
|
||||
- MiG-19P Farmer-B
|
||||
size: 20
|
||||
size: 16
|
||||
# Cairo West
|
||||
18:
|
||||
- primary: Strike
|
||||
secondary: any
|
||||
aircraft:
|
||||
- Tu-16 Badger
|
||||
size: 14
|
||||
- primary: Escort
|
||||
secondary: air-to-air
|
||||
aircraft:
|
||||
- MiG-21bis Fishbed-N
|
||||
size: 16
|
||||
# FARP
|
||||
Port Tewfik Staging Area:
|
||||
- primary: Transport
|
||||
secondary: any
|
||||
aircraft:
|
||||
- Mi-8MTV2 Hip
|
||||
size: 4
|
||||
# Cairo West
|
||||
18:
|
||||
- primary: Strike
|
||||
secondary:
|
||||
- DEAD
|
||||
- OCA/Runway
|
||||
aircraft:
|
||||
- Tu-16 Badger
|
||||
size: 15
|
||||
- primary: BARCAP
|
||||
secondary:
|
||||
- BAI
|
||||
- BARCAP
|
||||
- Escort
|
||||
- Fighter sweep
|
||||
- Intercept
|
||||
- TARCAP
|
||||
aircraft:
|
||||
- MiG-21bis Fishbed-N
|
||||
size: 20
|
||||
# FARP
|
||||
Port Tewfik Staging Area:
|
||||
- primary: Air Assault
|
||||
secondary: any
|
||||
aircraft:
|
||||
- Mi-8MTV2 Hip
|
||||
|
||||
Binary file not shown.
@@ -36,6 +36,11 @@ squadrons:
|
||||
aircraft:
|
||||
- S-3B Tanker
|
||||
size: 4
|
||||
- primary: Air Assault
|
||||
secondary: any
|
||||
aircraft:
|
||||
- UH-60A
|
||||
size: 4
|
||||
# Akrotiri
|
||||
44:
|
||||
- primary: Strike
|
||||
@@ -85,11 +90,6 @@ squadrons:
|
||||
aircraft:
|
||||
- OH-58D(R) Kiowa Warrior
|
||||
size: 4
|
||||
- primary: Air Assault
|
||||
secondary: any
|
||||
aircraft:
|
||||
- UH-60A
|
||||
size: 4
|
||||
# Damascus
|
||||
7:
|
||||
- primary: Strike
|
||||
|
||||
36
resources/customized_payloads/EA_6B.lua
Normal file
36
resources/customized_payloads/EA_6B.lua
Normal file
@@ -0,0 +1,36 @@
|
||||
local unitPayloads = {
|
||||
["name"] = "EA_6B",
|
||||
["payloads"] = {
|
||||
[1] = {
|
||||
["displayName"] = "Liberation SEAD",
|
||||
["name"] = "Liberation SEAD",
|
||||
["pylons"] = {
|
||||
[1] = {
|
||||
["CLSID"] = "{B06DD79A-F21E-4EB9-BD9D-AB3844618C93}",
|
||||
["num"] = 1,
|
||||
},
|
||||
[2] = {
|
||||
["CLSID"] = "{0395076D-2F77-4420-9D33-087A4398130B}",
|
||||
["num"] = 2,
|
||||
},
|
||||
[3] = {
|
||||
["CLSID"] = "{EA6B_ANALQ992}",
|
||||
["num"] = 3,
|
||||
},
|
||||
[4] = {
|
||||
["CLSID"] = "{0395076D-2F77-4420-9D33-087A4398130B}",
|
||||
["num"] = 4,
|
||||
},
|
||||
[5] = {
|
||||
["CLSID"] = "{B06DD79A-F21E-4EB9-BD9D-AB3844618C93}",
|
||||
["num"] = 5,
|
||||
},
|
||||
},
|
||||
["tasks"] = {
|
||||
[1] = 11,
|
||||
},
|
||||
},
|
||||
},
|
||||
["unitType"] = "EA_6B",
|
||||
}
|
||||
return unitPayloads
|
||||
33
resources/customized_payloads/Su_15.lua
Normal file
33
resources/customized_payloads/Su_15.lua
Normal file
@@ -0,0 +1,33 @@
|
||||
local unitPayloads = {
|
||||
["name"] = "Su_15",
|
||||
["payloads"] = {
|
||||
[1] = {
|
||||
["name"] = "BARCAP",
|
||||
["pylons"] = {
|
||||
[1] = {
|
||||
["CLSID"] = "{R-8M1R}",
|
||||
["num"] = 4,
|
||||
},
|
||||
[2] = {
|
||||
["CLSID"] = "{R-8M1T}",
|
||||
["num"] = 1,
|
||||
},
|
||||
[3] = {
|
||||
["CLSID"] = "{E92CBFE5-C153-11d8-9897-000476191836}",
|
||||
["num"] = 3,
|
||||
},
|
||||
[4] = {
|
||||
["CLSID"] = "{E92CBFE5-C153-11d8-9897-000476191836}",
|
||||
["num"] = 2,
|
||||
},
|
||||
},
|
||||
["tasks"] = {
|
||||
[1] = 10,
|
||||
},
|
||||
},
|
||||
},
|
||||
["tasks"] = {
|
||||
},
|
||||
["unitType"] = "Su_15",
|
||||
}
|
||||
return unitPayloads
|
||||
43
resources/customized_payloads/Su_15TM.lua
Normal file
43
resources/customized_payloads/Su_15TM.lua
Normal file
@@ -0,0 +1,43 @@
|
||||
local unitPayloads = {
|
||||
["name"] = "Su_15TM",
|
||||
["payloads"] = {
|
||||
[1] = {
|
||||
["displayName"] = "BARCAP",
|
||||
["name"] = "BARCAP",
|
||||
["pylons"] = {
|
||||
[1] = {
|
||||
["CLSID"] = "{R-98MR}",
|
||||
["num"] = 6,
|
||||
},
|
||||
[2] = {
|
||||
["CLSID"] = "{R-98MT}",
|
||||
["num"] = 1,
|
||||
},
|
||||
[3] = {
|
||||
["CLSID"] = "{R-60M}",
|
||||
["num"] = 5,
|
||||
},
|
||||
[4] = {
|
||||
["CLSID"] = "{R-60M}",
|
||||
["num"] = 2,
|
||||
},
|
||||
[5] = {
|
||||
["CLSID"] = "{E92CBFE5-C153-11d8-9897-000476191836}",
|
||||
["num"] = 4,
|
||||
},
|
||||
[6] = {
|
||||
["CLSID"] = "{E92CBFE5-C153-11d8-9897-000476191836}",
|
||||
["num"] = 3,
|
||||
},
|
||||
},
|
||||
["tasks"] = {
|
||||
[1] = 11,
|
||||
[2] = 10,
|
||||
},
|
||||
},
|
||||
},
|
||||
["tasks"] = {
|
||||
},
|
||||
["unitType"] = "Su_15TM",
|
||||
}
|
||||
return unitPayloads
|
||||
@@ -11,6 +11,7 @@
|
||||
"MiG-15bis Fagot",
|
||||
"MiG-19P Farmer-B",
|
||||
"MiG-21bis Fishbed-N",
|
||||
"Su-15 Flagon-A",
|
||||
"Tu-95MS Bear-H"
|
||||
],
|
||||
"awacs": [
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
"MiG-23MLD Flogger-K",
|
||||
"MiG-25PD Foxbat-E",
|
||||
"MiG-29A Fulcrum-A",
|
||||
"Su-15TM Flagon-E",
|
||||
"Su-17M4 Fitter-K",
|
||||
"Su-24M Fencer-D",
|
||||
"Su-25 Frogfoot",
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
"MiG-23MLD Flogger-K",
|
||||
"MiG-25PD Foxbat-E",
|
||||
"MiG-29A Fulcrum-A",
|
||||
"Su-15TM Flagon-E",
|
||||
"Su-17M4 Fitter-K",
|
||||
"Su-24M Fencer-D",
|
||||
"Su-25 Frogfoot",
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"MiG-27K Flogger-J2",
|
||||
"MiG-29A Fulcrum-A",
|
||||
"MiG-31 Foxhound",
|
||||
"Su-15TM Flagon-E",
|
||||
"Su-17M4 Fitter-K",
|
||||
"Su-24M Fencer-D",
|
||||
"Su-25 Frogfoot",
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
"CH-53E",
|
||||
"A-4E Skyhawk",
|
||||
"A-7E Corsair II",
|
||||
"EA-6B Prowler",
|
||||
"F-14A Tomcat (AI)",
|
||||
"F-14A Tomcat (Block 135-GR Late)",
|
||||
"F-4B Phantom II",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"C-130J-30 Super Hercules",
|
||||
"CH-47D",
|
||||
"CH-53E",
|
||||
"EA-6B Prowler",
|
||||
"F-117A Nighthawk",
|
||||
"F-14A Tomcat (AI)",
|
||||
"F-14A Tomcat (Block 135-GR Late)",
|
||||
|
||||
@@ -26,21 +26,22 @@
|
||||
"F-15E Strike Eagle (AI)",
|
||||
"F-15E Strike Eagle (Suite 4+)",
|
||||
"F-16CM Fighting Falcon (Block 50)",
|
||||
"F-16D Fighting Falcon (Block 52+)",
|
||||
"F-16D Fighting Falcon (Block 52)",
|
||||
"F-16D Fighting Falcon (Block 50+)",
|
||||
"F-16D Fighting Falcon (Block 50)",
|
||||
"F-16D Fighting Falcon (Block 52+)",
|
||||
"F-16D Fighting Falcon (Block 52)",
|
||||
"F-16D Fighting Falcon (Block 50+)",
|
||||
"F-16D Fighting Falcon (Block 50)",
|
||||
"F-22A Raptor",
|
||||
"F/A-18C Hornet (Lot 20)",
|
||||
"F/A-18E Super Hornet",
|
||||
"F/A-18F Super Hornet",
|
||||
"EA-18G Growler",
|
||||
"F/A-18E Super Hornet",
|
||||
"F/A-18F Super Hornet",
|
||||
"EA-6B Prowler",
|
||||
"EA-18G Growler",
|
||||
"OH-58D(R) Kiowa Warrior",
|
||||
"S-3B Viking",
|
||||
"SH-60B Seahawk",
|
||||
"UH-1H Iroquois",
|
||||
"UH-60A",
|
||||
"UH-60L"
|
||||
"UH-60A",
|
||||
"UH-60L"
|
||||
],
|
||||
"awacs": [
|
||||
"E-2C Hawkeye",
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"AH-1W SuperCobra",
|
||||
"A-4E Skyhawk",
|
||||
"A-6A Intruder",
|
||||
"EA-6B Prowler",
|
||||
"A-7E Corsair II",
|
||||
"F-14A Tomcat (AI)",
|
||||
"F-14A Tomcat (Block 135-GR Late)",
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
],
|
||||
"aircrafts": [
|
||||
"F-14B Tomcat",
|
||||
"EA-6B Prowler",
|
||||
"F/A-18C Hornet (Lot 20)",
|
||||
"F/A-18E Super Hornet",
|
||||
"F/A-18F Super Hornet",
|
||||
|
||||
@@ -11,7 +11,8 @@
|
||||
"F/A-18C Hornet (Lot 20)",
|
||||
"F/A-18E Super Hornet",
|
||||
"F/A-18F Super Hornet",
|
||||
"EA-18G Growler",
|
||||
"EA-18G Growler",
|
||||
"EA-6B Prowler",
|
||||
"AV-8B Harrier II Night Attack",
|
||||
"AH-1W SuperCobra",
|
||||
"S-3B Viking",
|
||||
|
||||
723
resources/plugins/arty/CG_ArtySpotter_V1_2a_MP.lua
Normal file
723
resources/plugins/arty/CG_ArtySpotter_V1_2a_MP.lua
Normal file
@@ -0,0 +1,723 @@
|
||||
-- Artillery Spotter script - Multiplayer version
|
||||
-- by Carsten Gurk aka Don Rudi
|
||||
|
||||
-- Map for passing settings from Retribution
|
||||
cg_arty_options = {
|
||||
["user_fireDelay"] = 10,
|
||||
["user_quantity"] = 20,
|
||||
["user_spread"] = 50,
|
||||
["user_spottingDistance"] = 15,
|
||||
}
|
||||
|
||||
local version = "MP 1.2"
|
||||
|
||||
-- User configurable variables
|
||||
|
||||
local user_fireDelay = cg_arty_options.user_fireDelay -- time to impcat of the rounds
|
||||
local user_quantity = cg_arty_options.user_quantity -- how many rounds will be fired in a fire for effect task
|
||||
local user_spread = cg_arty_options.user_spread -- impact radius of the rounds during fire for effect
|
||||
local user_spottingDistance = cg_arty_options.user_spottingDistance -- max allowable distance from player to target to prevent cheating. In kilometers.
|
||||
local user_restrictByType = "" -- Restriction by type ("", "helo", etc.)
|
||||
local user_restrictByUnitName = "" -- Restriction by unit name ("", "spotter", etc.), not case sensitive
|
||||
local user_markerPrefix = "" -- Prefix for marker text, for instance "#arty"
|
||||
|
||||
-- end of user block
|
||||
|
||||
-- Script variables
|
||||
|
||||
local SINGLE_ROUND = false -- pilot called single round on marker (from F10 menu)
|
||||
|
||||
local artyCall = 0 -- pilot called arty (from F10 menu)
|
||||
local artyRadius = user_spread -- Artillery Radius
|
||||
local adjustRadius = 20 -- fire adjustment
|
||||
local quantity = 1 -- Rounds expanded
|
||||
local quantity_effect = user_quantity -- Rounds expanded during fire for effect
|
||||
local tntEquivalent = 12 -- TNT equivalent for explosion
|
||||
local fireDelay = user_fireDelay -- delay til artillery fires in seconds
|
||||
|
||||
local firstShotFired = true
|
||||
|
||||
local markerSet = false
|
||||
|
||||
local pos = { x = 0, y = 0, z = 0 }
|
||||
local playerPos = { x = 0, y = 0, z = 0 }
|
||||
|
||||
local target = {}
|
||||
|
||||
local adjustX = 0
|
||||
local adjustZ = 0
|
||||
|
||||
local adjustDistance = 0 -- Adjust fire (from F10 menu)
|
||||
local adjustDirection = 0 -- Adjust fire (from F10 menu)
|
||||
|
||||
local position = ""
|
||||
|
||||
local markerText = ""
|
||||
|
||||
local artyTasks = {}
|
||||
|
||||
local menuItems = false
|
||||
|
||||
-- optional arty enabled user flag, for use in triggers, if the player wants to
|
||||
|
||||
trigger.action.setUserFlag( "artyEnabled", 1 )
|
||||
|
||||
|
||||
-- select format of target coordinates MGRS or LAT/LONG
|
||||
|
||||
local outputFormat = "MGRS"
|
||||
--local outputFormat = "LL"
|
||||
|
||||
|
||||
-- set values selected by player through F10 menu
|
||||
|
||||
local function setValue( _valueType, _value, _initiatorName )
|
||||
|
||||
if _valueType == "arty" then
|
||||
|
||||
artyCall = _value
|
||||
|
||||
end
|
||||
|
||||
if _valueType == "dist" then
|
||||
|
||||
adjustDistance = _value
|
||||
|
||||
trigger.action.outText("Fire adjusted by "..adjustDistance.." meters", 10)
|
||||
|
||||
end
|
||||
|
||||
if _valueType == "dir" then
|
||||
|
||||
adjustDirection = _value
|
||||
|
||||
end
|
||||
|
||||
artyAction( _initiatorName )
|
||||
|
||||
end
|
||||
|
||||
|
||||
-- Function to add F10 menu items for a specific group and store references
|
||||
|
||||
local function addMenuItems(groupId, initiatorName)
|
||||
|
||||
menuItems = true
|
||||
|
||||
local artyTask = artyTasks[initiatorName]
|
||||
|
||||
artyTask.ArtyMenu = missionCommands.addSubMenuForGroup(groupId, 'Artillery Commands')
|
||||
artyTask.AdjustDistance = missionCommands.addSubMenuForGroup(groupId, 'Adjust distance', artyTask.ArtyMenu)
|
||||
artyTask.AdjustDirection = missionCommands.addSubMenuForGroup(groupId, 'Adjust direction', artyTask.ArtyMenu)
|
||||
|
||||
artyTask.commands = {}
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'request single round', artyTask.ArtyMenu, function() setValue("arty", 1, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'request fire for effect', artyTask.ArtyMenu, function() setValue("arty", 2, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire by 20m', artyTask.AdjustDistance, function() setValue("dist", 20, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire by 50m', artyTask.AdjustDistance, function() setValue("dist", 50, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire by 100m', artyTask.AdjustDistance, function() setValue("dist", 100, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire by 200m', artyTask.AdjustDistance, function() setValue("dist", 200, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire by 500m', artyTask.AdjustDistance, function() setValue("dist", 500, initiatorName) end)
|
||||
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire North', artyTask.AdjustDirection, function() setValue("dir", 360, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire North-East', artyTask.AdjustDirection, function() setValue("dir", 45, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire East', artyTask.AdjustDirection, function() setValue("dir", 90, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire South-East', artyTask.AdjustDirection, function() setValue("dir", 135, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire South', artyTask.AdjustDirection, function() setValue("dir", 180, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire South-West', artyTask.AdjustDirection, function() setValue("dir", 225, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire West', artyTask.AdjustDirection, function() setValue("dir", 270, initiatorName) end)
|
||||
artyTask.commands[#artyTask.commands + 1] = missionCommands.addCommandForGroup(groupId, 'adjust fire North-West', artyTask.AdjustDirection, function() setValue("dir", 315, initiatorName) end)
|
||||
end
|
||||
|
||||
-- Function to remove F10 menu items for a specific group
|
||||
|
||||
local function removeMenuItems(initiatorName)
|
||||
|
||||
local artyTask = artyTasks[initiatorName]
|
||||
|
||||
if artyTask then
|
||||
|
||||
for _, command in ipairs(artyTask.commands) do
|
||||
missionCommands.removeItemForGroup(artyTasks[initiatorName].groupID, command)
|
||||
end
|
||||
missionCommands.removeItemForGroup(artyTasks[initiatorName].groupID, artyTask.AdjustDistance)
|
||||
missionCommands.removeItemForGroup(artyTasks[initiatorName].groupID, artyTask.AdjustDirection)
|
||||
missionCommands.removeItemForGroup(artyTasks[initiatorName].groupID, artyTask.ArtyMenu)
|
||||
end
|
||||
|
||||
menuItems = false
|
||||
|
||||
end
|
||||
|
||||
-- Calculate distance
|
||||
|
||||
local function getDist(_point1, _point2)
|
||||
|
||||
local xUnit = _point1.x
|
||||
local yUnit = _point1.z
|
||||
local xZone = _point2.x
|
||||
local yZone = _point2.z
|
||||
|
||||
local xDiff = xUnit - xZone
|
||||
local yDiff = yUnit - yZone
|
||||
|
||||
return math.sqrt(xDiff * xDiff + yDiff * yDiff)
|
||||
|
||||
end
|
||||
|
||||
-- Shelling Zone
|
||||
|
||||
local function shellZone ( _initiatorName )
|
||||
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Arty Task Created - fire incoming "..quantity.." rounds", 10)
|
||||
|
||||
if artyCall == 1 then
|
||||
artyRadius = 5
|
||||
else
|
||||
artyRadius = 50
|
||||
end
|
||||
|
||||
local _shellPos = artyTasks[_initiatorName].pos
|
||||
|
||||
if firstShotFired == true then
|
||||
_shellPos.x = _shellPos.x + adjustX
|
||||
_shellPos.y = _shellPos.y
|
||||
_shellPos.z = _shellPos.z + adjustZ
|
||||
end
|
||||
|
||||
for i = 1, quantity do
|
||||
|
||||
-- Create a random offset within the given radius
|
||||
|
||||
local randomX = math.random(-artyRadius, artyRadius)
|
||||
local randomZ = math.random(-artyRadius, artyRadius)
|
||||
|
||||
local strikePos = {
|
||||
x = _shellPos.x + randomX,
|
||||
y = _shellPos.y,
|
||||
z = _shellPos.z + randomZ
|
||||
}
|
||||
|
||||
-- Delay the shelling by 1 second for each shell
|
||||
|
||||
timer.scheduleFunction(function()
|
||||
trigger.action.explosion(strikePos, tntEquivalent) -- Create an explosion at the target position with a predefined power
|
||||
end, {}, timer.getTime() + i)
|
||||
end
|
||||
|
||||
--[[
|
||||
if firstShotFired == false then
|
||||
addMenuItems ()
|
||||
firstShotFired = true
|
||||
end
|
||||
]]--
|
||||
|
||||
end
|
||||
|
||||
-- MGRS conversion to LL to x,z
|
||||
|
||||
local function convertMGRStoPos ( _mrgs )
|
||||
|
||||
local lat, lon = coord.MGRStoLL( _mgrs )
|
||||
local markerPos = coord.LLtoLO( lat, lon, 0 )
|
||||
return markerPos
|
||||
|
||||
end
|
||||
|
||||
-- x,z coordinates conversion to LAT/LONG and MGRS
|
||||
|
||||
local function convertPos2Coord ( _pos, _reply )
|
||||
|
||||
local lat, lon, alt = coord.LOtoLL (_pos)
|
||||
local lat_degrees = math.floor (lat)
|
||||
local lat_minutes = (60 * (lat - lat_degrees))
|
||||
local lat_seconds = math.floor(60 * (lat_minutes - math.floor(lat_minutes)))
|
||||
lat_minutes = math.floor(lat_minutes)
|
||||
|
||||
local lon_degrees = math.floor (lon)
|
||||
local lon_minutes = (60 * (lon - lon_degrees))
|
||||
local lon_seconds = math.floor (60 * (lon_minutes - math.floor(lon_minutes)))
|
||||
lon_minutes = math.floor(lon_minutes)
|
||||
|
||||
local coordStringLL = "N" .. lat_degrees .. " " .. lat_minutes .. " " ..lat_seconds.. " E".. lon_degrees .. " " .. lon_minutes .. " ".. lon_seconds
|
||||
|
||||
local targetMGRS = coord.LLtoMGRS(lat, lon)
|
||||
targetMGRS.Easting = math.floor (( targetMGRS.Easting /10 ) + 0.5 )
|
||||
targetMGRS.Northing = math.floor (( targetMGRS.Northing / 10 ) + 0.5 )
|
||||
--local coordStringMGRS = targetMGRS.UTMZone.." "..targetMGRS.MGRSDigraph.." "..string.sub(targetMGRS.Easting, 1, -2).." "..string.sub(targetMGRS.Northing, 1, -2)
|
||||
local coordStringMGRS = targetMGRS.UTMZone.." "..targetMGRS.MGRSDigraph.." "..targetMGRS.Easting.." "..targetMGRS.Northing
|
||||
|
||||
if outputFormat == "MGRS" then
|
||||
coordString = coordStringMGRS
|
||||
else
|
||||
coordString = coordStringLL
|
||||
end
|
||||
|
||||
-- return either formated string or MGRS coordinate
|
||||
|
||||
if _reply == "string" then
|
||||
return coordString
|
||||
elseif _reply == "pos" then
|
||||
return targetMGRS
|
||||
end
|
||||
end
|
||||
|
||||
-- Who is the player
|
||||
|
||||
-- Function to determine which unit is controlled by the player
|
||||
--[[
|
||||
local function getPlayerControlledUnit()
|
||||
|
||||
local playerUnit = nil
|
||||
|
||||
-- Iterate through all coalitions and their respective player units
|
||||
|
||||
for coalitionID = 1, 2 do -- 1 = Red, 2 = Blue
|
||||
local playerUnits = coalition.getPlayers(coalitionID)
|
||||
for _, unit in ipairs(playerUnits) do
|
||||
if unit and unit:getPlayerName() then
|
||||
playerUnit = unit
|
||||
break
|
||||
end
|
||||
end
|
||||
if playerUnit then
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
return playerUnit
|
||||
end
|
||||
]]--
|
||||
|
||||
-- Check if user has created F10 map marker
|
||||
|
||||
artyAction = function ( _initiatorName )
|
||||
|
||||
-- Check Call for arty - 1 = single round, 2 = fire for effect
|
||||
|
||||
if artyCall == 1 or artyCall == 2 then
|
||||
|
||||
if MARKER_FOUND == true and artyTasks[_initiatorName] then
|
||||
|
||||
-- check if target is within 15km from player
|
||||
|
||||
--trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Arty action marker found.", 10)
|
||||
|
||||
--local _player = _initiator
|
||||
local _playerPos = artyTasks[_initiatorName].playerPos
|
||||
local _targetPos = artyTasks[_initiatorName].pos
|
||||
|
||||
local _dist = math.floor( getDist ( _targetPos, _playerPos ) / 10 ) / 100
|
||||
|
||||
if trigger.misc.getUserFlag( "artyEnabled" ) == 1 and _dist <= user_spottingDistance then
|
||||
|
||||
position = convertPos2Coord ( _targetPos, "string" )
|
||||
|
||||
if artyCall == 1 then
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Arty single round requested on "..position, 10)
|
||||
quantity = 1
|
||||
|
||||
elseif artyCall == 2 then
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Arty fire for effect requested on "..position, 10)
|
||||
quantity = quantity_effect
|
||||
end
|
||||
|
||||
timer.scheduleFunction(shellZone, _initiatorName, timer.getTime() + fireDelay)
|
||||
trigger.action.setUserFlag( "artyFired", 1 )
|
||||
|
||||
else
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Artillery not available", 10)
|
||||
end
|
||||
|
||||
else
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Arty Requested Without Marker", 10)
|
||||
end
|
||||
|
||||
artyCall = 0
|
||||
|
||||
end
|
||||
|
||||
-- Check Call for arty direction correction
|
||||
|
||||
if adjustDirection == 360 then
|
||||
|
||||
adjustX = adjustDistance
|
||||
adjustZ = 0
|
||||
artyRadius = 5
|
||||
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Fire adjusted to the North", 10)
|
||||
|
||||
adjustDirection = 0
|
||||
end
|
||||
|
||||
if adjustDirection == 45 then
|
||||
|
||||
adjustX = adjustDistance
|
||||
adjustZ = adjustDistance
|
||||
artyRadius = 5
|
||||
|
||||
adjustDirection = 0
|
||||
end
|
||||
|
||||
if adjustDirection == 90 then
|
||||
|
||||
adjustX = 0
|
||||
adjustZ = adjustDistance
|
||||
artyRadius = 5
|
||||
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Fire adjusted to the East", 10)
|
||||
|
||||
adjustDirection = 0
|
||||
end
|
||||
|
||||
if adjustDirection == 135 then
|
||||
|
||||
adjustX = -adjustDistance
|
||||
adjustZ = adjustDistance
|
||||
artyRadius = 5
|
||||
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Fire adjusted to the South-East", 10)
|
||||
|
||||
adjustDirection = 0
|
||||
end
|
||||
|
||||
if adjustDirection == 180 then
|
||||
|
||||
adjustX = -adjustDistance
|
||||
adjustZ = 0
|
||||
artyRadius = 5
|
||||
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Fire adjusted to the South", 10)
|
||||
|
||||
adjustDirection = 0
|
||||
end
|
||||
|
||||
if adjustDirection == 225 then
|
||||
|
||||
adjustX = -adjustDistance
|
||||
adjustZ = -adjustDistance
|
||||
artyRadius = 5
|
||||
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Fire adjusted to the South-West", 10)
|
||||
|
||||
adjustDirection = 0
|
||||
end
|
||||
|
||||
if adjustDirection == 270 then
|
||||
|
||||
adjustX = 0
|
||||
adjustZ = -adjustDistance
|
||||
artyRadius = 5
|
||||
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Fire adjusted meters to the West", 10)
|
||||
|
||||
adjustDirection = 0
|
||||
end
|
||||
|
||||
if adjustDirection == 315 then
|
||||
|
||||
adjustX = adjustDistance
|
||||
adjustZ = -adjustDistance
|
||||
artyRadius = 5
|
||||
|
||||
trigger.action.outTextForUnit( artyTasks[_initiatorName].unitID, "Fire adjusted meters to the North-West", 10)
|
||||
|
||||
adjustDirection = 0
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- Main
|
||||
|
||||
trigger.action.outText("Arty spotter script "..version.." loaded", 10)
|
||||
|
||||
|
||||
-- Map Marker Text - read and process
|
||||
|
||||
-- Function to remove spaces from a string
|
||||
|
||||
local function removeSpaces( _text )
|
||||
|
||||
_text = _text:gsub( " ", "" )
|
||||
_text = _text:gsub( "-", "" )
|
||||
return _text
|
||||
|
||||
end
|
||||
|
||||
-- Function to validate the structure of the MGRS coordinate
|
||||
|
||||
local function checkValidMGRS( _mgrs, len)
|
||||
|
||||
if len == 13 then
|
||||
|
||||
-- Pattern: 2 digits 1 letter UTM Zone, 2 letters MGRS Digraph, 4 digits Easting, 4 digits Northing
|
||||
return _mgrs:match("^%d%d%u%u%u%d%d%d%d%d%d%d%d$")
|
||||
|
||||
elseif len == 10 then
|
||||
|
||||
-- Pattern: 2 letters MGRS Digraph, 4 digits Easting, 4 digits Northing
|
||||
return _mgrs:match("^%u%u%d%d%d%d%d%d%d%d$")
|
||||
|
||||
elseif len == 8 then
|
||||
|
||||
-- Pattern: 4 digits Easting, 4 digits Northing
|
||||
return _mgrs:match("^%d%d%d%d%d%d%d%d$")
|
||||
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
-- Function to validate and complete MGRS coordinates
|
||||
|
||||
local function processMGRS( _text, _playerPos, initiatorName )
|
||||
local _cleanedText = string.upper( removeSpaces( _text ) )
|
||||
local len = #_cleanedText
|
||||
|
||||
local _isValidMGRS = checkValidMGRS( _cleanedText, len)
|
||||
|
||||
if _isValidMGRS then
|
||||
|
||||
trigger.action.outTextForUnit( artyTasks[initiatorName].unitID, "Processing MGRS: " .. _cleanedText, 10)
|
||||
|
||||
if len == 13 then
|
||||
|
||||
-- Complete MGRS coordinate
|
||||
return _cleanedText
|
||||
|
||||
elseif len == 10 then
|
||||
|
||||
-- Add UTM Zone based on player position
|
||||
local _utmZone = coord.LLtoMGRS(_playerPos.Lat, _playerPos.Lon).UTMZone
|
||||
return _utmZone .. _cleanedText
|
||||
|
||||
elseif len == 8 then
|
||||
|
||||
-- Add UTM Zone and MGRS Digraph based on player position
|
||||
local _mgrs = coord.LLtoMGRS( _playerPos.Lat, _playerPos.Lon )
|
||||
return _mgrs.UTMZone .. _mgrs.MGRSDigraph .. _cleanedText
|
||||
|
||||
else
|
||||
|
||||
-- Invalid MGRS coordinate
|
||||
return nil
|
||||
end
|
||||
|
||||
else
|
||||
|
||||
trigger.action.outTextForUnit( artyTasks[initiatorName].unitID, "Invalid text input: " .. _cleanedText, 10)
|
||||
return nil
|
||||
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
-- Function to convert a valid MGRS to vec3
|
||||
local function MGRStoVec3( _mgrs )
|
||||
|
||||
local lat, lon = coord.MGRStoLL( _mgrs )
|
||||
local vec3 = coord.LLtoLO( lat, lon, 0 )
|
||||
return vec3
|
||||
end
|
||||
|
||||
-- Function to check if the initiator is valid based on restrictions
|
||||
|
||||
local function isValidInitiator(initiator)
|
||||
if not initiator then return false end
|
||||
|
||||
-- Check type restriction
|
||||
|
||||
if user_restrictByType == "helo" then
|
||||
|
||||
if not initiator:getDesc().category == Unit.Category.Helicopter then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
-- Check name restriction
|
||||
|
||||
if user_restrictByUnitName ~= "" then
|
||||
|
||||
local name = initiator:getName():lower()
|
||||
|
||||
if not name:find(user_restrictByUnitName:lower()) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
-- Function to check if the marker text has the required prefix and remove it
|
||||
|
||||
local function checkAndRemovePrefix(text)
|
||||
|
||||
if user_markerPrefix ~= "" and text:sub(1, #user_markerPrefix) == user_markerPrefix then
|
||||
|
||||
return true, text:sub(#user_markerPrefix + 1)
|
||||
|
||||
elseif user_markerPrefix == "" then
|
||||
|
||||
return true, text
|
||||
|
||||
else
|
||||
|
||||
return false, text
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
-- Event handler for map marker creation
|
||||
local function onPlayerAddMarker(event)
|
||||
|
||||
|
||||
if event.id == world.event.S_EVENT_MARK_ADDED and user_markerPrefix == "" then
|
||||
|
||||
if isValidInitiator(event.initiator) then
|
||||
|
||||
--local hasPrefix, cleanedText = checkAndRemovePrefix(event.text)
|
||||
hasPrefix = true
|
||||
|
||||
if hasPrefix then
|
||||
|
||||
MARKER_FOUND = true
|
||||
pos = event.pos
|
||||
|
||||
if event.initiator then
|
||||
|
||||
local initiatorName = event.initiator:getName()
|
||||
|
||||
local playerUnit = event.initiator
|
||||
local playerPos = playerUnit:getPoint()
|
||||
|
||||
-- Store position
|
||||
|
||||
if not artyTasks[initiatorName] then
|
||||
artyTasks[initiatorName] = {}
|
||||
end
|
||||
|
||||
trigger.action.outTextForUnit( event.initiator:getID(), "Marker added", 5)
|
||||
|
||||
artyTasks[initiatorName].playerPos = playerPos
|
||||
artyTasks[initiatorName].pos = pos
|
||||
artyTasks[initiatorName].unitID = event.initiator:getID()
|
||||
|
||||
-- Add menu items for the initiator's group
|
||||
local groupId = event.initiator:getGroup():getID()
|
||||
artyTasks[initiatorName].groupID = groupId
|
||||
|
||||
if menuItems == false then
|
||||
addMenuItems(groupId, initiatorName)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
else
|
||||
--trigger.action.outText("You do not have permission to add a marker.", 5)
|
||||
end
|
||||
|
||||
elseif event.id == world.event.S_EVENT_MARK_CHANGE then
|
||||
|
||||
if isValidInitiator(event.initiator) then
|
||||
|
||||
local hasPrefix, cleanedText = checkAndRemovePrefix(event.text)
|
||||
|
||||
if hasPrefix then
|
||||
|
||||
MARKER_FOUND = true
|
||||
|
||||
local markText = cleanedText
|
||||
|
||||
trigger.action.outText("Text: "..markText, 10)
|
||||
|
||||
if markText and event.initiator then
|
||||
|
||||
local initiatorName = event.initiator:getName()
|
||||
local playerUnit = event.initiator
|
||||
|
||||
if not artyTasks[initiatorName] then
|
||||
artyTasks[initiatorName] = {}
|
||||
end
|
||||
|
||||
artyTasks[initiatorName].initiator = event.initiator
|
||||
artyTasks[initiatorName].unitID = event.initiator:getID()
|
||||
|
||||
trigger.action.outTextForUnit( event.initiator:getID(), "Marker changed", 5)
|
||||
|
||||
if playerUnit then
|
||||
|
||||
local playerPos = playerUnit:getPoint()
|
||||
local lat, lon = coord.LOtoLL(playerPos)
|
||||
local playerPosition = { Lat = lat, Lon = lon }
|
||||
local validMGRS = processMGRS(markText, playerPosition, initiatorName)
|
||||
|
||||
if validMGRS then
|
||||
|
||||
trigger.action.outTextForUnit( artyTasks[initiatorName].unitID, "Valid MGRS: " .. validMGRS, 10)
|
||||
|
||||
local tmpMGRS = {
|
||||
UTMZone = string.sub(validMGRS, 1, 3),
|
||||
MGRSDigraph = string.sub(validMGRS, 4, 5),
|
||||
Easting = tonumber(string.sub(validMGRS, 6, 9)) * 10,
|
||||
Northing = tonumber(string.sub(validMGRS, 10, 13)) * 10
|
||||
}
|
||||
|
||||
local targetPoint = MGRStoVec3(tmpMGRS)
|
||||
targetPoint.y = land.getHeight({ x = targetPoint.x, y = targetPoint.z })
|
||||
|
||||
|
||||
artyTasks[initiatorName].pos = targetPoint
|
||||
artyTasks[initiatorName].playerPos = playerPos
|
||||
|
||||
|
||||
else
|
||||
trigger.action.outTextForUnit( artyTasks[initiatorName].unitID, "Invalid MGRS coordinate entered.", 10)
|
||||
end
|
||||
|
||||
local groupId = event.initiator:getGroup():getID()
|
||||
artyTasks[initiatorName].groupID = groupId
|
||||
|
||||
if menuItems == false then
|
||||
addMenuItems(groupId, initiatorName)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
--trigger.action.outText("You do not have permission to change this marker.", 5)
|
||||
end
|
||||
|
||||
elseif event.id == world.event.S_EVENT_MARK_REMOVED then
|
||||
|
||||
trigger.action.outText("Marker removed", 5)
|
||||
|
||||
if event.initiator then
|
||||
|
||||
local initiatorName = event.initiator:getName()
|
||||
|
||||
if artyTasks[initiatorName] then
|
||||
|
||||
removeMenuItems(initiatorName)
|
||||
artyTasks[initiatorName] = nil
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Register the event handler
|
||||
local eventHandler = { f = onPlayerAddMarker }
|
||||
function eventHandler:onEvent(e)
|
||||
self.f(e)
|
||||
end
|
||||
world.addEventHandler(eventHandler)
|
||||
|
||||
|
||||
|
||||
|
||||
22
resources/plugins/arty/arty-config.lua
Normal file
22
resources/plugins/arty/arty-config.lua
Normal file
@@ -0,0 +1,22 @@
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- configuration file for Carsten's Arty Spotter Plugin
|
||||
--
|
||||
-- This configuration is tailored for a mission generated by DCS Retribution
|
||||
-- see https://github.com/dcs-retribution/dcs-retribution
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
-- arty plugin - configuration
|
||||
if dcsRetribution then
|
||||
-- retrieve specific options values
|
||||
if dcsRetribution.plugins then
|
||||
if dcsRetribution.plugins.arty then
|
||||
env.info("DCSRetribution|Carsten's Arty Spotter plugin - Setting Up")
|
||||
|
||||
cg_arty_options.user_fireDelay = dcsRetribution.plugins.arty.user_fireDelay
|
||||
cg_arty_options.user_quantity = dcsRetribution.plugins.arty.user_quantity
|
||||
cg_arty_options.user_spread = dcsRetribution.plugins.arty.user_spread
|
||||
cg_arty_options.user_spottingDistance = dcsRetribution.plugins.arty.user_spottingDistance
|
||||
end
|
||||
end
|
||||
end
|
||||
38
resources/plugins/arty/plugin.json
Normal file
38
resources/plugins/arty/plugin.json
Normal file
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"nameInUI": "Carsten's Arty Spotter",
|
||||
"defaultValue": false,
|
||||
"specificOptions": [
|
||||
{
|
||||
"nameInUI": "Time to impcat of the rounds",
|
||||
"mnemonic": "user_fireDelay",
|
||||
"defaultValue": 15
|
||||
},
|
||||
{
|
||||
"nameInUI": "Salvo quantity",
|
||||
"mnemonic": "user_quantity",
|
||||
"defaultValue": 5
|
||||
},
|
||||
{
|
||||
"nameInUI": "Impact radius",
|
||||
"mnemonic": "user_spread",
|
||||
"defaultValue": 150
|
||||
},
|
||||
{
|
||||
"nameInUI": "Max spotting distance. In kilometers.",
|
||||
"mnemonic": "user_spottingDistance",
|
||||
"defaultValue": 15
|
||||
}
|
||||
],
|
||||
"scriptsWorkOrders": [
|
||||
{
|
||||
"file": "CG_ArtySpotter_V1_2a_MP.lua",
|
||||
"mnemonic": "arty"
|
||||
}
|
||||
],
|
||||
"configurationWorkOrders": [
|
||||
{
|
||||
"file": "arty-config.lua",
|
||||
"mnemonic": "arty-config"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
[
|
||||
"base",
|
||||
"ctld",
|
||||
"arty",
|
||||
"dismounts",
|
||||
"ewrj",
|
||||
"ewrs",
|
||||
|
||||
@@ -3,8 +3,7 @@ name: Australian Army
|
||||
country: Australia
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- AUS Army Fictional
|
||||
livery: AUS Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: German Army
|
||||
country: Germany
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- DE Army Fictional
|
||||
livery: DE Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: Spanish Army
|
||||
country: Spain
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- ES Army Fictional
|
||||
livery: ES Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: French Army
|
||||
country: France
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- FR Army Fictional
|
||||
livery: FR Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: Greek Army
|
||||
country: Greece
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- GR Army Fictional
|
||||
livery: GR Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: Israeli Army
|
||||
country: Israel
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- ISR Army Fictional
|
||||
livery: ISR Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: Japanese Army
|
||||
country: Japan
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- JPN Army Fictional
|
||||
livery: JPN Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: Dutch Army
|
||||
country: The Netherlands
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- NL Army Fictional
|
||||
livery: NL Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: Polish Army
|
||||
country: Poland
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- PL Army Fictional
|
||||
livery: PL Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: Russian Army
|
||||
country: Russia
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- RU Army Fictional
|
||||
livery: RU Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: Tunisian Army
|
||||
country: Tunisia
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- TUN Army
|
||||
livery: TUN Army
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: Taiwanese Army
|
||||
country: Combined Joint Task Forces Blue
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- TWN Army Fictional
|
||||
livery: TWN Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: British Army Air Corps Desert
|
||||
country: UK
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- UK Army Fictional Desert
|
||||
livery: UK Army Fictional Desert
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -3,8 +3,7 @@ name: British Army Air Corps
|
||||
country: UK
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- UK Army Fictional
|
||||
livery: UK Army Fictional
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -5,8 +5,7 @@ female_pilot_percentage: 10
|
||||
country: USA
|
||||
role: Light Attack and Scout Helicopter
|
||||
aircraft: OH-58D(R) Kiowa Warrior
|
||||
livery:
|
||||
- US 3-17 B 937 Iraq
|
||||
livery: US 3-17 B 937 Iraq
|
||||
mission_types:
|
||||
- BAI
|
||||
- CAS
|
||||
|
||||
@@ -590,6 +590,11 @@ QFrame[style="QConditionsWidget"] {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
QFrame[style="QConditionsWidget"]:hover {
|
||||
cursor: pointer;
|
||||
background: #43A6C6;
|
||||
}
|
||||
|
||||
QGroupBox[style="QWeatherWidget"] {
|
||||
padding: 0px;
|
||||
margin-left: 0px;
|
||||
@@ -664,3 +669,7 @@ QCalendarWidget QTableView{
|
||||
.comms {
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
BIN
resources/ui/units/aircrafts/banners/EA_6B.jpg
Normal file
BIN
resources/ui/units/aircrafts/banners/EA_6B.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 132 KiB |
BIN
resources/ui/units/aircrafts/icons/EA_6B_24.jpg
Normal file
BIN
resources/ui/units/aircrafts/icons/EA_6B_24.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
BIN
resources/ui/units/aircrafts/icons/Su_15TM_24.jpg
Normal file
BIN
resources/ui/units/aircrafts/icons/Su_15TM_24.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.1 KiB |
BIN
resources/ui/units/aircrafts/icons/Su_15_24.jpg
Normal file
BIN
resources/ui/units/aircrafts/icons/Su_15_24.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.9 KiB |
17
resources/units/aircraft/EA_6B.yaml
Normal file
17
resources/units/aircraft/EA_6B.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
carrier_capable: true
|
||||
description:
|
||||
"The Northrop Grumman EA-6B Prowler is a twin-engine, four-seat, mid-wing electronic-warfare \
|
||||
\ aircraft derived from the A-6 Intruder airframe. The EA-6A was the initial electronic warfare \
|
||||
\ version of the A-6 used by the United States Marine Corps and United States Navy. \
|
||||
\ It was capable of carrying and firing anti-radiation missiles (ARMs), such as the AGM-88 HARM."
|
||||
introduced: 1971
|
||||
manufacturer: Northrop Grumman
|
||||
origin: USA
|
||||
price: 11
|
||||
role: Carrier-based Electronic-warfare Aircraft
|
||||
gunfighter: false
|
||||
variants:
|
||||
EA-6B Prowler: {}
|
||||
tasks:
|
||||
SEAD: 460
|
||||
SEAD Escort: 460
|
||||
@@ -29,7 +29,7 @@ radios:
|
||||
default_overrides:
|
||||
#NetCrewControlPriority: 0,
|
||||
#Remove_doors: true,
|
||||
PDU: true,
|
||||
#PDU: true,
|
||||
#Rifles: true,
|
||||
#MMS_removal: false,
|
||||
#Rapid_Deployment_Gear: false,
|
||||
|
||||
20
resources/units/aircraft/Su_15.yaml
Normal file
20
resources/units/aircraft/Su_15.yaml
Normal file
@@ -0,0 +1,20 @@
|
||||
description:
|
||||
"The Sukhoi Su-15 (NATO reporting name: Flagon) is a twinjet supersonic interceptor
|
||||
aircraft developed by the Soviet Union. It entered service in 1965 and remained one
|
||||
of the front-line designs into the 1990s."
|
||||
introduced: 1965
|
||||
manufacturer: Sukhoi
|
||||
origin: USSR/Russia
|
||||
price: 12
|
||||
role: Interceptor
|
||||
max_range: 200
|
||||
gunfighter: true
|
||||
variants:
|
||||
Su-15 Flagon-A: {}
|
||||
kneeboard_units: "metric"
|
||||
tasks:
|
||||
BARCAP: 360
|
||||
Escort: 360
|
||||
Fighter sweep: 360
|
||||
Intercept: 360
|
||||
TARCAP: 360
|
||||
23
resources/units/aircraft/Su_15TM.yaml
Normal file
23
resources/units/aircraft/Su_15TM.yaml
Normal file
@@ -0,0 +1,23 @@
|
||||
description:
|
||||
"The Sukhoi Su-15 (NATO reporting name: Flagon) is a twinjet supersonic interceptor
|
||||
aircraft developed by the Soviet Union. It entered service in 1965 and remained one
|
||||
of the front-line designs into the 1990s. The Flagon-A was followed in December 1971
|
||||
by the Su-15TM (NATO Flagon-E), with the improved Taifun-M radar (NATO Twin Scan)
|
||||
and provision for UPK-23-250 gun pod or R-60 (AA-8 Aphid) short-range air-to-air
|
||||
missiles."
|
||||
introduced: 1971
|
||||
manufacturer: Sukhoi
|
||||
origin: USSR/Russia
|
||||
price: 12
|
||||
role: Interceptor
|
||||
max_range: 200
|
||||
gunfighter: true
|
||||
variants:
|
||||
Su-15TM Flagon-E: {}
|
||||
kneeboard_units: "metric"
|
||||
tasks:
|
||||
BARCAP: 370
|
||||
Escort: 370
|
||||
Fighter sweep: 370
|
||||
Intercept: 370
|
||||
TARCAP: 370
|
||||
@@ -15,7 +15,6 @@ tasks:
|
||||
BAI: 350
|
||||
CAS: 450
|
||||
DEAD: 450
|
||||
Escort: 90
|
||||
OCA/Aircraft: 400
|
||||
OCA/Runway: 400
|
||||
SEAD: 450
|
||||
|
||||
@@ -16,15 +16,8 @@ gunfighter: true
|
||||
variants:
|
||||
F-104S Starfighter: {}
|
||||
tasks:
|
||||
Anti-ship: 150
|
||||
BAI: 140
|
||||
BARCAP: 250
|
||||
CAS: 140
|
||||
DEAD: 140
|
||||
Escort: 150
|
||||
Fighter sweep: 200
|
||||
Intercept: 300
|
||||
OCA/Aircraft: 140
|
||||
OCA/Runway: 200
|
||||
Strike: 50
|
||||
TARCAP: 250
|
||||
|
||||
@@ -18,13 +18,8 @@ variants:
|
||||
tasks:
|
||||
Anti-ship: 150
|
||||
BAI: 140
|
||||
BARCAP: 250
|
||||
CAS: 140
|
||||
DEAD: 140
|
||||
Escort: 150
|
||||
Fighter sweep: 200
|
||||
Intercept: 300
|
||||
OCA/Aircraft: 140
|
||||
OCA/Runway: 200
|
||||
Strike: 50
|
||||
TARCAP: 250
|
||||
|
||||
@@ -4,4 +4,6 @@ fallback: AIM-7E
|
||||
#Ignore how the CLSIDs look, these are not normal 7Es they are 7E-2 DOGFIGHT MISSILES
|
||||
clsids:
|
||||
- "{LAU-115 - AIM-7E}"
|
||||
- "{AIM-7E}"
|
||||
- "{AIM-7E}"
|
||||
- "{AIM-7E-2}"
|
||||
- "{HB_F4E_AIM-7E-2}"
|
||||
|
||||
@@ -4,4 +4,5 @@ fallback: AIM-9X
|
||||
# Do not add the other 7E looking names, they are actually AIM-7E-2 6 years newer
|
||||
clsids:
|
||||
- "{SHOULDER AIM-7E}"
|
||||
- "{BELLY AIM-7E}"
|
||||
- "{BELLY AIM-7E}"
|
||||
- "{HB_F4E_AIM-7E}"
|
||||
|
||||
@@ -5,4 +5,5 @@ clsids:
|
||||
- "{SHOULDER AIM-7F}"
|
||||
- "{BELLY AIM-7F}"
|
||||
- "{AIM-7F}"
|
||||
- "{LAU-115 - AIM-7F}"
|
||||
- "{LAU-115 - AIM-7F}"
|
||||
- "{HB_F4E_AIM-7F}"
|
||||
|
||||
@@ -6,3 +6,4 @@ clsids:
|
||||
- "{BELLY AIM-7M}"
|
||||
- "{8D399DDA-FF81-4F14-904D-099B34FE7918}"
|
||||
- "{LAU-115 - AIM-7M}"
|
||||
- "{HB_F4E_AIM-7M}"
|
||||
|
||||
7
resources/weapons/a2a-missiles/AIM-7P.yaml
Normal file
7
resources/weapons/a2a-missiles/AIM-7P.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
name: AIM-7P
|
||||
year: 1987
|
||||
fallback: AIM-7M
|
||||
clsids:
|
||||
- "{SHOULDER AIM-7P}"
|
||||
- "{BELLY AIM-7P}"
|
||||
- "{AIM-7P}"
|
||||
@@ -10,3 +10,5 @@ clsids:
|
||||
- "LAU-127_AIM-9L"
|
||||
- "{LAU-138 wtip - AIM-9L}"
|
||||
- "{LAU-7 - AIM-9L}"
|
||||
- "{LAU-7_AIM-9L_Left}"
|
||||
- "{LAU-7_AIM-9L_Right}"
|
||||
|
||||
@@ -11,3 +11,5 @@ clsids:
|
||||
- "{LAU-138 wtip - AIM-9M}"
|
||||
- "{LAU-7 - AIM-9M}"
|
||||
- "{AIM-9M-ON-ADAPTER}"
|
||||
- "{LAU-7_AIM-9M_Left}"
|
||||
- "{LAU-7_AIM-9M_Right}"
|
||||
|
||||
6
resources/weapons/standoff/AGM-12A.yaml
Normal file
6
resources/weapons/standoff/AGM-12A.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
name: AGM-12A
|
||||
year: 1959
|
||||
fallback: Mk 84
|
||||
clsids:
|
||||
- "{AGM_12A}"
|
||||
- "{AGM_12A_SWA}"
|
||||
6
resources/weapons/standoff/AGM-12B.yaml
Normal file
6
resources/weapons/standoff/AGM-12B.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
name: AGM-12B
|
||||
year: 1960
|
||||
fallback: AGM-12A
|
||||
clsids:
|
||||
- "{AGM_12B}"
|
||||
- "{AGM_12B_SWA}"
|
||||
6
resources/weapons/standoff/AGM-12C.yaml
Normal file
6
resources/weapons/standoff/AGM-12C.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
name: AGM-12C
|
||||
year: 1965
|
||||
fallback: AGM-12B
|
||||
clsids:
|
||||
- "{AGM_12C}"
|
||||
- "{AGM_12C_SWA}"
|
||||
@@ -3,3 +3,6 @@ year: 1965
|
||||
type: ARM
|
||||
clsids:
|
||||
- "{AGM_45A}"
|
||||
- "{LAU118_AGM_45A}"
|
||||
- "{LAU_34_AGM_45A}"
|
||||
- "{LAU_34_AGM_45A_SWA}"
|
||||
|
||||
5
resources/weapons/standoff/AGM-62-I.yaml
Normal file
5
resources/weapons/standoff/AGM-62-I.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
name: AGM-62 Walleye I
|
||||
year: 1967
|
||||
fallback: AGM-12C
|
||||
clsids:
|
||||
- "{AGM_62_I}"
|
||||
@@ -1,5 +1,5 @@
|
||||
name: AGM-62 Walleye II
|
||||
year: 1972
|
||||
fallback: Mk 84
|
||||
fallback: AGM-62 Walleye I
|
||||
clsids:
|
||||
- "{C40A1E3A-DD05-40D9-85A4-217729E37FAE}"
|
||||
|
||||
5
resources/weapons/standoff/AGM-65A-2X.yaml
Normal file
5
resources/weapons/standoff/AGM-65A-2X.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
name: 2xAGM-65A
|
||||
year: 1972
|
||||
clsids:
|
||||
- "{HB_F4EAGM-65A_LAU88_2x_Right}"
|
||||
- "{HB_F4EAGM-65A_LAU88_2x_Left}"
|
||||
5
resources/weapons/standoff/AGM-65A-3X.yaml
Normal file
5
resources/weapons/standoff/AGM-65A-3X.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
name: 3xAGM-65A
|
||||
year: 1972
|
||||
clsids:
|
||||
- "{HB_F4EAGM-65A_LAU88_3x_Right}"
|
||||
- "{HB_F4EAGM-65A_LAU88_3x_Left}"
|
||||
@@ -3,3 +3,5 @@ year: 1972
|
||||
fallback: AGM-62 Walleye II
|
||||
clsids:
|
||||
- "LAU_117_AGM_65A"
|
||||
- "{HB_F4E_AGM-65A_LAU117}"
|
||||
- "{HB_F4E_AGM-65A_LAU117_SWA}"
|
||||
|
||||
5
resources/weapons/standoff/AGM-65B-2X.yaml
Normal file
5
resources/weapons/standoff/AGM-65B-2X.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
name: 2xAGM-65B
|
||||
year: 1975
|
||||
clsids:
|
||||
- "{HB_F4EAGM-65B_LAU88_2x_Right}"
|
||||
- "{HB_F4EAGM-65B_LAU88_2x_Left}"
|
||||
5
resources/weapons/standoff/AGM-65B-3X.yaml
Normal file
5
resources/weapons/standoff/AGM-65B-3X.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
name: 3xAGM-65B
|
||||
year: 1975
|
||||
clsids:
|
||||
- "{HB_F4EAGM-65B_LAU88_3x_Right}"
|
||||
- "{HB_F4EAGM-65B_LAU88_3x_Left}"
|
||||
@@ -3,3 +3,5 @@ year: 1975
|
||||
fallback: AGM-65A
|
||||
clsids:
|
||||
- "LAU_117_AGM_65B"
|
||||
- "{HB_F4E_AGM-65B_LAU117}"
|
||||
- "{HB_F4E_AGM-65B_LAU117_SWA}"
|
||||
|
||||
@@ -4,3 +4,5 @@ fallback: AGM-65D
|
||||
clsids:
|
||||
- "{E6A6262A-CA08-4B3D-B030-E1A993B98452}"
|
||||
- "{E6A6262A-CA08-4B3D-B030-E1A993B98453}"
|
||||
- "{HB_F4EAGM-65D_LAU88_2x_Right}"
|
||||
- "{HB_F4EAGM-65D_LAU88_2x_Left}"
|
||||
|
||||
@@ -3,3 +3,5 @@ year: 1986
|
||||
fallback: 2xAGM-65D
|
||||
clsids:
|
||||
- "{DAC53A2F-79CA-42FF-A77A-F5649B601308}"
|
||||
- "{HB_F4EAGM-65D_LAU88_3x_Right}"
|
||||
- "{HB_F4EAGM-65D_LAU88_3x_Left}"
|
||||
|
||||
@@ -5,3 +5,5 @@ clsids:
|
||||
- "{444BA8AE-82A7-4345-842E-76154EFCCA47}"
|
||||
- "{444BA8AE-82A7-4345-842E-76154EFCCA46}"
|
||||
- "LAU_88_AGM_65D_ONE"
|
||||
- "{HB_F4E_AGM-65D_LAU117}"
|
||||
- "{HB_F4E_AGM-65D_LAU117_SWA}"
|
||||
|
||||
@@ -3,3 +3,5 @@ year: 1989
|
||||
fallback: AGM-65F
|
||||
clsids:
|
||||
- "LAU_117_AGM_65G"
|
||||
- "{LAU_117A_AGM_65G}"
|
||||
- "{HB_F4E_AGM-65G_LAU117}"
|
||||
|
||||
Reference in New Issue
Block a user