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

This commit is contained in:
MetalStormGhost 2024-07-20 19:21:06 +03:00
commit e88a4e1c51
18 changed files with 457 additions and 233 deletions

View File

@ -24,13 +24,13 @@ from game.theater import (
TheaterGroundObject, TheaterGroundObject,
TheaterUnit, TheaterUnit,
) )
from game.theater.theatergroup import TheaterGroup
from game.utils import Distance, meters, nautical_miles, feet from game.utils import Distance, meters, nautical_miles, feet
AGL_TRANSITION_ALT = 5000 AGL_TRANSITION_ALT = 5000
if TYPE_CHECKING: if TYPE_CHECKING:
from game.transfers import MultiGroupTransport from game.transfers import MultiGroupTransport
from game.theater.theatergroup import TheaterGroup
from game.ato.flight import Flight from game.ato.flight import Flight
@ -323,7 +323,9 @@ class WaypointBuilder:
return FlightWaypoint( return FlightWaypoint(
target.name, target.name,
FlightWaypointType.TARGET_POINT, FlightWaypointType.TARGET_POINT,
target.target.position, target.target.ground_object.position
if isinstance(target.target, (TheaterGroup, TheaterUnit))
else target.target.position,
meters(0), meters(0),
"RADIO", "RADIO",
description=description, description=description,

View File

@ -10,6 +10,8 @@ from dcs import Mission, Point
from dcs.coalition import Coalition from dcs.coalition import Coalition
from dcs.countries import country_dict from dcs.countries import country_dict
from dcs.task import OptReactOnThreat from dcs.task import OptReactOnThreat
from dcs.terrain import Airport
from dcs.unit import Static
from game.atcdata import AtcData from game.atcdata import AtcData
from game.dcs.beacons import Beacons from game.dcs.beacons import Beacons
@ -112,8 +114,8 @@ class MissionGenerator:
self.notify_info_generators() self.notify_info_generators()
# TODO: Shouldn't this be first?
namegen.reset_numbers() namegen.reset_numbers()
self.generate_warehouses()
self.mission.save(output) self.mission.save(output)
return self.unit_map return self.unit_map
@ -347,3 +349,33 @@ class MissionGenerator:
self.mission.groundControl.blue_tactical_commander = commanders self.mission.groundControl.blue_tactical_commander = commanders
self.mission.groundControl.blue_jtac = settings.jtac_count self.mission.groundControl.blue_jtac = settings.jtac_count
self.mission.groundControl.blue_observer = settings.observer_count self.mission.groundControl.blue_observer = settings.observer_count
def generate_warehouses(self) -> None:
settings = self.game.settings
for tmu in self.unit_map.theater_objects.values():
if (
tmu.theater_unit.is_ship
or isinstance(tmu.dcs_unit, Static)
and tmu.dcs_unit.category in ["Warehouses", "Heliports"]
):
# We'll serialize more than is actually necessary
# DCS will filter out warehouses as dynamic spawns so no need to worry there
# thus, if we serialize a ship as a warehouse that's not supported, DCS will filter it out
warehouse = Airport(
tmu.theater_unit.position,
self.mission.terrain,
).dict()
warehouse["coalition"] = (
"blue" if tmu.theater_unit.ground_object.coalition.player else "red"
)
warehouse["dynamicCargo"] = settings.dynamic_cargo
if tmu.theater_unit.is_ship or tmu.dcs_unit.category == "Heliports": # type: ignore
warehouse["dynamicSpawn"] = settings.dynamic_slots
warehouse["allowHotStart"] = settings.dynamic_slots_hot
self.mission.warehouses.warehouses[tmu.dcs_unit.id] = warehouse
# configure dynamic spawn, hot start of DS & dynamic cargo for airfields
for ap in self.mission.terrain.airports.values():
ap.dynamic_spawn = settings.dynamic_slots
ap.allow_hot_start = settings.dynamic_slots_hot
ap.dynamic_cargo = settings.dynamic_cargo

View File

@ -38,6 +38,7 @@ from dcs.task import (
FireAtPoint, FireAtPoint,
OptAlarmState, OptAlarmState,
) )
from dcs.terrain import Airport
from dcs.translation import String from dcs.translation import String
from dcs.triggers import ( from dcs.triggers import (
Event, Event,
@ -859,6 +860,14 @@ class HelipadGenerator:
cull_farp_statics = False cull_farp_statics = False
if not cull_farp_statics: if not cull_farp_statics:
warehouse = Airport(
pad.position,
self.m.terrain,
).dict()
warehouse["coalition"] = "blue" if self.cp.coalition.player else "red"
# configure dynamic spawn + hot start of DS, plus dynamic cargo?
self.m.warehouses.warehouses[pad.id] = warehouse
# Generate a FARP Ammo and Fuel stack for each pad # Generate a FARP Ammo and Fuel stack for each pad
self.m.static_group( self.m.static_group(
country=country, country=country,
@ -1095,6 +1104,14 @@ class GroundSpawnLargeGenerator:
country.id country.id
) )
warehouse = Airport(
pad.position,
self.m.terrain,
).dict()
warehouse["coalition"] = "blue" if self.cp.coalition.player else "red"
# configure dynamic spawn + hot start of DS, plus dynamic cargo?
self.m.warehouses.warehouses[pad.id] = warehouse
# Generate a FARP Ammo and Fuel stack for each pad # Generate a FARP Ammo and Fuel stack for each pad
if self.game.settings.ground_start_trucks: if self.game.settings.ground_start_trucks:
self.m.vehicle_group( self.m.vehicle_group(
@ -1231,6 +1248,14 @@ class GroundSpawnGenerator:
cull_farp_statics = False cull_farp_statics = False
if not cull_farp_statics: if not cull_farp_statics:
warehouse = Airport(
pad.position,
self.m.terrain,
).dict()
warehouse["coalition"] = "blue" if self.cp.coalition.player else "red"
# configure dynamic spawn + hot start of DS, plus dynamic cargo?
self.m.warehouses.warehouses[pad.id] = warehouse
# Generate a FARP Ammo and Fuel stack for each pad # Generate a FARP Ammo and Fuel stack for each pad
if self.game.settings.ground_start_trucks: if self.game.settings.ground_start_trucks:
self.m.vehicle_group( self.m.vehicle_group(

View File

@ -238,7 +238,13 @@ RADIOS: List[Radio] = [
# MiG-19P # MiG-19P
Radio("RSIU-4V", (RadioRange(MHz(100), MHz(150), kHz(25), Modulation.AM),)), Radio("RSIU-4V", (RadioRange(MHz(100), MHz(150), kHz(25), Modulation.AM),)),
# MiG-21bis # MiG-21bis
Radio("RSIU-5V", (RadioRange(MHz(118), MHz(140), kHz(25), Modulation.AM),)), Radio(
"R-832",
(
RadioRange(MHz(118), MHz(140), kHz(100), Modulation.AM),
RadioRange(MHz(220), MHz(390), kHz(100), Modulation.AM),
),
),
# Ka-50 # Ka-50
# Note: Also capable of 100MHz-150MHz, but we can't model gaps. # Note: Also capable of 100MHz-150MHz, but we can't model gaps.
Radio("R-800L1", (RadioRange(MHz(220), MHz(400), kHz(25), Modulation.AM),)), Radio("R-800L1", (RadioRange(MHz(220), MHz(400), kHz(25), Modulation.AM),)),

View File

@ -921,6 +921,29 @@ class Settings:
" and reapplied at split/racetrack end for applicable flights. " " and reapplied at split/racetrack end for applicable flights. "
), ),
) )
dynamic_slots: bool = boolean_option(
"Dynamic slots",
MISSION_GENERATOR_PAGE,
GAMEPLAY_SECTION,
default=False,
detail=(
"Enables dynamic slots. Please note that losses from dynamic slots won't be registered."
),
)
dynamic_slots_hot: bool = boolean_option(
"Allow dynamic slot hot start",
MISSION_GENERATOR_PAGE,
GAMEPLAY_SECTION,
default=True,
detail=("Enables hot start for dynamic slots."),
)
dynamic_cargo: bool = boolean_option(
"Dynamic cargo",
MISSION_GENERATOR_PAGE,
GAMEPLAY_SECTION,
default=True,
detail=("Enables dynamic cargo for airfields, ships, FARPs & warehouses."),
)
# Performance # Performance
perf_smoke_gen: bool = boolean_option( perf_smoke_gen: bool = boolean_option(

View File

@ -957,7 +957,6 @@ class A_4E_C(PlaneType):
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = ( LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = (
1, 1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM, Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM,
) )
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = ( LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = (
1, 1,

View File

@ -45,7 +45,7 @@ from game.dcs.aircrafttype import AircraftType
from game.persistency import airwing_dir from game.persistency import airwing_dir
from game.squadrons import AirWing, Pilot, Squadron from game.squadrons import AirWing, Pilot, Squadron
from game.squadrons.squadrondef import SquadronDef from game.squadrons.squadrondef import SquadronDef
from game.theater import ControlPoint, ParkingType from game.theater import ControlPoint, ParkingType, Airfield
from qt_ui.uiconstants import AIRCRAFT_ICONS, ICONS from qt_ui.uiconstants import AIRCRAFT_ICONS, ICONS
from qt_ui.widgets.combos.QSquadronLiverySelector import SquadronLiverySelector from qt_ui.widgets.combos.QSquadronLiverySelector import SquadronLiverySelector
from qt_ui.widgets.combos.primarytaskselector import PrimaryTaskSelector from qt_ui.widgets.combos.primarytaskselector import PrimaryTaskSelector
@ -127,7 +127,9 @@ class SquadronBaseSelector(QComboBox):
self.clear() self.clear()
if aircraft_type: if aircraft_type:
for base in self.bases: for base in self.bases:
if not base.can_operate(aircraft_type): if not base.can_operate(aircraft_type) and not isinstance(
base, Airfield
):
continue continue
self.addItem(base.name, base) self.addItem(base.name, base)
self.model().sort(0) self.model().sort(0)

View File

@ -215,7 +215,11 @@ class SquadronDestinationComboBox(QComboBox):
f"Consider moving these squadrons to different airfield " f"Consider moving these squadrons to different airfield "
"to avoid possible air-starts.", "to avoid possible air-starts.",
) )
return len(ap.free_parking_slots(dcs_unit_type)) return (
len(ap.free_parking_slots(dcs_unit_type))
+ free_helicopter_slots
+ free_ground_spawns
)
else: else:
parking_type = ParkingType().from_aircraft( parking_type = ParkingType().from_aircraft(
next(AircraftType.for_dcs_type(dcs_unit_type)), next(AircraftType.for_dcs_type(dcs_unit_type)),

View File

@ -33,7 +33,7 @@ pluggy==1.5.0
pre-commit==3.7.1 pre-commit==3.7.1
pydantic==2.7.4 pydantic==2.7.4
pydantic-settings==2.3.3 pydantic-settings==2.3.3
pydcs @ git+https://github.com/dcs-retribution/pydcs@800d8fd887a20ecbe811f9c9bde8f1648fea5588 pydcs @ git+https://github.com/dcs-retribution/pydcs@987dadca2faa9e4b7ce10a4c3fcb935b1bc8e91b
pyinstaller==5.13.2 pyinstaller==5.13.2
pyinstaller-hooks-contrib==2024.0 pyinstaller-hooks-contrib==2024.0
pyparsing==3.1.2 pyparsing==3.1.2

Binary file not shown.

View File

@ -1,14 +1,33 @@
--- ---
name: Afghanistan - The Second Afghan War name: Afghanistan - Graveyard of Empires
theater: Afghanistan theater: Afghanistan
authors: Starfire authors: Starfire
recommended_player_faction: Bluefor Modern recommended_player_faction: Bluefor Modern
recommended_enemy_faction: Redfor (Russia) 2010 recommended_enemy_faction: Redfor (Russia) 2010
description: description:
<p>Meow</p> <p>Following the 9/11 attacks, the United States and its NATO allies launched a
miz: second_afghan_war.miz full-scale invasion of Afghanistan to dismantle the Taliban regime and root out
Al-Qaeda. As the conflict progressed, Russia grew increasingly concerned that the
Western powers were using the War on Terror as a pretext for territorial expansion
in Central Asia. The Kremlin viewed NATO's growing presence in Afghanistan as a
direct threat to its sphere of influence and a potential encroachment on its
southern borders.</p>
<p>Shortly after the fall of Kandahar, which signalled the end of organised Taliban
control of Afghanistan, Russia and a coalition of its allies with historical ties
to the Soviet Union decided to intervene under the guise of protecting regional
stability and sovereignty. While Russia did not openly ally with the insurgents,
it covertly provided logistical support, intelligence, and military aid to
various anti-NATO factions within Afghanistan as part of a broader strategy to
prevent NATO forces from gaining a foothold in the region.</p>
<p>The conflict quickly escalated into a multi-faceted and very costly war. The
United States and its allies found themselves not only battling insurgents but
also facing direct confrontations with increasing numbers of conventional
Russian forces both in the air and on the ground. The ferocity of the war
underscored once more the peril of foreign intervention in this historically
unyielding land.</p>
miz: graveyard_of_empires.miz
performance: 1 performance: 1
recommended_start_date: 2001-12-17 recommended_start_date: 2002-01-27
version: "10.7" version: "10.7"
settings: settings:
hercules: true hercules: true
@ -36,20 +55,10 @@ squadrons:
aircraft: aircraft:
- KC-135 Stratotanker - KC-135 Stratotanker
size: 1 size: 1
- primary: Refueling
aircraft:
- KC-130J
- KC-130
size: 1
- primary: AEW&C - primary: AEW&C
aircraft: aircraft:
- E-3A - E-3A
size: 2 size: 1
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 12
- primary: DEAD - primary: DEAD
secondary: any secondary: any
aircraft: aircraft:
@ -59,12 +68,12 @@ squadrons:
secondary: any secondary: any
aircraft: aircraft:
- F-15E Strike Eagle (Suite 4+) - F-15E Strike Eagle (Suite 4+)
size: 12 size: 8
- primary: Escort - primary: Escort
secondary: any secondary: any
aircraft: aircraft:
- F-15C Eagle - F-15C Eagle
size: 12 size: 16
# Kandahar Heliport # Kandahar Heliport
15: 15:
- primary: Air Assault - primary: Air Assault
@ -79,28 +88,38 @@ squadrons:
size: 4 size: 4
#Camp Bastion #Camp Bastion
10: 10:
- primary: BAI - primary: Refueling
aircraft:
- KC-130J
- KC-130
size: 1
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 16
- primary: SEAD Escort
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- AV-8B Harrier II Night Attack - AV-8B Harrier II Night Attack
size: 12 size: 8
- primary: CAS - primary: CAS
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- A-10C Thunderbolt II (Suite 7) - A-10C Thunderbolt II (Suite 7)
size: 12 size: 8
#Camp Bastion Heliport #Camp Bastion Heliport
13: 13:
- primary: CAS - primary: CAS
secondary: any secondary: any
aircraft: aircraft:
- AH-64D Apache Longbow - AH-64D Apache Longbow
size: 8 size: 4
- primary: CAS - primary: CAS
secondary: any secondary: any
aircraft: aircraft:
- OH-58D(R) Kiowa Warrior - OH-58D(R) Kiowa Warrior
size: 8 size: 4
#Shindand #Shindand
3: 3:
- primary: BAI - primary: BAI
@ -125,12 +144,6 @@ squadrons:
aircraft: aircraft:
- Mi-24P Hind-F - Mi-24P Hind-F
size: 4 size: 4
- primary: CAS
secondary: any
aircraft:
- Ka-50 Hokum III
- Ka-50 Hokum (Blackshark 3)
size: 4
- primary: Transport - primary: Transport
secondary: any secondary: any
aircraft: aircraft:
@ -147,4 +160,17 @@ squadrons:
secondary: air-to-air secondary: air-to-air
aircraft: aircraft:
- MiG-29S Fulcrum-C - MiG-29S Fulcrum-C
size: 12 size: 10
- primary: SEAD Escort
secondary: any
aircraft:
- JF-17 Thunder
size: 8
#Farah
2:
- primary: CAS
secondary: any
aircraft:
- Ka-50 Hokum III
- Ka-50 Hokum (Blackshark 3)
size: 4

Binary file not shown.

View File

@ -0,0 +1,76 @@
---
name: Afghanistan - Operation Shattered Dagger
theater: Afghanistan
authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Toyota Al Gaib 2001
description:
<p>In the spring of 2006, insurgents initiated a well-coordinated offensive in southern Afghanistan,
focusing their efforts on the strategically vital provinces of Helmand and Kandahar. Insurgent
operations extended beyond small skirmishes, including major assaults on multiple Forward Operating
Bases (FOBs) that were crucial for coalition operations. The loss or isolation of these bases would
have significantly hindered NATO forces' ability to maintain control in the region, severely impacting
the overall stability and security of the region.</p>
<p>With multiple FOBs under siege and cut off from friendly forces, the situation for the coalition
troops became increasingly dire. In response to these attacks, Apache and Kiowa Warrior helicopters were
tasked with providing close air support, targeting insurgent positions, and neutralising enemy forces
surrounding the FOBs. Once cleared of enemy forces, Blackhawk and Chinook helicopters can then deliver
much needed reinforcements and supplies to coalition troops.</p>
miz: operation_shattered_dagger.miz
performance: 1
recommended_start_date: 2006-04-24
recommended_enemy_money: 0
recommended_enemy_income_multiplier: 0.0
version: "10.7"
settings:
hercules: true
squadron_start_full: true
squadrons:
#Kandahar
7:
- primary: Transport
secondary: any
aircraft:
- C-130J-30 Super Hercules
- C-130
size: 4
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 4
# Kandahar Heliport
15:
- primary: Air Assault
secondary: any
aircraft:
- UH-60A
size: 4
- primary: CAS
secondary: any
aircraft:
- OH-58D(R) Kiowa Warrior
size: 4
#Camp Bastion
10:
- primary: BAI
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
size: 4
- primary: AEW&C
aircraft:
- E-3A
size: 1
#Camp Bastion Heliport
13:
- primary: CAS
secondary: any
aircraft:
- AH-64D Apache Longbow
size: 4
- primary: Transport
secondary: any
aircraft:
- CH-47D
size: 4

View File

@ -56,6 +56,8 @@
"F/A-18E Tanker" "F/A-18E Tanker"
], ],
"frontline_units": [ "frontline_units": [
"MBT M1A2C SEP v3 Abrams",
"APC MRAP MaxxPro",
"LAV-25", "LAV-25",
"M1043 HMMWV (M2 HMG)", "M1043 HMMWV (M2 HMG)",
"M1045 HMMWV (BGM-71 TOW)", "M1045 HMMWV (BGM-71 TOW)",

View File

@ -35,7 +35,7 @@ mist = {}
-- don't change these -- don't change these
mist.majorVersion = 4 mist.majorVersion = 4
mist.minorVersion = 5 mist.minorVersion = 5
mist.build = 122 mist.build = 125
-- forward declaration of log shorthand -- forward declaration of log shorthand
local log local log
@ -695,7 +695,6 @@ do -- the main scope
["FARP"] = "farps", ["FARP"] = "farps",
["Fueltank"] = "fueltank_cargo", ["Fueltank"] = "fueltank_cargo",
["Gate"] = "gate", ["Gate"] = "gate",
["FARP Fuel Depot"] = "gsm rus",
["Armed house"] = "home1_a", ["Armed house"] = "home1_a",
["FARP Command Post"] = "kp-ug", ["FARP Command Post"] = "kp-ug",
["Watch Tower Armed"] = "ohr-vyshka", ["Watch Tower Armed"] = "ohr-vyshka",
@ -704,7 +703,6 @@ do -- the main scope
["Pipes big"] = "pipes_big_cargo", ["Pipes big"] = "pipes_big_cargo",
["Oil platform"] = "plavbaza", ["Oil platform"] = "plavbaza",
["Tetrapod"] = "tetrapod_cargo", ["Tetrapod"] = "tetrapod_cargo",
["Fuel tank"] = "toplivo",
["Trunks long"] = "trunks_long_cargo", ["Trunks long"] = "trunks_long_cargo",
["Trunks small"] = "trunks_small_cargo", ["Trunks small"] = "trunks_small_cargo",
["Passenger liner"] = "yastrebow", ["Passenger liner"] = "yastrebow",
@ -1152,6 +1150,7 @@ do -- the main scope
end end
end end
end end
--dbLog:warn(newTable)
--mist.debug.writeData(mist.utils.serialize,{'msg', newTable}, timer.getAbsTime() ..'Group.lua') --mist.debug.writeData(mist.utils.serialize,{'msg', newTable}, timer.getAbsTime() ..'Group.lua')
newTable.timeAdded = timer.getAbsTime() -- only on the dynGroupsAdded table. For other reference, see start time newTable.timeAdded = timer.getAbsTime() -- only on the dynGroupsAdded table. For other reference, see start time
--mist.debug.dumpDBs() --mist.debug.dumpDBs()
@ -1493,7 +1492,7 @@ do -- the main scope
task.t = timer.getTime() + task.rep --schedule next run task.t = timer.getTime() + task.rep --schedule next run
local err, errmsg = pcall(task.f, unpack(task.vars, 1, table.maxn(task.vars))) local err, errmsg = pcall(task.f, unpack(task.vars, 1, table.maxn(task.vars)))
if not err then if not err then
log:error('Error in scheduled function: $1' .. errmsg) log:error('Error in scheduled function: $1', errmsg)
end end
--scheduledTasks[i].f(unpack(scheduledTasks[i].vars, 1, table.maxn(scheduledTasks[i].vars))) -- do the task --scheduledTasks[i].f(unpack(scheduledTasks[i].vars, 1, table.maxn(scheduledTasks[i].vars))) -- do the task
i = i + 1 i = i + 1
@ -1519,7 +1518,7 @@ do -- the main scope
id = tostring(original_id) .. ' #' .. tostring(id_ind) id = tostring(original_id) .. ' #' .. tostring(id_ind)
id_ind = id_ind + 1 id_ind = id_ind + 1
end end
local valid
if mist.DBs.aliveUnits and mist.DBs.aliveUnits[val.object.id_] then if mist.DBs.aliveUnits and mist.DBs.aliveUnits[val.object.id_] then
--log:info('object found in alive_units') --log:info('object found in alive_units')
val.objectData = mist.utils.deepCopy(mist.DBs.aliveUnits[val.object.id_]) val.objectData = mist.utils.deepCopy(mist.DBs.aliveUnits[val.object.id_])
@ -1532,6 +1531,7 @@ do -- the main scope
--trigger.action.outText('remove via death: ' .. Unit.getName(val.object),20) --trigger.action.outText('remove via death: ' .. Unit.getName(val.object),20)
mist.DBs.activeHumans[Unit.getName(val.object)] = nil mist.DBs.activeHumans[Unit.getName(val.object)] = nil
end]] end]]
valid = true
elseif mist.DBs.removedAliveUnits and mist.DBs.removedAliveUnits[val.object.id_] then -- it didn't exist in alive_units, check old_alive_units elseif mist.DBs.removedAliveUnits and mist.DBs.removedAliveUnits[val.object.id_] then -- it didn't exist in alive_units, check old_alive_units
--log:info('object found in old_alive_units') --log:info('object found in old_alive_units')
val.objectData = mist.utils.deepCopy(mist.DBs.removedAliveUnits[val.object.id_]) val.objectData = mist.utils.deepCopy(mist.DBs.removedAliveUnits[val.object.id_])
@ -1540,9 +1540,10 @@ do -- the main scope
val.objectPos = pos.p val.objectPos = pos.p
end end
val.objectType = mist.DBs.removedAliveUnits[val.object.id_].category val.objectType = mist.DBs.removedAliveUnits[val.object.id_].category
valid = true
else --attempt to determine if static object... else --attempt to determine if static object...
--log:info('object not found in alive units or old alive units') --log:info('object not found in alive units or old alive units')
if Object.isExist(val.object) then
local pos = Object.getPosition(val.object) local pos = Object.getPosition(val.object)
if pos then if pos then
local static_found = false local static_found = false
@ -1564,11 +1565,15 @@ do -- the main scope
else else
val.objectType = 'unknown' val.objectType = 'unknown'
end end
valid = true
end end
end
if valid then
mist.DBs.deadObjects[id] = val mist.DBs.deadObjects[id] = val
end end
end end
end end
end
--[[ --[[
local function addClientsToActive(event) local function addClientsToActive(event)
@ -2019,7 +2024,7 @@ do -- the main scope
end end
end end
--mist.debug.writeData(mist.utils.serialize,{'msg', newGroup}, 'newGroupPushedToAddGroup.lua') --mist.debug.writeData(mist.utils.serialize,{'msg', newGroup}, newGroup.name ..'.lua')
--log:warn(newGroup) --log:warn(newGroup)
-- sanitize table -- sanitize table
newGroup.groupName = nil newGroup.groupName = nil
@ -3560,7 +3565,7 @@ function mist.getUnitsInMovingZones(unit_names, zone_unit_names, radius, zone_ty
end end
function mist.getUnitsLOS(unitset1, altoffset1, unitset2, altoffset2, radius) function mist.getUnitsLOS(unitset1, altoffset1, unitset2, altoffset2, radius)
log:info("$1, $2, $3, $4, $5", unitset1, altoffset1, unitset2, altoffset2, radius) --log:info("$1, $2, $3, $4, $5", unitset1, altoffset1, unitset2, altoffset2, radius)
radius = radius or math.huge radius = radius or math.huge
local unit_info1 = {} local unit_info1 = {}
local unit_info2 = {} local unit_info2 = {}
@ -3568,23 +3573,27 @@ function mist.getUnitsLOS(unitset1, altoffset1, unitset2, altoffset2, radius)
-- get the positions all in one step, saves execution time. -- get the positions all in one step, saves execution time.
for unitset1_ind = 1, #unitset1 do for unitset1_ind = 1, #unitset1 do
local unit1 = Unit.getByName(unitset1[unitset1_ind]) local unit1 = Unit.getByName(unitset1[unitset1_ind])
if unit1 then
local lCat = Object.getCategory(unit1) local lCat = Object.getCategory(unit1)
if unit1 and ((lCat == 1 and unit1:isActive()) or lCat ~= 1) and unit:isExist() == true then if ((lCat == 1 and unit1:isActive()) or lCat ~= 1) and unit1:isExist() == true then
unit_info1[#unit_info1 + 1] = {} unit_info1[#unit_info1 + 1] = {}
unit_info1[#unit_info1].unit = unit1 unit_info1[#unit_info1].unit = unit1
unit_info1[#unit_info1].pos = unit1:getPosition().p unit_info1[#unit_info1].pos = unit1:getPosition().p
end end
end end
end
for unitset2_ind = 1, #unitset2 do for unitset2_ind = 1, #unitset2 do
local unit2 = Unit.getByName(unitset2[unitset2_ind]) local unit2 = Unit.getByName(unitset2[unitset2_ind])
if unit2 then
local lCat = Object.getCategory(unit2) local lCat = Object.getCategory(unit2)
if unit2 and ((lCat == 1 and unit2:isActive()) or lCat ~= 1) and unit:isExist() == true then if ((lCat == 1 and unit2:isActive()) or lCat ~= 1) and unit2:isExist() == true then
unit_info2[#unit_info2 + 1] = {} unit_info2[#unit_info2 + 1] = {}
unit_info2[#unit_info2].unit = unit2 unit_info2[#unit_info2].unit = unit2
unit_info2[#unit_info2].pos = unit2:getPosition().p unit_info2[#unit_info2].pos = unit2:getPosition().p
end end
end end
end
local LOS_data = {} local LOS_data = {}
-- now compute los -- now compute los
@ -4012,13 +4021,14 @@ do -- group functions scope
if Group.getByName(gpName) and Group.getByName(gpName):isExist() == true then if Group.getByName(gpName) and Group.getByName(gpName):isExist() == true then
local newGroup = Group.getByName(gpName) local newGroup = Group.getByName(gpName)
local newData = {} local newData = mist.utils.deepCopy(dbData)
newData.name = gpName newData.name = gpName
newData.groupId = tonumber(newGroup:getID()) newData.groupId = tonumber(newGroup:getID())
newData.category = newGroup:getCategory() newData.category = newGroup:getCategory()
newData.groupName = gpName newData.groupName = gpName
newData.hidden = dbData.hidden newData.hidden = dbData.hidden
if newData.category == 2 then if newData.category == 2 then
newData.category = 'vehicle' newData.category = 'vehicle'
elseif newData.category == 3 then elseif newData.category == 3 then
@ -5193,7 +5203,8 @@ do -- mist.util scope
function mist.utils.getHeadingPoints(point1, point2, north) -- sick of writing this out. function mist.utils.getHeadingPoints(point1, point2, north) -- sick of writing this out.
if north then if north then
return mist.utils.getDir(mist.vec.sub(mist.utils.makeVec3(point2), mist.utils.makeVec3(point1)), (mist.utils.makeVec3(point1))) local p1 = mist.utils.get3DDist(point1)
return mist.utils.getDir(mist.vec.sub(mist.utils.makeVec3(point2), p1), p1)
else else
return mist.utils.getDir(mist.vec.sub(mist.utils.makeVec3(point2), mist.utils.makeVec3(point1))) return mist.utils.getDir(mist.vec.sub(mist.utils.makeVec3(point2), mist.utils.makeVec3(point1)))
end end
@ -5837,8 +5848,8 @@ do -- mist.debug scope
log:alert('insufficient libraries to run mist.debug.dump_G, you must disable the sanitization of the io and lfs libraries in ./Scripts/MissionScripting.lua') log:alert('insufficient libraries to run mist.debug.dump_G, you must disable the sanitization of the io and lfs libraries in ./Scripts/MissionScripting.lua')
--trigger.action.outText(errmsg, 10) --trigger.action.outText(errmsg, 10)
end end
end
end
--- Write debug data to file. --- Write debug data to file.
-- This function requires you to disable script sanitization -- This function requires you to disable script sanitization
-- in $DCS_ROOT\Scripts\MissionScripting.lua to access lfs and io -- in $DCS_ROOT\Scripts\MissionScripting.lua to access lfs and io
@ -7653,7 +7664,10 @@ do
--log:warn(s) --log:warn(s)
if type(s) == 'table' then if type(s) == 'table' then
local mType = s.markType local mType = s.markType
--log:echo(s)
if mType == 'panel' then if mType == 'panel' then
local markScope = s.markScope or "all"
if markScope == 'coa' then if markScope == 'coa' then
trigger.action.markToCoalition(s.markId, s.text, s.pos, s.markFor, s.readOnly) trigger.action.markToCoalition(s.markId, s.text, s.pos, s.markFor, s.readOnly)
elseif markScope == 'group' then elseif markScope == 'group' then
@ -7711,10 +7725,15 @@ do
local function validateColor(val) local function validateColor(val)
if type(val) == 'table' then if type(val) == 'table' then
for i = 1, #val do for i = 1, 4 do
if val[i] then
if type(val[i]) == 'number' and val[i] > 1 then if type(val[i]) == 'number' and val[i] > 1 then
val[i] = val[i]/255 -- convert RGB values from 0-255 to 0-1 equivilent. val[i] = val[i]/255 -- convert RGB values from 0-255 to 0-1 equivilent.
end end
else
val[i] = 0.8
log:warn("index $1 of color to mist.marker.add was missing, defaulted to 0.8", i)
end
end end
elseif type(val) == 'string' then elseif type(val) == 'string' then
val = mist.utils.hexToRGB(val) val = mist.utils.hexToRGB(val)
@ -7755,7 +7774,7 @@ do
--log:info('create maker DB: $1', e.idx) --log:info('create maker DB: $1', e.idx)
mist.DBs.markList[e.idx] = {time = e.time, pos = e.pos, groupId = e.groupId, mType = 'panel', text = e.text, markId = e.idx, coalition = e.coalition} mist.DBs.markList[e.idx] = {time = e.time, pos = e.pos, groupId = e.groupId, mType = 'panel', text = e.text, markId = e.idx, coalition = e.coalition}
if e.unit then if e.unit then
mist.DBs.markList[e.idx].unit = e.intiator:getName() mist.DBs.markList[e.idx].unit = e.initiator:getName()
end end
--log:info(mist.marker.list[e.idx]) --log:info(mist.marker.list[e.idx])
end end
@ -7778,7 +7797,7 @@ do
else else
for mEntry, mData in pairs(mist.DBs.markList) do for mEntry, mData in pairs(mist.DBs.markList) do
if id == mData.name or id == mData.id then if id == mData.name or id == mData.id then
return mData.id return mData.markId
end end
end end
end end
@ -7788,11 +7807,16 @@ do
local function removeMark(id) local function removeMark(id)
--log:info("Removing Mark: $1", id --log:info("Removing Mark: $1", id)
local removed = false local removed = false
if type(id) == 'table' then if type(id) == 'table' then
for ind, val in pairs(id) do for ind, val in pairs(id) do
local r = getMarkId(val) local r
if val.markId then
r = val.markId
else
r = getMarkId(val)
end
if r then if r then
trigger.action.removeMark(r) trigger.action.removeMark(r)
mist.DBs.markList[r] = nil mist.DBs.markList[r] = nil
@ -7802,10 +7826,12 @@ do
else else
local r = getMarkId(id) local r = getMarkId(id)
if r then
trigger.action.removeMark(r) trigger.action.removeMark(r)
mist.DBs.markList[r] = nil mist.DBs.markList[r] = nil
removed = true removed = true
end end
end
return removed return removed
end end
@ -7926,6 +7952,7 @@ do
if markForCoa then if markForCoa then
if type(markForCoa) == 'string' then if type(markForCoa) == 'string' then
--log:warn("coa is string")
if tonumber(markForCoa) then if tonumber(markForCoa) then
coa = coas[tonumber(markForCoa)] coa = coas[tonumber(markForCoa)]
markScope = 'coa' markScope = 'coa'
@ -7940,11 +7967,10 @@ do
end end
elseif type(markForCoa) == 'number' and markForCoa >=-1 and markForCoa <= #coas then elseif type(markForCoa) == 'number' and markForCoa >=-1 and markForCoa <= #coas then
coa = markForCoa coa = markForCoa
markScore = 'coa' --log:warn("coa is number")
markScope = 'coa'
end end
markFor = coa
elseif markFor then elseif markFor then
if type(markFor) == 'number' then -- groupId if type(markFor) == 'number' then -- groupId
if mist.DBs.groupsById[markFor] then if mist.DBs.groupsById[markFor] then
@ -8053,7 +8079,7 @@ do
end end
for i = 1, #markForTable do for i = 1, #markForTable do
local newId = iterate() local newId = iterate()
local data = {markId = newId, text = text, pos = pos[i], markFor = markForTable[i], markType = 'panel', name = name, readOnly = readOnly, time = timer.getTime()} local data = {markId = newId, text = text, pos = pos[i], markScope = markScope, markFor = markForTable[i], markType = 'panel', name = name, readOnly = readOnly, time = timer.getTime()}
mist.DBs.markList[newId] = data mist.DBs.markList[newId] = data
table.insert(list, data) table.insert(list, data)
@ -8177,6 +8203,7 @@ do
end end
function mist.marker.remove(id) function mist.marker.remove(id)
return removeMark(id) return removeMark(id)
end end
@ -8967,8 +8994,8 @@ do -- group tasks scope
minR = mist.utils.get2DDist(avg, zone[i]) minR = mist.utils.get2DDist(avg, zone[i])
end end
end end
--log:warn('Radius: $1', radius)
--log:warn('minR: $1', minR) --log:warn('minR: $1', minR)
--log:warn('Radius: $1', radius)
local lSpawnPos = {} local lSpawnPos = {}
for j = 1, 100 do for j = 1, 100 do
newCoord = mist.getRandPointInCircle(avg, radius) newCoord = mist.getRandPointInCircle(avg, radius)
@ -9200,7 +9227,7 @@ do -- group tasks scope
function mist.groupIsDead(groupName) -- copy more or less from on station function mist.groupIsDead(groupName) -- copy more or less from on station
local gp = Group.getByName(groupName) local gp = Group.getByName(groupName)
if gp then if gp then
if #gp:getUnits() > 0 or gp:isExist() == true then if #gp:getUnits() > 0 and gp:isExist() == true then
return false return false
end end
end end

View File

@ -5,7 +5,7 @@
"specificOptions": [], "specificOptions": [],
"scriptsWorkOrders": [ "scriptsWorkOrders": [
{ {
"file": "mist_4_5_122.lua", "file": "mist_4_5_126.lua",
"mnemonic": "mist" "mnemonic": "mist"
}, },
{ {

View File

@ -20,8 +20,8 @@ variants:
origin: China origin: China
MiG-21bis Fishbed-N: {} MiG-21bis Fishbed-N: {}
radios: radios:
intra_flight: RSIU-5V intra_flight: R-832
inter_flight: RSIU-5V inter_flight: R-832
channels: channels:
type: common type: common
namer: single namer: single