Merge remote-tracking branch 'remotes/dcs-retribution/dcs-retribution/dev' into pretense-generator

This commit is contained in:
MetalStormGhost
2024-07-05 12:06:53 +03:00
111 changed files with 2645 additions and 500 deletions

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View 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

View 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

View 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

View File

@@ -11,6 +11,7 @@
"MiG-15bis Fagot",
"MiG-19P Farmer-B",
"MiG-21bis Fishbed-N",
"Su-15 Flagon-A",
"Tu-95MS Bear-H"
],
"awacs": [

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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)",

View File

@@ -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",

View File

@@ -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)",

View File

@@ -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",

View File

@@ -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",

View 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)

View 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

View 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"
}
]
}

View File

@@ -1,6 +1,7 @@
[
"base",
"ctld",
"arty",
"dismounts",
"ewrj",
"ewrs",

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

View 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

View File

@@ -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,

View 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

View 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

View File

@@ -15,7 +15,6 @@ tasks:
BAI: 350
CAS: 450
DEAD: 450
Escort: 90
OCA/Aircraft: 400
OCA/Runway: 400
SEAD: 450

View File

@@ -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

View File

@@ -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

View File

@@ -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}"

View File

@@ -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}"

View File

@@ -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}"

View File

@@ -6,3 +6,4 @@ clsids:
- "{BELLY AIM-7M}"
- "{8D399DDA-FF81-4F14-904D-099B34FE7918}"
- "{LAU-115 - AIM-7M}"
- "{HB_F4E_AIM-7M}"

View File

@@ -0,0 +1,7 @@
name: AIM-7P
year: 1987
fallback: AIM-7M
clsids:
- "{SHOULDER AIM-7P}"
- "{BELLY AIM-7P}"
- "{AIM-7P}"

View File

@@ -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}"

View File

@@ -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}"

View File

@@ -0,0 +1,6 @@
name: AGM-12A
year: 1959
fallback: Mk 84
clsids:
- "{AGM_12A}"
- "{AGM_12A_SWA}"

View File

@@ -0,0 +1,6 @@
name: AGM-12B
year: 1960
fallback: AGM-12A
clsids:
- "{AGM_12B}"
- "{AGM_12B_SWA}"

View File

@@ -0,0 +1,6 @@
name: AGM-12C
year: 1965
fallback: AGM-12B
clsids:
- "{AGM_12C}"
- "{AGM_12C_SWA}"

View File

@@ -3,3 +3,6 @@ year: 1965
type: ARM
clsids:
- "{AGM_45A}"
- "{LAU118_AGM_45A}"
- "{LAU_34_AGM_45A}"
- "{LAU_34_AGM_45A_SWA}"

View File

@@ -0,0 +1,5 @@
name: AGM-62 Walleye I
year: 1967
fallback: AGM-12C
clsids:
- "{AGM_62_I}"

View File

@@ -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}"

View File

@@ -0,0 +1,5 @@
name: 2xAGM-65A
year: 1972
clsids:
- "{HB_F4EAGM-65A_LAU88_2x_Right}"
- "{HB_F4EAGM-65A_LAU88_2x_Left}"

View File

@@ -0,0 +1,5 @@
name: 3xAGM-65A
year: 1972
clsids:
- "{HB_F4EAGM-65A_LAU88_3x_Right}"
- "{HB_F4EAGM-65A_LAU88_3x_Left}"

View File

@@ -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}"

View File

@@ -0,0 +1,5 @@
name: 2xAGM-65B
year: 1975
clsids:
- "{HB_F4EAGM-65B_LAU88_2x_Right}"
- "{HB_F4EAGM-65B_LAU88_2x_Left}"

View File

@@ -0,0 +1,5 @@
name: 3xAGM-65B
year: 1975
clsids:
- "{HB_F4EAGM-65B_LAU88_3x_Right}"
- "{HB_F4EAGM-65B_LAU88_3x_Left}"

View File

@@ -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}"

View File

@@ -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}"

View File

@@ -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}"

View File

@@ -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}"

View File

@@ -3,3 +3,5 @@ year: 1989
fallback: AGM-65F
clsids:
- "LAU_117_AGM_65G"
- "{LAU_117A_AGM_65G}"
- "{HB_F4E_AGM-65G_LAU117}"