mirror of
https://github.com/Pax1601/DCSOlympus.git
synced 2025-10-29 16:56:34 +00:00
436 lines
20 KiB
Lua
436 lines
20 KiB
Lua
--[[--
|
|
Olympus base air AI functions
|
|
## Description:
|
|
Olympus is a development of zeus, as in for arma, taken into DCS to control stuff easily via a web interface.
|
|
This file is a bunch of functions that relate to basic spawning, control, and removal of AI aircraft.
|
|
|
|
assert(loadfile('C:\\Users\\hindsas\\Saved Games\\DCS.openbeta\\Missions\\Olympus\\LUA\\baseFunctions.lua'))()
|
|
|
|
]]
|
|
|
|
vv = {} --not actually a virus, possibly just Italian and Windows defender is racist
|
|
|
|
function vv.notify(message, displayFor)
|
|
trigger.action.outText(message, displayFor)
|
|
end
|
|
|
|
--Functions related to attack
|
|
function vv.attackAirUnit () --Unit attacks another unit (forces detection)
|
|
--https://wiki.hoggitworld.com/view/DCS_task_attackUnit
|
|
local controller = Unit.getByName("TestBlue"):getController()
|
|
AttackUnit = {
|
|
id = 'AttackUnit',
|
|
params = {
|
|
unitId = 2, -- obviously you have to work this out somehow
|
|
groupAttack = false, --I think true sets it to attack first unit, then second unit etc
|
|
}
|
|
}
|
|
controller:pushTask(AttackUnit)
|
|
vv.notify("AttackAirUnit executed", 2)
|
|
end
|
|
|
|
function vv.attackAirGroup () --Group attacks another group (forces detection)
|
|
--https://wiki.hoggitworld.com/view/DCS_task_attackGroup
|
|
local controller = Group.getByName("TestBlue"):getController()
|
|
AttackGroup = {
|
|
id = 'AttackGroup',
|
|
params = {
|
|
groupId = 2, -- obviously you have to work this out somehow
|
|
|
|
}
|
|
}
|
|
controller:pushTask(AttackGroup)
|
|
vv.notify("attackAirGroup executed", 2)
|
|
end
|
|
|
|
function vv.detectUnits () --what units a thing has detected, and how
|
|
--https://wiki.hoggitworld.com/view/DCS_func_getDetectedTargets
|
|
local controller = Unit.getByName("TestBlue"):getController()
|
|
local detectedUnits = controller:getDetectedTargets()
|
|
vv.notify(mist.utils.tableShow(detectedUnits), 10)
|
|
vv.notify("detectAirUnit executed", 2)
|
|
end
|
|
|
|
function vv.attackGroundPoint() --obviously freaks the eff out over water
|
|
--https://wiki.hoggitworld.com/view/DCS_task_bombing
|
|
local controller = Unit.getByName("TestBlue"):getController()
|
|
local vec3UnderUnit = mist.utils.makeVec3GL(Unit.getByName("TestBlue"):getPosition()) --vec3 on the floor under the unit
|
|
local vec2 = mist.utils.makeVec2(vec3UnderUnit) --zero reason to do all this, just shows how to get unit locations
|
|
--yes we are bombing whatever is directly below the unit
|
|
Bombing = {
|
|
id = 'Bombing',
|
|
params = {
|
|
point = vec2,
|
|
attackQty = 1,
|
|
--weaponType = 536870912 , --optional use cannon don't think it works
|
|
weaponType = 2956984318 , --optional this is use any A2G weapon
|
|
}
|
|
}
|
|
controller:pushTask(Bombing)
|
|
vv.notify("attackGroundPoint executed", 2)
|
|
end
|
|
|
|
function vv.attackGroundUnit()
|
|
-- I actually think my attack air unit code is just attack anything, so this isn't needed
|
|
vv.notify("attackGroundUnit executed", 2)
|
|
end
|
|
|
|
|
|
--Functions related to movement
|
|
|
|
function vv.flyHere ()
|
|
--https://wiki.hoggitworld.com/view/MIST_fixedWingBuildWP has similar shit for helicopters but think its same
|
|
local startPoint = mist.getLeadPos(Group.getByName("TestBlue")) --lots of ways to get where it is, this ones cool
|
|
|
|
--this bit of codes a bit overly flash, as you just need a destination point but its kinda cool
|
|
airbases = coalition.getAirbases(2) --check for coalition airbases, if none, must be neutrals so check them
|
|
if #airbases == 0 then
|
|
airbases = coalition.getAirbases(0)
|
|
end
|
|
local pickRandomAirbase = math.random(1,#airbases)
|
|
airbase = airbases[pickRandomAirbase]
|
|
airbasePos = Airbase.getPosition(airbase).p
|
|
|
|
--flashy airbase position crap done on with the main bit
|
|
|
|
local endPoint = airbasePos
|
|
local path = {}
|
|
path[#path + 1] = mist.fixedWing.buildWP(startPoint, flyOverPoint, 250, 5000, 'BARO') --type, speed, alt, altType, SI units
|
|
path[#path + 1] = mist.fixedWing.buildWP(endPoint, TurningPoint, 250, 2000, 'BARO')
|
|
|
|
mist.goRoute(Group.getByName("TestBlue"), path)
|
|
|
|
vv.notify("flyHere executed", 2)
|
|
end
|
|
|
|
function vv.landHere ()
|
|
--https://wiki.hoggitworld.com/view/DCS_task_mission there isn't a land thing, the land thing is for helis, there is a give it a mission to land or this somehow works
|
|
local startPoint = mist.getLeadPos(Group.getByName("TestBlue"))
|
|
|
|
airbases = coalition.getAirbases(2) --check for coalition airbases, if none, must be neutrals so check them
|
|
if #airbases == 0 then
|
|
airbases = coalition.getAirbases(0)
|
|
end
|
|
local pickRandomAirbase = math.random(1,#airbases)
|
|
airbase = airbases[pickRandomAirbase]
|
|
airbasePos = Airbase.getPosition(airbase).p
|
|
|
|
local endPoint = mist.utils.makeVec2(airbasePos)
|
|
|
|
local path = {}
|
|
path[#path + 1] = mist.heli.buildWP(startPoint, TurningPoint, 200, 2000, 'agl') --no difference between heli and fixedWing waypoints, baar default speeds are higher
|
|
path[#path + 1] = mist.heli.buildWP(endPoint, Landing, 200, 2000, 'agl')
|
|
|
|
mist.goRoute(Group.getByName("TestBlue"), path)
|
|
|
|
vv.notify("landHere executed", 2)
|
|
end
|
|
|
|
function vv.followGroup()
|
|
local group = Group.getByName("TestBlue")
|
|
local controller = group:getController()
|
|
|
|
controller:resetTask()
|
|
local groupFlw = Group.getByName("TestRed"):getID()
|
|
local position = {x= 0 , y= 0, z=1600}
|
|
-- position = {x= 0 , y= -5, z=100} -- right
|
|
-- position = {x= 150 , y= -5, z=-100} --front
|
|
-- position = {x= 0 , y= -5, z=-100} --left
|
|
-- position = {x= -100 , y= -5, z=0} --trail
|
|
-- position = {x= 0 , y= 304, z= 0} --above
|
|
-- position = {x= 0 , y= 0, z=1600} --spread 4 1 mile
|
|
|
|
|
|
Follow = {
|
|
id = 'Follow',
|
|
params = {
|
|
groupId = groupFlw,
|
|
pos = position, --x is x y is up and down or Z ( Z is left and right or y)
|
|
lastWptIndexFlag = false,
|
|
lastWptIndex = 1
|
|
}
|
|
}
|
|
|
|
controller:setTask(Follow)
|
|
vv.notify("followGroup executed", 2)
|
|
end
|
|
|
|
function vv.refuelAtUnit ()
|
|
local group = Group.getByName("TestBlue")
|
|
|
|
Refueling = { -- this is go refuel, not I want to become a tanker
|
|
id = 'Refueling',
|
|
params = {}
|
|
}
|
|
local controller = group:getController()
|
|
controller:setTask(Refueling)
|
|
|
|
vv.notify("refuelAtUnit executed", 2)
|
|
end
|
|
|
|
|
|
|
|
--functions related to formations
|
|
--there are loads of options you can do in the same way as setting formations, restrick afterburner, jettison, ROE, etc
|
|
--https://wiki.hoggitworld.com/view/DCS_func_setOption
|
|
function vv.changeFormation ()
|
|
local group = Group.getByName("TestBlue")
|
|
local controller = group:getController()
|
|
controller:setOption(AI.Option.Air.id.FORMATION,458753) --spread 4 according to page, actually echleon left?
|
|
vv.notify("changeFormation executed", 2)
|
|
end
|
|
|
|
--Functions related to missions
|
|
function vv.executeMission ()
|
|
vv.notify("executeMission executed", 2)
|
|
end
|
|
|
|
|
|
--Functions related to querying stuff for a unit
|
|
--mostly from this https://wiki.hoggitworld.com/view/DCS_Class_Unit
|
|
function vv.fuelState () --gives it as a percentage i.e. 0.5 is 50% fuel 1.6 is several tanks of fuel + internal
|
|
local unit = Unit.getByName("TestBlue")
|
|
local fuelState = Unit.getFuel(unit)
|
|
vv.notify(fuelState, 2)
|
|
vv.notify("fuelState executed", 2)
|
|
end
|
|
|
|
--Functions related to air events, like takeoff, landing, ejection
|
|
|
|
--Functions related to spawning
|
|
|
|
function vv.spawnAirGroup ()
|
|
--https://wiki.hoggitworld.com/view/MIST_dynAdd
|
|
|
|
plane = {
|
|
["modulation"] = 0,
|
|
["tasks"] =
|
|
{
|
|
}, -- end of ["tasks"]
|
|
["radioSet"] = false,
|
|
["task"] = "CAP",
|
|
["uncontrolled"] = false,
|
|
["route"] =
|
|
{
|
|
["points"] =
|
|
{
|
|
[1] =
|
|
{
|
|
["alt"] = 2000,
|
|
["action"] = "Turning Point",
|
|
["alt_type"] = "BARO",
|
|
["speed"] = 179.86111111111,
|
|
["task"] =
|
|
{
|
|
["id"] = "ComboTask",
|
|
["params"] =
|
|
{
|
|
["tasks"] =
|
|
{
|
|
}, -- end of ["tasks"]
|
|
}, -- end of ["params"]
|
|
}, -- end of ["task"]
|
|
["type"] = "Turning Point",
|
|
["ETA"] = 0,
|
|
["ETA_locked"] = true,
|
|
["y"] = -15921.222675484,
|
|
["x"] = 20601.532582682,
|
|
["formation_template"] = "",
|
|
["speed_locked"] = true,
|
|
}, -- end of [1]
|
|
[2] =
|
|
{
|
|
["alt"] = 2000,
|
|
["action"] = "Turning Point",
|
|
["alt_type"] = "BARO",
|
|
["speed"] = 179.86111111111,
|
|
["task"] =
|
|
{
|
|
["id"] = "ComboTask",
|
|
["params"] =
|
|
{
|
|
["tasks"] =
|
|
{
|
|
}, -- end of ["tasks"]
|
|
}, -- end of ["params"]
|
|
}, -- end of ["task"]
|
|
["type"] = "Turning Point",
|
|
["ETA"] = 500.42644231043,
|
|
["ETA_locked"] = false,
|
|
["y"] = -17324.285714286,
|
|
["x"] = 109492.85714286,
|
|
["formation_template"] = "",
|
|
["speed_locked"] = true,
|
|
}, -- end of [2]
|
|
}, -- end of ["points"]
|
|
}, -- end of ["route"]
|
|
["groupId"] = 10,
|
|
["hidden"] = false,
|
|
["units"] =
|
|
{
|
|
[1] =
|
|
{
|
|
["alt"] = 2000,
|
|
["alt_type"] = "BARO",
|
|
["livery_id"] = "vfa-37",
|
|
["skill"] = "Excellent",
|
|
["speed"] = 179.86111111111,
|
|
["AddPropAircraft"] =
|
|
{
|
|
}, -- end of ["AddPropAircraft"]
|
|
["type"] = "FA-18C_hornet",
|
|
["unitId"] = 10,
|
|
["psi"] = 0.015782716092426,
|
|
["dataCartridge"] =
|
|
{
|
|
["GroupsPoints"] =
|
|
{
|
|
["PB"] =
|
|
{
|
|
}, -- end of ["PB"]
|
|
["Sequence 2 Red"] =
|
|
{
|
|
}, -- end of ["Sequence 2 Red"]
|
|
["Start Location"] =
|
|
{
|
|
}, -- end of ["Start Location"]
|
|
["Sequence 1 Blue"] =
|
|
{
|
|
}, -- end of ["Sequence 1 Blue"]
|
|
["Sequence 3 Yellow"] =
|
|
{
|
|
}, -- end of ["Sequence 3 Yellow"]
|
|
["A/A Waypoint"] =
|
|
{
|
|
}, -- end of ["A/A Waypoint"]
|
|
["PP"] =
|
|
{
|
|
}, -- end of ["PP"]
|
|
["Initial Point"] =
|
|
{
|
|
}, -- end of ["Initial Point"]
|
|
}, -- end of ["GroupsPoints"]
|
|
["Points"] =
|
|
{
|
|
}, -- end of ["Points"]
|
|
}, -- end of ["dataCartridge"]
|
|
["y"] = -15921.222675484,
|
|
["x"] = 20601.532582682,
|
|
["name"] = "TestBlueSpawn",
|
|
["payload"] =
|
|
{
|
|
["pylons"] =
|
|
{
|
|
[7] =
|
|
{
|
|
["CLSID"] = "{7575BA0B-7294-4844-857B-031A144B2595}",
|
|
}, -- end of [7]
|
|
[3] =
|
|
{
|
|
["CLSID"] = "{7575BA0B-7294-4844-857B-031A144B2595}",
|
|
}, -- end of [3]
|
|
}, -- end of ["pylons"]
|
|
["fuel"] = 4900,
|
|
["flare"] = 60,
|
|
["ammo_type"] = 1,
|
|
["chaff"] = 60,
|
|
["gun"] = 100,
|
|
}, -- end of ["payload"]
|
|
["heading"] = -0.015782716092426,
|
|
["callsign"] =
|
|
{
|
|
[1] = 1,
|
|
[2] = 1,
|
|
[3] = 1,
|
|
["name"] = "Enfield11",
|
|
}, -- end of ["callsign"]
|
|
["onboard_num"] = "010",
|
|
}, -- end of [1]
|
|
[2] =
|
|
{
|
|
["alt"] = 2000,
|
|
["alt_type"] = "BARO",
|
|
["livery_id"] = "vfa-37",
|
|
["skill"] = "Excellent",
|
|
["speed"] = 179.86111111111,
|
|
["AddPropAircraft"] =
|
|
{
|
|
}, -- end of ["AddPropAircraft"]
|
|
["type"] = "FA-18C_hornet",
|
|
["unitId"] = 11,
|
|
["psi"] = 0.015782716092426,
|
|
["y"] = -15881.222675484,
|
|
["x"] = 20561.532582682,
|
|
["name"] = "TestBlueSpawn-1",
|
|
["payload"] =
|
|
{
|
|
["pylons"] =
|
|
{
|
|
}, -- end of ["pylons"]
|
|
["fuel"] = 4900,
|
|
["flare"] = 60,
|
|
["ammo_type"] = 1,
|
|
["chaff"] = 60,
|
|
["gun"] = 100,
|
|
}, -- end of ["payload"]
|
|
["heading"] = -0.015782716092426,
|
|
["callsign"] =
|
|
{
|
|
[1] = 1,
|
|
[2] = 1,
|
|
[3] = 2,
|
|
["name"] = "Enfield12",
|
|
}, -- end of ["callsign"]
|
|
["onboard_num"] = "012",
|
|
}, -- end of [2]
|
|
}, -- end of ["units"]
|
|
["y"] = -15921.222675484,
|
|
["x"] = 20601.532582682,
|
|
["name"] = "TestBlueSpawn",
|
|
["communication"] = true,
|
|
["start_time"] = 0,
|
|
["frequency"] = 305,
|
|
}
|
|
--loads of other stuff you can do with this but this is probably what you need to startPoint
|
|
--you can also set a route here, and included first waypoint as spawn on airbases etc
|
|
--https://github.com/pydcs/dcs/blob/master/dcs/weapons_data.py all weapon pylon types
|
|
plane.country = 'Russia'
|
|
plane.category = 'airplane'
|
|
|
|
mist.dynAdd(plane)
|
|
vv.notify("spawnAirGroup executed", 2)
|
|
end
|
|
|
|
function vv.destroyAirGroup ()
|
|
local unit = Unit.getByName("TestBlue")
|
|
Object.destroy(unit)
|
|
vv.notify("destroyAirGroup executed", 2)
|
|
end
|
|
|
|
function vv.detonateAirGroup ()
|
|
local unit = Unit.getByName("TestBlue")
|
|
local unitPos = Object.getPosition(unit)
|
|
trigger.action.explosion(unitPos.p , 5 )
|
|
vv.notify("detonateAirGroup executed", 2)
|
|
end
|
|
|
|
|
|
|
|
controlRadio = missionCommands.addSubMenuForGroup(3, "Air control functions" , nil)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Attack the unit" , controlRadio , vv.attackAirUnit)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Attack the group" , controlRadio , vv.attackAirGroup)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Get detected targets" , controlRadio , vv.detectUnits)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Bomb below me" , controlRadio , vv.attackGroundPoint)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Fly here (to random airbase)" , controlRadio , vv.flyHere)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Land there" , controlRadio , vv.landHere)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Follow group" , controlRadio , vv.followGroup)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Go tank" , controlRadio , vv.refuelAtUnit)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Change formation" , controlRadio , vv.changeFormation)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Get fuel" , controlRadio , vv.fuelState)
|
|
controlRadio2 = missionCommands.addSubMenuForGroup(3, "Spawn Functions" , nil)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Spawn new group" , controlRadio2 , vv.spawnAirGroup)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Delete group" , controlRadio2 , vv.destroyAirGroup)
|
|
specificCommand = missionCommands.addCommandForGroup(3 , "Blow up group" , controlRadio2 , vv.detonateAirGroup)
|
|
|
|
env.setErrorMessageBoxEnabled(false) --mad skills stop server freezing on lua crash error box but also bad from diagnostics POV
|
|
vv.notify("baseFunctions.lua loaded", 2) |