DCSOlympus/scripts/lua/examples/baseFunctions.lua
2024-01-03 17:48:38 +01:00

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)