2024-01-03 17:48:38 +01:00

629 lines
16 KiB
Lua

--max range, altitude and it fails?
--shoot right up
--fix sa10 and sa 11
--different static layouts on a carrier depending on what is going on
--guns on a static ship at sea?
pg = {}
handler = {}
pg.name = "Sam"
pg.cloneName = "Clone"
pg.fakeTargetName = "Player"
pg.samCounter = 1
pg.droneAlt = 20000
pg.delay = 40
pg.missileSpeed = 565
pg.samLoc = {}
pg.samLoc.x = 1
pg.samLoc.y = 1
pg.samLoc.z = 1
pg.missilesActive = 0
pg.droneName = nil
pg.droneSpeed = 300
pg.hidden = false
pg.samDB = {[1] = {["missileDelay"] = 40, ["missileSpeed"] = 770},
[2] = {["missileDelay"] = 40, ["missileSpeed"] = 770},
[3] = {["missileDelay"] = 120, ["missileSpeed"] = 550},
[4] = {["missileDelay"] = 40, ["missileSpeed"] = 770},
[5] = {["missileDelay"] = 65, ["missileSpeed"] = 770},
[6] = {["missileDelay"] = 60, ["missileSpeed"] = 500},
[7] = {["missileDelay"] = 40, ["missileSpeed"] = 770},
[8] = {["missileDelay"] = 40, ["missileSpeed"] = 770},
[9] = {["missileDelay"] = 40, ["missileSpeed"] = 770},
[10] = {["missileDelay"] = 60, ["missileSpeed"] = 1400},
}
function pg.notify(message, displayFor)
trigger.action.outText(message, displayFor, false)
end
function pg.fakeSam(vec3)
playerTarget = Unit.getByName(pg.fakeTargetName)
pointFakeTarget = playerTarget:getPosition().p
vec3 = vec3 or pg.samLoc
vecSub = mist.vec.sub(pointFakeTarget , vec3)
planeHeading = mist.utils.getDir(vecSub)
missileType = 2
pg.spawnDrone (vec3,planeHeading,playerTarget,missileType)
--pg.notify("FakeSam Ran", 10)
targetID = Group.getByName("TargetDrone" .. pg.samCounter):getUnit(1):getID()
samGroup = Group.getByName("poleGenerator" .. pg.samCounter)
vars = {[1] = targetID, [2] = samGroup}
timer.scheduleFunction(pg.attack ,vars, timer.getTime() + 1)
pg.samCounter = pg.samCounter + 1
end
function pg.spawnSamSA2 (vec3,heading)
--where
--name
group = {}
group.groupName = "poleGenerator" .. pg.samCounter
group.units = {
[1] =
{
["skill"] = "High",
["coldAtStart"] = false,
["hidden"] = pg.hidden,
["type"] = "S_75M_Volhov",
--["unitId"] = 35,
["y"] = vec3.z-40,
["x"] = vec3.x-40,
--["name"] = "Ground-1-2",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [1]
[2] =
{
["skill"] = "High",
["coldAtStart"] = false,
["type"] = "SNR_75V",
--["unitId"] = 34,
["y"] = vec3.z,
["x"] = vec3.x,
--["name"] = "Ground-1-1",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [2]
}
group.hidden = pg.hidden
group.category = "VEHICLE"
group.country = 54
mist.dynAdd(group)
--heading
end
function pg.spawnSamSA3 (vec3,heading)
--where
--name
group = {}
group.groupName = "poleGenerator" .. pg.samCounter
group.units = {
[1] =
{
["skill"] = "High",
["coldAtStart"] = false,
["hidden"] = pg.hidden,
["type"] = "snr s-125 tr",
--["unitId"] = 35,
["y"] = vec3.z-40,
["x"] = vec3.x-40,
--["name"] = "Ground-1-2",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [1]
[2] =
{
["skill"] = "High",
["coldAtStart"] = false,
["type"] = "5p73 s-125 ln",
--["unitId"] = 34,
["y"] = vec3.z,
["x"] = vec3.x,
--["name"] = "Ground-1-1",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [2]
}
group.hidden = pg.hidden
group.category = "VEHICLE"
group.country = 54
mist.dynAdd(group)
--heading
end
function pg.spawnSamSA5 (vec3,heading)
--where
--name
group = {}
group.groupName = "poleGenerator" .. pg.samCounter
group.units = {
[1] =
{
["skill"] = "High",
["coldAtStart"] = false,
["hidden"] = pg.hidden,
["type"] = "RPC_5N62V",
--["unitId"] = 35,
["y"] = vec3.z-40,
["x"] = vec3.x-40,
--["name"] = "Ground-1-2",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [1]
[2] =
{
["skill"] = "High",
["coldAtStart"] = false,
["type"] = "RLS_19J6",
--["unitId"] = 34,
["y"] = vec3.z,
["x"] = vec3.x,
--["name"] = "Ground-1-1",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [2]
[3] =
{
["skill"] = "High",
["coldAtStart"] = false,
["type"] = "S-200_Launcher",
--["unitId"] = 34,
["y"] = vec3.z-80,
["x"] = vec3.x-80,
--["name"] = "Ground-1-1",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [3]
}
group.hidden = pg.hidden
group.category = "VEHICLE"
group.country = 54
mist.dynAdd(group)
--heading
end
function pg.spawnSamSA6 (vec3,heading)
--where
--name
group = {}
group.groupName = "poleGenerator" .. pg.samCounter
group.units = {
[1] =
{
["skill"] = "High",
["coldAtStart"] = false,
["hidden"] = pg.hidden,
["type"] = "Kub 1S91 str",
--["unitId"] = 35,
["y"] = vec3.z-40,
["x"] = vec3.x-40,
--["name"] = "Ground-1-2",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [1]
[2] =
{
["skill"] = "High",
["coldAtStart"] = false,
["type"] = "Kub 2P25 ln",
--["unitId"] = 34,
["y"] = vec3.z,
["x"] = vec3.x,
--["name"] = "Ground-1-1",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [2]
}
group.hidden = pg.hidden
group.category = "VEHICLE"
group.country = 54
mist.dynAdd(group)
--heading
end
function pg.spawnSamSA10 (vec3,heading)
--where
--name
group = {}
group.groupName = "poleGenerator" .. pg.samCounter
group.units = {
[1] =
{
["skill"] = "High",
["coldAtStart"] = false,
["hidden"] = pg.hidden,
["type"] = "S-300PS 40B6M tr",
--["unitId"] = 35,
["y"] = vec3.z,
["x"] = vec3.x,
--["name"] = "Ground-1-2",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [1]
[2] =
{
["skill"] = "High",
["coldAtStart"] = false,
["type"] = "S-300PS 64H6E sr",
--["unitId"] = 34,
["y"] = vec3.z-10,
["x"] = vec3.x-10,
--["name"] = "Ground-1-1",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [2]
[3] =
{
["skill"] = "High",
["coldAtStart"] = false,
["type"] = "S-300PS 54K6 cp",
--["unitId"] = 34,
["y"] = vec3.z-20,
["x"] = vec3.x-20,
--["name"] = "Ground-1-1",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [3]
[4] =
{
["skill"] = "High",
["coldAtStart"] = false,
["type"] = "S-300PS 5P85C ln",
--["unitId"] = 34,
["y"] = vec3.z-40,
["x"] = vec3.x-40,
--["name"] = "Ground-1-1",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [4]
}
group.hidden = pg.hidden
group.category = "VEHICLE"
group.country = 54
mist.dynAdd(group)
--heading
end
function pg.spawnSamSA11 (vec3,heading)
--where
--name
group = {}
group.groupName = "poleGenerator" .. pg.samCounter
group.units = {
[1] =
{
["skill"] = "High",
["coldAtStart"] = false,
["hidden"] = pg.hidden,
["type"] = "SA-11 Buk SR 9S18M1",
--["unitId"] = 35,
["y"] = vec3.z-40,
["x"] = vec3.x-40,
--["name"] = "Ground-1-2",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [1]
[2] =
{
["skill"] = "High",
["coldAtStart"] = false,
["type"] = "SA-11 Buk CC 9S470M1",
--["unitId"] = 34,
["y"] = vec3.z,
["x"] = vec3.x,
--["name"] = "Ground-1-1",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [2]
[2] =
{
["skill"] = "High",
["coldAtStart"] = false,
["type"] = "SA-11 Buk LN 9A310M1",
--["unitId"] = 34,
["y"] = vec3.z,
["x"] = vec3.x,
--["name"] = "Ground-1-1",
["heading"] = heading+math.pi,
["playerCanDrive"] = false,
}, -- end of [2]
}
group.hidden = pg.hidden
group.category = "VEHICLE"
group.country = 54
mist.dynAdd(group)
--heading
end
function pg.spawnDrone(vec3,planeHeading,playerTarget,missileType)
-- where is the plane going to be in x seconds
playerTargetPos = playerTarget:getPosition().p
futurePlayerTargetPos = playerTargetPos
playerMotionVec = Object.getVelocity(playerTarget)
--work out what type of SAM we are shooting to work out the delay, missile speed etc
if missileType == 2 then
pg.delay = pg.samDB[2].missileDelay
pg.missileSpeed = pg.samDB[2].missileSpeed
elseif missileType == 3 then
pg.delay = pg.samDB[3].missileDelay
pg.missileSpeed = pg.samDB[3].missileSpeed
elseif missileType == 5 then
pg.delay = pg.samDB[5].missileDelay
pg.missileSpeed = pg.samDB[5].missileSpeed
elseif missileType == 6 then
pg.delay = pg.samDB[6].missileDelay
pg.missileSpeed = pg.samDB[5].missileSpeed
elseif missileType == 10 then
pg.delay = pg.samDB[10].missileDelay
pg.missileSpeed = pg.samDB[10].missileSpeed
elseif missileType == 11 then
pg.delay = pg.samDB[11].missileDelay
pg.missileSpeed = pg.samDB[11].missileSpeed
else --assume SA2
pg.delay = pg.samDB[2].missileDelay
pg.missileSpeed = pg.samDB[2].missileSpeed
end
futurePlayerTargetPos.x = playerTargetPos.x + playerMotionVec.x*pg.delay
futurePlayerTargetPos.y = playerTargetPos.y + playerMotionVec.y*pg.delay
futurePlayerTargetPos.z = playerTargetPos.z + playerMotionVec.z*pg.delay
droneTurnPoint = mist.projectPoint(futurePlayerTargetPos, 10000 ,planeHeading+math.pi)
--this is where the plane will be when the missile is launched
--pythago to get hyp
--x^2 + y^x = hyp^2
x = mist.utils.get2DDist(futurePlayerTargetPos,vec3)
y = playerTargetPos.y
--pg.notify(y,5)
hyp = math.sqrt(x^2 + y^2)
roughFlightTime = hyp /pg.missileSpeed-- distance / speed
futurePlayerTargetPos.x = futurePlayerTargetPos.x + playerMotionVec.x*roughFlightTime
futurePlayerTargetPos.y = futurePlayerTargetPos.y + playerMotionVec.y*roughFlightTime
futurePlayerTargetPos.z = futurePlayerTargetPos.z + playerMotionVec.z*roughFlightTime
--this is where the plane will be when the missile arrives at its altitude
--now we need to work out where the drone is going to go
vecSub = mist.vec.sub(vec3,futurePlayerTargetPos)
heading = mist.utils.getDir(vecSub) --heading between picked location and future pos
extendDistance = x + 10000
alt = (((futurePlayerTargetPos.y) * extendDistance)/x)
droneAtTimePos = mist.projectPoint(vec3, extendDistance ,heading +math.pi)
extendDistance = extendDistance + pg.droneSpeed*roughFlightTime
droneAtStartPos = mist.projectPoint(vec3, extendDistance ,heading +math.pi)
--we want to curve the missile in the players direction
--planeHeading
pg.makeDrone(droneAtStartPos,heading, droneAtTimePos, futurePlayerTargetPos,alt,droneTurnPoint)
if missileType == 2 then
pg.spawnSamSA2 (vec3,heading)
elseif missileType == 3 then
pg.spawnSamSA3 (vec3,heading)
elseif missileType == 5 then
pg.spawnSamSA5 (vec3,heading)
elseif missileType == 6 then
pg.spawnSamSA6 (vec3,heading)
elseif missileType == 10 then
pg.spawnSamSA10 (vec3,heading)
else --assume SA2
pg.spawnSamSA2 (vec3,heading)
end
end
function pg.makeDrone(spawnVec,heading, routeVec, nextRouteVec,alt,droneTurnPoint)
--this spawns in the drone
group = DroneClone
group.groupName = "TargetDrone" .. pg.samCounter
group.groupId = nil
group.units[1].unitId = nil
group.units[1].unitName = nil
group.units[1].y = spawnVec.z
group.units[1].x = spawnVec.x
group.units[1].heading = heading
group.units[1].alt = alt
group.route["points"][2] = group.route["points"][1]
group.route["points"][3] = group.route["points"][1]
group.route["points"][1]["y"] = routeVec.z
group.route["points"][1]["x"] = routeVec.x
group.route["points"][1]["alt"] = alt
group.route["points"][2]["y"] = nextRouteVec.z
group.route["points"][2]["x"] = nextRouteVec.x
group.route["points"][2]["alt"] = alt
group.route["points"][3]["y"] = droneTurnPoint.z
group.route["points"][3]["x"] = droneTurnPoint.x
group.route["points"][3]["alt"] = alt
group.countryId = 56
group.category = 'AIRPLANE'
mist.dynAdd(group)
end
function pg.attack (vars)
targetID = vars[1]
samGroup = vars[2]
AttackUnit = {
id = 'AttackUnit',
params = {
unitId = targetID,
attackQtyLimit = true,
attackQty = 1,
}
}
local controller = samGroup:getController()
controller:pushTask(AttackUnit)
end
function pg.radarOff ()
group = Group.getByName(pg.name)
local controller = group:getController()
controller:setOption(9,1)
end
function pg.radarOn ()
group = Group.getByName(pg.name)
local controller = group:getController()
controller:setOption(9,0)
end
DroneClone=
{
["modulation"] = 0,
["tasks"] =
{
}, -- end of ["tasks"]
["task"] = "Reconnaissance",
["uncontrolled"] = false,
["route"] =
{
["points"] =
{
[1] =
{
["alt"] = 2000,
["action"] = "Turning Point",
["alt_type"] = "BARO",
["speed"] = 82.222222222222,
["task"] =
{
["id"] = "ComboTask",
["params"] =
{
["tasks"] =
{}, -- end of ["tasks"]
}, -- end of ["params"]
}, -- end of ["task"]
["type"] = "Turning Point",
["ETA"] = 0,
["ETA_locked"] = true,
["y"] = 0,
["x"] = 0,
["formation_template"] = "",
["speed_locked"] = true,
}, -- end of [1]
[2] =
{
["alt"] = 2000,
["action"] = "Turning Point",
["alt_type"] = "BARO",
["speed"] = 82.222222222222,
["task"] =
{
["id"] = "ComboTask",
["params"] =
{
["tasks"] =
{
}, -- end of ["tasks"]
}, -- end of ["params"]
}, -- end of ["task"]
["type"] = "Turning Point",
["ETA"] = 157.20107538291,
["ETA_locked"] = false,
["y"] = 0,
["x"] = 0,
["formation_template"] = "",
["speed_locked"] = true,
}, -- end of [2]
}, -- end of ["points"]
}, -- end of ["route"]
--["groupId"] = 1,
["hidden"] = pg.hidden,
["units"] =
{
[1] =
{
["alt"] = 2000,
["alt_type"] = "BARO",
["livery_id"] = "'camo' scheme",
["skill"] = "High",
["speed"] = 82.222222222222,
["type"] = "MQ-9 Reaper",
--["unitId"] = 1,
--["psi"] = -3.129323330636,
["y"] = 0,
["x"] = 0,
["payload"] =
{
["pylons"] =
{
}, -- end of ["pylons"]
["fuel"] = 1300,
["flare"] = 0,
["chaff"] = 0,
["gun"] = 100,
}, -- end of ["payload"]
["heading"] = 0.5,
["callsign"] =
{
[1] = 1,
[2] = 1,
[3] = 1,
["name"] = "Enfield11",
}, -- end of ["callsign"]
["onboard_num"] = "010",
}, -- end of [1]
}, -- end of ["units"]
["y"] = 0,
["x"] = 0,
["communication"] = true,
["start_time"] = 0,
["frequency"] = 124,
}
local function protectedCall(...)
local status, retval = pcall(...)
if not status then
end
end
function handler:onEvent(event)
protectedCall(pg.eventHandler, event)
end
function pg.eventHandler (event)
if (26 == event.id) then --this is when someone types into a mark
local vec3 = mist.utils.makeVec3GL(event.pos)
pg.fakeSam (vec3)
end
end
function handler:onEvent(event)
protectedCall(pg.eventHandler, event)
end
do
longRangeShots = missionCommands.addSubMenu("SAM")
missionCommands.addCommand ("Generate pole", longRangeShots, pg.fakeSam)
world.addEventHandler(handler)
end
pg.notify("poleGen.lua",10)