From dcce65edeb995e4932c135f9e5f3e9d8dcf8cb2b Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sat, 11 Jun 2016 10:29:39 +0200 Subject: [PATCH] Updated Moose.lua --- .../l10n/DEFAULT/Moose.lua | 20031 +++++++++++++++- Moose Mission Setup/Moose.lua | 20031 +++++++++++++++- .../Moose_Test_AIBALANCER.miz | Bin 20647 -> 138094 bytes .../Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz | Bin 99744 -> 217191 bytes .../Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz | Bin 35121 -> 152568 bytes .../Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz | Bin 59151 -> 176598 bytes .../Moose_Test_MISSILETRAINER.miz | Bin 126338 -> 243820 bytes .../Moose_Test_SEAD/MOOSE_Test_SEAD.miz | Bin 25733 -> 143180 bytes .../Moose_Test_SET_CLIENT.miz | Bin 19551 -> 137033 bytes .../Moose_Test_SET_GROUP.miz | Bin 41244 -> 158691 bytes .../Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz | Bin 54983 -> 172430 bytes .../MOOSE_Test_SPAWN_Repeat.miz | Bin 25294 -> 142741 bytes .../MOOSE_Test_TASK_Pickup_and_Deploy.miz | Bin 31895 -> 149342 bytes .../Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz | Bin 40914 -> 158361 bytes .../Moose_Test_ZONE/Moose_Test_ZONE.miz | Bin 20875 -> 138322 bytes .../Moose_Test_ZONE_POLYGON.miz | Bin 21591 -> 139038 bytes .../Moose_Test_ZONE_RADIUS.miz | Bin 21027 -> 138474 bytes .../Moose_Test_ZONE_UNIT.miz | Bin 20901 -> 138348 bytes 18 files changed, 40018 insertions(+), 44 deletions(-) diff --git a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua index 8e2cefd95..682e1f28d 100644 --- a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua +++ b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua @@ -1,6 +1,5 @@ -env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160611_0744' ) - +env.info( '*** MOOSE STATIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160611_1029' ) local base = _G Include = {} @@ -11,33 +10,20021 @@ Include.Path = function() end Include.File = function( IncludeFile ) - if not Include.Files[ IncludeFile ] then - Include.Files[IncludeFile] = IncludeFile - env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) - local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) - if f == nil then - env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) - local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) - if f == nil then - error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) - else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) - return f() +end + +Include.Files = {} +--- Various routines +-- @module routines +-- @author Flightcontrol + +env.setErrorMessageBoxEnabled(false) + +--- Extract of MIST functions. +-- @author Grimes + +routines = {} + + +-- don't change these +routines.majorVersion = 3 +routines.minorVersion = 3 +routines.build = 22 + +----------------------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------- +-- Utils- conversion, Lua utils, etc. +routines.utils = {} + +--from http://lua-users.org/wiki/CopyTable +routines.utils.deepCopy = function(object) + local lookup_table = {} + local function _copy(object) + if type(object) ~= "table" then + return object + elseif lookup_table[object] then + return lookup_table[object] + end + local new_table = {} + lookup_table[object] = new_table + for index, value in pairs(object) do + new_table[_copy(index)] = _copy(value) + end + return setmetatable(new_table, getmetatable(object)) + end + local objectreturn = _copy(object) + return objectreturn +end + + +-- porting in Slmod's serialize_slmod2 +routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function + + lookup_table = {} + + local function _Serialize( tbl ) + + if type(tbl) == 'table' then --function only works for tables! + + if lookup_table[tbl] then + return lookup_table[object] end + + local tbl_str = {} + + lookup_table[tbl] = tbl_str + + tbl_str[#tbl_str + 1] = '{' + + for ind,val in pairs(tbl) do -- serialize its fields + local ind_str = {} + if type(ind) == "number" then + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = tostring(ind) + ind_str[#ind_str + 1] = ']=' + else --must be a string + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) + ind_str[#ind_str + 1] = ']=' + end + + local val_str = {} + if ((type(val) == 'number') or (type(val) == 'boolean')) then + val_str[#val_str + 1] = tostring(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'string' then + val_str[#val_str + 1] = routines.utils.basicSerialize(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'nil' then -- won't ever happen, right? + val_str[#val_str + 1] = 'nil,' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'table' then + if ind == "__index" then + -- tbl_str[#tbl_str + 1] = "__index" + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else + + val_str[#val_str + 1] = _Serialize(val) + val_str[#val_str + 1] = ',' --I think this is right, I just added it + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + end + elseif type(val) == 'function' then + -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else +-- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) +-- env.info( debug.traceback() ) + end + + end + tbl_str[#tbl_str + 1] = '}' + return table.concat(tbl_str) else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) - return f() + return tostring(tbl) + end + end + + local objectreturn = _Serialize(tbl) + return objectreturn +end + +--porting in Slmod's "safestring" basic serialize +routines.utils.basicSerialize = function(s) + if s == nil then + return "\"\"" + else + if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then + return tostring(s) + elseif type(s) == 'string' then + s = string.format('%q', s) + return s end end end -Include.ProgramPath = "Scripts/Moose/" -Include.MissionPath = Include.Path() -env.info( "Include.ProgramPath = " .. Include.ProgramPath) -env.info( "Include.MissionPath = " .. Include.MissionPath) +routines.utils.toDegree = function(angle) + return angle*180/math.pi +end -Include.Files = {} +routines.utils.toRadian = function(angle) + return angle*math.pi/180 +end +routines.utils.metersToNM = function(meters) + return meters/1852 +end + +routines.utils.metersToFeet = function(meters) + return meters/0.3048 +end + +routines.utils.NMToMeters = function(NM) + return NM*1852 +end + +routines.utils.feetToMeters = function(feet) + return feet*0.3048 +end + +routines.utils.mpsToKnots = function(mps) + return mps*3600/1852 +end + +routines.utils.mpsToKmph = function(mps) + return mps*3.6 +end + +routines.utils.knotsToMps = function(knots) + return knots*1852/3600 +end + +routines.utils.kmphToMps = function(kmph) + return kmph/3.6 +end + +function routines.utils.makeVec2(Vec3) + if Vec3.z then + return {x = Vec3.x, y = Vec3.z} + else + return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. + end +end + +function routines.utils.makeVec3(Vec2, y) + if not Vec2.z then + if not y then + y = 0 + end + return {x = Vec2.x, y = y, z = Vec2.y} + else + return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. + end +end + +function routines.utils.makeVec3GL(Vec2, offset) + local adj = offset or 0 + + if not Vec2.z then + return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} + else + return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} + end +end + +routines.utils.zoneToVec3 = function(zone) + local new = {} + if type(zone) == 'table' and zone.point then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + elseif type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + if zone then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + end + end +end + +-- gets heading-error corrected direction from point along vector vec. +function routines.utils.getDir(vec, point) + local dir = math.atan2(vec.z, vec.x) + dir = dir + routines.getNorthCorrection(point) + if dir < 0 then + dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi + end + return dir +end + +-- gets distance in meters between two points (2 dimensional) +function routines.utils.get2DDist(point1, point2) + point1 = routines.utils.makeVec3(point1) + point2 = routines.utils.makeVec3(point2) + return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) +end + +-- gets distance in meters between two points (3 dimensional) +function routines.utils.get3DDist(point1, point2) + return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) +end + + + +-- From http://lua-users.org/wiki/SimpleRound +-- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place +routines.utils.round = function(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + +-- porting in Slmod's dostring +routines.utils.dostring = function(s) + local f, err = loadstring(s) + if f then + return true, f() + else + return false, err + end +end + + +--3D Vector manipulation +routines.vec = {} + +routines.vec.add = function(vec1, vec2) + return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} +end + +routines.vec.sub = function(vec1, vec2) + return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} +end + +routines.vec.scalarMult = function(vec, mult) + return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} +end + +routines.vec.scalar_mult = routines.vec.scalarMult + +routines.vec.dp = function(vec1, vec2) + return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z +end + +routines.vec.cp = function(vec1, vec2) + return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} +end + +routines.vec.mag = function(vec) + return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 +end + +routines.vec.getUnitVec = function(vec) + local mag = routines.vec.mag(vec) + return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } +end + +routines.vec.rotateVec2 = function(vec2, theta) + return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} +end +--------------------------------------------------------------------------------------------------------------------------- + + + + +-- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. +routines.tostringMGRS = function(MGRS, acc) + if acc == 0 then + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph + else + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) + .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) + end +end + +--[[acc: +in DM: decimal point of minutes. +In DMS: decimal point of seconds. +position after the decimal of the least significant digit: +So: +42.32 - acc of 2. +]] +routines.tostringLL = function(lat, lon, acc, DMS) + + local latHemi, lonHemi + if lat > 0 then + latHemi = 'N' + else + latHemi = 'S' + end + + if lon > 0 then + lonHemi = 'E' + else + lonHemi = 'W' + end + + lat = math.abs(lat) + lon = math.abs(lon) + + local latDeg = math.floor(lat) + local latMin = (lat - latDeg)*60 + + local lonDeg = math.floor(lon) + local lonMin = (lon - lonDeg)*60 + + if DMS then -- degrees, minutes, and seconds. + local oldLatMin = latMin + latMin = math.floor(latMin) + local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) + + local oldLonMin = lonMin + lonMin = math.floor(lonMin) + local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) + + if latSec == 60 then + latSec = 0 + latMin = latMin + 1 + end + + if lonSec == 60 then + lonSec = 0 + lonMin = lonMin + 1 + end + + local secFrmtStr -- create the formatting string for the seconds place + if acc <= 0 then -- no decimal place. + secFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi + + else -- degrees, decimal minutes. + latMin = routines.utils.round(latMin, acc) + lonMin = routines.utils.round(lonMin, acc) + + if latMin == 60 then + latMin = 0 + latDeg = latDeg + 1 + end + + if lonMin == 60 then + lonMin = 0 + lonDeg = lonDeg + 1 + end + + local minFrmtStr -- create the formatting string for the minutes place + if acc <= 0 then -- no decimal place. + minFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi + + end +end + +--[[ required: az - radian + required: dist - meters + optional: alt - meters (set to false or nil if you don't want to use it). + optional: metric - set true to get dist and alt in km and m. + precision will always be nearest degree and NM or km.]] +routines.tostringBR = function(az, dist, alt, metric) + az = routines.utils.round(routines.utils.toDegree(az), 0) + + if metric then + dist = routines.utils.round(dist/1000, 2) + else + dist = routines.utils.round(routines.utils.metersToNM(dist), 2) + end + + local s = string.format('%03d', az) .. ' for ' .. dist + + if alt then + if metric then + s = s .. ' at ' .. routines.utils.round(alt, 0) + else + s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) + end + end + return s +end + +routines.getNorthCorrection = function(point) --gets the correction needed for true north + if not point.z then --Vec2; convert to Vec3 + point.z = point.y + point.y = 0 + end + local lat, lon = coord.LOtoLL(point) + local north_posit = coord.LLtoLO(lat + 1, lon) + return math.atan2(north_posit.z - point.z, north_posit.x - point.x) +end + + +-- the main area +do + -- THE MAIN FUNCTION -- Accessed 100 times/sec. + routines.main = function() + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error + ---------------------------------------------------------------------------------------------------------- + --area to add new stuff in + + routines.do_scheduled_functions() + end -- end of routines.main + + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) + +end + + +do + local idNum = 0 + + --Simplified event handler + routines.addEventHandler = function(f) --id is optional! + local handler = {} + idNum = idNum + 1 + handler.id = idNum + handler.f = f + handler.onEvent = function(self, event) + self.f(event) + end + world.addEventHandler(handler) + end + + routines.removeEventHandler = function(id) + for key, handler in pairs(world.eventHandlers) do + if handler.id and handler.id == id then + world.eventHandlers[key] = nil + return true + end + end + return false + end +end + +-- need to return a Vec3 or Vec2? +function routines.getRandPointInCircle(point, radius, innerRadius) + local theta = 2*math.pi*math.random() + local rad = math.random() + math.random() + if rad > 1 then + rad = 2 - rad + end + + local radMult + if innerRadius and innerRadius <= radius then + radMult = (radius - innerRadius)*rad + innerRadius + else + radMult = radius*rad + end + + if not point.z then --might as well work with vec2/3 + point.z = point.y + end + + local rndCoord + if radius > 0 then + rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} + else + rndCoord = {x = point.x, y = point.z} + end + return rndCoord +end + +routines.goRoute = function(group, path) + local misTask = { + id = 'Mission', + params = { + route = { + points = routines.utils.deepCopy(path), + }, + }, + } + if type(group) == 'string' then + group = Group.getByName(group) + end + local groupCon = group:getController() + if groupCon then + groupCon:setTask(misTask) + return true + end + + Controller.setTask(groupCon, misTask) + return false +end + + +-- Useful atomic functions from mist, ported. + +routines.ground = {} +routines.fixedWing = {} +routines.heli = {} + +routines.ground.buildWP = function(point, overRideForm, overRideSpeed) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + local form, speed + + if point.speed and not overRideSpeed then + wp.speed = point.speed + elseif type(overRideSpeed) == 'number' then + wp.speed = overRideSpeed + else + wp.speed = routines.utils.kmphToMps(20) + end + + if point.form and not overRideForm then + form = point.form + else + form = overRideForm + end + + if not form then + wp.action = 'Cone' + else + form = string.lower(form) + if form == 'off_road' or form == 'off road' then + wp.action = 'Off Road' + elseif form == 'on_road' or form == 'on road' then + wp.action = 'On Road' + elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then + wp.action = 'Rank' + elseif form == 'cone' then + wp.action = 'Cone' + elseif form == 'diamond' then + wp.action = 'Diamond' + elseif form == 'vee' then + wp.action = 'Vee' + elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then + wp.action = 'EchelonL' + elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then + wp.action = 'EchelonR' + else + wp.action = 'Cone' -- if nothing matched + end + end + + wp.type = 'Turning Point' + + return wp + +end + +routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 2000 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(500) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.heli.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 500 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(200) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.groupToRandomPoint = function(vars) + local group = vars.group --Required + local point = vars.point --required + local radius = vars.radius or 0 + local innerRadius = vars.innerRadius + local form = vars.form or 'Cone' + local heading = vars.heading or math.random()*2*math.pi + local headingDegrees = vars.headingDegrees + local speed = vars.speed or routines.utils.kmphToMps(20) + + + local useRoads + if not vars.disableRoads then + useRoads = true + else + useRoads = false + end + + local path = {} + + if headingDegrees then + heading = headingDegrees*math.pi/180 + end + + if heading >= 2*math.pi then + heading = heading - 2*math.pi + end + + local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) + + local offset = {} + local posStart = routines.getLeadPos(group) + + offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) + offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) + path[#path + 1] = routines.ground.buildWP(posStart, form, speed) + + + if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) + path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) + path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) + else + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) + end + + path[#path + 1] = routines.ground.buildWP(offset, form, speed) + path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) + + routines.goRoute(group, path) + + return +end + +routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) + local pos = routines.getLeadPos(gpData) + local fakeZone = {} + fakeZone.radius = dist or math.random(300, 1000) + fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} + routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) + + return +end + +routines.groupToRandomZone = function(gpData, zone, form, heading, speed) + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + if type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + elseif type(zone) == 'table' and not zone.radius then + zone = trigger.misc.getZone(zone[math.random(1, #zone)]) + end + + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.radius = zone.radius + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.point = routines.utils.zoneToVec3(zone) + + routines.groupToRandomPoint(vars) + + return +end + +routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types + if coord.z then + coord.y = coord.z + end + local typeConverted = {} + + if type(terrainTypes) == 'string' then -- if its a string it does this check + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then + table.insert(typeConverted, constId) + end + end + elseif type(terrainTypes) == 'table' then -- if its a table it does this check + for typeId, typeData in pairs(terrainTypes) do + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then + table.insert(typeConverted, constId) + end + end + end + end + for validIndex, validData in pairs(typeConverted) do + if land.getSurfaceType(coord) == land.SurfaceType[validData] then + return true + end + end + return false +end + +routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) + if type(point) == 'string' then + point = trigger.misc.getZone(point) + end + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.disableRoads = useRoads + vars.point = routines.utils.zoneToVec3(point) + routines.groupToRandomPoint(vars) + + return +end + + +routines.getLeadPos = function(group) + if type(group) == 'string' then -- group name + group = Group.getByName(group) + end + + local units = group:getUnits() + + local leader = units[1] + if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. + local lowestInd = math.huge + for ind, unit in pairs(units) do + if ind < lowestInd then + lowestInd = ind + leader = unit + end + end + end + if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... + return leader:getPosition().p + end +end + +--[[ vars for routines.getMGRSString: +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +]] +routines.getMGRSString = function(vars) + local units = vars.units + local acc = vars.acc or 5 + local avgPos = routines.getAvgPos(units) + if avgPos then + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) + end +end + +--[[ vars for routines.getLLString +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. + + +]] +routines.getLLString = function(vars) + local units = vars.units + local acc = vars.acc or 3 + local DMS = vars.DMS + local avgPos = routines.getAvgPos(units) + if avgPos then + local lat, lon = coord.LOtoLL(avgPos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + +--[[ +vars.zone - table of a zone name. +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRStringZone = function(vars) + local zone = trigger.misc.getZone( vars.zone ) + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + if zone then + local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(zone.point, ref) + if alt then + alt = zone.y + end + return routines.tostringBR(dir, dist, alt, metric) + else + env.info( 'routines.getBRStringZone: error: zone is nil' ) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRString = function(vars) + local units = vars.units + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + local avgPos = routines.getAvgPos(units) + if avgPos then + local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(avgPos, ref) + if alt then + alt = avgPos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + + +-- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. +--[[ vars for routines.getLeadingPos: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +]] +routines.getLeadingPos = function(vars) + local units = vars.units + local heading = vars.heading + local radius = vars.radius + if vars.headingDegrees then + heading = routines.utils.toRadian(vars.headingDegrees) + end + + local unitPosTbl = {} + for i = 1, #units do + local unit = Unit.getByName(units[i]) + if unit and unit:isExist() then + unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p + end + end + if #unitPosTbl > 0 then -- one more more units found. + -- first, find the unit most in the heading direction + local maxPos = -math.huge + + local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = + for i = 1, #unitPosTbl do + local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) + if (not maxPos) or maxPos < rotatedVec2.x then + maxPos = rotatedVec2.x + maxPosInd = i + end + end + + --now, get all the units around this unit... + local avgPos + if radius then + local maxUnitPos = unitPosTbl[maxPosInd] + local avgx, avgy, avgz, totNum = 0, 0, 0, 0 + for i = 1, #unitPosTbl do + if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then + avgx = avgx + unitPosTbl[i].x + avgy = avgy + unitPosTbl[i].y + avgz = avgz + unitPosTbl[i].z + totNum = totNum + 1 + end + end + avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} + else + avgPos = unitPosTbl[maxPosInd] + end + + return avgPos + end +end + + +--[[ vars for routines.getLeadingMGRSString: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number, 0 to 5. +]] +routines.getLeadingMGRSString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 5 + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) + end +end + +--[[ vars for routines.getLeadingLLString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. +]] +routines.getLeadingLLString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 3 + local DMS = vars.DMS + local lat, lon = coord.LOtoLL(pos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + + + +--[[ vars for routines.getLeadingBRString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.metric - boolean, if true, use km instead of NM. +vars.alt - boolean, if true, include altitude. +vars.ref - vec3/vec2 reference point. +]] +routines.getLeadingBRString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local ref = vars.ref + local alt = vars.alt + local metric = vars.metric + + local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(pos, ref) + if alt then + alt = pos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + +--[[ vars for routines.message.add + vars.text = 'Hello World' + vars.displayTime = 20 + vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} + +]] + +--[[ vars for routines.msgMGRS +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgMGRS = function(vars) + local units = vars.units + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getMGRSString{units = units, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + +--[[ vars for routines.msgLL +vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLLString{units = units, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local alt = vars.alt + local metric = vars.metric + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +-------------------------------------------------------------------------------------------- +-- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - string red, blue +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBullseye = function(vars) + if string.lower(vars.ref) == 'red' then + vars.ref = routines.DBs.missionData.bullseye.red + routines.msgBR(vars) + elseif string.lower(vars.ref) == 'blue' then + vars.ref = routines.DBs.missionData.bullseye.blue + routines.msgBR(vars) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - unit name of reference point +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] + +routines.msgBRA = function(vars) + if Unit.getByName(vars.ref) then + vars.ref = Unit.getByName(vars.ref):getPosition().p + if not vars.alt then + vars.alt = true + end + routines.msgBR(vars) + end +end +-------------------------------------------------------------------------------------------- + +--[[ vars for routines.msgLeadingMGRS: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number, 0 to 5. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingMGRS = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + + +end +--[[ vars for routines.msgLeadingLL: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. (optional) +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + +--[[ +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.metric - boolean, if true, use km instead of NM. (optional) +vars.alt - boolean, if true, include altitude. (optional) +vars.ref - vec3/vec2 reference point. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local metric = vars.metric + local alt = vars.alt + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + + +function spairs(t, order) + -- collect the keys + local keys = {} + for k in pairs(t) do keys[#keys+1] = k end + + -- if order function given, sort by it by passing the table and keys a, b, + -- otherwise just sort the keys + if order then + table.sort(keys, function(a,b) return order(t, a, b) end) + else + table.sort(keys) + end + + -- return the iterator function + local i = 0 + return function() + i = i + 1 + if keys[i] then + return keys[i], t[keys[i]] + end + end +end + + +function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) +--trace.f() + + local CurrentZoneID = nil + + if CargoGroup then + local CargoUnits = CargoGroup:getUnits() + for CargoUnitID, CargoUnit in pairs( CargoUnits ) do + if CargoUnit and CargoUnit:getLife() >= 1.0 then + CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) + if CurrentZoneID then + break + end + end + end + end + +--trace.r( "", "", { CurrentZoneID } ) + return CurrentZoneID +end + + + +function routines.IsUnitInZones( TransportUnit, LandingZones ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + +function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + + +function routines.IsStaticInZones( TransportStatic, LandingZones ) +--trace.f() + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local TransportStaticPos = TransportStatic:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + +--trace.r( "", "", { TransportZoneResult } ) + return TransportZoneResult +end + + +function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local CargoPos = CargoUnit:getPosition().p + local ReferenceP = ReferencePosition.p + + if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + end + + return Valid +end + +function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) + + -- fill-up some local variables to support further calculations to determine location of units within the zone + local CargoUnits = CargoGroup:getUnits() + for CargoUnitId, CargoUnit in pairs( CargoUnits ) do + local CargoUnitPos = CargoUnit:getPosition().p +-- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) + local ReferenceP = ReferencePosition.p +-- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) + + if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + break + end + end + + return Valid +end + + +function routines.ValidateString( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "string" then + if Variable == "" then + error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) + Valid = false + end + else + error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateNumber( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "number" then + else + error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid + +end + +function routines.ValidateGroup( Variable, VariableName, Valid ) +--trace.f() + + if Variable == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateZone( LandingZones, VariableName, Valid ) +--trace.f() + + if LandingZones == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + if trigger.misc.getZone( LandingZoneName ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) + Valid = false + break + end + end + else + if trigger.misc.getZone( LandingZones ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) + Valid = false + end + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) +--trace.f() + + local ValidVariable = false + + for EnumId, EnumData in pairs( Enum ) do + if Variable == EnumData then + ValidVariable = true + break + end + end + + if ValidVariable then + else + error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} + -- refactor to search by groupId and allow groupId and groupName as inputs + local gpId = groupIdent + if type(groupIdent) == 'string' and not tonumber(groupIdent) then + gpId = _DATABASE.Templates.Groups[groupIdent].groupId + end + + for coa_name, coa_data in pairs(env.mission.coalition) do + if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + for obj_type_name, obj_type_data in pairs(cntry_data) do + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + for group_num, group_data in pairs(obj_type_data.group) do + if group_data and group_data.groupId == gpId then -- this is the group we are looking for + if group_data.route and group_data.route.points and #group_data.route.points > 0 then + local points = {} + + for point_num, point in pairs(group_data.route.points) do + local routeData = {} + if not point.point then + routeData.x = point.x + routeData.y = point.y + else + routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. + end + routeData.form = point.action + routeData.speed = point.speed + routeData.alt = point.alt + routeData.alt_type = point.alt_type + routeData.airdromeId = point.airdromeId + routeData.helipadId = point.helipadId + routeData.type = point.type + routeData.action = point.action + if task then + routeData.task = point.task + end + points[point_num] = routeData + end + + return points + end + return + end --if group_data and group_data.name and group_data.name == 'groupname' + end --for group_num, group_data in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do +end + +routines.ground.patrolRoute = function(vars) + + + local tempRoute = {} + local useRoute = {} + local gpData = vars.gpData + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + local useGroupRoute + if not vars.useGroupRoute then + useGroupRoute = vars.gpData + else + useGroupRoute = vars.useGroupRoute + end + local routeProvided = false + if not vars.route then + if useGroupRoute then + tempRoute = routines.getGroupRoute(useGroupRoute) + end + else + useRoute = vars.route + local posStart = routines.getLeadPos(gpData) + useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) + routeProvided = true + end + + + local overRideSpeed = vars.speed or 'default' + local pType = vars.pType + local offRoadForm = vars.offRoadForm or 'default' + local onRoadForm = vars.onRoadForm or 'default' + + if routeProvided == false and #tempRoute > 0 then + local posStart = routines.getLeadPos(gpData) + + + useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) + for i = 1, #tempRoute do + local tempForm = tempRoute[i].action + local tempSpeed = tempRoute[i].speed + + if offRoadForm == 'default' then + tempForm = tempRoute[i].action + end + if onRoadForm == 'default' then + onRoadForm = 'On Road' + end + if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then + tempForm = onRoadForm + else + tempForm = offRoadForm + end + + if type(overRideSpeed) == 'number' then + tempSpeed = overRideSpeed + end + + + useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) + end + + if pType and string.lower(pType) == 'doubleback' then + local curRoute = routines.utils.deepCopy(useRoute) + for i = #curRoute, 2, -1 do + useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) + end + end + + useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP + end + + local cTask3 = {} + local newPatrol = {} + newPatrol.route = useRoute + newPatrol.gpData = gpData:getName() + cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' + cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) + cTask3[#cTask3 + 1] = ')' + cTask3 = table.concat(cTask3) + local tempTask = { + id = 'WrappedAction', + params = { + action = { + id = 'Script', + params = { + command = cTask3, + + }, + }, + }, + } + + + useRoute[#useRoute].task = tempTask + routines.goRoute(gpData, useRoute) + + return +end + +routines.ground.patrol = function(gpData, pType, form, speed) + local vars = {} + + if type(gpData) == 'table' and gpData:getName() then + gpData = gpData:getName() + end + + vars.useGroupRoute = gpData + vars.gpData = gpData + vars.pType = pType + vars.offRoadForm = form + vars.speed = speed + + routines.ground.patrolRoute(vars) + + return +end + +function routines.GetUnitHeight( CheckUnit ) +--trace.f( "routines" ) + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } + local UnitHeight = UnitPoint.y + + local LandHeight = land.getHeight( UnitPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) + + return UnitHeight - LandHeight + +end + + + +Su34Status = { status = {} } +boardMsgRed = { statusMsg = "" } +boardMsgAll = { timeMsg = "" } +SpawnSettings = {} +Su34MenuPath = {} +Su34Menus = 0 + + +function Su34AttackCarlVinson(groupName) +--trace.menu("", "Su34AttackCarlVinson") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupCarlVinson = Group.getByName("US Carl Vinson #001") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupCarlVinson ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 1 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackWest(groupName) +--trace.f("","Su34AttackWest") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipWest1 = Group.getByName("US Ship West #001") + local groupShipWest2 = Group.getByName("US Ship West #002") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipWest1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + if groupShipWest2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 2 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackNorth(groupName) +--trace.menu("","Su34AttackNorth") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipNorth1 = Group.getByName("US Ship North #001") + local groupShipNorth2 = Group.getByName("US Ship North #002") + local groupShipNorth3 = Group.getByName("US Ship North #003") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipNorth1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth3 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + Su34Status.status[groupName] = 3 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Orbit(groupName) +--trace.menu("","Su34Orbit") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) + Su34Status.status[groupName] = 4 + MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) +end + +function Su34TakeOff(groupName) +--trace.menu("","Su34TakeOff") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 8 + MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Hold(groupName) +--trace.menu("","Su34Hold") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 5 + MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) +end + +function Su34RTB(groupName) +--trace.menu("","Su34RTB") + Su34Status.status[groupName] = 6 + MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Destroyed(groupName) +--trace.menu("","Su34Destroyed") + Su34Status.status[groupName] = 7 + MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) +end + +function GroupAlive( groupName ) +--trace.menu("","GroupAlive") + local groupTest = Group.getByName( groupName ) + + local groupExists = false + + if groupTest then + groupExists = groupTest:isExist() + end + + --trace.r( "", "", { groupExists } ) + return groupExists +end + +function Su34IsDead() +--trace.f() + +end + +function Su34OverviewStatus() +--trace.menu("","Su34OverviewStatus") + local msg = "" + local currentStatus = 0 + local Exists = false + + for groupName, currentStatus in pairs(Su34Status.status) do + + env.info(('Su34 Overview Status: GroupName = ' .. groupName )) + Alive = GroupAlive( groupName ) + + if Alive then + if currentStatus == 1 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking carrier Carl Vinson. " + elseif currentStatus == 2 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking supporting ships in the west. " + elseif currentStatus == 3 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking invading ships in the north. " + elseif currentStatus == 4 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "In orbit and awaiting further instructions. " + elseif currentStatus == 5 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Holding Weapons. " + elseif currentStatus == 6 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Return to Krasnodar. " + elseif currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + elseif currentStatus == 8 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Take-Off. " + end + else + if currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + else + Su34Destroyed(groupName) + end + end + end + + boardMsgRed.statusMsg = msg +end + + +function UpdateBoardMsg() +--trace.f() + Su34OverviewStatus() + MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) +end + +function MusicReset( flg ) +--trace.f() + trigger.action.setUserFlag(95,flg) +end + +function PlaneActivate(groupNameFormat, flg) +--trace.f() + local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) + --trigger.action.outText(groupName,10) + trigger.action.activateGroup(Group.getByName(groupName)) +end + +function Su34Menu(groupName) +--trace.f() + + --env.info(( 'Su34Menu(' .. groupName .. ')' )) + local groupSu34 = Group.getByName( groupName ) + + if Su34Status.status[groupName] == 1 or + Su34Status.status[groupName] == 2 or + Su34Status.status[groupName] == 3 or + Su34Status.status[groupName] == 4 or + Su34Status.status[groupName] == 5 then + if Su34MenuPath[groupName] == nil then + if planeMenuPath == nil then + planeMenuPath = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "SU-34 anti-ship flights", + nil + ) + end + Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "Flight " .. groupName, + planeMenuPath + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack carrier Carl Vinson", + Su34MenuPath[groupName], + Su34AttackCarlVinson, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the west", + Su34MenuPath[groupName], + Su34AttackWest, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the north", + Su34MenuPath[groupName], + Su34AttackNorth, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Hold position and await instructions", + Su34MenuPath[groupName], + Su34Orbit, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Report status", + Su34MenuPath[groupName], + Su34OverviewStatus + ) + end + else + if Su34MenuPath[groupName] then + missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) + end + end +end + +--- Obsolete function, but kept to rework in framework. + +function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) +--trace.f("Spawn") + --env.info(( 'ChooseInfantry: ' )) + + TeleportPrefixTableCount = #TeleportPrefixTable + TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) + + --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) + + local TeleportFound = false + local TeleportLoop = true + local Index = TeleportPrefixTableIndex + local TeleportPrefix = '' + + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableCount then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + + if TeleportFound == false then + TeleportLoop = true + Index = 1 + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableIndex then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + end + + local TeleportGroupName = '' + if TeleportFound == true then + TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) + else + TeleportGroupName = '' + end + + --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) + --env.info(('ChooseInfantry: return')) + + return TeleportGroupName +end + +SpawnedInfantry = 0 + +function LandCarrier ( CarrierGroup, LandingZonePrefix ) +--trace.f() + --env.info(( 'LandCarrier: ' )) + --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) + + local controllerGroup = CarrierGroup:getController() + + local LandingZone = trigger.misc.getZone(LandingZonePrefix) + local LandingZonePos = {} + LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) + LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) + + controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) + + --env.info(( 'LandCarrier: end' )) +end + +EscortCount = 0 +function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) +--trace.f() + --env.info(( 'EscortCarrier: ' )) + --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) + + local CarrierName = CarrierGroup:getName() + + local EscortMission = {} + local CarrierMission = {} + + local EscortMission = SpawnMissionGroup( EscortPrefix ) + local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) + + if EscortMission ~= nil and CarrierMission ~= nil then + + EscortCount = EscortCount + 1 + EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) + EscortMission.name = EscortMissionName + EscortMission.groupId = nil + EscortMission.lateActivation = false + EscortMission.taskSelected = false + + local EscortUnits = #EscortMission.units + for u = 1, EscortUnits do + EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) + EscortMission.units[u].unitId = nil + end + + + EscortMission.route.points[1].task = { id = "ComboTask", + params = + { + tasks = + { + [1] = + { + enabled = true, + auto = false, + id = "Escort", + number = 1, + params = + { + lastWptIndexFlagChangedManually = false, + groupId = CarrierGroup:getID(), + lastWptIndex = nil, + lastWptIndexFlag = false, + engagementDistMax = EscortEngagementDistanceMax, + targetTypes = EscortTargetTypes, + pos = + { + y = 20, + x = 20, + z = 0, + } -- end of ["pos"] + } -- end of ["params"] + } -- end of [1] + } -- end of ["tasks"] + } -- end of ["params"] + } -- end of ["task"] + + SpawnGroupAdd( EscortPrefix, EscortMission ) + + end +end + +function SendMessageToCarrier( CarrierGroup, CarrierMessage ) +--trace.f() + + if CarrierGroup ~= nil then + MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) + end + +end + +function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) +--trace.f() + + if type(MsgGroup) == 'string' then + --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) + MsgGroup = Group.getByName( MsgGroup ) + end + + if MsgGroup ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) + end +end + +function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) +--trace.f() + + if UnitName ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { UnitName } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + end +end + +function MessageToAll( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, MsgTime, "Message" ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) +end + +function MessageToRed( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, MsgTime, "To Red Coalition" ):ToCoalition( coalition.side.RED ) +end + +function MessageToBlue( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, MsgTime, "To Blue Coalition" ):ToCoalition( coalition.side.RED ) +end + +function getCarrierHeight( CarrierGroup ) +--trace.f() + + if CarrierGroup ~= nil then + if table.getn(CarrierGroup:getUnits()) == 1 then + local CarrierUnit = CarrierGroup:getUnits()[1] + local CurrentPoint = CarrierUnit:getPoint() + + local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local CarrierHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return CarrierHeight - LandHeight + else + return 999999 + end + else + return 999999 + end + +end + +function GetUnitHeight( CheckUnit ) +--trace.f() + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local UnitHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return UnitHeight - LandHeight + +end + + +_MusicTable = {} +_MusicTable.Files = {} +_MusicTable.Queue = {} +_MusicTable.FileCnt = 0 + + +function MusicRegister( SndRef, SndFile, SndTime ) +--trace.f() + + env.info(( 'MusicRegister: SndRef = ' .. SndRef )) + env.info(( 'MusicRegister: SndFile = ' .. SndFile )) + env.info(( 'MusicRegister: SndTime = ' .. SndTime )) + + + _MusicTable.FileCnt = _MusicTable.FileCnt + 1 + + _MusicTable.Files[_MusicTable.FileCnt] = {} + _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef + _MusicTable.Files[_MusicTable.FileCnt].File = SndFile + _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime + + if not _MusicTable.Function then + _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) + end + +end + +function MusicToPlayer( SndRef, PlayerName, SndContinue ) +--trace.f() + + --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) + + local PlayerUnits = AlivePlayerUnits() + for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do + local PlayerUnitName = PlayerUnit:getPlayerName() + --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) + if PlayerName == PlayerUnitName then + PlayerGroup = PlayerUnit:getGroup() + if PlayerGroup then + --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) + MusicToGroup( SndRef, PlayerGroup, SndContinue ) + end + break + end + end + + --env.info(( 'MusicToPlayer: end' )) + +end + +function MusicToGroup( SndRef, SndGroup, SndContinue ) +--trace.f() + + --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) + + if SndGroup ~= nil then + if _MusicTable and _MusicTable.FileCnt > 0 then + if SndGroup:isExist() then + if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then + --env.info(( 'MusicToGroup: OK for Sound.' )) + local SndIdx = 0 + if SndRef == '' then + --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) + SndIdx = math.random( 1, _MusicTable.FileCnt ) + else + for SndIdx = 1, _MusicTable.FileCnt do + if _MusicTable.Files[SndIdx].Ref == SndRef then + break + end + end + end + --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) + --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) + trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) + MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) + + local SndQueueRef = SndGroup:getUnit(1):getPlayerName() + if _MusicTable.Queue[SndQueueRef] == nil then + _MusicTable.Queue[SndQueueRef] = {} + end + _MusicTable.Queue[SndQueueRef].Start = timer.getTime() + _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() + _MusicTable.Queue[SndQueueRef].Group = SndGroup + _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() + _MusicTable.Queue[SndQueueRef].Ref = SndIdx + _MusicTable.Queue[SndQueueRef].Continue = SndContinue + _MusicTable.Queue[SndQueueRef].Type = Group + end + end + end + end +end + +function MusicCanStart(PlayerName) +--trace.f() + + --env.info(( 'MusicCanStart:' )) + + local MusicOut = false + + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) + local PlayerFound = false + local MusicStart = 0 + local MusicTime = 0 + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.PlayerName == PlayerName then + PlayerFound = true + MusicStart = SndQueue.Start + MusicTime = _MusicTable.Files[SndQueue.Ref].Time + break + end + end + if PlayerFound then + --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) + --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) + --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) + + if MusicStart + MusicTime <= timer.getTime() then + MusicOut = true + end + else + MusicOut = true + end + end + + if MusicOut then + --env.info(( 'MusicCanStart: true' )) + else + --env.info(( 'MusicCanStart: false' )) + end + + return MusicOut +end + +function MusicScheduler() +--trace.scheduled("", "MusicScheduler") + + --env.info(( 'MusicScheduler:' )) + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicScheduler: Walking Sound Queue.')) + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.Continue then + if MusicCanStart(SndQueue.PlayerName) then + --env.info(('MusicScheduler: MusicToGroup')) + MusicToPlayer( '', SndQueue.PlayerName, true ) + end + end + end + end + +end + + +env.info(( 'Init: Scripts Loaded v1.1' )) + +--- BASE classes. +-- +-- @{#BASE} class +-- ============== +-- The @{#BASE} class is the super class for most of the classes defined within MOOSE. +-- +-- It handles: +-- +-- * The construction and inheritance of child classes. +-- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). +-- +-- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. +-- +-- BASE Trace functionality +-- ======================== +-- The BASE class contains trace methods to trace progress within a mission execution of a certain object. +-- Note that these trace methods are inherited by each MOOSE class interiting BASE. +-- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. +-- +-- Trace a function call +-- --------------------- +-- There are basically 3 types of tracing methods available within BASE: +-- +-- * @{#BASE.F}: Trace the beginning of a function and its given parameters. +-- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. +-- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. +-- +-- Tracing levels +-- -------------- +-- There are 3 tracing levels within MOOSE. +-- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. +-- +-- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: +-- +-- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. +-- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. +-- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. +-- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. +-- +-- BASE Inheritance support +-- ======================== +-- The following methods are available to support inheritance: +-- +-- * @{#BASE.Inherit}: Inherits from a class. +-- * @{#BASE.Inherited}: Returns the parent class from the class. +-- +-- Future +-- ====== +-- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. +-- +-- ==== +-- +-- @module Base +-- @author FlightControl + + + +local _TraceOn = true +local _TraceLevel = 1 +local _TraceAll = false +local _TraceClass = {} +local _TraceClassMethod = {} + +--- The BASE Class +-- @type BASE +-- @field ClassName The name of the class. +-- @field ClassID The ID number of the class. +BASE = { + ClassName = "BASE", + ClassID = 0, + Events = {}, + States = {} +} + +--- The Formation Class +-- @type FORMATION +-- @field Cone A cone formation. +FORMATION = { + Cone = "Cone" +} + + + +--- The base constructor. This is the top top class of all classed defined within the MOOSE. +-- Any new class needs to be derived from this class for proper inheritance. +-- @param #BASE self +-- @return #BASE The new instance of the BASE class. +-- @usage +-- function TASK:New() +-- +-- local self = BASE:Inherit( self, BASE:New() ) +-- +-- -- assign Task default values during construction +-- self.TaskBriefing = "Task: No Task." +-- self.Time = timer.getTime() +-- self.ExecuteStage = _TransportExecuteStage.NONE +-- +-- return self +-- end +-- @todo need to investigate if the deepCopy is really needed... Don't think so. +function BASE:New() + local Child = routines.utils.deepCopy( self ) + local Parent = {} + setmetatable( Child, Parent ) + Child.__index = Child + self.ClassID = self.ClassID + 1 + Child.ClassID = self.ClassID + --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) + return Child +end + +--- This is the worker method to inherit from a parent class. +-- @param #BASE self +-- @param Child is the Child class that inherits. +-- @param #BASE Parent is the Parent class that the Child inherits from. +-- @return #BASE Child +function BASE:Inherit( Child, Parent ) + local Child = routines.utils.deepCopy( Child ) + --local Parent = routines.utils.deepCopy( Parent ) + --local Parent = Parent + if Child ~= nil then + setmetatable( Child, Parent ) + Child.__index = Child + end + --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID + self:T( 'Inherited from ' .. Parent.ClassName ) + return Child +end + +--- This is the worker method to retrieve the Parent class. +-- @param #BASE self +-- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. +-- @return #BASE +function BASE:Inherited( Child ) + local Parent = getmetatable( Child ) +-- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) + return Parent +end + +--- Get the ClassName + ClassID of the class instance. +-- The ClassName + ClassID is formatted as '%s#%09d'. +-- @param #BASE self +-- @return #string The ClassName + ClassID of the class instance. +function BASE:GetClassNameAndID() + return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) +end + +--- Get the ClassName of the class instance. +-- @param #BASE self +-- @return #string The ClassName of the class instance. +function BASE:GetClassName() + return self.ClassName +end + +--- Get the ClassID of the class instance. +-- @param #BASE self +-- @return #string The ClassID of the class instance. +function BASE:GetClassID() + return self.ClassID +end + +--- Set a new listener for the class. +-- @param self +-- @param DCSTypes#Event Event +-- @param #function EventFunction +-- @return #BASE +function BASE:AddEvent( Event, EventFunction ) + self:F( Event ) + + self.Events[#self.Events+1] = {} + self.Events[#self.Events].Event = Event + self.Events[#self.Events].EventFunction = EventFunction + self.Events[#self.Events].EventEnabled = false + + return self +end + +--- Returns the event dispatcher +-- @param #BASE self +-- @return Event#EVENT +function BASE:Event() + + return _EVENTDISPATCHER +end + + + + + +--- Enable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:EnableEvents() + self:F( #self.Events ) + + for EventID, Event in pairs( self.Events ) do + Event.Self = self + Event.EventEnabled = true + end + self.Events.Handler = world.addEventHandler( self ) + + return self +end + + +--- Disable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:DisableEvents() + self:F() + + world.removeEventHandler( self ) + for EventID, Event in pairs( self.Events ) do + Event.Self = nil + Event.EventEnabled = false + end + + return self +end + + +local BaseEventCodes = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} +-- Event = { +-- id = enum world.event, +-- time = Time, +-- initiator = Unit, +-- target = Unit, +-- place = Unit, +-- subPlace = enum world.BirthPlace, +-- weapon = Weapon +-- } + +--- Creation of a Birth Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +-- @param #string IniUnitName The initiating unit name. +-- @param place +-- @param subplace +function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) + self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) + + local Event = { + id = world.event.S_EVENT_BIRTH, + time = EventTime, + initiator = Initiator, + IniUnitName = IniUnitName, + place = place, + subplace = subplace + } + + world.onEvent( Event ) +end + +--- Creation of a Crash Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +function BASE:CreateEventCrash( EventTime, Initiator ) + self:F( { EventTime, Initiator } ) + + local Event = { + id = world.event.S_EVENT_CRASH, + time = EventTime, + initiator = Initiator, + } + + world.onEvent( Event ) +end + +-- TODO: Complete DCSTypes#Event structure. +--- The main event handling function... This function captures all events generated for the class. +-- @param #BASE self +-- @param DCSTypes#Event event +function BASE:onEvent(event) + --self:F( { BaseEventCodes[event.id], event } ) + + if self then + for EventID, EventObject in pairs( self.Events ) do + if EventObject.EventEnabled then + --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) + --env.info( 'onEvent event.id = ' .. tostring(event.id) ) + --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) + if event.id == EventObject.Event then + if self == EventObject.Self then + if event.initiator and event.initiator:isExist() then + event.IniUnitName = event.initiator:getName() + end + if event.target and event.target:isExist() then + event.TgtUnitName = event.target:getName() + end + --self:T( { BaseEventCodes[event.id], event } ) + --EventObject.EventFunction( self, event ) + end + end + end + end + end +end + +function BASE:SetState( Object, StateName, State ) + + local ClassNameAndID = Object:GetClassNameAndID() + if not self.States[ClassNameAndID] then + self.States[ClassNameAndID] = {} + end + + self.States[ClassNameAndID][StateName] = State + + return self.States[ClassNameAndID][StateName] +end + +function BASE:GetState( Object, StateName ) + + local ClassNameAndID = Object:GetClassNameAndID() + if self.States[ClassNameAndID] then + return self.States[ClassNameAndID][StateName] + end + + return nil +end + +function BASE:ClearState( Object, StateName ) + + local ClassNameAndID = Object:GetClassNameAndID() + if self.States[ClassNameAndID] then + self.States[ClassNameAndID][StateName] = nil + end +end + +-- Trace section + +-- Log a trace (only shown when trace is on) +-- TODO: Make trace function using variable parameters. + +--- Set trace level +-- @param #BASE self +-- @param #number Level +function BASE:TraceLevel( Level ) + _TraceLevel = Level + self:E( "Tracing level " .. Level ) +end + +--- Trace all methods in MOOSE +-- @param #BASE self +-- @param #boolean TraceAll true = trace all methods in MOOSE. +function BASE:TraceAll( TraceAll ) + + _TraceAll = TraceAll + + if _TraceAll then + self:E( "Tracing all methods in MOOSE " ) + else + self:E( "Switched off tracing all methods in MOOSE" ) + end +end + +--- Set tracing for a class +-- @param #BASE self +-- @param #string Class +function BASE:TraceClass( Class ) + _TraceClass[Class] = true + _TraceClassMethod[Class] = {} + self:E( "Tracing class " .. Class ) +end + +--- Set tracing for a specific method of class +-- @param #BASE self +-- @param #string Class +-- @param #string Method +function BASE:TraceClassMethod( Class, Method ) + if not _TraceClassMethod[Class] then + _TraceClassMethod[Class] = {} + _TraceClassMethod[Class].Method = {} + end + _TraceClassMethod[Class].Method[Method] = true + self:E( "Tracing method " .. Method .. " of class " .. Class ) +end + +--- Trace a function call. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if _TraceOn and ( ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) ) then + + local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) + local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function call level 2. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F2( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function call level 3. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F3( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:_T( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if _TraceOn and ( ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) ) then + + local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) + local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function logic level 1. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 1 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + + +--- Trace a function logic level 2. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T2( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function logic level 3. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T3( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Log an exception which will be traced always. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:E( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = -1 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) +end + + + +--- Models time events calling event handing functions. +-- +-- @{SCHEDULER} class +-- =================== +-- The @{SCHEDULER} class models time events calling given event handling functions. +-- +-- SCHEDULER constructor +-- ===================== +-- The SCHEDULER class is quite easy to use: +-- +-- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. +-- +-- SCHEDULER timer methods +-- ======================= +-- The SCHEDULER can be stopped and restarted with the following methods: +-- +-- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. +-- * @{#SCHEDULER.Start}: Stop the scheduler. +-- +-- @module Scheduler +-- @author FlightControl + +--- The SCHEDULER class +-- @type SCHEDULER +-- @extends Base#BASE +SCHEDULER = { + ClassName = "SCHEDULER", +} + + +--- Constructor. +-- @param #SCHEDULER self +-- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. +-- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. +-- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. +-- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. +-- @return #SCHEDULER self +function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) + + self.TimeEventObject = TimeEventObject + self.TimeEventFunction = TimeEventFunction + self.TimeEventFunctionArguments = TimeEventFunctionArguments + self.StartSeconds = StartSeconds + + if RepeatSecondsInterval then + self.RepeatSecondsInterval = RepeatSecondsInterval + self.Repeat = true + else + self.RepeatSecondsInterval = 0 + self.Repeat = false + end + + if RandomizationFactor then + self.RandomizationFactor = RandomizationFactor + else + self.RandomizationFactor = 0 + end + + if StopSeconds then + self.StopSeconds = StopSeconds + end + + + self.StartTime = timer.getTime() + + self:Start() + + return self +end + +--- (Re-)Starts the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Start() + self:F2( self.TimeEventObject ) + + timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) + + return self +end + +--- Stops the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Stop() + self:F2( self.TimeEventObject ) + + self.Repeat = false + + return self +end + +-- Private Functions + +function SCHEDULER:_Scheduler() + self:F2( self.TimeEventFunctionArguments ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + env.info( debug.traceback() ) + + return errmsg + end + + local Status, Result + if self.TimeEventObject then + Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + else + Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + end + + self:T( { Status, Result, self.StartTime, self.RepeatSecondsInterval, self.RandomizationFactor, self.StopSeconds } ) + + if Status and ( ( Result == nil ) or ( Result and Result ~= false ) ) then + if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then + local ScheduleTime = timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 + self:T( { timer.getTime(), ScheduleTime } ) + timer.scheduleFunction( + self._Scheduler, + self, + ScheduleTime + ) + end + end + +end + + + + + + + + +--- The EVENT class models an efficient event handling process between other classes and its units, weapons. +-- @module Event +-- @author FlightControl + +--- The EVENT structure +-- @type EVENT +-- @field #EVENT.Events Events +EVENT = { + ClassName = "EVENT", + ClassID = 0, +} + +local _EVENTCODES = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--- The Event structure +-- @type EVENTDATA +-- @field id +-- @field initiator +-- @field target +-- @field weapon +-- @field IniDCSUnit +-- @field IniDCSUnitName +-- @field IniDCSGroup +-- @field IniDCSGroupName +-- @field TgtDCSUnit +-- @field TgtDCSUnitName +-- @field TgtDCSGroup +-- @field TgtDCSGroupName +-- @field Weapon +-- @field WeaponName +-- @field WeaponTgtDCSUnit + +--- The Events structure +-- @type EVENT.Events +-- @field #number IniUnit + +function EVENT:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F2() + self.EventHandler = world.addEventHandler( self ) + return self +end + +function EVENT:EventText( EventID ) + + local EventText = _EVENTCODES[EventID] + + return EventText +end + + +--- Initializes the Events structure for the event +-- @param #EVENT self +-- @param DCSWorld#world.event EventID +-- @param #string EventClass +-- @return #EVENT.Events +function EVENT:Init( EventID, EventClass ) + self:F3( { _EVENTCODES[EventID], EventClass } ) + if not self.Events[EventID] then + self.Events[EventID] = {} + end + if not self.Events[EventID][EventClass] then + self.Events[EventID][EventClass] = {} + end + return self.Events[EventID][EventClass] +end + + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @param #function OnEventFunction +-- @return #EVENT +function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) + self:F2( EventTemplate.name ) + + for EventUnitID, EventUnit in pairs( EventTemplate.units ) do + OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) + end + return self +end + +--- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) + self:F2( { EventID } ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + Event.EventFunction = EventFunction + Event.EventSelf = EventSelf + return self +end + + +--- Set a new listener for an S_EVENT_X event +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) + self:F2( EventDCSUnitName ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + if not Event.IniUnit then + Event.IniUnit = {} + end + Event.IniUnit[EventDCSUnitName] = {} + Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction + Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf + return self +end + + +--- Create an OnBirth event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirth( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName The id of the unit for the event to be handled. +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Create an OnCrash event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnCrash( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnDead( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + +--- Set a new listener for an S_EVENT_PILOT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_LAND event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_TAKEOFF event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_STARTUP event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShot( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event for a unit. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) + + return self +end + + + +function EVENT:onEvent( Event ) + self:F2( { _EVENTCODES[Event.id], Event } ) + + if self and self.Events and self.Events[Event.id] then + if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then + Event.IniDCSUnit = Event.initiator + Event.IniDCSGroup = Event.IniDCSUnit:getGroup() + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniDCSGroupName = "" + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + Event.IniDCSGroupName = Event.IniDCSGroup:getName() + end + end + if Event.target then + if Event.target and Event.target:getCategory() == Object.Category.UNIT then + Event.TgtDCSUnit = Event.target + Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtDCSGroupName = "" + if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then + Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() + end + end + end + if Event.weapon then + Event.Weapon = Event.weapon + Event.WeaponName = Event.Weapon:getTypeName() + --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() + end + self:E( { _EVENTCODES[Event.id], Event } ) + for ClassName, EventData in pairs( self.Events[Event.id] ) do + if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then + self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) + EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) + else + if Event.IniDCSUnit and not EventData.IniUnit then + self:T2( { "Calling event function for class ", ClassName } ) + EventData.EventFunction( EventData.EventSelf, Event ) + end + end + end + end +end + +--- Encapsulation of DCS World Menu system in a set of MENU classes. +-- @module Menu + +--- The MENU class +-- @type MENU +-- @extends Base#BASE +MENU = { + ClassName = "MENU", + MenuPath = nil, + MenuText = "", + MenuParentPath = nil +} + +--- +function MENU:New( MenuText, MenuParentPath ) + + -- Arrange meta tables + local Child = BASE:Inherit( self, BASE:New() ) + + Child.MenuPath = nil + Child.MenuText = MenuText + Child.MenuParentPath = MenuParentPath + return Child +end + +--- The COMMANDMENU class +-- @type COMMANDMENU +-- @extends Menu#MENU +COMMANDMENU = { + ClassName = "COMMANDMENU", + CommandMenuFunction = nil, + CommandMenuArgument = nil +} + +function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + Child.CommandMenuFunction = CommandMenuFunction + Child.CommandMenuArgument = CommandMenuArgument + return Child +end + +--- The SUBMENU class +-- @type SUBMENU +-- @extends Menu#MENU +SUBMENU = { + ClassName = "SUBMENU" +} + +function SUBMENU:New( MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) + return Child +end + +-- This local variable is used to cache the menus registered under clients. +-- Menus don't dissapear when clients are destroyed and restarted. +-- So every menu for a client created must be tracked so that program logic accidentally does not create +-- the same menus twice during initialization logic. +-- These menu classes are handling this logic with this variable. +local _MENUCLIENTS = {} + +--- The MENU_CLIENT class +-- @type MENU_CLIENT +-- @extends Menu#MENU +MENU_CLIENT = { + ClassName = "MENU_CLIENT" +} + +--- Creates a new menu item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_CLIENT self +function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuClient, MenuText, ParentMenu } ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) + MenuPath[MenuPathID] = self.MenuPath + + self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_CLIENT_COMMAND class +-- @type MENU_CLIENT_COMMAND +-- @extends Menu#MENU +MENU_CLIENT_COMMAND = { + ClassName = "MENU_CLIENT_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return Menu#MENU_CLIENT_COMMAND self +function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + MenuPath[MenuPathID] = self.MenuPath + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +function MENU_CLIENT_COMMAND:Remove() + self:F( self.MenuPath ) + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_COALITION class +-- @type MENU_COALITION +-- @extends Menu#MENU +MENU_COALITION = { + ClassName = "MENU_COALITION" +} + +--- Creates a new coalition menu item +-- @param #MENU_COALITION self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_COALITION self +function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuCoalition, MenuText, ParentMenu } ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + self:T( { MenuParentPath, MenuText } ) + + self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) + + self:T( { self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + + return nil +end + + +--- The MENU_COALITION_COMMAND class +-- @type MENU_COALITION_COMMAND +-- @extends Menu#MENU +MENU_COALITION_COMMAND = { + ClassName = "MENU_COALITION_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param #MENU_COALITION_COMMAND self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +--- Removes a radio command item for a coalition +-- @param #MENU_COALITION_COMMAND self +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:Remove() + self:F( self.MenuPath ) + + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end +--- This module contains the GROUP class. +-- +-- 1) @{Group#GROUP} class, extends @{Base#BASE} +-- ============================================= +-- The @{Group#GROUP} class is a wrapper class to handle the DCS Group objects: +-- +-- * Support all DCS Group APIs. +-- * Enhance with Group specific APIs not in the DCS Group API set. +-- * Handle local Group Controller. +-- * Manage the "state" of the DCS Group. +-- +-- **IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil).** +-- +-- 1.1) GROUP reference methods +-- ----------------------- +-- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). +-- +-- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Group or the DCS GroupName. +-- +-- Another thing to know is that GROUP objects do not "contain" the DCS Group object. +-- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. +-- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. +-- +-- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: +-- +-- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. +-- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. +-- +-- 1.2) GROUP task methods +-- ----------------------- +-- Several group task methods are available that help you to prepare tasks. +-- These methods return a string consisting of the task description, which can then be given to either a @{Group#GROUP.PushTask} or @{Group#SetTask} method to assign the task to the GROUP. +-- Tasks are specific for the category of the GROUP, more specific, for AIR, GROUND or AIR and GROUND. +-- Each task description where applicable indicates for which group category the task is valid. +-- There are 2 main subdivisions of tasks: Assigned tasks and EnRoute tasks. +-- +-- ### 1.2.1) Assigned task methods +-- +-- Assigned task methods make the group execute the task where the location of the (possible) targets of the task are known before being detected. +-- This is different from the EnRoute tasks, where the targets of the task need to be detected before the task can be executed. +-- +-- Find below a list of the **assigned task** methods: +-- +-- * @{#GROUP.TaskAttackGroup}: (AIR) Attack a Group. +-- * @{#GROUP.TaskAttackMapObject}: (AIR) Attacking the map object (building, structure, e.t.c). +-- * @{#GROUP.TaskAttackUnit}: (AIR) Attack the Unit. +-- * @{#GROUP.TaskBombing}: (AIR) Delivering weapon at the point on the ground. +-- * @{#GROUP.TaskBombingRunway}: (AIR) Delivering weapon on the runway. +-- * @{#GROUP.TaskEmbarking}: (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. +-- * @{#GROUP.TaskEmbarkToTransport}: (GROUND) Embark to a Transport landed at a location. +-- * @{#GROUP.TaskEscort}: (AIR) Escort another airborne group. +-- * @{#GROUP.TaskFAC_AttackGroup}: (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. +-- * @{#GROUP.TaskFireAtPoint}: (GROUND) Fire at a VEC2 point until ammunition is finished. +-- * @{#GROUP.TaskFollow}: (AIR) Following another airborne group. +-- * @{#GROUP.TaskHold}: (GROUND) Hold ground group from moving. +-- * @{#GROUP.TaskHoldPosition}: (AIR) Hold position at the current position of the first unit of the group. +-- * @{#GROUP.TaskLand}: (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- * @{#GROUP.TaskLandAtZone}: (AIR) Land the group at a @{Zone#ZONE_RADIUS). +-- * @{#GROUP.TaskOrbitCircle}: (AIR) Orbit at the current position of the first unit of the group at a specified alititude. +-- * @{#GROUP.TaskOrbitCircleAtVec2}: (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- * @{#GROUP.TaskRefueling}: (AIR) Refueling from the nearest tanker. No parameters. +-- * @{#GROUP.TaskRoute}: (AIR + GROUND) Return a Misson task to follow a given route defined by Points. +-- * @{#GROUP.TaskRouteToVec2}: (AIR + GROUND) Make the Group move to a given point. +-- * @{#GROUP.TaskRouteToVec3}: (AIR + GROUND) Make the Group move to a given point. +-- * @{#GROUP.TaskRouteToZone}: (AIR + GROUND) Route the group to a given zone. +-- +-- ### 1.2.2) EnRoute task methods +-- +-- EnRoute tasks require the targets of the task need to be detected by the group (using its sensors) before the task can be executed: +-- +-- * @{#GROUP.EnRouteTaskAWACS}: (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- * @{#GROUP.EnRouteTaskEngageGroup}: (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskEngageTargets}: (AIR) Engaging targets of defined types. +-- * @{#GROUP.EnRouteTaskEWR}: (AIR) Attack the Unit. +-- * @{#GROUP.EnRouteTaskFAC}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskFAC_EngageGroup}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskTanker}: (AIR) Aircraft will act as a tanker for friendly units. No parameters. +-- +-- ### 1.2.3) Preparation task methods +-- +-- There are certain task methods that allow to tailor the task behaviour: +-- +-- * @{#GROUP.TaskWrappedAction}: Return a WrappedAction Task taking a Command. +-- * @{#GROUP.TaskCombo}: Return a Combo Task taking an array of Tasks. +-- * @{#GROUP.TaskCondition}: Return a condition section for a controlled task. +-- * @{#GROUP.TaskControlled}: Return a Controlled Task taking a Task and a TaskCondition. +-- +-- ### 1.2.4) Obtain the mission from group templates +-- +-- Group templates contain complete mission descriptions. Sometimes you want to copy a complete mission from a group and assign it to another: +-- +-- * @{#GROUP.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. +-- +-- 1.3) GROUP Command methods +-- -------------------------- +-- Group **command methods** prepare the execution of commands using the @{#GROUP.SetCommand} method: +-- +-- * @{#GROUP.CommandDoScript}: Do Script command. +-- * @{#GROUP.CommandSwitchWayPoint}: Perform a switch waypoint command. +-- +-- 1.4) GROUP Option methods +-- ------------------------- +-- Group **Option methods** change the behaviour of the Group while being alive. +-- +-- ### 1.4.1) Rule of Engagement: +-- +-- * @{#GROUP.OptionROEWeaponFree} +-- * @{#GROUP.OptionROEOpenFire} +-- * @{#GROUP.OptionROEReturnFire} +-- * @{#GROUP.OptionROEEvadeFire} +-- +-- To check whether an ROE option is valid for a specific group, use: +-- +-- * @{#GROUP.OptionROEWeaponFreePossible} +-- * @{#GROUP.OptionROEOpenFirePossible} +-- * @{#GROUP.OptionROEReturnFirePossible} +-- * @{#GROUP.OptionROEEvadeFirePossible} +-- +-- ### 1.4.2) Rule on thread: +-- +-- * @{#GROUP.OptionROTNoReaction} +-- * @{#GROUP.OptionROTPassiveDefense} +-- * @{#GROUP.OptionROTEvadeFire} +-- * @{#GROUP.OptionROTVertical} +-- +-- To test whether an ROT option is valid for a specific group, use: +-- +-- * @{#GROUP.OptionROTNoReactionPossible} +-- * @{#GROUP.OptionROTPassiveDefensePossible} +-- * @{#GROUP.OptionROTEvadeFirePossible} +-- * @{#GROUP.OptionROTVerticalPossible} +-- +-- 1.5) GROUP Zone validation methods +-- ---------------------------------- +-- The group can be validated whether it is completely, partly or not within a @{Zone}. +-- Use the following Zone validation methods on the group: +-- +-- * @{#GROUP.IsCompletelyInZone}: Returns true if all units of the group are within a @{Zone}. +-- * @{#GROUP.IsPartlyInZone}: Returns true if some units of the group are within a @{Zone}. +-- * @{#GROUP.IsNotInZone}: Returns true if none of the group units of the group are within a @{Zone}. +-- +-- The zone can be of any @{Zone} class derived from @{Zone#ZONE_BASE}. So, these methods are polymorphic to the zones tested on. +-- +-- @module Group +-- @author FlightControl + +--- The GROUP class +-- @type GROUP +-- @extends Base#BASE +-- @field DCSGroup#Group DCSGroup The DCS group class. +-- @field #string GroupName The name of the group. +GROUP = { + ClassName = "GROUP", + GroupName = "", + GroupID = 0, + Controller = nil, + DCSGroup = nil, + WayPointFunctions = {}, +} + +--- A DCSGroup +-- @type DCSGroup +-- @field id_ The ID of the group in DCS + +--- Create a new GROUP from a DCSGroup +-- @param #GROUP self +-- @param DCSGroup#Group GroupName The DCS Group name +-- @return #GROUP self +function GROUP:Register( GroupName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( GroupName ) + self.GroupName = GroupName + return self +end + +-- Reference methods. + +--- Find the GROUP wrapper class instance using the DCS Group. +-- @param #GROUP self +-- @param DCSGroup#Group DCSGroup The DCS Group. +-- @return #GROUP The GROUP. +function GROUP:Find( DCSGroup ) + + local GroupName = DCSGroup:getName() -- Group#GROUP + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +--- Find the created GROUP using the DCS Group Name. +-- @param #GROUP self +-- @param #string GroupName The DCS Group Name. +-- @return #GROUP The GROUP. +function GROUP:FindByName( GroupName ) + + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +-- DCS Group methods support. + +--- Returns the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group The DCS Group. +function GROUP:GetDCSGroup() + local DCSGroup = Group.getByName( self.GroupName ) + + if DCSGroup then + return DCSGroup + end + + return nil +end + + +--- Returns if the DCS Group is alive. +-- When the group exists at run-time, this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean true if the DCS Group is alive. +function GROUP:IsAlive() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupIsAlive = DCSGroup:isExist() + self:T3( GroupIsAlive ) + return GroupIsAlive + end + + return nil +end + +--- Destroys the DCS Group and all of its DCS Units. +-- Note that this destroy method also raises a destroy event at run-time. +-- So all event listeners will catch the destroy event of this DCS Group. +-- @param #GROUP self +function GROUP:Destroy() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + self:CreateEventCrash( timer.getTime(), UnitData ) + end + DCSGroup:destroy() + DCSGroup = nil + end + + return nil +end + +--- Returns category of the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group.Category The category ID +function GROUP:GetCategory() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + return GroupCategory + end + + return nil +end + +--- Returns the category name of the DCS Group. +-- @param #GROUP self +-- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship +function GROUP:GetCategoryName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local CategoryNames = { + [Group.Category.AIRPLANE] = "Airplane", + [Group.Category.HELICOPTER] = "Helicopter", + [Group.Category.GROUND] = "Ground Unit", + [Group.Category.SHIP] = "Ship", + } + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + + return CategoryNames[GroupCategory] + end + + return nil +end + + +--- Returns the coalition of the DCS Group. +-- @param #GROUP self +-- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. +function GROUP:GetCoalition() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCoalition = DCSGroup:getCoalition() + self:T3( GroupCoalition ) + return GroupCoalition + end + + return nil +end + +--- Returns the country of the DCS Group. +-- @param #GROUP self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Group is not existing or alive. +function GROUP:GetCountry() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCountry = DCSGroup:getUnit(1):getCountry() + self:T3( GroupCountry ) + return GroupCountry + end + + return nil +end + +--- Returns the name of the DCS Group. +-- @param #GROUP self +-- @return #string The DCS Group name. +function GROUP:GetName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupName = DCSGroup:getName() + self:T3( GroupName ) + return GroupName + end + + return nil +end + +--- Returns the DCS Group identifier. +-- @param #GROUP self +-- @return #number The identifier of the DCS Group. +function GROUP:GetID() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupID = DCSGroup:getID() + self:T3( GroupID ) + return GroupID + end + + return nil +end + +--- Returns the UNIT wrapper class with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the UNIT wrapper class to be returned. +-- @return Unit#UNIT The UNIT wrapper class. +function GROUP:GetUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) + self:T3( UnitFound.UnitName ) + self:T2( UnitFound ) + return UnitFound + end + + return nil +end + +--- Returns the DCS Unit with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the DCS Unit to be returned. +-- @return DCSUnit#Unit The DCS Unit. +function GROUP:GetDCSUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) + self:T3( DCSUnitFound ) + return DCSUnitFound + end + + return nil +end + +--- Returns current size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. +-- @param #GROUP self +-- @return #number The DCS Group size. +function GROUP:GetSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupSize = DCSGroup:getSize() + self:T3( GroupSize ) + return GroupSize + end + + return nil +end + +--- +--- Returns the initial size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. +-- @param #GROUP self +-- @return #number The DCS Group initial size. +function GROUP:GetInitialSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupInitialSize = DCSGroup:getInitialSize() + self:T3( GroupInitialSize ) + return GroupInitialSize + end + + return nil +end + +--- Returns the UNITs wrappers of the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The UNITs wrappers. +function GROUP:GetUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + local Units = {} + for Index, UnitData in pairs( DCSUnits ) do + Units[#Units+1] = UNIT:Find( UnitData ) + end + self:T3( Units ) + return Units + end + + return nil +end + + +--- Returns the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The DCS Units. +function GROUP:GetDCSUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + self:T3( DCSUnits ) + return DCSUnits + end + + return nil +end + +--- Get the controller for the GROUP. +-- @param #GROUP self +-- @return DCSController#Controller +function GROUP:_GetController() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupController = DCSGroup:getController() + self:T3( GroupController ) + return GroupController + end + + return nil +end + + +--- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. +-- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. +-- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. +-- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! +-- @param #GROUP self +-- @return #GROUP +function GROUP:WayPointInitialize() + + self.WayPoints = self:GetTaskRoute() + + return self +end + + +--- Registers a waypoint function that will be executed when the group moves over the WayPoint. +-- @param #GROUP self +-- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! +-- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. +-- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. +-- @return #GROUP +function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) + self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) + + table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) + self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) + return self +end + + +function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) + + local DCSTask + + local DCSScript = {} + DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " + + if FunctionArguments.n > 0 then + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" + else + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" + end + + DCSTask = self:TaskWrappedAction( + self:CommandDoScript( + table.concat( DCSScript ) + ), WayPointIndex + ) + + self:T3( DCSTask ) + + return DCSTask + +end + + + +--- Executes the WayPoint plan. +-- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. +-- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! +-- @param #GROUP self +-- @param #number WayPoint The WayPoint from where to execute the mission. +-- @param #number WaitTime The amount seconds to wait before initiating the mission. +-- @return #GROUP +function GROUP:WayPointExecute( WayPoint, WaitTime ) + + if not WayPoint then + WayPoint = 1 + end + + -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. + for TaskPointID = 1, WayPoint - 1 do + table.remove( self.WayPoints, 1 ) + end + + self:T3( self.WayPoints ) + + self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) + + return self +end + + +--- Activates a GROUP. +-- @param #GROUP self +function GROUP:Activate() + self:F2( { self.GroupName } ) + trigger.action.activateGroup( self:GetDCSGroup() ) + return self:GetDCSGroup() +end + + +--- Gets the type name of the group. +-- @param #GROUP self +-- @return #string The type name of the group. +function GROUP:GetTypeName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupTypeName = DCSGroup:getUnit(1):getTypeName() + self:T3( GroupTypeName ) + return( GroupTypeName ) + end + + return nil +end + +--- Gets the CallSign of the first DCS Unit of the DCS Group. +-- @param #GROUP self +-- @return #string The CallSign of the first DCS Unit of the DCS Group. +function GROUP:GetCallsign() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCallSign = DCSGroup:getUnit(1):getCallsign() + self:T3( GroupCallSign ) + return GroupCallSign + end + + return nil +end + +--- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec2() + self:F2( self.GroupName ) + + local GroupPointVec2 = self:GetUnit(1):GetPointVec2() + self:T3( GroupPointVec2 ) + return GroupPointVec2 +end + +--- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec3() + self:F2( self.GroupName ) + + local GroupPointVec3 = self:GetUnit(1):GetPointVec3() + self:T3( GroupPointVec3 ) + return GroupPointVec3 +end + + + +-- Is Zone Functions + +--- Returns true if all units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsCompletelyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + else + return false + end + end + + return true +end + +--- Returns true if some units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsPartlyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + return true + end + end + + return false +end + +--- Returns true if none of the group units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsNotInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + return false + end + end + + return true +end + +--- Returns if the group is of an air category. +-- If the group is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean Air category evaluation result. +function GROUP:IsAir() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER + self:T3( IsAirResult ) + return IsAirResult + end + + return nil +end + +--- Returns if the DCS Group contains Helicopters. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Helicopters. +function GROUP:IsHelicopter() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.HELICOPTER + end + + return nil +end + +--- Returns if the DCS Group contains AirPlanes. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains AirPlanes. +function GROUP:IsAirPlane() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.AIRPLANE + end + + return nil +end + +--- Returns if the DCS Group contains Ground troops. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ground troops. +function GROUP:IsGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.GROUND + end + + return nil +end + +--- Returns if the DCS Group contains Ships. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ships. +function GROUP:IsShip() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.SHIP + end + + return nil +end + +--- Returns if all units of the group are on the ground or landed. +-- If all units of this group are on the ground, this function will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean All units on the ground result. +function GROUP:AllOnGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local AllOnGroundResult = true + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + if UnitData:inAir() then + AllOnGroundResult = false + end + end + + self:T3( AllOnGroundResult ) + return AllOnGroundResult + end + + return nil +end + +--- Returns the current maximum velocity of the group. +-- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. +-- @param #GROUP self +-- @return #number Maximum velocity found. +function GROUP:GetMaxVelocity() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local MaxVelocity = 0 + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + + local Velocity = UnitData:getVelocity() + local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) + + if VelocityTotal < MaxVelocity then + MaxVelocity = VelocityTotal + end + end + + return MaxVelocity + end + + return nil +end + +--- Returns the current minimum height of the group. +-- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. +-- @param #GROUP self +-- @return #number Minimum height found. +function GROUP:GetMinHeight() + self:F2() + +end + +--- Returns the current maximum height of the group. +-- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. +-- @param #GROUP self +-- @return #number Maximum height found. +function GROUP:GetMaxHeight() + self:F2() + +end + +-- Tasks + +--- Popping current Task from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PopCurrentTask() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:popTask() + return self + end + + return nil +end + +--- Pushing Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PushTask( DCSTask, WaitTime ) + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller:pushTask( DCSTask ) + + if WaitTime then + --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) + else + Controller:pushTask( DCSTask ) + end + + return self + end + + return nil +end + +--- Clearing the Task Queue and Setting the Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:SetTask( DCSTask, WaitTime ) + self:F2( { DCSTask } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller.setTask( Controller, DCSTask ) + + if not WaitTime then + WaitTime = 1 + end + --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) + + return self + end + + return nil +end + + +--- Return a condition section for a controlled task. +-- @param #GROUP self +-- @param DCSTime#Time time +-- @param #string userFlag +-- @param #boolean userFlagValue +-- @param #string condition +-- @param DCSTime#Time duration +-- @param #number lastWayPoint +-- return DCSTask#Task +function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) + self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) + + local DCSStopCondition = {} + DCSStopCondition.time = time + DCSStopCondition.userFlag = userFlag + DCSStopCondition.userFlagValue = userFlagValue + DCSStopCondition.condition = condition + DCSStopCondition.duration = duration + DCSStopCondition.lastWayPoint = lastWayPoint + + self:T3( { DCSStopCondition } ) + return DCSStopCondition +end + +--- Return a Controlled Task taking a Task and a TaskCondition. +-- @param #GROUP self +-- @param DCSTask#Task DCSTask +-- @param #DCSStopCondition DCSStopCondition +-- @return DCSTask#Task +function GROUP:TaskControlled( DCSTask, DCSStopCondition ) + self:F2( { DCSTask, DCSStopCondition } ) + + local DCSTaskControlled + + DCSTaskControlled = { + id = 'ControlledTask', + params = { + task = DCSTask, + stopCondition = DCSStopCondition + } + } + + self:T3( { DCSTaskControlled } ) + return DCSTaskControlled +end + +--- Return a Combo Task taking an array of Tasks. +-- @param #GROUP self +-- @param DCSTask#TaskArray DCSTasks Array of @{DCSTask#Task} +-- @return DCSTask#Task +function GROUP:TaskCombo( DCSTasks ) + self:F2( { DCSTasks } ) + + local DCSTaskCombo + + DCSTaskCombo = { + id = 'ComboTask', + params = { + tasks = DCSTasks + } + } + + self:T3( { DCSTaskCombo } ) + return DCSTaskCombo +end + +--- Return a WrappedAction Task taking a Command. +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return DCSTask#Task +function GROUP:TaskWrappedAction( DCSCommand, Index ) + self:F2( { DCSCommand } ) + + local DCSTaskWrappedAction + + DCSTaskWrappedAction = { + id = "WrappedAction", + enabled = true, + number = Index, + auto = false, + params = { + action = DCSCommand, + }, + } + + self:T3( { DCSTaskWrappedAction } ) + return DCSTaskWrappedAction +end + +--- Executes a command action +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return #GROUP self +function GROUP:SetCommand( DCSCommand ) + self:F2( DCSCommand ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:setCommand( DCSCommand ) + return self + end + + return nil +end + +--- Perform a switch waypoint command +-- @param #GROUP self +-- @param #number FromWayPoint +-- @param #number ToWayPoint +-- @return DCSTask#Task +function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) + self:F2( { FromWayPoint, ToWayPoint, Index } ) + + local CommandSwitchWayPoint = { + id = 'SwitchWaypoint', + params = { + fromWaypointIndex = FromWayPoint, + goToWaypointIndex = ToWayPoint, + }, + } + + self:T3( { CommandSwitchWayPoint } ) + return CommandSwitchWayPoint +end + + +-- TASKS FOR AIR GROUPS + + +--- (AIR) Attack a Group. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- AttackGroup = { + -- id = 'AttackGroup', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The unit. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- AttackUnit = { + -- id = 'AttackUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- } + -- } + + local DCSTask + DCSTask = { id = 'AttackUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon at the point on the ground. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- Bombing = { +-- id = 'Bombing', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'Bombing', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point to hold the position. +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) + self:F2( { self.GroupName, Point, Altitude, Speed } ) + + -- pattern = enum AI.Task.OribtPattern, + -- point = Vec2, + -- point2 = Vec2, + -- speed = Distance, + -- altitude = Distance + + local LandHeight = land.getHeight( Point ) + + self:T3( { LandHeight } ) + + local DCSTask = { id = 'Orbit', + params = { pattern = AI.Task.OrbitPattern.CIRCLE, + point = Point, + speed = Speed, + altitude = Altitude + LandHeight + } + } + + + -- local AITask = { id = 'ControlledTask', + -- params = { task = { id = 'Orbit', + -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, + -- point = Point, + -- speed = Speed, + -- altitude = Altitude + LandHeight + -- } + -- }, + -- stopCondition = { duration = Duration + -- } + -- } + -- } + -- ) + + return DCSTask +end + +--- (AIR) Orbit at the current position of the first unit of the group at a specified alititude. +-- @param #GROUP self +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircle( Altitude, Speed ) + self:F2( { self.GroupName, Altitude, Speed } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupPoint = self:GetPointVec2() + return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) + end + + return nil +end + + + +--- (AIR) Hold position at the current position of the first unit of the group. +-- @param #GROUP self +-- @param #number Duration The maximum duration in seconds to hold the position. +-- @return #GROUP self +function GROUP:TaskHoldPosition() + self:F2( { self.GroupName } ) + + return self:TaskOrbitCircle( 30, 10 ) +end + + + + +--- (AIR) Attacking the map object (building, structure, e.t.c). +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- AttackMapObject = { +-- id = 'AttackMapObject', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'AttackMapObject', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon on the runway. +-- @param #GROUP self +-- @param Airbase#AIRBASE Airbase Airbase to attack. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- BombingRunway = { +-- id = 'BombingRunway', +-- params = { +-- runwayId = AirdromeId, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'BombingRunway', + params = { + point = Airbase:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Refueling from the nearest tanker. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskRefueling() + self:F2( { self.GroupName } ) + +-- Refueling = { +-- id = 'Refueling', +-- params = {} +-- } + + local DCSTask + DCSTask = { id = 'Refueling', + params = { + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtVec2( Point, Duration ) + self:F2( { self.GroupName, Point, Duration } ) + +-- Land = { +-- id= 'Land', +-- params = { +-- point = Vec2, +-- durationFlag = boolean, +-- duration = Time +-- } +-- } + + local DCSTask + if Duration and Duration > 0 then + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = true, + duration = Duration, + }, + } + else + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = false, + }, + } + end + + self:T3( DCSTask ) + return DCSTask +end + +--- (AIR) Land the group at a @{Zone#ZONE_RADIUS). +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) + self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) + + local Point + if RandomPoint then + Point = Zone:GetRandomPointVec2() + else + Point = Zone:GetPointVec2() + end + + local DCSTask = self:TaskLandAtVec2( Point, Duration ) + + self:T3( DCSTask ) + return DCSTask +end + + + +--- (AIR) Following another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- If another group is on land the unit / group will orbit around. +-- @param #GROUP self +-- @param Group#GROUP FollowGroup The group to be followed. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) + +-- Follow = { +-- id = 'Follow', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Escort another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- The unit / group will also protect that group from threats of specified types. +-- @param #GROUP self +-- @param Group#GROUP EscortGroup The group to be escorted. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) + +-- Escort = { +-- id = 'Escort', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number, +-- engagementDistMax = Distance, +-- targetTypes = array of AttributeName, +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + engagementDistMax = EngagementDistance, + targetTypes = TargetTypes, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- GROUND TASKS + +--- (GROUND) Fire at a VEC2 point until ammunition is finished. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 The point to fire at. +-- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFireAtPoint( PointVec2, Radius ) + self:F2( { self.GroupName, PointVec2, Radius } ) + + -- FireAtPoint = { + -- id = 'FireAtPoint', + -- params = { + -- point = Vec2, + -- radius = Distance, + -- } + -- } + + local DCSTask + DCSTask = { id = 'FireAtPoint', + params = { + point = PointVec2, + radius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Hold ground group from moving. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskHold() + self:F2( { self.GroupName } ) + +-- Hold = { +-- id = 'Hold', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Hold', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS + +--- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) + +-- FAC_AttackGroup = { +-- id = 'FAC_AttackGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +-- EN-ROUTE TASKS FOR AIRBORNE GROUPS + +--- (AIR) Engaging targets of defined types. +-- @param #GROUP self +-- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) + self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) + +-- EngageTargets ={ +-- id = 'EngageTargets', +-- params = { +-- maxDist = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargets', + params = { + maxDist = Distance, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR) Engaging a targets of defined types at circle-shaped zone. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. +-- @param DCSTypes#Distance Radius Radius of the zone. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) + self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) + +-- EngageTargetsInZone = { +-- id = 'EngageTargetsInZone', +-- params = { +-- point = Vec2, +-- zoneRadius = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargetsInZone', + params = { + point = PointVec2, + zoneRadius = Radius, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- EngageGroup = { + -- id = 'EngageGroup ', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- priority = number, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The UNIT. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- EngageUnit = { + -- id = 'EngageUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- priority = number, + -- } + -- } + + local DCSTask + DCSTask = { id = 'EngageUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskAWACS( ) + self:F2( { self.GroupName } ) + +-- AWACS = { +-- id = 'AWACS', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'AWACS', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Aircraft will act as a tanker for friendly units. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskTanker( ) + self:F2( { self.GroupName } ) + +-- Tanker = { +-- id = 'Tanker', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Tanker', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for ground units/groups + +--- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEWR( ) + self:F2( { self.GroupName } ) + +-- EWR = { +-- id = 'EWR', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'EWR', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for airborne and ground units/groups + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) + +-- FAC_EngageGroup = { +-- id = 'FAC_EngageGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean, +-- priority = number, +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + priority = Priority, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC( Radius, Priority ) + self:F2( { self.GroupName, Radius, Priority } ) + +-- FAC = { +-- id = 'FAC', +-- params = { +-- radius = Distance, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC', + params = { + radius = Radius, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + + +--- (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Duration The duration in seconds to wait. +-- @param #GROUP EmbarkingGroup The group to be embarked. +-- @return DCSTask#Task The DCS task structure +function GROUP:TaskEmbarking( Point, Duration, EmbarkingGroup ) + self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) + + local DCSTask + DCSTask = { id = 'Embarking', + params = { x = Point.x, + y = Point.y, + duration = Duration, + groupsForEmbarking = { EmbarkingGroup.GroupID }, + durationFlag = true, + distributionFlag = false, + distribution = {}, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Embark to a Transport landed at a location. + +--- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Radius The radius of the embarking zone around the Point. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEmbarkToTransport( Point, Radius ) + self:F2( { self.GroupName, Point, Radius } ) + + local DCSTask --DCSTask#Task + DCSTask = { id = 'EmbarkToTransport', + params = { x = Point.x, + y = Point.y, + zoneRadius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR + GROUND) Return a mission task from a mission template. +-- @param #GROUP self +-- @param #table TaskMission A table containing the mission task. +-- @return DCSTask#Task +function GROUP:TaskMission( TaskMission ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { TaskMission, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Return a Misson task to follow a given route defined by Points. +-- @param #GROUP self +-- @param #table Points A table of route points. +-- @return DCSTask#Task +function GROUP:TaskRoute( Points ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR + GROUND) Make the Group move to fly to a given point. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec2( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.y + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + +--- (AIR + GROUND) Make the Group move to a given point. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec3( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec3() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = "BARO" + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.z + PointTo.alt = Point.y + PointTo.alt_type = "BARO" + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + + + +--- Make the group to follow a given route. +-- @param #GROUP self +-- @param #table GoPoints A table of Route Points. +-- @return #GROUP self +function GROUP:Route( GoPoints ) + self:F2( GoPoints ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Points = routines.utils.deepCopy( GoPoints ) + local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } + local Controller = self:_GetController() + --Controller.setTask( Controller, MissionTask ) + --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) + SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) + return self + end + + return nil +end + + + +--- (AIR + GROUND) Route the group to a given zone. +-- The group final destination point can be randomized. +-- A speed can be given in km/h. +-- A given formation can be given. +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to route to. +-- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. +-- @param #number Speed The speed. +-- @param Base#FORMATION Formation The formation string. +function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) + self:F2( Zone ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local GroupPoint = self:GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Cone" + PointFrom.speed = 20 / 1.6 + + + local PointTo = {} + local ZonePoint + + if Randomize then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + PointTo.x = ZonePoint.x + PointTo.y = ZonePoint.y + PointTo.type = "Turning Point" + + if Formation then + PointTo.action = Formation + else + PointTo.action = "Cone" + end + + if Speed then + PointTo.speed = Speed + else + PointTo.speed = 20 / 1.6 + end + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self + end + + return nil +end + +-- Commands + +--- Do Script command +-- @param #GROUP self +-- @param #string DoScript +-- @return #DCSCommand +function GROUP:CommandDoScript( DoScript ) + + local DCSDoScript = { + id = "Script", + params = { + command = DoScript, + }, + } + + self:T3( DCSDoScript ) + return DCSDoScript +end + + +--- Return the mission template of the group. +-- @param #GROUP self +-- @return #table The MissionTemplate +function GROUP:GetTaskMission() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) +end + +--- Return the mission route of the group. +-- @param #GROUP self +-- @return #table The mission route defined by points. +function GROUP:GetTaskRoute() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) +end + +--- Return the route of a group by using the @{Database#DATABASE} class. +-- @param #GROUP self +-- @param #number Begin The route point from where the copy will start. The base route point is 0. +-- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. +-- @param #boolean Randomize Randomization of the route, when true. +-- @param #number Radius When randomization is on, the randomization is within the radius. +function GROUP:CopyRoute( Begin, End, Randomize, Radius ) + self:F2( { Begin, End } ) + + local Points = {} + + -- Could be a Spawned Group + local GroupName = string.match( self:GetName(), ".*#" ) + if GroupName then + GroupName = GroupName:sub( 1, -2 ) + else + GroupName = self:GetName() + end + + self:T3( { GroupName } ) + + local Template = _DATABASE.Templates.Groups[GroupName].Template + + if Template then + if not Begin then + Begin = 0 + end + if not End then + End = 0 + end + + for TPointID = Begin + 1, #Template.route.points - End do + if Template.route.points[TPointID] then + Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) + if Randomize then + if not Radius then + Radius = 500 + end + Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) + Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) + end + end + end + return Points + end + + return nil +end + + +function GROUP:GetDetectedTargets() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return self:_GetController():getDetectedTargets() + end + + return nil +end + +function GROUP:IsTargetDetected( DCSObject ) + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + + local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, + Controller.Detection.VISUAL, + Controller.Detection.OPTIC, + Controller.Detection.RADAR, + Controller.Detection.IRST, + Controller.Detection.RWR, + Controller.Detection.DLINK + ) + return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + end + + return nil +end + +-- Options + +--- Can the GROUP hold their weapons? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEHoldFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Holding weapons. +-- @param Group#GROUP self +-- @return Group#GROUP self +function GROUP:OptionROEHoldFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack returning on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEReturnFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Return fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEReturnFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack designated targets? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEOpenFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Openfire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEOpenFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack targets of opportunity? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEWeaponFreePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Weapon free. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEWeaponFree() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) + end + + return self + end + + return nil +end + +--- Can the GROUP ignore enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTNoReactionPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- No evasion on enemy threats. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTNoReaction() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade using passive defenses? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTPassiveDefensePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Evasion passive defense. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTPassiveDefense() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTEvadeFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTEvadeFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on fire using vertical manoeuvres? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTVerticalPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire using vertical manoeuvres. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTVertical() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + end + + return self + end + + return nil +end + +-- Message APIs + +--- Returns a message for a coalition or a client. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @return Message#MESSAGE +function GROUP:Message( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return MESSAGE:New( Message, Duration, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")" ) + end + + return nil +end + +--- Send a message to all coalitions. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToAll( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToAll() + end + + return nil +end + +--- Send a message to the red coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTYpes#Duration Duration The duration of the message. +function GROUP:MessageToRed( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToRed() + end + + return nil +end + +--- Send a message to the blue coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToBlue( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToBlue() + end + + return nil +end + +--- Send a message to a client. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @param Client#CLIENT Client The client object receiving the message. +function GROUP:MessageToClient( Message, Duration, Client ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToClient( Client ) + end + + return nil +end +--- This module contains the UNIT class. +-- +-- 1) @{Unit#UNIT} class, extends @{Base#BASE} +-- =========================================== +-- The @{Unit#UNIT} class is a wrapper class to handle the DCS Unit objects: +-- +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Unit API set. +-- * Handle local Unit Controller. +-- * Manage the "state" of the DCS Unit. +-- +-- +-- 1.1) UNIT reference methods +-- ---------------------- +-- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). +-- +-- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. +-- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. +-- +-- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: +-- +-- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. +-- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). +-- +-- 1.2) DCS UNIT APIs +-- ------------------ +-- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. +-- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, +-- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() +-- is implemented in the UNIT class as @{#UNIT.GetName}(). +-- +-- 1.3) Smoke, Flare Units +-- ----------------------- +-- The UNIT class provides methods to smoke or flare units easily. +-- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods +-- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. +-- When the DCS Unit moves for whatever reason, the smoking will still continue! +-- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() +-- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. +-- +-- 1.4) Location Position, Point +-- ----------------------------- +-- The UNIT class provides methods to obtain the current point or position of the DCS Unit. +-- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current **location** of the DCS Unit in a Vec2 (2D) or a **point** in a Vec3 (3D) vector respectively. +-- If you want to obtain the complete **3D position** including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. +-- +-- 1.5) Test if alive +-- ------------------ +-- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. +-- +-- 1.6) Test for proximity +-- ----------------------- +-- The UNIT class contains methods to test the location or proximity against zones or other objects. +-- +-- ### 1.6.1) Zones +-- To test whether the Unit is within a **zone**, use the @{#UNIT.IsInZone}() or the @{#UNIT.IsNotInZone}() methods. Any zone can be tested on, but the zone must be derived from @{Zone#ZONE_BASE}. +-- +-- ### 1.6.2) Units +-- Test if another DCS Unit is within a given radius of the current DCS Unit, use the @{#UNIT.OtherUnitInRadius}() method. +-- +-- @module Unit +-- @author FlightControl + + + + + +--- The UNIT class +-- @type UNIT +-- @extends Base#BASE +-- @field #UNIT.FlareColor FlareColor +-- @field #UNIT.SmokeColor SmokeColor +UNIT = { + ClassName="UNIT", + CategoryName = { + [Unit.Category.AIRPLANE] = "Airplane", + [Unit.Category.HELICOPTER] = "Helicoper", + [Unit.Category.GROUND_UNIT] = "Ground Unit", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + }, + FlareColor = { + Green = trigger.flareColor.Green, + Red = trigger.flareColor.Red, + White = trigger.flareColor.White, + Yellow = trigger.flareColor.Yellow + }, + SmokeColor = { + Green = trigger.smokeColor.Green, + Red = trigger.smokeColor.Red, + White = trigger.smokeColor.White, + Orange = trigger.smokeColor.Orange, + Blue = trigger.smokeColor.Blue + }, + } + +--- FlareColor +-- @type UNIT.FlareColor +-- @field Green +-- @field Red +-- @field White +-- @field Yellow + +--- SmokeColor +-- @type UNIT.SmokeColor +-- @field Green +-- @field Red +-- @field White +-- @field Orange +-- @field Blue + +-- Registration. + +--- Create a new UNIT from DCSUnit. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit +-- @param Database#DATABASE Database +-- @return Unit#UNIT +function UNIT:Register( UnitName ) + + local self = BASE:Inherit( self, BASE:New() ) + self:F2( UnitName ) + self.UnitName = UnitName + return self +end + +-- Reference methods. + +--- Finds a UNIT from the _DATABASE using a DCSUnit object. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. +-- @return Unit#UNIT self +function UNIT:Find( DCSUnit ) + + local UnitName = DCSUnit:getName() + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +--- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. +-- @param #UNIT self +-- @param #string UnitName The Unit Name. +-- @return Unit#UNIT self +function UNIT:FindByName( UnitName ) + + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +function UNIT:GetDCSUnit() + local DCSUnit = Unit.getByName( self.UnitName ) + + if DCSUnit then + return DCSUnit + end + + self:E( "Unit " .. self.UnitName .. " not found!" ) + return nil +end + +--- Returns coalition of the Unit. +-- @param Unit#UNIT self +-- @return DCSCoalitionObject#coalition.side The side of the coalition. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCoalition() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCoalition = DCSUnit:getCoalition() + self:T3( UnitCoalition ) + return UnitCoalition + end + + return nil +end + +--- Returns country of the Unit. +-- @param Unit#UNIT self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCountry() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCountry = DCSUnit:getCountry() + self:T3( UnitCountry ) + return UnitCountry + end + + return nil +end + + +--- Returns DCS Unit object name. +-- The function provides access to non-activated units too. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitName = self.UnitName + return UnitName + end + + return nil +end + + +--- Returns if the unit is alive. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is alive. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsAlive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitIsAlive = DCSUnit:isExist() + return UnitIsAlive + end + + return false +end + +--- Returns if the unit is activated. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is activated. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsActive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local UnitIsActive = DCSUnit:isActive() + return UnitIsActive + end + + return nil +end + +--- Returns name of the player that control the unit or nil if the unit is controlled by A.I. +-- @param Unit#UNIT self +-- @return #string Player Name +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPlayerName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local PlayerName = DCSUnit:getPlayerName() + if PlayerName == nil then + PlayerName = "" + end + return PlayerName + end + + return nil +end + +--- Returns the unit's unique identifier. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.ID Unit ID +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetID() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitID = DCSUnit:getID() + return UnitID + end + + return nil +end + +--- Returns the unit's number in the group. +-- The number is the same number the unit has in ME. +-- It may not be changed during the mission. +-- If any unit in the group is destroyed, the numbers of another units will not be changed. +-- @param Unit#UNIT self +-- @return #number The Unit number. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetNumber() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitNumber = DCSUnit:getNumber() + return UnitNumber + end + + return nil +end + +--- Returns the unit's group if it exist and nil otherwise. +-- @param Unit#UNIT self +-- @return Group#GROUP The Group of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetGroup() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitGroup = DCSUnit:getGroup() + return UnitGroup + end + + return nil +end + + +--- Returns the unit's callsign - the localized string. +-- @param Unit#UNIT self +-- @return #string The Callsign of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCallSign() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCallSign = DCSUnit:getCallsign() + return UnitCallSign + end + + return nil +end + +--- Returns the unit's health. Dead units has health <= 1.0. +-- @param Unit#UNIT self +-- @return #number The Unit's health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife = DCSUnit:getLife() + return UnitLife + end + + return nil +end + +--- Returns the Unit's initial health. +-- @param Unit#UNIT self +-- @return #number The Unit's initial health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife0() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife0 = DCSUnit:getLife0() + return UnitLife0 + end + + return nil +end + +--- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. +-- @param Unit#UNIT self +-- @return #number The relative amount of fuel (from 0.0 to 1.0). +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetFuel() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitFuel = DCSUnit:getFuel() + return UnitFuel + end + + return nil +end + +--- Returns the Unit's ammunition. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Ammo +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAmmo() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitAmmo = DCSUnit:getAmmo() + return UnitAmmo + end + + return nil +end + +--- Returns the unit sensors. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Sensors +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetSensors() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitSensors = DCSUnit:getSensors() + return UnitSensors + end + + return nil +end + +-- Need to add here a function per sensortype +-- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) + +--- Returns two values: +-- +-- * First value indicates if at least one of the unit's radar(s) is on. +-- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @param Unit#UNIT self +-- @return #boolean Indicates if at least one of the unit's radar(s) is on. +-- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetRadar() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() + return UnitRadarOn, UnitRadarObject + end + + return nil, nil +end + +-- Need to add here functions to check if radar is on and which object etc. + +--- Returns unit descriptor. Descriptor type depends on unit category. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Desc The Unit descriptor. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetDesc() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitDesc = DCSUnit:getDesc() + self:T2( UnitDesc ) + return UnitDesc + end + + self:E( "Unit " .. self.UnitName .. "not found!" ) + return nil +end + + +--- Returns the type name of the DCS Unit. +-- @param Unit#UNIT self +-- @return #string The type name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetTypeName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitTypeName = DCSUnit:getTypeName() + self:T3( UnitTypeName ) + return UnitTypeName + end + + return nil +end + + + +--- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. +-- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. +-- The spawn sequence number and unit number are contained within the name after the '#' sign. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPrefix() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) + self:T3( UnitPrefix ) + return UnitPrefix + end + + return nil +end + + + +--- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec2() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + + local UnitPointVec2 = {} + UnitPointVec2.x = UnitPointVec3.x + UnitPointVec2.y = UnitPointVec3.z + + self:T2( UnitPointVec2 ) + return UnitPointVec2 + end + + return nil +end + + +--- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + self:T3( UnitPointVec3 ) + return UnitPointVec3 + end + + return nil +end + +--- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Position The 3D position vectors of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPositionVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPosition = DCSUnit:getPosition() + self:T3( UnitPosition ) + return UnitPosition + end + + return nil +end + +--- Returns the DCS Unit velocity vector. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The velocity vector +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetVelocity() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitVelocityVec3 = DCSUnit:getVelocity() + self:T3( UnitVelocityVec3 ) + return UnitVelocityVec3 + end + + return nil +end + +-- Is functions + +--- Returns true if the unit is within a @{Zone}. +-- @param #UNIT self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the unit is within the @{Zone#ZONE_BASE} +function UNIT:IsInZone( Zone ) + self:F2( { self.UnitName, Zone } ) + + local IsInZone = Zone:IsPointVec3InZone( self:GetPointVec3() ) + + self:T( { IsInZone } ) + return IsInZone +end + +--- Returns true if the unit is not within a @{Zone}. +-- @param #UNIT self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the unit is not within the @{Zone#ZONE_BASE} +function UNIT:IsNotInZone( Zone ) + self:F2( { self.UnitName, Zone } ) + + local IsInZone = not Zone:IsPointVec3InZone( self:GetPointVec3() ) + + self:T( { IsInZone } ) + return IsInZone +end + +--- Returns true if the DCS Unit is in the air. +-- @param Unit#UNIT self +-- @return #boolean true if in the air. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:InAir() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitInAir = DCSUnit:inAir() + self:T3( UnitInAir ) + return UnitInAir + end + + return nil +end + +--- Returns the altitude of the DCS Unit. +-- @param Unit#UNIT self +-- @return DCSTypes#Distance The altitude of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAltitude() + self:F2() + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 + return UnitPointVec3.y + end + + return nil +end + +--- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. +-- @param Unit#UNIT self +-- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. +-- @param Radius The radius in meters with the DCS Unit in the centre. +-- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) + self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPos = self:GetPointVec3() + local AwaitUnitPos = AwaitUnit:GetPointVec3() + + if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then + self:T3( "true" ) + return true + else + self:T3( "false" ) + return false + end + end + + return nil +end + +--- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. +-- @param Unit#UNIT self +-- @return #string The DCS Unit Category Name +function UNIT:GetCategoryName() + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] + return UnitCategoryName + end + + return nil +end + +--- Signal a flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:Flare( FlareColor ) + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) +end + +--- Signal a white flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareWhite() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) +end + +--- Signal a yellow flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareYellow() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) +end + +--- Signal a green flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareGreen() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) +end + +--- Signal a red flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareRed() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) +end + +--- Smoke the UNIT. +-- @param #UNIT self +function UNIT:Smoke( SmokeColor ) + self:F2() + trigger.action.smoke( self:GetPointVec3(), SmokeColor ) +end + +--- Smoke the UNIT Green. +-- @param #UNIT self +function UNIT:SmokeGreen() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) +end + +--- Smoke the UNIT Red. +-- @param #UNIT self +function UNIT:SmokeRed() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) +end + +--- Smoke the UNIT White. +-- @param #UNIT self +function UNIT:SmokeWhite() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) +end + +--- Smoke the UNIT Orange. +-- @param #UNIT self +function UNIT:SmokeOrange() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) +end + +--- Smoke the UNIT Blue. +-- @param #UNIT self +function UNIT:SmokeBlue() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) +end + +-- Is methods + +--- Returns if the unit is of an air category. +-- If the unit is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #UNIT self +-- @return #boolean Air category evaluation result. +function UNIT:IsAir() + self:F2() + + local UnitDescriptor = self.DCSUnit:getDesc() + self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) + + local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) + + self:T3( IsAirResult ) + return IsAirResult +end + +--- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. +-- There are essentially two core functions that zones accomodate: +-- +-- * Test if an object is within the zone boundaries. +-- * Provide the zone behaviour. Some zones are static, while others are moveable. +-- +-- The object classes are using the zone classes to test the zone boundaries, which can take various forms: +-- +-- * Test if completely within the zone. +-- * Test if partly within the zone (for @{Group#GROUP} objects). +-- * Test if not in the zone. +-- * Distance to the nearest intersecting point of the zone. +-- * Distance to the center of the zone. +-- * ... +-- +-- Each of these ZONE classes have a zone name, and specific parameters defining the zone type: +-- +-- * @{Zone#ZONE_BASE}: The ZONE_BASE class defining the base for all other zone classes. +-- * @{Zone#ZONE_RADIUS}: The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- * @{Zone#ZONE}: The ZONE class, defined by the zone name as defined within the Mission Editor. +-- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: +-- +-- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. +-- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. +-- +-- === +-- +-- 1) @{Zone#ZONE_BASE} class, extends @{Base#BASE} +-- ================================================ +-- The ZONE_BASE class defining the base for all other zone classes. +-- +-- === +-- +-- 2) @{Zone#ZONE_RADIUS} class, extends @{Zone#ZONE_BASE} +-- ======================================================= +-- The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- +-- === +-- +-- 3) @{Zone#ZONE} class, extends @{Zone#ZONE_RADIUS} +-- ========================================== +-- The ZONE class, defined by the zone name as defined within the Mission Editor. +-- +-- === +-- +-- 4) @{Zone#ZONE_UNIT} class, extends @{Zone#ZONE_RADIUS} +-- ======================================================= +-- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- +-- === +-- +-- 5) @{Zone#ZONE_POLYGON} class, extends @{Zone#ZONE_BASE} +-- ======================================================== +-- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- === +-- +-- @module Zone +-- @author FlightControl + + + + + + + + + +--- The ZONE_BASE class +-- @type ZONE_BASE +-- @extends Base#BASE +ZONE_BASE = { + ClassName = "ZONE_BASE", + } + +--- ZONE_BASE constructor +-- @param #ZONE_BASE self +-- @param #string ZoneName Name of the zone. +-- @return #ZONE_BASE self +function ZONE_BASE:New( ZoneName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( ZoneName ) + + self.ZoneName = ZoneName + + return self +end + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_BASE:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_BASE:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_BASE self +-- @param SmokeColor The smoke color. +function ZONE_BASE:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + +end + + +--- The ZONE_RADIUS class, defined by a zone name, a location and a radius. +-- @type ZONE_RADIUS +-- @field DCSTypes#Vec2 PointVec2 The current location of the zone. +-- @field DCSTypes#Distance Radius The radius of the zone. +-- @extends Zone#ZONE_BASE +ZONE_RADIUS = { + ClassName="ZONE_RADIUS", + } + +--- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. +-- @param #ZONE_RADIUS self +-- @param #string ZoneName Name of the zone. +-- @param DCSTypes#Vec2 PointVec2 The location of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, PointVec2, Radius } ) + + self.Radius = Radius + self.PointVec2 = PointVec2 + + return self +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @param #number Points (optional) The amount of points in the circle. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:SmokeZone( SmokeColor, Points ) + self:F2( SmokeColor ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + Points = Points and Points or 360 + + local Angle + local RadialBase = math.pi*2 + + for Angle = 0, 360, 360 / Points do + local Radial = Angle * RadialBase / 360 + Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() + POINT_VEC2:New( Point.x, Point.y ):Smoke( SmokeColor ) + end + + return self +end + + +--- Flares the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param #POINT_VEC3.FlareColor FlareColor The flare color. +-- @param #number Points (optional) The amount of points in the circle. +-- @param DCSTypes#Azimuth Azimuth (optional) Azimuth The azimuth of the flare. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth ) + self:F2( { FlareColor, Azimuth } ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + Points = Points and Points or 360 + + local Angle + local RadialBase = math.pi*2 + + for Angle = 0, 360, 360 / Points do + local Radial = Angle * RadialBase / 360 + Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() + POINT_VEC2:New( Point.x, Point.y ):Flare( FlareColor, Azimuth ) + end + + return self +end + +--- Returns the radius of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:GetRadius() + self:F2( self.ZoneName ) + + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Sets the radius of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:SetRadius( Radius ) + self:F2( self.ZoneName ) + + self.Radius = Radius + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Returns the location of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The location of the zone. +function ZONE_RADIUS:GetPointVec2() + self:F2( self.ZoneName ) + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Sets the location of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The new location of the zone. +-- @return DCSTypes#Vec2 The new location of the zone. +function ZONE_RADIUS:SetPointVec2( PointVec2 ) + self:F2( self.ZoneName ) + + self.PointVec2 = PointVec2 + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Returns the point of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return DCSTypes#Vec3 The point of the zone. +function ZONE_RADIUS:GetPointVec3( Height ) + self:F2( self.ZoneName ) + + local PointVec2 = self:GetPointVec2() + + local PointVec3 = { x = PointVec2.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = PointVec2.y } + + self:T2( { PointVec3 } ) + + return PointVec3 +end + + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + local ZonePointVec2 = self:GetPointVec2() + + if (( PointVec2.x - ZonePointVec2.x )^2 + ( PointVec2.y - ZonePointVec2.y ) ^2 ) ^ 0.5 <= self:GetRadius() then + return true + end + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + +--- Returns a random location within the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The random location within the zone. +function ZONE_RADIUS:GetRandomPointVec2() + self:F( self.ZoneName ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + local angle = math.random() * math.pi*2; + Point.x = PointVec2.x + math.cos( angle ) * math.random() * self:GetRadius(); + Point.y = PointVec2.y + math.sin( angle ) * math.random() * self:GetRadius(); + + self:T( { Point } ) + + return Point +end + + + +--- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. +-- @type ZONE +-- @extends Zone#ZONE_RADIUS +ZONE = { + ClassName="ZONE", + } + + +--- Constructor of ZONE, taking the zone name. +-- @param #ZONE self +-- @param #string ZoneName The name of the zone as defined within the mission editor. +-- @return #ZONE +function ZONE:New( ZoneName ) + + local Zone = trigger.misc.getZone( ZoneName ) + + if not Zone then + error( "Zone " .. ZoneName .. " does not exist." ) + return nil + end + + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.point.x, y = Zone.point.z }, Zone.radius ) ) + self:F( ZoneName ) + + self.Zone = Zone + + return self +end + + +--- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- @type ZONE_UNIT +-- @field Unit#UNIT ZoneUNIT +-- @extends Zone#ZONE_RADIUS +ZONE_UNIT = { + ClassName="ZONE_UNIT", + } + +--- Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius. +-- @param #ZONE_UNIT self +-- @param #string ZoneName Name of the zone. +-- @param Unit#UNIT ZoneUNIT The unit as the center of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_UNIT self +function ZONE_UNIT:New( ZoneName, ZoneUNIT, Radius ) + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneUNIT:GetPointVec2(), Radius ) ) + self:F( { ZoneName, ZoneUNIT:GetPointVec2(), Radius } ) + + self.ZoneUNIT = ZoneUNIT + + return self +end + + +--- Returns the current location of the @{Unit#UNIT}. +-- @param #ZONE_UNIT self +-- @return DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. +function ZONE_UNIT:GetPointVec2() + self:F( self.ZoneName ) + + local ZonePointVec2 = self.ZoneUNIT:GetPointVec2() + + self:T( { ZonePointVec2 } ) + + return ZonePointVec2 +end + + +--- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- @type ZONE_POLYGON +-- @extends Zone#ZONE_BASE +ZONE_POLYGON = { + ClassName="ZONE_POLYGON", + } + +--- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor. +-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON. +-- @param #ZONE_POLYGON self +-- @param #string ZoneName Name of the zone. +-- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:New( ZoneName, ZoneGroup ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, ZoneGroup } ) + + local GroupPoints = ZoneGroup:GetTaskRoute() + local i = 0 + + self.Polygon = {} + + for i = 1, #GroupPoints do + self.Polygon[i] = {} + self.Polygon[i].x = GroupPoints[i].x + self.Polygon[i].y = GroupPoints[i].y + end + + return self +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_POLYGON self +-- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + + local i + local j + local Segments = 10 + + i = 1 + j = #self.Polygon + + while i <= #self.Polygon do + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + + local DeltaX = self.Polygon[j].x - self.Polygon[i].x + local DeltaY = self.Polygon[j].y - self.Polygon[i].y + + for Segment = 0, Segments do -- We divide each line in 5 segments and smoke a point on the line. + local PointX = self.Polygon[i].x + ( Segment * DeltaX / Segments ) + local PointY = self.Polygon[i].y + ( Segment * DeltaY / Segments ) + POINT_VEC2:New( PointX, PointY ):Smoke( SmokeColor ) + end + j = i + i = i + 1 + end + + return self +end + + + + +--- Returns if a location is within the zone. +-- @param #ZONE_POLYGON self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + local i + local j + local c = false + + i = 1 + j = #self.Polygon + + while i < #self.Polygon do + j = i + i = i + 1 + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + if ( ( ( self.Polygon[i].y > PointVec2.y ) ~= ( self.Polygon[j].y > PointVec2.y ) ) and + ( PointVec2.x < ( self.Polygon[j].x - self.Polygon[i].x ) * ( PointVec2.y - self.Polygon[i].y ) / ( self.Polygon[j].y - self.Polygon[i].y ) + self.Polygon[i].x ) + ) then + c = not c + end + self:T2( { "c = ", c } ) + end + + self:T( { "c = ", c } ) + return c +end + +--- This module contains the CLIENT class. +-- +-- 1) @{Client#CLIENT} class, extends @{Unit#UNIT} +-- =============================================== +-- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. +-- Note that clients are NOT the same as Units, they are NOT necessarily alive. +-- The @{Client#CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: +-- +-- * Wraps the DCS Unit objects with skill level set to Player or Client. +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Group API set. +-- * When player joins Unit, execute alive init logic. +-- * Handles messages to players. +-- * Manage the "state" of the DCS Unit. +-- +-- Clients are being used by the @{MISSION} class to follow players and register their successes. +-- +-- 1.1) CLIENT reference methods +-- ----------------------------- +-- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts). +-- +-- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. +-- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. +-- +-- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: +-- +-- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. +-- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). +-- +-- @module Client +-- @author FlightControl + + + + + + + +--- The CLIENT class +-- @type CLIENT +-- @extends Unit#UNIT +CLIENT = { + ONBOARDSIDE = { + NONE = 0, + LEFT = 1, + RIGHT = 2, + BACK = 3, + FRONT = 4 + }, + ClassName = "CLIENT", + ClientName = nil, + ClientAlive = false, + ClientTransport = false, + ClientBriefingShown = false, + _Menus = {}, + _Tasks = {}, + Messages = { + } +} + + +--- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:Find( DCSUnit ) + local ClientName = DCSUnit:getName() + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( ClientName ) + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + + +--- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. +-- As an optional parameter, a briefing text can be given also. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:FindByName( ClientName, ClientBriefing ) + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( { ClientName, ClientBriefing } ) + ClientFound:AddBriefing( ClientBriefing ) + ClientFound.MessageSwitch = true + + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + +function CLIENT:Register( ClientName ) + local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) + + self:F( ClientName ) + self.ClientName = ClientName + self.MessageSwitch = true + self.ClientAlive2 = false + + --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) + self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) + + self:E( self ) + return self +end + + +--- Transport defines that the Client is a Transport. Transports show cargo. +-- @param #CLIENT self +-- @return #CLIENT +function CLIENT:Transport() + self:F() + + self.ClientTransport = true + return self +end + +--- AddBriefing adds a briefing to a CLIENT when a player joins a mission. +-- @param #CLIENT self +-- @param #string ClientBriefing is the text defining the Mission briefing. +-- @return #CLIENT self +function CLIENT:AddBriefing( ClientBriefing ) + self:F( ClientBriefing ) + self.ClientBriefing = ClientBriefing + self.ClientBriefingShown = false + + return self +end + +--- Show the briefing of a CLIENT. +-- @param #CLIENT self +-- @return #CLIENT self +function CLIENT:ShowBriefing() + self:F( { self.ClientName, self.ClientBriefingShown } ) + + if not self.ClientBriefingShown then + self.ClientBriefingShown = true + local Briefing = "" + if self.ClientBriefing then + Briefing = Briefing .. self.ClientBriefing + end + Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." + self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) + end + + return self +end + +--- Show the mission briefing of a MISSION to the CLIENT. +-- @param #CLIENT self +-- @param #string MissionBriefing +-- @return #CLIENT self +function CLIENT:ShowMissionBriefing( MissionBriefing ) + self:F( { self.ClientName } ) + + if MissionBriefing then + self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) + end + + return self +end + + + +--- Resets a CLIENT. +-- @param #CLIENT self +-- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. +function CLIENT:Reset( ClientName ) + self:F() + self._Menus = {} +end + +-- Is Functions + +--- Checks if the CLIENT is a multi-seated UNIT. +-- @param #CLIENT self +-- @return #boolean true if multi-seated. +function CLIENT:IsMultiSeated() + self:F( self.ClientName ) + + local ClientMultiSeatedTypes = { + ["Mi-8MT"] = "Mi-8MT", + ["UH-1H"] = "UH-1H", + ["P-51B"] = "P-51B" + } + + if self:IsAlive() then + local ClientTypeName = self:GetClientGroupUnit():GetTypeName() + if ClientMultiSeatedTypes[ClientTypeName] then + return true + end + end + + return false +end + +--- Checks for a client alive event and calls a function on a continuous basis. +-- @param #CLIENT self +-- @param #function CallBack Function. +-- @return #CLIENT +function CLIENT:Alive( CallBackFunction, ... ) + self:F() + + self.ClientCallBack = CallBackFunction + self.ClientParameters = arg + + return self +end + +--- @param #CLIENT self +function CLIENT:_AliveCheckScheduler() + self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown, self.ClientCallBack } ) + + if self:IsAlive() then -- Polymorphic call of UNIT + if self.ClientAlive2 == false then + self:ShowBriefing() + if self.ClientCallBack then + self:T("Calling Callback function") + self.ClientCallBack( self, unpack( self.ClientParameters ) ) + end + self.ClientAlive2 = true + end + else + if self.ClientAlive2 == true then + self.ClientAlive2 = false + end + end + + return true +end + +--- Return the DCSGroup of a Client. +-- This function is modified to deal with a couple of bugs in DCS 1.5.3 +-- @param #CLIENT self +-- @return DCSGroup#Group +function CLIENT:GetDCSGroup() + self:F3() + +-- local ClientData = Group.getByName( self.ClientName ) +-- if ClientData and ClientData:isExist() then +-- self:T( self.ClientName .. " : group found!" ) +-- return ClientData +-- else +-- return nil +-- end + + local ClientUnit = Unit.getByName( self.ClientName ) + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "CoalitionData:", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + + --self:E(self.ClientName) + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() and UnitData:getGroup():isExist() then + if ClientGroup:getID() == UnitData:getGroup():getID() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + self.ClientGroupID = ClientGroup:getID() + self.ClientGroupName = ClientGroup:getName() + return ClientGroup + end + else + -- Now we need to resolve the bugs in DCS 1.5 ... + -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) + self:T3( "Bug 1.5 logic" ) + local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate + self.ClientGroupID = ClientGroupTemplate.groupId + self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName + self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) + return ClientGroup + end + -- else + -- error( "Client " .. self.ClientName .. " not found!" ) + end + else + --self:E( { "Client not found!", self.ClientName } ) + end + end + end + end + + -- For non player clients + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + return ClientGroup + end + end + end + + self.ClientGroupID = nil + self.ClientGroupUnit = nil + + return nil +end + + +-- TODO: Check DCSTypes#Group.ID +--- Get the group ID of the client. +-- @param #CLIENT self +-- @return DCSTypes#Group.ID +function CLIENT:GetClientGroupID() + + local ClientGroup = self:GetDCSGroup() + + --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() + return self.ClientGroupID +end + + +--- Get the name of the group of the client. +-- @param #CLIENT self +-- @return #string +function CLIENT:GetClientGroupName() + + local ClientGroup = self:GetDCSGroup() + + self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() + return self.ClientGroupName +end + +--- Returns the UNIT of the CLIENT. +-- @param #CLIENT self +-- @return Unit#UNIT +function CLIENT:GetClientGroupUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + self:T( self.ClientDCSUnit ) + if ClientDCSUnit and ClientDCSUnit:isExist() then + local ClientUnit = _DATABASE:FindUnit( self.ClientName ) + self:T2( ClientUnit ) + return ClientUnit + end +end + +--- Returns the DCSUnit of the CLIENT. +-- @param #CLIENT self +-- @return DCSTypes#Unit +function CLIENT:GetClientGroupDCSUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + if ClientDCSUnit and ClientDCSUnit:isExist() then + self:T2( ClientDCSUnit ) + return ClientDCSUnit + end +end + + +--- Evaluates if the CLIENT is a transport. +-- @param #CLIENT self +-- @return #boolean true is a transport. +function CLIENT:IsTransport() + self:F() + return self.ClientTransport +end + +--- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. +-- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. +-- @param #CLIENT self +function CLIENT:ShowCargo() + self:F() + + local CargoMsg = "" + + for CargoName, Cargo in pairs( CARGOS ) do + if self == Cargo:IsLoadedInClient() then + CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" + end + end + + if CargoMsg == "" then + CargoMsg = "empty" + end + + self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) + +end + +-- TODO (1) I urgently need to revise this. +--- A local function called by the DCS World Menu system to switch off messages. +function CLIENT.SwitchMessages( PrmTable ) + PrmTable[1].MessageSwitch = PrmTable[2] +end + +--- The main message driver for the CLIENT. +-- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. +-- @param #CLIENT self +-- @param #string Message is the text describing the message. +-- @param #number MessageDuration is the duration in seconds that the Message should be displayed. +-- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId +-- @param #string MessageCategory is the category of the message (the title). +-- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. +function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) + self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) + + if not self.MenuMessages then + if self:GetClientGroupID() then + self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) + self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) + self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) + end + end + + if self.MessageSwitch == true then + if MessageCategory == nil then + MessageCategory = "Messages" + end + if self.Messages[MessageId] == nil then + self.Messages[MessageId] = {} + self.Messages[MessageId].MessageId = MessageId + self.Messages[MessageId].MessageTime = timer.getTime() + self.Messages[MessageId].MessageDuration = MessageDuration + if MessageInterval == nil then + self.Messages[MessageId].MessageInterval = 600 + else + self.Messages[MessageId].MessageInterval = MessageInterval + end + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) + else + if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then + MESSAGE:New( Message, MessageDuration , MessageCategory):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + else + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + end + end + end +end +--- This module contains the STATIC class. +-- +-- 1) @{Static#STATIC} class, extends @{Unit#UNIT} +-- =============================================== +-- Statics are **Static Units** defined within the Mission Editor. +-- Note that Statics are almost the same as Units, but they don't have a controller. +-- The @{Static#STATIC} class is a wrapper class to handle the DCS Static objects: +-- +-- * Wraps the DCS Static objects. +-- * Support all DCS Static APIs. +-- * Enhance with Static specific APIs not in the DCS API set. +-- +-- 1.1) STATIC reference methods +-- ----------------------------- +-- For each DCS Static will have a STATIC wrapper object (instance) within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts). +-- +-- The STATIC class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the Static Name. +-- +-- Another thing to know is that STATIC objects do not "contain" the DCS Static object. +-- The STATIc methods will reference the DCS Static object by name when it is needed during API execution. +-- If the DCS Static object does not exist or is nil, the STATIC methods will return nil and log an exception in the DCS.log file. +-- +-- The STATIc class provides the following functions to retrieve quickly the relevant STATIC instance: +-- +-- * @{#STATIC.FindByName}(): Find a STATIC instance from the _DATABASE object using a DCS Static name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these STATIC OBJECT REFERENCES! (make the STATIC object references nil). +-- +-- @module Static +-- @author FlightControl + + + + + + +--- The STATIC class +-- @type STATIC +-- @extends Unit#UNIT +STATIC = { + ClassName = "STATIC", +} + + +--- Finds a STATIC from the _DATABASE using the relevant Static Name. +-- As an optional parameter, a briefing text can be given also. +-- @param #STATIC self +-- @param #string StaticName Name of the DCS **Static** as defined within the Mission Editor. +-- @return #STATIC +function STATIC:FindByName( StaticName ) + local StaticFound = _DATABASE:FindStatic( StaticName ) + + if StaticFound then + StaticFound:F( { StaticName } ) + + return StaticFound + end + + error( "STATIC not found for: " .. StaticName ) +end + +function STATIC:Register( StaticName ) + local self = BASE:Inherit( self, UNIT:Register( StaticName ) ) + + self:F( StaticName ) + + return self +end + + +function STATIC:GetDCSUnit() + local DCSStatic = StaticObject.getByName( self.UnitName ) + + if DCSStatic then + return DCSStatic + end + + return nil +end +--- Manage the mission database. +-- +-- @{#DATABASE} class +-- ================== +-- Mission designers can use the DATABASE class to refer to: +-- +-- * UNITS +-- * GROUPS +-- * players +-- * alive players +-- * CLIENTS +-- * alive CLIENTS +-- +-- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. +-- +-- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. +-- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. +-- +-- DATABASE iterators: +-- =================== +-- You can iterate the database with the available iterator methods. +-- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the DATABASE: +-- +-- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. +-- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. +-- +-- @module Database +-- @author FlightControl + + + + + + + + + + + + +--- DATABASE class +-- @type DATABASE +-- @extends Base#BASE +DATABASE = { + ClassName = "DATABASE", + Templates = { + Units = {}, + Groups = {}, + ClientsByName = {}, + ClientsByID = {}, + }, + DCSUnits = {}, + DCSGroups = {}, + DCSStatics = {}, + UNITS = {}, + STATICS = {}, + GROUPS = {}, + PLAYERS = {}, + PLAYERSALIVE = {}, + CLIENTS = {}, + CLIENTSALIVE = {}, + NavPoints = {}, +} + +local _DATABASECoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _DATABASECategory = + { + ["plane"] = Unit.Category.AIRPLANE, + ["helicopter"] = Unit.Category.HELICOPTER, + ["vehicle"] = Unit.Category.GROUND_UNIT, + ["ship"] = Unit.Category.SHIP, + ["static"] = Unit.Category.STRUCTURE, + } + + +--- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #DATABASE self +-- @return #DATABASE +-- @usage +-- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. +-- DBObject = DATABASE:New() +function DATABASE:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + + + -- Follow alive players and clients + _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) + _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) + + self:_RegisterTemplates() + self:_RegisterGroupsAndUnits() + self:_RegisterClients() + self:_RegisterStatics() + self:_RegisterPlayers() + + return self +end + +--- Finds a Unit based on the Unit Name. +-- @param #DATABASE self +-- @param #string UnitName +-- @return Unit#UNIT The found Unit. +function DATABASE:FindUnit( UnitName ) + + local UnitFound = self.UNITS[UnitName] + return UnitFound +end + + +--- Adds a Unit based on the Unit Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddUnit( DCSUnit, DCSUnitName ) + + self.DCSUnits[DCSUnitName] = DCSUnit + self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) +end + + +--- Deletes a Unit from the DATABASE based on the Unit Name. +-- @param #DATABASE self +function DATABASE:DeleteUnit( DCSUnitName ) + + self.DCSUnits[DCSUnitName] = nil +end + +--- Adds a Static based on the Static Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddStatic( DCSStatic, DCSStaticName ) + + self.DCSStatics[DCSStaticName] = DCSStatic + self.STATICS[DCSStaticName] = STATIC:Register( DCSStaticName ) +end + + +--- Deletes a Static from the DATABASE based on the Static Name. +-- @param #DATABASE self +function DATABASE:DeleteStatic( DCSStaticName ) + + self.DCSStatics[DCSStaticName] = nil +end + +--- Finds a STATIC based on the StaticName. +-- @param #DATABASE self +-- @param #string StaticName +-- @return Static#STATIC The found STATIC. +function DATABASE:FindStatic( StaticName ) + + local StaticFound = self.STATICS[StaticName] + return StaticFound +end + + +--- Finds a CLIENT based on the ClientName. +-- @param #DATABASE self +-- @param #string ClientName +-- @return Client#CLIENT The found CLIENT. +function DATABASE:FindClient( ClientName ) + + local ClientFound = self.CLIENTS[ClientName] + return ClientFound +end + + +--- Adds a CLIENT based on the ClientName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddClient( ClientName ) + + self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) + self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) +end + + +--- Finds a GROUP based on the GroupName. +-- @param #DATABASE self +-- @param #string GroupName +-- @return Group#GROUP The found GROUP. +function DATABASE:FindGroup( GroupName ) + + local GroupFound = self.GROUPS[GroupName] + return GroupFound +end + + +--- Adds a GROUP based on the GroupName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddGroup( DCSGroup, GroupName ) + + self.DCSGroups[GroupName] = DCSGroup + self.GROUPS[GroupName] = GROUP:Register( GroupName ) +end + +--- Adds a player based on the Player Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddPlayer( UnitName, PlayerName ) + + if PlayerName then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self.PLAYERS[PlayerName] = PlayerName + self.PLAYERSALIVE[PlayerName] = PlayerName + self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) + end +end + +--- Deletes a player from the DATABASE based on the Player Name. +-- @param #DATABASE self +function DATABASE:DeletePlayer( PlayerName ) + + if PlayerName then + self:E( { "Clean player:", PlayerName } ) + self.PLAYERSALIVE[PlayerName] = nil + self.CLIENTSALIVE[PlayerName] = nil + end +end + + +--- Instantiate new Groups within the DCSRTE. +-- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: +-- SpawnCountryID, SpawnCategoryID +-- This method is used by the SPAWN class. +-- @param #DATABASE self +-- @param #table SpawnTemplate +-- @return #DATABASE self +function DATABASE:Spawn( SpawnTemplate ) + self:F2( SpawnTemplate.name ) + + self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) + + -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. + local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID + local SpawnCountryID = SpawnTemplate.SpawnCountryID + local SpawnCategoryID = SpawnTemplate.SpawnCategoryID + + -- Nullify + SpawnTemplate.SpawnCoalitionID = nil + SpawnTemplate.SpawnCountryID = nil + SpawnTemplate.SpawnCategoryID = nil + + self:_RegisterTemplate( SpawnTemplate, SpawnCoalitionID, SpawnCategoryID, SpawnCountryID ) + + self:T3( SpawnTemplate ) + coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) + + -- Restore + SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID + SpawnTemplate.SpawnCountryID = SpawnCountryID + SpawnTemplate.SpawnCategoryID = SpawnCategoryID + + local SpawnGroup = GROUP:Register( SpawnTemplate.name ) + return SpawnGroup +end + +--- Set a status to a Group within the Database, this to check crossing events for example. +function DATABASE:SetStatusGroup( GroupName, Status ) + self:F2( Status ) + + self.Templates.Groups[GroupName].Status = Status +end + +--- Get a status to a Group within the Database, this to check crossing events for example. +function DATABASE:GetStatusGroup( GroupName ) + self:F2( Status ) + + if self.Templates.Groups[GroupName] then + return self.Templates.Groups[GroupName].Status + else + return "" + end +end + +--- Private method that registers new Group Templates within the DATABASE Object. +-- @param #DATABASE self +-- @param #table GroupTemplate +-- @return #DATABASE self +function DATABASE:_RegisterTemplate( GroupTemplate, CoalitionID, CategoryID, CountryID ) + + local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) + + local TraceTable = {} + + if not self.Templates.Groups[GroupTemplateName] then + self.Templates.Groups[GroupTemplateName] = {} + self.Templates.Groups[GroupTemplateName].Status = nil + end + + -- Delete the spans from the route, it is not needed and takes memory. + if GroupTemplate.route and GroupTemplate.route.spans then + GroupTemplate.route.spans = nil + end + + self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName + self.Templates.Groups[GroupTemplateName].Template = GroupTemplate + self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId + self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units + self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units + self.Templates.Groups[GroupTemplateName].CategoryID = CategoryID + self.Templates.Groups[GroupTemplateName].CoalitionID = CoalitionID + self.Templates.Groups[GroupTemplateName].CountryID = CountryID + + + TraceTable[#TraceTable+1] = "Group" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].GroupName + + TraceTable[#TraceTable+1] = "Coalition" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CoalitionID + TraceTable[#TraceTable+1] = "Category" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CategoryID + TraceTable[#TraceTable+1] = "Country" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CountryID + + TraceTable[#TraceTable+1] = "Units" + + for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do + + local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) + self.Templates.Units[UnitTemplateName] = {} + self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName + self.Templates.Units[UnitTemplateName].Template = UnitTemplate + self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName + self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate + self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId + self.Templates.Units[UnitTemplateName].CategoryID = CategoryID + self.Templates.Units[UnitTemplateName].CoalitionID = CoalitionID + self.Templates.Units[UnitTemplateName].CountryID = CountryID + + if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then + self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate + self.Templates.ClientsByName[UnitTemplateName].CategoryID = CategoryID + self.Templates.ClientsByName[UnitTemplateName].CoalitionID = CoalitionID + self.Templates.ClientsByName[UnitTemplateName].CountryID = CountryID + self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate + end + + TraceTable[#TraceTable+1] = self.Templates.Units[UnitTemplateName].UnitName + end + + self:E( TraceTable ) +end + +function DATABASE:GetCoalitionFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CoalitionID +end + +function DATABASE:GetCategoryFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CategoryID +end + +function DATABASE:GetCountryFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CountryID +end + +--- Private method that registers all alive players in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterPlayers() + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + if not self.PLAYERS[PlayerName] then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self:AddPlayer( UnitName, PlayerName ) + end + end + end + end + + return self +end + + +--- Private method that registers all Groups and Units within in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterGroupsAndUnits() + + local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSGroupId, DCSGroup in pairs( CoalitionData ) do + + if DCSGroup:isExist() then + local DCSGroupName = DCSGroup:getName() + + self:E( { "Register Group:", DCSGroup, DCSGroupName } ) + self:AddGroup( DCSGroup, DCSGroupName ) + + for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do + + local DCSUnitName = DCSUnit:getName() + self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) + self:AddUnit( DCSUnit, DCSUnitName ) + end + else + self:E( { "Group does not exist: ", DCSGroup } ) + end + + end + end + + return self +end + +--- Private method that registers all Units of skill Client or Player within in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterClients() + + for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do + self:E( { "Register Client:", ClientName } ) + self:AddClient( ClientName ) + end + + return self +end + +function DATABASE:_RegisterStatics() + + local CoalitionsData = { GroupsRed = coalition.getStaticObjects( coalition.side.RED ), GroupsBlue = coalition.getStaticObjects( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSStaticId, DCSStatic in pairs( CoalitionData ) do + + if DCSStatic:isExist() then + local DCSStaticName = DCSStatic:getName() + + self:E( { "Register Static:", DCSStatic, DCSStaticName } ) + self:AddStatic( DCSStatic, DCSStaticName ) + else + self:E( { "Static does not exist: ", DCSStatic } ) + end + end + end + + return self +end + + +--- Events + +--- Handles the OnBirth event for the alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnBirth( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) + self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) + self:_EventOnPlayerEnterUnit( Event ) + end +end + + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnDeadOrCrash( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + if self.DCSUnits[Event.IniDCSUnitName] then + self:DeleteUnit( Event.IniDCSUnitName ) + -- add logic to correctly remove a group once all units are destroyed... + end + end +end + + +--- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerEnterUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if not self.PLAYERSALIVE[PlayerName] then + self:AddPlayer( Event.IniDCSUnitName, PlayerName ) + end + end +end + + +--- Handles the OnPlayerLeaveUnit event to clean the active players table. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerLeaveUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if self.PLAYERSALIVE[PlayerName] then + self:DeletePlayer( PlayerName ) + end + end +end + +--- Iterators + +--- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. +-- @return #DATABASE self +function DATABASE:ForEach( IteratorFunction, arg, Set ) + self:F2( arg ) + + local function CoRoutine() + local Count = 0 + for ObjectID, Object in pairs( Set ) do + self:T2( Object ) + IteratorFunction( Object, unpack( arg ) ) + Count = Count + 1 + if Count % 10 == 0 then + coroutine.yield( false ) + end + end + return true + end + + local co = coroutine.create( CoRoutine ) + + local function Schedule() + + local status, res = coroutine.resume( co ) + self:T2( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + + return false + end + + local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. +-- @return #DATABASE self +function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.DCSUnits ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.UNITS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. +-- @return #DATABASE self +function DATABASE:ForEachGroup( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.GROUPS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. +-- @return #DATABASE self +function DATABASE:ForEachPlayer( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClient( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClientAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) + + return self +end + + +function DATABASE:_RegisterTemplates() + self:F2() + + self.Navpoints = {} + self.UNITS = {} + --Build routines.db.units and self.Navpoints + for CoalitionName, coa_data in pairs(env.mission.coalition) do + + if (CoalitionName == 'red' or CoalitionName == 'blue') and type(coa_data) == 'table' then + --self.Units[coa_name] = {} + + ---------------------------------------------- + -- build nav points DB + self.Navpoints[CoalitionName] = {} + if coa_data.nav_points then --navpoints + for nav_ind, nav_data in pairs(coa_data.nav_points) do + + if type(nav_data) == 'table' then + self.Navpoints[CoalitionName][nav_ind] = routines.utils.deepCopy(nav_data) + + self.Navpoints[CoalitionName][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. + self.Navpoints[CoalitionName][nav_ind]['point'] = {} -- point is used by SSE, support it. + self.Navpoints[CoalitionName][nav_ind]['point']['x'] = nav_data.x + self.Navpoints[CoalitionName][nav_ind]['point']['y'] = 0 + self.Navpoints[CoalitionName][nav_ind]['point']['z'] = nav_data.y + end + end + end + ------------------------------------------------- + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + + local CountryName = string.upper(cntry_data.name) + --self.Units[coa_name][countryName] = {} + --self.Units[coa_name][countryName]["countryId"] = cntry_data.id + + if type(cntry_data) == 'table' then --just making sure + + for obj_type_name, obj_type_data in pairs(cntry_data) do + + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check + + local CategoryName = obj_type_name + + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + + --self.Units[coa_name][countryName][category] = {} + + for group_num, GroupTemplate in pairs(obj_type_data.group) do + + if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group + self:_RegisterTemplate( + GroupTemplate, + coalition.side[string.upper(CoalitionName)], + _DATABASECategory[string.lower(CategoryName)], + country.id[string.upper(CountryName)] + ) + end --if GroupTemplate and GroupTemplate.units then + end --for group_num, GroupTemplate in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --if type(cntry_data) == 'table' then + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do + + return self +end + + + + +--- This module contains the SET classes. +-- +-- === +-- +-- 1) @{Set#SET_BASE} class, extends @{Base#BASE} +-- ================================================ +-- The @{Set#SET_BASE} class defines the core functions that define a collection of objects. +-- A SET provides iterators to iterate the SET, but will **temporarily** yield the ForEach interator loop at defined **"intervals"** to the mail simulator loop. +-- In this way, large loops can be done while not blocking the simulator main processing loop. +-- The default **"yield interval"** is after 10 objects processed. +-- The default **"time interval"** is after 0.001 seconds. +-- +-- 1.1) Add or remove objects from the SET +-- --------------------------------------- +-- Some key core functions are @{Set#SET_BASE.Add} and @{Set#SET_BASE.Remove} to add or remove objects from the SET in your logic. +-- +-- 1.2) Define the SET iterator **"yield interval"** and the **"time interval"**. +-- ------------------------------------------------------------------------------------- +-- Modify the iterator intervals with the @{Set#SET_BASE.SetInteratorIntervals} method. +-- You can set the **"yield interval"**, and the **"time interval"**. (See above). +-- +-- === +-- +-- 2) @{Set#SET_GROUP} class, extends @{Set#SET_BASE} +-- ==================================================== +-- Mission designers can use the @{Set#SET_GROUP} class to build sets of groups belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Starting with certain prefix strings. +-- +-- 2.1) SET_GROUP construction method: +-- ----------------------------------- +-- Create a new SET_GROUP object with the @{#SET_GROUP.New} method: +-- +-- * @{#SET_GROUP.New}: Creates a new SET_GROUP object. +-- +-- 2.2) Add or Remove GROUP(s) from SET_GROUP: +-- ------------------------------------------- +-- GROUPS can be added and removed using the @{Set#SET_GROUP.AddGroupsByName} and @{Set#SET_GROUP.RemoveGroupsByName} respectively. +-- These methods take a single GROUP name or an array of GROUP names to be added or removed from SET_GROUP. +-- +-- 2.3) SET_GROUP filter criteria: +-- ------------------------------- +-- You can set filter criteria to define the set of groups within the SET_GROUP. +-- Filter criteria are defined by: +-- +-- * @{#SET_GROUP.FilterCoalitions}: Builds the SET_GROUP with the groups belonging to the coalition(s). +-- * @{#SET_GROUP.FilterCategories}: Builds the SET_GROUP with the groups belonging to the category(ies). +-- * @{#SET_GROUP.FilterCountries}: Builds the SET_GROUP with the gruops belonging to the country(ies). +-- * @{#SET_GROUP.FilterPrefixes}: Builds the SET_GROUP with the groups starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_GROUP, you can start filtering using: +-- +-- * @{#SET_GROUP.FilterStart}: Starts the filtering of the groups within the SET_GROUP and add or remove GROUP objects **dynamically**. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_GROUP.FilterZones}: Builds the SET_GROUP with the groups within a @{Zone#ZONE}. +-- +-- 2.4) SET_GROUP iterators: +-- ------------------------- +-- Once the filters have been defined and the SET_GROUP has been built, you can iterate the SET_GROUP with the available iterator methods. +-- The iterator methods will walk the SET_GROUP set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_GROUP: +-- +-- * @{#SET_GROUP.ForEachGroup}: Calls a function for each alive group it finds within the SET_GROUP. +-- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupPartlyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- +-- ==== +-- +-- 3) @{Set#SET_UNIT} class, extends @{Set#SET_BASE} +-- =================================================== +-- Mission designers can use the @{Set#SET_UNIT} class to build sets of units belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Unit types +-- * Starting with certain prefix strings. +-- +-- 3.1) SET_UNIT construction method: +-- ---------------------------------- +-- Create a new SET_UNIT object with the @{#SET_UNIT.New} method: +-- +-- * @{#SET_UNIT.New}: Creates a new SET_UNIT object. +-- +-- 3.2) Add or Remove UNIT(s) from SET_UNIT: +-- ----------------------------------------- +-- UNITs can be added and removed using the @{Set#SET_UNIT.AddUnitsByName} and @{Set#SET_UNIT.RemoveUnitsByName} respectively. +-- These methods take a single UNIT name or an array of UNIT names to be added or removed from SET_UNIT. +-- +-- 3.3) SET_UNIT filter criteria: +-- ------------------------------ +-- You can set filter criteria to define the set of units within the SET_UNIT. +-- Filter criteria are defined by: +-- +-- * @{#SET_UNIT.FilterCoalitions}: Builds the SET_UNIT with the units belonging to the coalition(s). +-- * @{#SET_UNIT.FilterCategories}: Builds the SET_UNIT with the units belonging to the category(ies). +-- * @{#SET_UNIT.FilterTypes}: Builds the SET_UNIT with the units belonging to the unit type(s). +-- * @{#SET_UNIT.FilterCountries}: Builds the SET_UNIT with the units belonging to the country(ies). +-- * @{#SET_UNIT.FilterPrefixes}: Builds the SET_UNIT with the units starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_UNIT, you can start filtering using: +-- +-- * @{#SET_UNIT.FilterStart}: Starts the filtering of the units within the SET_UNIT. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_UNIT.FilterZones}: Builds the SET_UNIT with the units within a @{Zone#ZONE}. +-- +-- 3.4) SET_UNIT iterators: +-- ------------------------ +-- Once the filters have been defined and the SET_UNIT has been built, you can iterate the SET_UNIT with the available iterator methods. +-- The iterator methods will walk the SET_UNIT set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_UNIT: +-- +-- * @{#SET_UNIT.ForEachUnit}: Calls a function for each alive unit it finds within the SET_UNIT. +-- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- +-- Planned iterators methods in development are (so these are not yet available): +-- +-- * @{#SET_UNIT.ForEachUnitInUnit}: Calls a function for each unit contained within the SET_UNIT. +-- * @{#SET_UNIT.ForEachUnitCompletelyInZone}: Iterate and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- * @{#SET_UNIT.ForEachUnitNotInZone}: Iterate and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- +-- 4) @{Set#SET_CLIENT} class, extends @{Set#SET_BASE} +-- =================================================== +-- Mission designers can use the @{Set#SET_CLIENT} class to build sets of units belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Client types +-- * Starting with certain prefix strings. +-- +-- 4.1) SET_CLIENT construction method: +-- ---------------------------------- +-- Create a new SET_CLIENT object with the @{#SET_CLIENT.New} method: +-- +-- * @{#SET_CLIENT.New}: Creates a new SET_CLIENT object. +-- +-- 4.2) Add or Remove CLIENT(s) from SET_CLIENT: +-- ----------------------------------------- +-- CLIENTs can be added and removed using the @{Set#SET_CLIENT.AddClientsByName} and @{Set#SET_CLIENT.RemoveClientsByName} respectively. +-- These methods take a single CLIENT name or an array of CLIENT names to be added or removed from SET_CLIENT. +-- +-- 4.3) SET_CLIENT filter criteria: +-- ------------------------------ +-- You can set filter criteria to define the set of clients within the SET_CLIENT. +-- Filter criteria are defined by: +-- +-- * @{#SET_CLIENT.FilterCoalitions}: Builds the SET_CLIENT with the clients belonging to the coalition(s). +-- * @{#SET_CLIENT.FilterCategories}: Builds the SET_CLIENT with the clients belonging to the category(ies). +-- * @{#SET_CLIENT.FilterTypes}: Builds the SET_CLIENT with the clients belonging to the client type(s). +-- * @{#SET_CLIENT.FilterCountries}: Builds the SET_CLIENT with the clients belonging to the country(ies). +-- * @{#SET_CLIENT.FilterPrefixes}: Builds the SET_CLIENT with the clients starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_CLIENT, you can start filtering using: +-- +-- * @{#SET_CLIENT.FilterStart}: Starts the filtering of the clients within the SET_CLIENT. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_CLIENT.FilterZones}: Builds the SET_CLIENT with the clients within a @{Zone#ZONE}. +-- +-- 4.4) SET_CLIENT iterators: +-- ------------------------ +-- Once the filters have been defined and the SET_CLIENT has been built, you can iterate the SET_CLIENT with the available iterator methods. +-- The iterator methods will walk the SET_CLIENT set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_CLIENT: +-- +-- * @{#SET_CLIENT.ForEachClient}: Calls a function for each alive client it finds within the SET_CLIENT. +-- +-- ==== +-- +-- @module Set +-- @author FlightControl + +--- SET_BASE class +-- @type SET_BASE +-- @extends Base#BASE +SET_BASE = { + ClassName = "SET_BASE", + Set = {}, +} + +--- Creates a new SET_BASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_BASE self +-- @return #SET_BASE +-- @usage +-- -- Define a new SET_BASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. +-- DBObject = SET_BASE:New() +function SET_BASE:New( Database ) + + env.info( tostring( Database ) ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + self.Database = Database + + self.YieldInterval = 10 + self.TimeInterval = 0.001 + + return self +end + +--- Finds an @{Base#BASE} object based on the object Name. +-- @param #SET_BASE self +-- @param #string ObjectName +-- @return Base#BASE The Object found. +function SET_BASE:_Find( ObjectName ) + + local ObjectFound = self.Set[ObjectName] + return ObjectFound +end + + +--- Adds a @{Base#BASE} object in the @{Set#SET_BASE}, using the Object Name as the index. +-- @param #SET_BASE self +-- @param #string ObjectName +-- @param Base#BASE Object +-- @return Base#BASE The added BASE Object. +function SET_BASE:Add( ObjectName, Object ) + + self.Set[ObjectName] = Object +end + +--- Removes a @{Base#BASE} object from the @{Set#SET_BASE} and derived classes, based on the Object Name. +-- @param #SET_BASE self +-- @param #string ObjectName +function SET_BASE:Remove( ObjectName ) + + self.Set[ObjectName] = nil +end + +--- Define the SET iterator **"yield interval"** and the **"time interval"**. +-- @param #SET_BASE self +-- @param #number YieldInterval Sets the frequency when the iterator loop will yield after the number of objects processed. The default frequency is 10 objects processed. +-- @param #number TimeInterval Sets the time in seconds when the main logic will resume the iterator loop. The default time is 0.001 seconds. +-- @return #SET_BASE self +function SET_BASE:SetIteratorIntervals( YieldInterval, TimeInterval ) + + self.YieldInterval = YieldInterval + self.TimeInterval = TimeInterval + + return self +end + + + +--- Starts the filtering for the defined collection. +-- @param #SET_BASE self +-- @return #SET_BASE self +function SET_BASE:_FilterStart() + + for ObjectName, Object in pairs( self.Database ) do + + if self:IsIncludeObject( Object ) then + self:E( { "Adding Object:", ObjectName } ) + self:Add( ObjectName, Object ) + end + end + + _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + + -- Follow alive players and clients +-- _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) +-- _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) + + + return self +end + + + +----- Private method that registers all alive players in the mission. +---- @param #SET_BASE self +---- @return #SET_BASE self +--function SET_BASE:_RegisterPlayers() +-- +-- local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } +-- for CoalitionId, CoalitionData in pairs( CoalitionsData ) do +-- for UnitId, UnitData in pairs( CoalitionData ) do +-- self:T3( { "UnitData:", UnitData } ) +-- if UnitData and UnitData:isExist() then +-- local UnitName = UnitData:getName() +-- if not self.PlayersAlive[UnitName] then +-- self:E( { "Add player for unit:", UnitName, UnitData:getPlayerName() } ) +-- self.PlayersAlive[UnitName] = UnitData:getPlayerName() +-- end +-- end +-- end +-- end +-- +-- return self +--end + +--- Events + +--- Handles the OnBirth event for the Set. +-- @param #SET_BASE self +-- @param Event#EVENTDATA Event +function SET_BASE:_EventOnBirth( Event ) + self:F3( { Event } ) + + if Event.IniDCSUnit then + local ObjectName, Object = self:AddInDatabase( Event ) + self:T3( ObjectName, Object ) + if self:IsIncludeObject( Object ) then + self:Add( ObjectName, Object ) + --self:_EventOnPlayerEnterUnit( Event ) + end + end +end + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #SET_BASE self +-- @param Event#EVENTDATA Event +function SET_BASE:_EventOnDeadOrCrash( Event ) + self:F3( { Event } ) + + if Event.IniDCSUnit then + local ObjectName, Object = self:FindInDatabase( Event ) + if ObjectName and Object then + self:Remove( ObjectName ) + end + end +end + +----- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +---- @param #SET_BASE self +---- @param Event#EVENTDATA Event +--function SET_BASE:_EventOnPlayerEnterUnit( Event ) +-- self:F3( { Event } ) +-- +-- if Event.IniDCSUnit then +-- if self:IsIncludeObject( Event.IniDCSUnit ) then +-- if not self.PlayersAlive[Event.IniDCSUnitName] then +-- self:E( { "Add player for unit:", Event.IniDCSUnitName, Event.IniDCSUnit:getPlayerName() } ) +-- self.PlayersAlive[Event.IniDCSUnitName] = Event.IniDCSUnit:getPlayerName() +-- self.ClientsAlive[Event.IniDCSUnitName] = _DATABASE.Clients[ Event.IniDCSUnitName ] +-- end +-- end +-- end +--end +-- +----- Handles the OnPlayerLeaveUnit event to clean the active players table. +---- @param #SET_BASE self +---- @param Event#EVENTDATA Event +--function SET_BASE:_EventOnPlayerLeaveUnit( Event ) +-- self:F3( { Event } ) +-- +-- if Event.IniDCSUnit then +-- if self:IsIncludeObject( Event.IniDCSUnit ) then +-- if self.PlayersAlive[Event.IniDCSUnitName] then +-- self:E( { "Cleaning player for unit:", Event.IniDCSUnitName, Event.IniDCSUnit:getPlayerName() } ) +-- self.PlayersAlive[Event.IniDCSUnitName] = nil +-- self.ClientsAlive[Event.IniDCSUnitName] = nil +-- end +-- end +-- end +--end + +-- Iterators + +--- Iterate the SET_BASE and derived classes and call an iterator function for the given SET_BASE, providing the Object for each element within the set and optional parameters. +-- @param #SET_BASE self +-- @param #function IteratorFunction The function that will be called. +-- @return #SET_BASE self +function SET_BASE:ForEach( IteratorFunction, arg, Set, Function, FunctionArguments ) + self:F3( arg ) + + local function CoRoutine() + local Count = 0 + for ObjectID, Object in pairs( Set ) do + self:T2( Object ) + if Function then + if Function( unpack( FunctionArguments ), Object ) == true then + IteratorFunction( Object, unpack( arg ) ) + end + else + IteratorFunction( Object, unpack( arg ) ) + end + Count = Count + 1 + if Count % self.YieldInterval == 0 then + coroutine.yield( false ) + end + end + return true + end + + local co = coroutine.create( CoRoutine ) + + local function Schedule() + + local status, res = coroutine.resume( co ) + self:T3( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + + return false + end + + local Scheduler = SCHEDULER:New( self, Schedule, {}, self.TimeInterval, self.TimeInterval, 0 ) + + return self +end + + +----- Interate the SET_BASE and call an interator function for each **alive** unit, providing the Unit and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive unit in the SET_BASE. The function needs to accept a UNIT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachDCSUnitAlive( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.DCSUnitsAlive ) +-- +-- return self +--end +-- +----- Interate the SET_BASE and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a UNIT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachPlayer( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Interate the SET_BASE and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a CLIENT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachClient( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- Decides whether to include the Object +-- @param #SET_BASE self +-- @param #table Object +-- @return #SET_BASE self +function SET_BASE:IsIncludeObject( Object ) + self:F3( Object ) + + return true +end + +--- Flushes the current SET_BASE contents in the log ... (for debug reasons). +-- @param #SET_BASE self +-- @return #string A string with the names of the objects. +function SET_BASE:Flush() + self:F3() + + local ObjectNames = "" + for ObjectName, Object in pairs( self.Set ) do + ObjectNames = ObjectNames .. ObjectName .. ", " + end + self:T( { "Objects in Set:", ObjectNames } ) + + return ObjectNames +end + +-- SET_GROUP + +--- SET_GROUP class +-- @type SET_GROUP +-- @extends Set#SET_BASE +SET_GROUP = { + ClassName = "SET_GROUP", + Filter = { + Coalitions = nil, + Categories = nil, + Countries = nil, + GroupPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Group.Category.AIRPLANE, + helicopter = Group.Category.HELICOPTER, + ground = Group.Category.GROUND_UNIT, + ship = Group.Category.SHIP, + structure = Group.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_GROUP object, building a set of groups belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_GROUP self +-- @return #SET_GROUP +-- @usage +-- -- Define a new SET_GROUP Object. This DBObject will contain a reference to all alive GROUPS. +-- DBObject = SET_GROUP:New() +function SET_GROUP:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.GROUPS ) ) + + return self +end + +--- Add GROUP(s) to SET_GROUP. +-- @param Set#SET_GROUP self +-- @param #string AddGroupNames A single name or an array of GROUP names. +-- @return self +function SET_GROUP:AddGroupsByName( AddGroupNames ) + + local AddGroupNamesArray = ( type( AddGroupNames ) == "table" ) and AddGroupNames or { AddGroupNames } + + for AddGroupID, AddGroupName in pairs( AddGroupNamesArray ) do + self:Add( AddGroupName, GROUP:FindByName( AddGroupName ) ) + end + + return self +end + +--- Remove GROUP(s) from SET_GROUP. +-- @param Set#SET_GROUP self +-- @param Group#GROUP RemoveGroupNames A single name or an array of GROUP names. +-- @return self +function SET_GROUP:RemoveGroupsByName( RemoveGroupNames ) + + local RemoveGroupNamesArray = ( type( RemoveGroupNames ) == "table" ) and RemoveGroupNames or { RemoveGroupNames } + + for RemoveGroupID, RemoveGroupName in pairs( RemoveGroupNamesArray ) do + self:Remove( RemoveGroupName.GroupName ) + end + + return self +end + + + + +--- Finds a Group based on the Group Name. +-- @param #SET_GROUP self +-- @param #string GroupName +-- @return Group#GROUP The found Group. +function SET_GROUP:FindGroup( GroupName ) + + local GroupFound = self.Set[GroupName] + return GroupFound +end + + + +--- Builds a set of groups of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_GROUP self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_GROUP self +function SET_GROUP:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of groups out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_GROUP self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_GROUP self +function SET_GROUP:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + +--- Builds a set of groups of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_GROUP self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_GROUP self +function SET_GROUP:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of groups of defined GROUP prefixes. +-- All the groups starting with the given prefixes will be included within the set. +-- @param #SET_GROUP self +-- @param #string Prefixes The prefix of which the group name starts with. +-- @return #SET_GROUP self +function SET_GROUP:FilterPrefixes( Prefixes ) + if not self.Filter.GroupPrefixes then + self.Filter.GroupPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.GroupPrefixes[Prefix] = Prefix + end + return self +end + + +--- Starts the filtering. +-- @param #SET_GROUP self +-- @return #SET_GROUP self +function SET_GROUP:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_GROUP self +-- @param Event#EVENTDATA Event +-- @return #string The name of the GROUP +-- @return #table The GROUP +function SET_GROUP:AddInDatabase( Event ) + self:F3( { Event } ) + + if not self.Database[Event.IniDCSGroupName] then + self.Database[Event.IniDCSGroupName] = GROUP:Register( Event.IniDCSGroupName ) + self:T3( self.Database[Event.IniDCSGroupName] ) + end + + return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_GROUP self +-- @param Event#EVENTDATA Event +-- @return #string The name of the GROUP +-- @return #table The GROUP +function SET_GROUP:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. +-- @param #SET_GROUP self +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroup( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupCompletelyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsCompletelyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupPartlyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsPartlyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + + +----- Interate the SET_GROUP and call an interator function for each **alive** player, providing the Group of the player and optional parameters. +---- @param #SET_GROUP self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a GROUP parameter. +---- @return #SET_GROUP self +--function SET_GROUP:ForEachPlayer( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Interate the SET_GROUP and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_GROUP self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a CLIENT parameter. +---- @return #SET_GROUP self +--function SET_GROUP:ForEachClient( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- +-- @param #SET_GROUP self +-- @param Group#GROUP MooseGroup +-- @return #SET_GROUP self +function SET_GROUP:IsIncludeObject( MooseGroup ) + self:F2( MooseGroup ) + local MooseGroupInclude = true + + if self.Filter.Coalitions then + local MooseGroupCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + self:T3( { "Coalition:", MooseGroup:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MooseGroup:GetCoalition() then + MooseGroupCoalition = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCoalition + end + + if self.Filter.Categories then + local MooseGroupCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + self:T3( { "Category:", MooseGroup:GetCategory(), self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MooseGroup:GetCategory() then + MooseGroupCategory = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCategory + end + + if self.Filter.Countries then + local MooseGroupCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + self:T3( { "Country:", MooseGroup:GetCountry(), CountryName } ) + if country.id[CountryName] == MooseGroup:GetCountry() then + MooseGroupCountry = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCountry + end + + if self.Filter.GroupPrefixes then + local MooseGroupPrefix = false + for GroupPrefixId, GroupPrefix in pairs( self.Filter.GroupPrefixes ) do + self:T3( { "Prefix:", string.find( MooseGroup:GetName(), GroupPrefix, 1 ), GroupPrefix } ) + if string.find( MooseGroup:GetName(), GroupPrefix, 1 ) then + MooseGroupPrefix = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupPrefix + end + + self:T2( MooseGroupInclude ) + return MooseGroupInclude +end + +--- SET_UNIT class +-- @type SET_UNIT +-- @extends Set#SET_BASE +SET_UNIT = { + ClassName = "SET_UNIT", + Units = {}, + Filter = { + Coalitions = nil, + Categories = nil, + Types = nil, + Countries = nil, + UnitPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Unit.Category.AIRPLANE, + helicopter = Unit.Category.HELICOPTER, + ground = Unit.Category.GROUND_UNIT, + ship = Unit.Category.SHIP, + structure = Unit.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_UNIT object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_UNIT self +-- @return #SET_UNIT +-- @usage +-- -- Define a new SET_UNIT Object. This DBObject will contain a reference to all alive Units. +-- DBObject = SET_UNIT:New() +function SET_UNIT:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.UNITS ) ) + + return self +end + +--- Add UNIT(s) to SET_UNIT. +-- @param Set#SET_UNIT self +-- @param #string AddUnitNames A single name or an array of UNIT names. +-- @return self +function SET_UNIT:AddUnitsByName( AddUnitNames ) + + local AddUnitNamesArray = ( type( AddUnitNames ) == "table" ) and AddUnitNames or { AddUnitNames } + + for AddUnitID, AddUnitName in pairs( AddUnitNamesArray ) do + self:Add( AddUnitName, UNIT:FindByName( AddUnitName ) ) + end + + return self +end + +--- Remove UNIT(s) from SET_UNIT. +-- @param Set#SET_UNIT self +-- @param Unit#UNIT RemoveUnitNames A single name or an array of UNIT names. +-- @return self +function SET_UNIT:RemoveUnitsByName( RemoveUnitNames ) + + local RemoveUnitNamesArray = ( type( RemoveUnitNames ) == "table" ) and RemoveUnitNames or { RemoveUnitNames } + + for RemoveUnitID, RemoveUnitName in pairs( RemoveUnitNamesArray ) do + self:Remove( RemoveUnitName.UnitName ) + end + + return self +end + + +--- Finds a Unit based on the Unit Name. +-- @param #SET_UNIT self +-- @param #string UnitName +-- @return Unit#UNIT The found Unit. +function SET_UNIT:FindUnit( UnitName ) + + local UnitFound = self.Set[UnitName] + return UnitFound +end + + + +--- Builds a set of units of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_UNIT self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_UNIT self +function SET_UNIT:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of units out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_UNIT self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_UNIT self +function SET_UNIT:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + + +--- Builds a set of units of defined unit types. +-- Possible current types are those types known within DCS world. +-- @param #SET_UNIT self +-- @param #string Types Can take those type strings known within DCS world. +-- @return #SET_UNIT self +function SET_UNIT:FilterTypes( Types ) + if not self.Filter.Types then + self.Filter.Types = {} + end + if type( Types ) ~= "table" then + Types = { Types } + end + for TypeID, Type in pairs( Types ) do + self.Filter.Types[Type] = Type + end + return self +end + + +--- Builds a set of units of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_UNIT self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_UNIT self +function SET_UNIT:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of units of defined unit prefixes. +-- All the units starting with the given prefixes will be included within the set. +-- @param #SET_UNIT self +-- @param #string Prefixes The prefix of which the unit name starts with. +-- @return #SET_UNIT self +function SET_UNIT:FilterPrefixes( Prefixes ) + if not self.Filter.UnitPrefixes then + self.Filter.UnitPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.UnitPrefixes[Prefix] = Prefix + end + return self +end + + + + +--- Starts the filtering. +-- @param #SET_UNIT self +-- @return #SET_UNIT self +function SET_UNIT:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_UNIT self +-- @param Event#EVENTDATA Event +-- @return #string The name of the UNIT +-- @return #table The UNIT +function SET_UNIT:AddInDatabase( Event ) + self:F3( { Event } ) + + if not self.Database[Event.IniDCSUnitName] then + self.Database[Event.IniDCSUnitName] = UNIT:Register( Event.IniDCSUnitName ) + self:T3( self.Database[Event.IniDCSUnitName] ) + end + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_UNIT self +-- @param Event#EVENTDATA Event +-- @return #string The name of the UNIT +-- @return #table The UNIT +function SET_UNIT:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Interate the SET_UNIT and call an interator function for each **alive** UNIT, providing the UNIT and optional parameters. +-- @param #SET_UNIT self +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- @param #SET_UNIT self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnitCompletelyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Unit#UNIT UnitObject + function( ZoneObject, UnitObject ) + if UnitObject:IsCompletelyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- @param #SET_UNIT self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnitNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Unit#UNIT UnitObject + function( ZoneObject, UnitObject ) + if UnitObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + + + +----- Interate the SET_UNIT and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. +---- @param #SET_UNIT self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a UNIT parameter. +---- @return #SET_UNIT self +--function SET_UNIT:ForEachPlayer( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Interate the SET_UNIT and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_UNIT self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a CLIENT parameter. +---- @return #SET_UNIT self +--function SET_UNIT:ForEachClient( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- +-- @param #SET_UNIT self +-- @param Unit#UNIT MUnit +-- @return #SET_UNIT self +function SET_UNIT:IsIncludeObject( MUnit ) + self:F2( MUnit ) + local MUnitInclude = true + + if self.Filter.Coalitions then + local MUnitCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + self:T3( { "Coalition:", MUnit:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MUnit:GetCoalition() then + MUnitCoalition = true + end + end + MUnitInclude = MUnitInclude and MUnitCoalition + end + + if self.Filter.Categories then + local MUnitCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + self:T3( { "Category:", MUnit:GetDesc().category, self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MUnit:GetDesc().category then + MUnitCategory = true + end + end + MUnitInclude = MUnitInclude and MUnitCategory + end + + if self.Filter.Types then + local MUnitType = false + for TypeID, TypeName in pairs( self.Filter.Types ) do + self:T3( { "Type:", MUnit:GetTypeName(), TypeName } ) + if TypeName == MUnit:GetTypeName() then + MUnitType = true + end + end + MUnitInclude = MUnitInclude and MUnitType + end + + if self.Filter.Countries then + local MUnitCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + self:T3( { "Country:", MUnit:GetCountry(), CountryName } ) + if country.id[CountryName] == MUnit:GetCountry() then + MUnitCountry = true + end + end + MUnitInclude = MUnitInclude and MUnitCountry + end + + if self.Filter.UnitPrefixes then + local MUnitPrefix = false + for UnitPrefixId, UnitPrefix in pairs( self.Filter.UnitPrefixes ) do + self:T3( { "Prefix:", string.find( MUnit:GetName(), UnitPrefix, 1 ), UnitPrefix } ) + if string.find( MUnit:GetName(), UnitPrefix, 1 ) then + MUnitPrefix = true + end + end + MUnitInclude = MUnitInclude and MUnitPrefix + end + + self:T2( MUnitInclude ) + return MUnitInclude +end + + +--- SET_CLIENT + +--- SET_CLIENT class +-- @type SET_CLIENT +-- @extends Set#SET_BASE +SET_CLIENT = { + ClassName = "SET_CLIENT", + Clients = {}, + Filter = { + Coalitions = nil, + Categories = nil, + Types = nil, + Countries = nil, + ClientPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Unit.Category.AIRPLANE, + helicopter = Unit.Category.HELICOPTER, + ground = Unit.Category.GROUND_UNIT, + ship = Unit.Category.SHIP, + structure = Unit.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_CLIENT object, building a set of clients belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_CLIENT self +-- @return #SET_CLIENT +-- @usage +-- -- Define a new SET_CLIENT Object. This DBObject will contain a reference to all Clients. +-- DBObject = SET_CLIENT:New() +function SET_CLIENT:New() + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.CLIENTS ) ) + + return self +end + +--- Add CLIENT(s) to SET_CLIENT. +-- @param Set#SET_CLIENT self +-- @param #string AddClientNames A single name or an array of CLIENT names. +-- @return self +function SET_CLIENT:AddClientsByName( AddClientNames ) + + local AddClientNamesArray = ( type( AddClientNames ) == "table" ) and AddClientNames or { AddClientNames } + + for AddClientID, AddClientName in pairs( AddClientNamesArray ) do + self:Add( AddClientName, CLIENT:FindByName( AddClientName ) ) + end + + return self +end + +--- Remove CLIENT(s) from SET_CLIENT. +-- @param Set#SET_CLIENT self +-- @param Client#CLIENT RemoveClientNames A single name or an array of CLIENT names. +-- @return self +function SET_CLIENT:RemoveClientsByName( RemoveClientNames ) + + local RemoveClientNamesArray = ( type( RemoveClientNames ) == "table" ) and RemoveClientNames or { RemoveClientNames } + + for RemoveClientID, RemoveClientName in pairs( RemoveClientNamesArray ) do + self:Remove( RemoveClientName.ClientName ) + end + + return self +end + + +--- Finds a Client based on the Client Name. +-- @param #SET_CLIENT self +-- @param #string ClientName +-- @return Client#CLIENT The found Client. +function SET_CLIENT:FindClient( ClientName ) + + local ClientFound = self.Set[ClientName] + return ClientFound +end + + + +--- Builds a set of clients of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_CLIENT self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of clients out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_CLIENT self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + + +--- Builds a set of clients of defined client types. +-- Possible current types are those types known within DCS world. +-- @param #SET_CLIENT self +-- @param #string Types Can take those type strings known within DCS world. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterTypes( Types ) + if not self.Filter.Types then + self.Filter.Types = {} + end + if type( Types ) ~= "table" then + Types = { Types } + end + for TypeID, Type in pairs( Types ) do + self.Filter.Types[Type] = Type + end + return self +end + + +--- Builds a set of clients of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_CLIENT self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of clients of defined client prefixes. +-- All the clients starting with the given prefixes will be included within the set. +-- @param #SET_CLIENT self +-- @param #string Prefixes The prefix of which the client name starts with. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterPrefixes( Prefixes ) + if not self.Filter.ClientPrefixes then + self.Filter.ClientPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.ClientPrefixes[Prefix] = Prefix + end + return self +end + + + + +--- Starts the filtering. +-- @param #SET_CLIENT self +-- @return #SET_CLIENT self +function SET_CLIENT:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_CLIENT self +-- @param Event#EVENTDATA Event +-- @return #string The name of the CLIENT +-- @return #table The CLIENT +function SET_CLIENT:AddInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_CLIENT self +-- @param Event#EVENTDATA Event +-- @return #string The name of the CLIENT +-- @return #table The CLIENT +function SET_CLIENT:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Interate the SET_CLIENT and call an interator function for each **alive** CLIENT, providing the CLIENT and optional parameters. +-- @param #SET_CLIENT self +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClient( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence completely in a @{Zone}, providing the CLIENT and optional parameters to the called function. +-- @param #SET_CLIENT self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClientCompletelyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Client#CLIENT ClientObject + function( ZoneObject, ClientObject ) + if ClientObject:IsCompletelyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence not in a @{Zone}, providing the CLIENT and optional parameters to the called function. +-- @param #SET_CLIENT self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClientNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Client#CLIENT ClientObject + function( ZoneObject, ClientObject ) + if ClientObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- +-- @param #SET_CLIENT self +-- @param Client#CLIENT MClient +-- @return #SET_CLIENT self +function SET_CLIENT:IsIncludeObject( MClient ) + self:F2( MClient ) + + local MClientInclude = true + + if MClient then + local MClientName = MClient.UnitName + + if self.Filter.Coalitions then + local MClientCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + local ClientCoalitionID = _DATABASE:GetCoalitionFromClientTemplate( MClientName ) + self:T3( { "Coalition:", ClientCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionID then + MClientCoalition = true + end + end + self:T( { "Evaluated Coalition", MClientCoalition } ) + MClientInclude = MClientInclude and MClientCoalition + end + + if self.Filter.Categories then + local MClientCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + local ClientCategoryID = _DATABASE:GetCategoryFromClientTemplate( MClientName ) + self:T3( { "Category:", ClientCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == ClientCategoryID then + MClientCategory = true + end + end + self:T( { "Evaluated Category", MClientCategory } ) + MClientInclude = MClientInclude and MClientCategory + end + + if self.Filter.Types then + local MClientType = false + for TypeID, TypeName in pairs( self.Filter.Types ) do + self:T3( { "Type:", MClient:GetTypeName(), TypeName } ) + if TypeName == MClient:GetTypeName() then + MClientType = true + end + end + self:T( { "Evaluated Type", MClientType } ) + MClientInclude = MClientInclude and MClientType + end + + if self.Filter.Countries then + local MClientCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + local ClientCountryID = _DATABASE:GetCountryFromClientTemplate(MClientName) + self:T3( { "Country:", ClientCountryID, country.id[CountryName], CountryName } ) + if country.id[CountryName] and country.id[CountryName] == ClientCountryID then + MClientCountry = true + end + end + self:T( { "Evaluated Country", MClientCountry } ) + MClientInclude = MClientInclude and MClientCountry + end + + if self.Filter.ClientPrefixes then + local MClientPrefix = false + for ClientPrefixId, ClientPrefix in pairs( self.Filter.ClientPrefixes ) do + self:T3( { "Prefix:", string.find( MClient.UnitName, ClientPrefix, 1 ), ClientPrefix } ) + if string.find( MClient.UnitName, ClientPrefix, 1 ) then + MClientPrefix = true + end + end + self:T( { "Evaluated Prefix", MClientPrefix } ) + MClientInclude = MClientInclude and MClientPrefix + end + end + + self:T2( MClientInclude ) + return MClientInclude +end + +--- This module contains the POINT classes. +-- +-- 1) @{Point#POINT_VEC3} class, extends @{Base#BASE} +-- =============================================== +-- The @{Point#POINT_VEC3} class defines a 3D point in the simulator. +-- +-- 1.1) POINT_VEC3 constructor +-- --------------------------- +-- +-- A new POINT instance can be created with: +-- +-- * @{#POINT_VEC3.New}(): a 3D point. +-- +-- 2) @{Point#POINT_VEC2} class, extends @{Point#POINT_VEC3} +-- ========================================================= +-- The @{Point#POINT_VEC2} class defines a 2D point in the simulator. The height coordinate (if needed) will be the land height + an optional added height specified. +-- +-- 2.1) POINT_VEC2 constructor +-- --------------------------- +-- +-- A new POINT instance can be created with: +-- +-- * @{#POINT_VEC2.New}(): a 2D point. +-- +-- @module Point +-- @author FlightControl + +--- The POINT_VEC3 class +-- @type POINT_VEC3 +-- @extends Base#BASE +-- @field #POINT_VEC3.SmokeColor SmokeColor +-- @field #POINT_VEC3.FlareColor FlareColor +POINT_VEC3 = { + ClassName = "POINT_VEC3", + SmokeColor = { + Green = trigger.smokeColor.Green, + Red = trigger.smokeColor.Red, + White = trigger.smokeColor.White, + Orange = trigger.smokeColor.Orange, + Blue = trigger.smokeColor.Blue + }, + FlareColor = { + Green = trigger.flareColor.Green, + Red = trigger.flareColor.Red, + White = trigger.flareColor.White, + Yellow = trigger.flareColor.Yellow + }, + } + +--- SmokeColor +-- @type POINT_VEC3.SmokeColor +-- @field Green +-- @field Red +-- @field White +-- @field Orange +-- @field Blue + +--- FlareColor +-- @type POINT_VEC3.FlareColor +-- @field Green +-- @field Red +-- @field White +-- @field Yellow + +-- Constructor. + +--- Create a new POINT_VEC3 object. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. +-- @param DCSTypes#Distance y The y coordinate of the Vec3 point, pointing Upwards. +-- @param DCSTypes#Distance z The z coordinate of the Vec3 point, pointing to the Right. +-- @return Point#POINT_VEC3 +function POINT_VEC3:New( x, y, z ) + + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { x, y, z } ) + self.PointVec3 = { x = x, y = y, z = z } + return self +end + +--- Smokes the point in a color. +-- @param #POINT_VEC3 self +-- @param Point#POINT_VEC3.SmokeColor SmokeColor +function POINT_VEC3:Smoke( SmokeColor ) + self:F2( { SmokeColor, self.PointVec3 } ) + trigger.action.smoke( self.PointVec3, SmokeColor ) +end + +--- Smoke the POINT_VEC3 Green. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeGreen() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Green ) +end + +--- Smoke the POINT_VEC3 Red. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeRed() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Red ) +end + +--- Smoke the POINT_VEC3 White. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeWhite() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.White ) +end + +--- Smoke the POINT_VEC3 Orange. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeOrange() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Orange ) +end + +--- Smoke the POINT_VEC3 Blue. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeBlue() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Blue ) +end + +--- Flares the point in a color. +-- @param #POINT_VEC3 self +-- @param Point#POINT_VEC3.FlareColor +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:Flare( FlareColor, Azimuth ) + self:F2( { FlareColor, self.PointVec3 } ) + trigger.action.signalFlare( self.PointVec3, FlareColor, Azimuth and Azimuth or 0 ) +end + +--- Flare the POINT_VEC3 White. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:FlareWhite( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.White, Azimuth ) +end + +--- Flare the POINT_VEC3 Yellow. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:FlareYellow( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.Yellow, Azimuth ) +end + +--- Flare the POINT_VEC3 Green. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:FlareGreen( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.Green, Azimuth ) +end + +--- Flare the POINT_VEC3 Red. +-- @param #POINT_VEC3 self +function POINT_VEC3:FlareRed( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.Red, Azimuth ) +end + + +--- The POINT_VEC2 class +-- @type POINT_VEC2 +-- @extends Point#POINT_VEC3 +POINT_VEC2 = { + ClassName = "POINT_VEC2", + } + +--- Create a new POINT_VEC2 object. +-- @param #POINT_VEC2 self +-- @param DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. +-- @param DCSTypes#Distance y The y coordinate of the Vec3 point, pointing to the Right. +-- @param DCSTypes#Distance LandHeightAdd (optional) The default height if required to be evaluated will be the land height of the x, y coordinate. You can specify an extra height to be added to the land height. +-- @return Point#POINT_VEC2 +function POINT_VEC2:New( x, y, LandHeightAdd ) + + local LandHeight = land.getHeight( { ["x"] = x, ["y"] = y } ) + if LandHeightAdd then + LandHeight = LandHeight + LandHeightAdd + end + + local self = BASE:Inherit( self, POINT_VEC3:New( x, LandHeight, y ) ) + self:F2( { x, y, LandHeightAdd } ) + + return self +end + + +--- The main include file for the MOOSE system. + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Scheduler" ) +Include.File( "Event" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Unit" ) +Include.File( "Zone" ) +Include.File( "Client" ) +Include.File( "Static" ) +Include.File( "Database" ) +Include.File( "Set" ) +Include.File( "Point" ) Include.File( "Moose" ) +Include.File( "Scoring" ) +Include.File( "Cargo" ) +Include.File( "Message" ) +Include.File( "Stage" ) +Include.File( "Task" ) +Include.File( "GoHomeTask" ) +Include.File( "DestroyBaseTask" ) +Include.File( "DestroyGroupsTask" ) +Include.File( "DestroyRadarsTask" ) +Include.File( "DestroyUnitTypesTask" ) +Include.File( "PickupTask" ) +Include.File( "DeployTask" ) +Include.File( "NoTask" ) +Include.File( "RouteTask" ) +Include.File( "Mission" ) +Include.File( "CleanUp" ) +Include.File( "Spawn" ) +Include.File( "Movement" ) +Include.File( "Sead" ) +Include.File( "Escort" ) +Include.File( "MissileTrainer" ) +Include.File( "AIBalancer" ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-- The order of the declarations is important here. Don't touch it. + +--- Declare the event dispatcher based on the EVENT class +_EVENTDISPATCHER = EVENT:New() -- #EVENT + +--- Declare the main database object, which is used internally by the MOOSE classes. +_DATABASE = DATABASE:New() -- Database#DATABASE + +--- Scoring system for MOOSE. +-- This scoring class calculates the hits and kills that players make within a simulation session. +-- Scoring is calculated using a defined algorithm. +-- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded +-- to a database or a BI tool to publish the scoring results to the player community. +-- @module Scoring +-- @author FlightControl + + +--- The Scoring class +-- @type SCORING +-- @field Players A collection of the current players that have joined the game. +-- @extends Base#BASE +SCORING = { + ClassName = "SCORING", + ClassID = 0, + Players = {}, +} + +local _SCORINGCoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _SCORINGCategory = + { + [Unit.Category.AIRPLANE] = "Plane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Vehicle", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + +--- Creates a new SCORING object to administer the scoring achieved by players. +-- @param #SCORING self +-- @param #string GameName The name of the game. This name is also logged in the CSV score file. +-- @return #SCORING self +-- @usage +-- -- Define a new scoring object for the mission Gori Valley. +-- ScoringObject = SCORING:New( "Gori Valley" ) +function SCORING:New( GameName ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + if GameName then + self.GameName = GameName + else + error( "A game name must be given to register the scoring results" ) + end + + + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) + + --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) + self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) + + self:ScoreMenu() + + return self + +end + +--- Creates a score radio menu. Can be accessed using Radio -> F10. +-- @param #SCORING self +-- @return #SCORING self +function SCORING:ScoreMenu() + self.Menu = SUBMENU:New( 'Scoring' ) + self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) + --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) + return self +end + +--- Follows new players entering Clients within the DCSRTE. +-- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... +function SCORING:_FollowPlayersScheduled() + self:F3( "_FollowPlayersScheduled" ) + + local ClientUnit = 0 + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } + local unitId + local unitData + local AlivePlayerUnits = {} + + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "_FollowPlayersScheduled", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:_AddPlayerFromUnit( UnitData ) + end + end + + return true +end + + +--- Track DEAD or CRASH events for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnDeadOrCrash( Event ) + self:F( { Event } ) + + local TargetUnit = nil + local TargetGroup = nil + local TargetUnitName = "" + local TargetGroupName = "" + local TargetPlayerName = "" + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + TargetUnit = Event.IniDCSUnit + TargetUnitName = Event.IniDCSUnitName + TargetGroup = Event.IniDCSGroup + TargetGroupName = Event.IniDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category -- Workaround + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) + end + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Something got killed" ) + + -- Some variables + local InitUnitName = PlayerData.UnitName + local InitUnitType = PlayerData.UnitType + local InitCoalition = PlayerData.UnitCoalition + local InitCategory = PlayerData.UnitCategory + local InitUnitCoalition = _SCORINGCoalition[InitCoalition] + local InitUnitCategory = _SCORINGCategory[InitCategory] + + self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) + + -- What is he hitting? + if TargetCategory then + if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? + if not PlayerData.Kill[TargetCategory] then + PlayerData.Kill[TargetCategory] = {} + end + if not PlayerData.Kill[TargetCategory][TargetType] then + PlayerData.Kill[TargetCategory][TargetType] = {} + PlayerData.Kill[TargetCategory][TargetType].Score = 0 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 + PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 + end + + if InitCoalition == TargetCoalition then + PlayerData.Penalty = PlayerData.Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + 5 ):ToAll() + self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + PlayerData.Score = PlayerData.Score + 10 + PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + 5 ):ToAll() + self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + end + end +end + + + +--- Add a new player entering a Unit. +function SCORING:_AddPlayerFromUnit( UnitData ) + self:F( UnitData ) + + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + local UnitDesc = UnitData:getDesc() + local UnitCategory = UnitDesc.category + local UnitCoalition = UnitData:getCoalition() + local UnitTypeName = UnitData:getTypeName() + + self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) + + if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... + self.Players[PlayerName] = {} + self.Players[PlayerName].Hit = {} + self.Players[PlayerName].Kill = {} + self.Players[PlayerName].Mission = {} + + -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do + -- self.Players[PlayerName].Hit[CategoryID] = {} + -- self.Players[PlayerName].Kill[CategoryID] = {} + -- end + self.Players[PlayerName].HitPlayers = {} + self.Players[PlayerName].HitUnits = {} + self.Players[PlayerName].Score = 0 + self.Players[PlayerName].Penalty = 0 + self.Players[PlayerName].PenaltyCoalition = 0 + self.Players[PlayerName].PenaltyWarning = 0 + end + + if not self.Players[PlayerName].UnitCoalition then + self.Players[PlayerName].UnitCoalition = UnitCoalition + else + if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then + self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 + self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. + "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", + 2 + ):ToAll() + self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, + UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) + end + end + self.Players[PlayerName].UnitName = UnitName + self.Players[PlayerName].UnitCoalition = UnitCoalition + self.Players[PlayerName].UnitCategory = UnitCategory + self.Players[PlayerName].UnitType = UnitTypeName + + if self.Players[PlayerName].Penalty > 100 then + if self.Players[PlayerName].PenaltyWarning < 1 then + MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, + 30 + ):ToAll() + self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 + end + end + + if self.Players[PlayerName].Penalty > 150 then + ClientGroup = GROUP:NewFromDCSUnit( UnitData ) + ClientGroup:Destroy() + MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", + 10 + ):ToAll() + end + + end +end + + +--- Registers Scores the players completing a Mission Task. +function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) + self:F( { PlayerUnit, MissionName, Score } ) + + local PlayerName = PlayerUnit:getPlayerName() + + if not self.Players[PlayerName].Mission[MissionName] then + self.Players[PlayerName].Mission[MissionName] = {} + self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 + self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 + end + + self:T( PlayerName ) + self:T( self.Players[PlayerName].Mission[MissionName] ) + + self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score + self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score + + MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + 20 ):ToAll() + + self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) +end + + +--- Registers Mission Scores for possible multiple players that contributed in the Mission. +function SCORING:_AddMissionScore( MissionName, Score ) + self:F( { MissionName, Score } ) + + for PlayerName, PlayerData in pairs( self.Players ) do + + if PlayerData.Mission[MissionName] then + PlayerData.Score = PlayerData.Score + Score + PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score + MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + 20 ):ToAll() + self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) + end + end +end + +--- Handles the OnHit event for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnHit( Event ) + self:F( { Event } ) + + local InitUnit = nil + local InitUnitName = "" + local InitGroup = nil + local InitGroupName = "" + local InitPlayerName = nil + + local InitCoalition = nil + local InitCategory = nil + local InitType = nil + local InitUnitCoalition = nil + local InitUnitCategory = nil + local InitUnitType = nil + + local TargetUnit = nil + local TargetUnitName = "" + local TargetGroup = nil + local TargetGroupName = "" + local TargetPlayerName = "" + + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + InitUnit = Event.IniDCSUnit + InitUnitName = Event.IniDCSUnitName + InitGroup = Event.IniDCSGroup + InitGroupName = Event.IniDCSGroupName + InitPlayerName = InitUnit:getPlayerName() + + InitCoalition = InitUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --InitCategory = InitUnit:getCategory() + InitCategory = InitUnit:getDesc().category + InitType = InitUnit:getTypeName() + + InitUnitCoalition = _SCORINGCoalition[InitCoalition] + InitUnitCategory = _SCORINGCategory[InitCategory] + InitUnitType = InitType + + self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) + end + + + if Event.TgtDCSUnit then + + TargetUnit = Event.TgtDCSUnit + TargetUnitName = Event.TgtDCSUnitName + TargetGroup = Event.TgtDCSGroup + TargetGroupName = Event.TgtDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) + end + + if InitPlayerName ~= nil then -- It is a player that is hitting something + self:_AddPlayerFromUnit( InitUnit ) + if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + self:_AddPlayerFromUnit( TargetUnit ) + self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 + end + + self:T( "Hitting Something" ) + -- What is he hitting? + if TargetCategory then + if not self.Players[InitPlayerName].Hit[TargetCategory] then + self.Players[InitPlayerName].Hit[TargetCategory] = {} + end + if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 + end + local Score = 0 + if InitCoalition == TargetCoalition then + self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + 2 + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + 2 + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + elseif InitPlayerName == nil then -- It is an AI hitting a player??? + + end +end + + +function SCORING:ReportScoreAll() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = ":\n" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() +end + + +function SCORING:ReportScorePlayer() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = "" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() + +end + + +function SCORING:SecondsToClock(sSeconds) + local nSeconds = sSeconds + if nSeconds == 0 then + --return nil; + return "00:00:00"; + else + nHours = string.format("%02.f", math.floor(nSeconds/3600)); + nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); + nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); + return nHours..":"..nMins..":"..nSecs + end +end + +--- Opens a score CSV file to log the scores. +-- @param #SCORING self +-- @param #string ScoringCSV +-- @return #SCORING self +-- @usage +-- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". +-- ScoringObject = SCORING:New( "Gori Valley" ) +-- ScoringObject:OpenCSV( "Player Scores" ) +function SCORING:OpenCSV( ScoringCSV ) + self:F( ScoringCSV ) + + if lfs and io and os then + if ScoringCSV then + self.ScoringCSV = ScoringCSV + local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" + + self.CSVFile, self.err = io.open( fdir, "w+" ) + if not self.CSVFile then + error( "Error: Cannot open CSV file in " .. lfs.writedir() ) + end + + self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) + + self.RunTime = os.date("%y-%m-%d_%H-%M-%S") + else + error( "A string containing the CSV file name must be given." ) + end + else + self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) + end + return self +end + + +--- Registers a score for a player. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @param #string ScoreType The type of the score. +-- @param #string ScoreTimes The amount of scores achieved. +-- @param #string ScoreAmount The score given. +-- @param #string PlayerUnitName The unit name of the player. +-- @param #string PlayerUnitCoalition The coalition of the player unit. +-- @param #string PlayerUnitCategory The category of the player unit. +-- @param #string PlayerUnitType The type of the player unit. +-- @param #string TargetUnitName The name of the target unit. +-- @param #string TargetUnitCoalition The coalition of the target unit. +-- @param #string TargetUnitCategory The category of the target unit. +-- @param #string TargetUnitType The type of the target unit. +-- @return #SCORING self +function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + --write statistic information to file + local ScoreTime = self:SecondsToClock( timer.getTime() ) + PlayerName = PlayerName:gsub( '"', '_' ) + + if PlayerUnitName and PlayerUnitName ~= '' then + local PlayerUnit = Unit.getByName( PlayerUnitName ) + + if PlayerUnit then + if not PlayerUnitCategory then + --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] + PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] + end + + if not PlayerUnitCoalition then + PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] + end + + if not PlayerUnitType then + PlayerUnitType = PlayerUnit:getTypeName() + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + + if not TargetUnitCoalition then + TargetUnitCoalition = '' + end + + if not TargetUnitCategory then + TargetUnitCategory = '' + end + + if not TargetUnitType then + TargetUnitType = '' + end + + if not TargetUnitName then + TargetUnitName = '' + end + + if lfs and io and os then + self.CSVFile:write( + '"' .. self.GameName .. '"' .. ',' .. + '"' .. self.RunTime .. '"' .. ',' .. + '' .. ScoreTime .. '' .. ',' .. + '"' .. PlayerName .. '"' .. ',' .. + '"' .. ScoreType .. '"' .. ',' .. + '"' .. PlayerUnitCoalition .. '"' .. ',' .. + '"' .. PlayerUnitCategory .. '"' .. ',' .. + '"' .. PlayerUnitType .. '"' .. ',' .. + '"' .. PlayerUnitName .. '"' .. ',' .. + '"' .. TargetUnitCoalition .. '"' .. ',' .. + '"' .. TargetUnitCategory .. '"' .. ',' .. + '"' .. TargetUnitType .. '"' .. ',' .. + '"' .. TargetUnitName .. '"' .. ',' .. + '' .. ScoreTimes .. '' .. ',' .. + '' .. ScoreAmount + ) + + self.CSVFile:write( "\n" ) + end +end + + +function SCORING:CloseCSV() + if lfs and io and os then + self.CSVFile:close() + end +end + +--- CARGO Classes +-- @module CARGO + + + + + + + +--- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". +-- These clients are defined within the Mission Orchestration Framework (MOF) + +CARGOS = {} + + +CARGO_ZONE = { + ClassName="CARGO_ZONE", + CargoZoneName = '', + CargoHostUnitName = '', + SIGNAL = { + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + }, + COLOR = { + GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, + RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, + WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, + BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } + } + } +} + +--- Creates a new zone where cargo can be collected or deployed. +-- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. +-- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. +-- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. +-- The CargoHostName is the "host" of the cargo zone: +-- +-- * It will smoke the zone position when a client is approaching the zone. +-- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. +-- +-- @param #CARGO_ZONE self +-- @param #string CargoZoneName The name of the zone as declared within the mission editor. +-- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. +function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) + self:F( { CargoZoneName, CargoHostName } ) + + self.CargoZoneName = CargoZoneName + self.SignalHeight = 2 + --self.CargoZone = trigger.misc.getZone( CargoZoneName ) + + + if CargoHostName then + self.CargoHostName = CargoHostName + end + + self:T( self.CargoZoneName ) + + return self +end + +function CARGO_ZONE:Spawn() + self:F( self.CargoHostName ) + + if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + if CargoHostGroup and CargoHostGroup:IsAlive() then + else + self.CargoHostSpawn:ReSpawn( 1 ) + end + else + self:T( "Initialize CargoHostSpawn" ) + self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) + self.CargoHostSpawn:ReSpawn( 1 ) + end + end + + return self +end + +function CARGO_ZONE:GetHostUnit() + self:F( self ) + + if self.CargoHostName then + + -- A Host has been given, signal the host + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + local CargoHostUnit + if CargoHostGroup and CargoHostGroup:IsAlive() then + CargoHostUnit = CargoHostGroup:GetUnit(1) + else + CargoHostUnit = StaticObject.getByName( self.CargoHostName ) + end + + return CargoHostUnit + end + + return nil +end + +function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) + self:F() + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + local SignalUnitTypeName = SignalUnit:getTypeName() + + local HostMessage = "" + + local IsCargo = false + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + if Cargo:IsStatusNone() then + HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" + IsCargo = true + end + end + end + + if not IsCargo then + HostMessage = "No Cargo Available." + end + + Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) + end +end + + +function CARGO_ZONE:Signal() + self:F() + + local Signalled = false + + if self.SignalType then + + if self.CargoHostName then + + -- A Host has been given, signal the host + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + self:T( 'Signalling Unit' ) + local SignalVehiclePos = SignalUnit:GetPointVec3() + SignalVehiclePos.y = SignalVehiclePos.y + 2 + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + + trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) + Signalled = false + + end + end + + else + + local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) + Signalled = false + + end + end + end + + return Signalled + +end + +function CARGO_ZONE:WhiteSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:BlueSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:OrangeSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:WhiteFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:YellowFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:GetCargoHostUnit() + self:F( self ) + + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) + if CargoHostGroup and CargoHostGroup:IsAlive() then + local CargoHostUnit = CargoHostGroup:GetUnit(1) + if CargoHostUnit and CargoHostUnit:IsAlive() then + return CargoHostUnit + end + end + end + + return nil +end + +function CARGO_ZONE:GetCargoZoneName() + self:F() + + return self.CargoZoneName +end + +CARGO = { + ClassName = "CARGO", + STATUS = { + NONE = 0, + LOADED = 1, + UNLOADED = 2, + LOADING = 3 + }, + CargoClient = nil +} + +--- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... +function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { CargoType, CargoName, CargoWeight } ) + + + self.CargoType = CargoType + self.CargoName = CargoName + self.CargoWeight = CargoWeight + + self:StatusNone() + + return self +end + +function CARGO:Spawn( Client ) + self:F() + + return self + +end + +function CARGO:IsNear( Client, LandingZone ) + self:F() + + local Near = true + + return Near + +end + + +function CARGO:IsLoadingToClient() + self:F() + + if self:IsStatusLoading() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:IsLoadedInClient() + self:F() + + if self:IsStatusLoaded() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:UnLoad( Client, TargetZoneName ) + self:F() + + self:StatusUnLoaded() + + return self +end + +function CARGO:OnBoard( Client, LandingZone ) + self:F() + + local Valid = true + + self.CargoClient = Client + local ClientUnit = Client:GetClientGroupDCSUnit() + + return Valid +end + +function CARGO:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = true + + return OnBoarded +end + +function CARGO:Load( Client ) + self:F() + + self:StatusLoaded( Client ) + + return self +end + +function CARGO:IsLandingRequired() + self:F() + return true +end + +function CARGO:IsSlingLoad() + self:F() + return false +end + + +function CARGO:StatusNone() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.NONE + + return self +end + +function CARGO:StatusLoading( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADING + self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusLoaded( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADED + self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusUnLoaded() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.UNLOADED + + return self +end + + +function CARGO:IsStatusNone() + self:F() + + return self.CargoStatus == CARGO.STATUS.NONE +end + +function CARGO:IsStatusLoading() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADING +end + +function CARGO:IsStatusLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADED +end + +function CARGO:IsStatusUnLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.UNLOADED +end + + +CARGO_GROUP = { + ClassName = "CARGO_GROUP" +} + + +function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) + + self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) + self.CargoZone = CargoZone + + CARGOS[self.CargoName] = self + + return self + +end + +function CARGO_GROUP:Spawn( Client ) + self:F( { Client } ) + + local SpawnCargo = true + + if self:IsStatusNone() then + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + + elseif self:IsStatusLoading() then + + local Client = self:IsLoadingToClient() + if Client and Client:GetDCSGroup() then + SpawnCargo = false + else + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + end + + elseif self:IsStatusLoaded() then + + local ClientLoaded = self:IsLoadedInClient() + -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. + if ClientLoaded and ClientLoaded ~= Client then + local ClientGroup = Client:GetDCSGroup() + if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then + SpawnCargo = false + else + self:StatusNone() + end + else + -- Same Client, but now in initialize, so set back the status to None. + self:StatusNone() + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + end + + if SpawnCargo then + if self.CargoZone:GetCargoHostUnit() then + --- ReSpawn the Cargo from the CargoHost + self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() + else + --- ReSpawn the Cargo in the CargoZone without a host ... + self:T( self.CargoZone ) + self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() + end + self:StatusNone() + end + + self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) + + return self +end + +function CARGO_GROUP:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoGroupName then + local CargoGroup = Group.getByName( self.CargoGroupName ) + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + local CargoUnit = CargoGroup:getUnit(1) + local CargoPos = CargoUnit:getPoint() + + self.CargoInAir = CargoUnit:inAir() + + self:T( self.CargoInAir ) + + -- Only move the group to the carrier when the cargo is not in the air + -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). + if not self.CargoInAir then + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) + Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) + + end + self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) + + --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) + end + + self:StatusLoading( Client ) + + return Valid + +end + + +function CARGO_GROUP:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + if not self.CargoInAir then + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + else + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + + return OnBoarded +end + + +function CARGO_GROUP:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + + local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) + + self.CargoGroupName = CargoGroup:GetName() + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) + + self:StatusUnLoaded() + + return self +end + + +CARGO_PACKAGE = { + ClassName = "CARGO_PACKAGE" +} + + +function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) + + self.CargoClient = CargoClient + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_PACKAGE:Spawn( Client ) + self:F( { self, Client } ) + + -- this needs to be checked thoroughly + + local CargoClientGroup = self.CargoClient:GetDCSGroup() + if not CargoClientGroup then + if not self.CargoClientSpawn then + self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) + end + self.CargoClientSpawn:ReSpawn( 1 ) + end + + local SpawnCargo = true + + if self:IsStatusNone() then + + elseif self:IsStatusLoading() or self:IsStatusLoaded() then + + local CargoClientLoaded = self:IsLoadedInClient() + if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then + SpawnCargo = false + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + else + + end + + if SpawnCargo then + self:StatusLoaded( self.CargoClient ) + end + + return self +end + + +function CARGO_PACKAGE:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + self:T( self.CargoClient.ClientName ) + self:T( 'Client Exists.' ) + + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + local CarrierPosMoveAway = ClientUnit:getPoint() + + local CargoHostGroup = self.CargoClient:GetDCSGroup() + local CargoHostName = self.CargoClient:GetDCSGroup():getName() + + local CargoHostUnits = CargoHostGroup:getUnits() + local CargoPos = CargoHostUnits[1]:getPoint() + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + end + self:T( "Routing " .. CargoHostName ) + + --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) + + return Valid + +end + + +function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then + + -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. + self:StatusLoaded( Client ) + + -- All done, onboarded the Cargo to the new Client. + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) + + --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) + self:StatusUnLoaded() + + return Cargo +end + + +CARGO_SLINGLOAD = { + ClassName = "CARGO_SLINGLOAD" +} + + +function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) + local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) + + self.CargoHostName = CargoHostName + + -- Cargo will be initialized around the CargoZone position. + self.CargoZone = CargoZone + + self.CargoCount = 0 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + -- The country ID needs to be correctly set. + self.CargoCountryID = CargoCountryID + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_SLINGLOAD:IsLandingRequired() + self:F() + return false +end + + +function CARGO_SLINGLOAD:IsSlingLoad() + self:F() + return true +end + + +function CARGO_SLINGLOAD:Spawn( Client ) + self:F( { self, Client } ) + + local Zone = trigger.misc.getZone( self.CargoZone ) + + local ZonePos = {} + ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + + self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) + + --[[ + -- This does not work in 1.5.2. + CargoStatic = StaticObject.getByName( self.CargoName ) + if CargoStatic then + CargoStatic:destroy() + end + --]] + + CargoStatic = StaticObject.getByName( self.CargoStaticName ) + + if CargoStatic and CargoStatic:isExist() then + CargoStatic:destroy() + end + + -- I need to make every time a new cargo due to bugs in 1.5.2. + + self.CargoCount = self.CargoCount + 1 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + local CargoTemplate = { + ["category"] = "Cargo", + ["shape_name"] = "ab-212_cargo", + ["type"] = "Cargo1", + ["x"] = ZonePos.x, + ["y"] = ZonePos.y, + ["mass"] = self.CargoWeight, + ["name"] = self.CargoStaticName, + ["canCargo"] = true, + ["heading"] = 0, + } + + coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) + +-- end + + return self +end + + +function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + return Near +end + + +function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) + self:F() + + local Near = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + Near = true + end + end + + return Near +end + + +function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + + return Valid +end + + +function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + self:StatusUnLoaded() + + return Cargo +end +--- This module contains the MESSAGE class. +-- +-- 1) @{Message#MESSAGE} class, extends @{Base#BASE} +-- ================================================= +-- Message System to display Messages to Clients, Coalitions or All. +-- Messages are shown on the display panel for an amount of seconds, and will then disappear. +-- Messages can contain a category which is indicating the category of the message. +-- +-- 1.1) MESSAGE construction methods +-- --------------------------------- +-- Messages are created with @{Message#MESSAGE.New}. Note that when the MESSAGE object is created, no message is sent yet. +-- To send messages, you need to use the To functions. +-- +-- 1.2) Send messages with MESSAGE To methods +-- ------------------------------------------ +-- Messages are sent to: +-- +-- * Clients with @{Message#MESSAGE.ToClient}. +-- * Coalitions with @{Message#MESSAGE.ToCoalition}. +-- * All Players with @{Message#MESSAGE.ToAll}. +-- +-- @module Message +-- @author FlightControl + +--- The MESSAGE class +-- @type MESSAGE +-- @extends Base#BASE +MESSAGE = { + ClassName = "MESSAGE", + MessageCategory = 0, + MessageID = 0, +} + + +--- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. +-- @param self +-- @param #string MessageText is the text of the Message. +-- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. +-- @param #string MessageCategory (optional) is a string expressing the "category" of the Message. The category will be shown as the first text in the message followed by a ": ". +-- @return #MESSAGE +-- @usage +-- -- Create a series of new Messages. +-- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". +-- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", 25, "End of Mission" ) +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", 25, "Penalty" ) +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", 25, "Score") +function MESSAGE:New( MessageText, MessageDuration, MessageCategory ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MessageText, MessageDuration, MessageCategory } ) + + -- When no MessageCategory is given, we don't show it as a title... + if MessageCategory and MessageCategory ~= "" then + self.MessageCategory = MessageCategory .. ": " + else + self.MessageCategory = "" + end + + self.MessageDuration = MessageDuration + self.MessageTime = timer.getTime() + self.MessageText = MessageText + + self.MessageSent = false + self.MessageGroup = false + self.MessageCoalition = false + + return self +end + +--- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". +-- @param #MESSAGE self +-- @param Client#CLIENT Client is the Group of the Client. +-- @return #MESSAGE +-- @usage +-- -- Send the 2 messages created with the @{New} method to the Client Group. +-- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. +-- ClientGroup = Group.getByName( "ClientGroup" ) +-- +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) +-- MessageClient1:ToClient( ClientGroup ) +-- MessageClient2:ToClient( ClientGroup ) +function MESSAGE:ToClient( Client ) + self:F( Client ) + + if Client and Client:GetClientGroupID() then + + local ClientGroupID = Client:GetClientGroupID() + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to the Blue coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the BLUE coalition. +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageBLUE:ToBlue() +function MESSAGE:ToBlue() + self:F() + + self:ToCoalition( coalition.side.BLUE ) + + return self +end + +--- Sends a MESSAGE to the Red Coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToRed() +function MESSAGE:ToRed( ) + self:F() + + self:ToCoalition( coalition.side.RED ) + + return self +end + +--- Sends a MESSAGE to a Coalition. +-- @param #MESSAGE self +-- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToCoalition( coalition.side.RED ) +function MESSAGE:ToCoalition( CoalitionSide ) + self:F( CoalitionSide ) + + if CoalitionSide then + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to all players. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created to all players. +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) +-- MessageAll:ToAll() +function MESSAGE:ToAll() + self:F() + + self:ToCoalition( coalition.side.RED ) + self:ToCoalition( coalition.side.BLUE ) + + return self +end + + + +----- The MESSAGEQUEUE class +---- @type MESSAGEQUEUE +--MESSAGEQUEUE = { +-- ClientGroups = {}, +-- CoalitionSides = {} +--} +-- +--function MESSAGEQUEUE:New( RefreshInterval ) +-- local self = BASE:Inherit( self, BASE:New() ) +-- self:F( { RefreshInterval } ) +-- +-- self.RefreshInterval = RefreshInterval +-- +-- --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) +-- self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) +-- +-- return self +--end +-- +----- This function is called automatically by the MESSAGEQUEUE scheduler. +--function MESSAGEQUEUE:_DisplayMessages() +-- +-- -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). +-- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do +-- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do +-- if MessageData.MessageSent == false then +-- --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageSent = true +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- end +-- +-- -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. +-- -- Because the Client messages will overwrite the Coalition messages (for that Client). +-- for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do +-- for MessageID, MessageData in pairs( ClientGroupData.Messages ) do +-- if MessageData.MessageGroup == false then +-- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageGroup = true +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- +-- -- Now check if the Client also has messages that belong to the Coalition of the Client... +-- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do +-- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do +-- local CoalitionGroup = Group.getByName( ClientGroupName ) +-- if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then +-- if MessageData.MessageCoalition == false then +-- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageCoalition = true +-- end +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- end +-- end +-- +-- return true +--end +-- +----- The _MessageQueue object is created when the MESSAGE class module is loaded. +----_MessageQueue = MESSAGEQUEUE:New( 0.5 ) +-- +--- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. +-- @module STAGE +-- @author Flightcontrol + + + + + + + +--- The STAGE class +-- @type +STAGE = { + ClassName = "STAGE", + MSG = { ID = "None", TIME = 10 }, + FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, + + Name = "NoStage", + StageType = '', + WaitTime = 1, + Frequency = 1, + MessageCount = 0, + MessageInterval = 15, + MessageShown = {}, + MessageShow = false, + MessageFlash = false +} + + +function STAGE:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + return self +end + +function STAGE:Execute( Mission, Client, Task ) + + local Valid = true + + return Valid +end + +function STAGE:Executing( Mission, Client, Task ) + +end + +function STAGE:Validate( Mission, Client, Task ) + local Valid = true + + return Valid +end + + +STAGEBRIEF = { + ClassName = "BRIEF", + MSG = { ID = "Brief", TIME = 1 }, + Name = "Brief", + StageBriefingTime = 0, + StageBriefingDuration = 1 +} + +function STAGEBRIEF:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute +-- @param #STAGEBRIEF self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +-- @return #boolean +function STAGEBRIEF:Execute( Mission, Client, Task ) + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + self:F() + Client:ShowMissionBriefing( Mission.MissionBriefing ) + self.StageBriefingTime = timer.getTime() + return Valid +end + +function STAGEBRIEF:Validate( Mission, Client, Task ) + local Valid = STAGE:Validate( Mission, Client, Task ) + self:T() + + if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then + return 0 + else + self.StageBriefingTime = timer.getTime() + return 1 + end + +end + + +STAGESTART = { + ClassName = "START", + MSG = { ID = "Start", TIME = 1 }, + Name = "Start", + StageStartTime = 0, + StageStartDuration = 1 +} + +function STAGESTART:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGESTART:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + if Task.TaskBriefing then + Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) + else + Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) + end + self.StageStartTime = timer.getTime() + return Valid +end + +function STAGESTART:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + if timer.getTime() - self.StageStartTime <= self.StageStartDuration then + return 0 + else + self.StageStartTime = timer.getTime() + return 1 + end + + return 1 + +end + +STAGE_CARGO_LOAD = { + ClassName = "STAGE_CARGO_LOAD" +} + +function STAGE_CARGO_LOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do + LoadCargo:Load( Client ) + end + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + +STAGE_CARGO_INIT = { + ClassName = "STAGE_CARGO_INIT" +} + +function STAGE_CARGO_INIT:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do + self:T( InitLandingZone ) + InitLandingZone:Spawn() + end + + + self:T( Task.Cargos.InitCargos ) + for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do + self:T( { InitCargoData } ) + InitCargoData:Spawn( Client ) + end + + return Valid +end + + +function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + + +STAGEROUTE = { + ClassName = "STAGEROUTE", + MSG = { ID = "Route", TIME = 5 }, + Frequency = STAGE.FREQUENCY.REPEAT, + Name = "Route" +} + +function STAGEROUTE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + self.MessageSwitch = true + return self +end + + +--- Execute the routing. +-- @param #STAGEROUTE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEROUTE:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + local RouteMessage = "Fly to: " + self:T( Task.LandingZones ) + for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do + RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' + end + + if Client:IsMultiSeated() then + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) + else + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) + end + + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGEROUTE:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + -- check if the Client is in the landing zone + self:T( Task.LandingZones.LandingZoneNames ) + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + + if Task.CurrentLandingZoneName then + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + + self:T( 1 ) + return 1 + end + + self:T( 0 ) + return 0 +end + + + +STAGELANDING = { + ClassName = "STAGELANDING", + MSG = { ID = "Landing", TIME = 10 }, + Name = "Landing", + Signalled = false +} + +function STAGELANDING:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute the landing coordination. +-- @param #STAGELANDING self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGELANDING:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) + else + Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) + end + + Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() + + self:T( { Task.HostUnit } ) + + if Task.HostUnit then + + Task.HostUnitName = Task.HostUnit:GetPrefix() + Task.HostUnitTypeName = Task.HostUnit:GetTypeName() + + local HostMessage = "" + Task.CargoNames = "" + + local IsFirst = true + + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + + if Cargo:IsLandingRequired() then + self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") + Task.IsLandingRequired = true + end + + if Cargo:IsSlingLoad() then + self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") + Task.IsSlingLoad = true + end + + if IsFirst then + IsFirst = false + Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + else + Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + end + end + end + + if Task.IsLandingRequired then + HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + else + HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + end + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) + + end +end + +function STAGELANDING:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + if Task.CurrentLandingZoneName then + + -- Client is in de landing zone. + self:T( Task.CurrentLandingZoneName ) + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + else + if Task.CurrentLandingZone then + Task.CurrentLandingZone = nil + end + if Task.CurrentCargoZone then + Task.CurrentCargoZone = nil + end + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -1 ) + return -1 + end + + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then + self:T( 1 ) + Task.IsInAirTestRequired = true + return 1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then + self:T( 1 ) + Task.IsInAirTestRequired = false + return 1 + end + + self:T( 0 ) + return 0 +end + +STAGELANDED = { + ClassName = "STAGELANDED", + MSG = { ID = "Land", TIME = 10 }, + Name = "Landed", + MenusAdded = false +} + +function STAGELANDED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELANDED:Execute( Mission, Client, Task ) + self:F() + + if Task.IsLandingRequired then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', + self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) + + if not self.MenusAdded then + Task.Cargo = nil + Task:RemoveCargoMenus( Client ) + Task:AddCargoMenus( Client, CARGOS, 250 ) + end + end +end + + + +function STAGELANDED:Validate( Mission, Client, Task ) + self:F() + + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -2 ) + return -2 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + self:T( "Client went back in the air. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + -- Wait until cargo is selected from the menu. + if Task.IsLandingRequired then + if not Task.Cargo then + self:T( 0 ) + return 0 + end + end + + self:T( 1 ) + return 1 +end + +STAGEUNLOAD = { + ClassName = "STAGEUNLOAD", + MSG = { ID = "Unload", TIME = 10 }, + Name = "Unload" +} + +function STAGEUNLOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Coordinate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) + else + Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) + end + Task:RemoveCargoMenus( Client ) +end + +function STAGEUNLOAD:Executing( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) + + local TargetZoneName + + if Task.TargetZoneName then + TargetZoneName = Task.TargetZoneName + else + TargetZoneName = Task.CurrentLandingZoneName + end + + if Task.Cargo:UnLoad( Client, TargetZoneName ) then + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + if Mission.MissionReportFlash then + Client:ShowCargo() + end + end +end + +--- Validate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Validate( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Validate()' ) + + if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if not Client:GetClientGroupDCSUnit():inAir() then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) + end + Task:RemoveCargoMenus( Client ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. + return 1 + end + + return 1 +end + +STAGELOAD = { + ClassName = "STAGELOAD", + MSG = { ID = "Load", TIME = 10 }, + Name = "Load" +} + +function STAGELOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELOAD:Execute( Mission, Client, Task ) + self:F() + + if not Task.IsSlingLoad then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) + + -- Route the cargo to the Carrier + + Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + else + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + end +end + +function STAGELOAD:Executing( Mission, Client, Task ) + self:F() + + -- If the Cargo is ready to be loaded, load it into the Client. + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + self:T( Task.Cargo.CargoName) + + if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then + + -- Load the Cargo onto the Client + Task.Cargo:Load( Client ) + + -- Message to the pilot that cargo has been loaded. + Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", + 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + + Client:ShowCargo() + end + else + Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) + for CargoID, Cargo in pairs( CARGOS ) do + self:T( "Cargo.CargoName = " .. Cargo.CargoName ) + + if Cargo:IsSlingLoad() then + local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) + if CargoStatic then + self:T( "Cargo is found in the DCS simulator.") + local CargoStaticPosition = CargoStatic:getPosition().p + self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) + local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) + if CargoStaticHeight > 5 then + self:T( "Cargo is airborne.") + Cargo:StatusLoaded() + Task.Cargo = Cargo + Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', + self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + break + end + else + self:T( "Cargo not found in the DCS simulator." ) + end + end + end + end + +end + +function STAGELOAD:Validate( Mission, Client, Task ) + self:F() + + self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + Task:RemoveCargoMenus( Client ) + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) + self:T( 1 ) + return 1 + end + + else + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) + if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) + self:T( 1 ) + return 1 + end + end + + end + + + self:T( 0 ) + return 0 +end + + +STAGEDONE = { + ClassName = "STAGEDONE", + MSG = { ID = "Done", TIME = 10 }, + Name = "Done" +} + +function STAGEDONE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +function STAGEDONE:Execute( Mission, Client, Task ) + self:F() + +end + +function STAGEDONE:Validate( Mission, Client, Task ) + self:F() + + Task:Done() + + return 0 +end + +STAGEARRIVE = { + ClassName = "STAGEARRIVE", + MSG = { ID = "Arrive", TIME = 10 }, + Name = "Arrive" +} + +function STAGEARRIVE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + + +--- Execute Arrival +-- @param #STAGEARRIVE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEARRIVE:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) + end + +end + +function STAGEARRIVE:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) + if ( Task.CurrentLandingZoneID ) then + else + return -1 + end + + return 1 +end + +STAGEGROUPSDESTROYED = { + ClassName = "STAGEGROUPSDESTROYED", + DestroyGroupSize = -1, + Frequency = STAGE.FREQUENCY.REPEAT, + MSG = { ID = "DestroyGroup", TIME = 10 }, + Name = "GroupsDestroyed" +} + +function STAGEGROUPSDESTROYED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +--function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) +-- +-- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) +-- +--end + +function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) + self:F() + + if Task.MissionTask:IsGoalReached() then + return 1 + else + return 0 + end +end + +function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) + self:F() + self:T( { Task.ClassName, Task.Destroyed } ) + --env.info( 'Event Table Task = ' .. tostring(Task) ) + +end + + + + + + + + + + + + + +--[[ + _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. + + - _TransportStage.START + - _TransportStage.ROUTE + - _TransportStage.LAND + - _TransportStage.EXECUTE + - _TransportStage.DONE + - _TransportStage.REMOVE +--]] +_TransportStage = { + HOLD = "HOLD", + START = "START", + ROUTE = "ROUTE", + LANDING = "LANDING", + LANDED = "LANDED", + EXECUTING = "EXECUTING", + LOAD = "LOAD", + UNLOAD = "UNLOAD", + DONE = "DONE", + NEXT = "NEXT" +} + +_TransportStageMsgTime = { + HOLD = 10, + START = 60, + ROUTE = 5, + LANDING = 10, + LANDED = 30, + EXECUTING = 30, + LOAD = 30, + UNLOAD = 30, + DONE = 30, + NEXT = 0 +} + +_TransportStageTime = { + HOLD = 10, + START = 5, + ROUTE = 5, + LANDING = 1, + LANDED = 1, + EXECUTING = 5, + LOAD = 5, + UNLOAD = 5, + DONE = 1, + NEXT = 0 +} + +_TransportStageAction = { + REPEAT = -1, + NONE = 0, + ONCE = 1 +} +--- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. +-- @module TASK + + + + + + + +--- The TASK class +-- @type TASK +-- @extends Base#BASE +TASK = { + + -- Defines the different signal types with a Task. + SIGNAL = { + COLOR = { + RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, + GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, + BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } + }, + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + } + }, + ClassName = "TASK", + Mission = {}, -- Owning mission of the Task + Name = '', + Stages = {}, + Stage = {}, + Cargos = { + InitCargos = {}, + LoadCargos = {} + }, + LandingZones = { + LandingZoneNames = {}, + LandingZones = {} + }, + ActiveStage = 0, + TaskDone = false, + TaskFailed = false, + GoalTasks = {} +} + +--- Instantiates a new TASK Base. Should never be used. Interface Class. +-- @return TASK +function TASK:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + -- assign Task default values during construction + self.TaskBriefing = "Task: No Task." + self.Time = timer.getTime() + self.ExecuteStage = _TransportExecuteStage.NONE + + return self +end + +function TASK:SetStage( StageSequenceIncrement ) + self:F( { StageSequenceIncrement } ) + + local Valid = false + if StageSequenceIncrement ~= 0 then + self.ActiveStage = self.ActiveStage + StageSequenceIncrement + if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then + self.Stage = self.Stages[self.ActiveStage] + self:T( { self.Stage.Name } ) + self.Frequency = self.Stage.Frequency + Valid = true + else + Valid = false + env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) + end + end + self.Time = timer.getTime() + return Valid +end + +function TASK:Init() + self:F() + self.ActiveStage = 0 + self:SetStage(1) + self.TaskDone = false + self.TaskFailed = false +end + + +--- Get progress of a TASK. +-- @return string GoalsText +function TASK:GetGoalProgress() + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + Goals = '(' .. Goals .. ')' + else + Goals = '( - )' + end + GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' + end + + if GoalsText == "" then + GoalsText = "( - )" + end + + return GoalsText +end + +--- Show progress of a TASK. +-- @param MISSION Mission Group structure describing the Mission. +-- @param CLIENT Client Group structure describing the Client. +function TASK:ShowGoalProgress( Mission, Client ) + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + if Mission:IsCompleted() then + else + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + else + Goals = "-" + end + GoalsText = GoalsText .. self:GetGoalProgress() + end + end + + if Mission.MissionReportFlash or Mission.MissionReportShow then + Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) + end +end + +--- Sets a TASK to status Done. +function TASK:Done() + self:F2() + self.TaskDone = true +end + +--- Returns if a TASK is done. +-- @return bool +function TASK:IsDone() + self:F2( self.TaskDone ) + return self.TaskDone +end + +--- Sets a TASK to status failed. +function TASK:Failed() + self:F() + self.TaskFailed = true +end + +--- Returns if a TASk has failed. +-- @return bool +function TASK:IsFailed() + self:F2( self.TaskFailed ) + return self.TaskFailed +end + +function TASK:Reset( Mission, Client ) + self:F2() + self.ExecuteStage = _TransportExecuteStage.NONE +end + +--- Returns the Goals of a TASK +-- @return @table Goals +function TASK:GetGoals() + return self.GoalTasks +end + +--- Returns if a TASK has Goal(s). +-- @param #TASK self +-- @param #string GoalVerb is the name of the Goal of the TASK. +-- @return bool +function TASK:Goal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self:T2( {self.GoalTasks[GoalVerb] } ) + if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then + return true + else + return false + end +end + +--- Sets the total Goals to be achieved of the Goal Name +-- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:SetGoalTotal( GoalTotal, GoalVerb ) + self:F2( { GoalTotal, GoalVerb } ) + + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self.GoalTasks[GoalVerb] = {} + self.GoalTasks[GoalVerb].Goals = {} + self.GoalTasks[GoalVerb].GoalTotal = GoalTotal + self.GoalTasks[GoalVerb].GoalCount = 0 + return self +end + +--- Gets the total of Goals to be achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:GetGoalTotal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalTotal + else + return 0 + end +end + +--- Sets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param number GoalCount is the total number of Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:SetGoalCount( GoalCount, GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = GoalCount + end + return self +end + +--- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. +-- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) + self:F2( { GoalCountIncrease, GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease + end + return self +end + +--- Gets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalCount( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalCount + else + return 0 + end +end + +--- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalPercentage( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) + else + return 100 + end +end + +--- Returns if all the Goals of the TASK were achieved. +-- @return bool +function TASK:IsGoalReached() + self:F2() + + local GoalReached = true + + for GoalVerb, Goals in pairs( self.GoalTasks ) do + self:T2( { "GoalVerb", GoalVerb } ) + if self:Goal( GoalVerb ) then + local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) + self:T2( "GoalToDo = " .. GoalToDo ) + if GoalToDo <= 0 then + else + GoalReached = false + break + end + else + break + end + end + + self:T( { GoalReached, self.GoalTasks } ) + return GoalReached +end + +--- Adds an Additional Goal for the TASK to be achieved. +-- @param string GoalVerb is the name of the Goal of the TASK. +-- @param string GoalTask is a text describing the Goal of the TASK to be achieved. +-- @param number GoalIncrease is a number by which the Goal achievement is increasing. +function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) + self:F2( { GoalVerb, GoalTask, GoalIncrease } ) + + if self:Goal( GoalVerb ) then + self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease + end + return self +end + +--- Returns if the additional Goal for the TASK was completed. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return string Goals +function TASK:GetGoalCompletion( GoalVerb ) + self:F2( { GoalVerb } ) + + if self:Goal( GoalVerb ) then + local Goals = "" + for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end + return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount + end +end + +function TASK.MenuAction( Parameter ) + Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING + Parameter.ReferenceTask.Cargo = Parameter.CargoTask +end + +function TASK:StageExecute() + self:F() + + local Execute = false + + if self.Frequency == STAGE.FREQUENCY.REPEAT then + Execute = true + elseif self.Frequency == STAGE.FREQUENCY.NONE then + Execute = false + elseif self.Frequency >= 0 then + Execute = true + self.Frequency = self.Frequency - 1 + end + + return Execute + +end + +--- Work function to set signal events within a TASK. +function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) + self:F() + + local Valid = true + + if Valid then + if type( SignalUnitNames ) == "table" then + self.LandingZoneSignalUnitNames = SignalUnitNames + else + self.LandingZoneSignalUnitNames = { SignalUnitNames } + end + self.LandingZoneSignalType = SignalType + self.LandingZoneSignalColor = SignalColor + self.Signalled = false + if SignalHeight ~= nil then + self.LandingZoneSignalHeight = SignalHeight + else + self.LandingZoneSignalHeight = 0 + end + + if self.TaskBriefing then + self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." + end + end + + return Valid +end + +--- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end +--- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. +-- @module GOHOMETASK + +--- The GOHOMETASK class +-- @type +GOHOMETASK = { + ClassName = "GOHOMETASK", +} + +--- Creates a new GOHOMETASK. +-- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. +-- @return GOHOMETASK +function GOHOMETASK:New( LandingZones ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones } ) + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Fly Home' + self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. +-- @module DESTROYBASETASK +-- @see DESTROYGROUPSTASK +-- @see DESTROYUNITTYPESTASK +-- @see DESTROY_RADARS_TASK + + + +--- The DESTROYBASETASK class +-- @type DESTROYBASETASK +DESTROYBASETASK = { + ClassName = "DESTROYBASETASK", + Destroyed = 0, + GoalVerb = "Destroy", + DestroyPercentage = 100, +} + +--- Creates a new DESTROYBASETASK. +-- @param #DESTROYBASETASK self +-- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". +-- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". +-- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +-- @return DESTROYBASETASK +function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + self.Name = 'Destroy' + self.Destroyed = 0 + self.DestroyGroupPrefixes = DestroyGroupPrefixes + self.DestroyGroupType = DestroyGroupType + self.DestroyUnitType = DestroyUnitType + if DestroyPercentage then + self.DestroyPercentage = DestroyPercentage + end + self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + + return self +end + +--- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. +-- @param #DESTROYBASETASK self +-- @param Event#EVENTDATA Event structure of MOOSE. +function DESTROYBASETASK:EventDead( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + local DestroyUnit = Event.IniDCSUnit + local DestroyUnitName = Event.IniDCSUnitName + local DestroyGroup = Event.IniDCSGroup + local DestroyGroupName = Event.IniDCSGroupName + + --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! + --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... + local UnitsDestroyed = 0 + for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do + self:T( DestroyGroupPrefix ) + if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then + self:T( BASE:Inherited(self).ClassName ) + UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:T( UnitsDestroyed ) + end + end + + self:T( { UnitsDestroyed } ) + self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) + end + +end + +--- Validate task completeness of DESTROYBASETASK. +-- @param DestroyGroup Group structure describing the group to be evaluated. +-- @param DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F() + + return 0 +end +--- DESTROYGROUPSTASK +-- @module DESTROYGROUPSTASK + + + +--- The DESTROYGROUPSTASK class +-- @type +DESTROYGROUPSTASK = { + ClassName = "DESTROYGROUPSTASK", + GoalVerb = "Destroy Groups", +} + +--- Creates a new DESTROYGROUPSTASK. +-- @param #DESTROYGROUPSTASK self +-- @param #string DestroyGroupType String describing the group to be destroyed. +-- @param #string DestroyUnitType String describing the unit to be destroyed. +-- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +---@return DESTROYGROUPSTASK +function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) + self:F() + + self.Name = 'Destroy Groups' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + _EVENTDISPATCHER:OnCrash( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param #DESTROYGROUPSTASK self +-- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. +-- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. +-- @return #number The DestroyCount reflecting the amount of units destroyed within the group. +function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) + + local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. + local DestroyGroupInitialSize = DestroyGroup:getInitialSize() + self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) + + local DestroyCount = 0 + if DestroyGroup then + if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then + DestroyCount = 1 + end + else + DestroyCount = 1 + end + + self:T( DestroyCount ) + + return DestroyCount +end +--- Task class to destroy radar installations. +-- @module DESTROYRADARSTASK + + + +--- The DESTROYRADARS class +-- @type +DESTROYRADARSTASK = { + ClassName = "DESTROYRADARSTASK", + GoalVerb = "Destroy Radars" +} + +--- Creates a new DESTROYRADARSTASK. +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @return DESTROYRADARSTASK +function DESTROYRADARSTASK:New( DestroyGroupNames ) + local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) + self:F() + + self.Name = 'Destroy Radars' + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + self:T( 'Destroyed a radar' ) + DestroyCount = 1 + end + end + return DestroyCount +end +--- Set TASK to destroy certain unit types. +-- @module DESTROYUNITTYPESTASK + + + +--- The DESTROYUNITTYPESTASK class +-- @type +DESTROYUNITTYPESTASK = { + ClassName = "DESTROYUNITTYPESTASK", + GoalVerb = "Destroy", +} + +--- Creates a new DESTROYUNITTYPESTASK. +-- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". +-- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. +-- @return DESTROYUNITTYPESTASK +function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) + self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) + + if type(DestroyUnitTypes) == 'table' then + self.DestroyUnitTypes = DestroyUnitTypes + else + self.DestroyUnitTypes = { DestroyUnitTypes } + end + + self.Name = 'Destroy Unit Types' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do + if DestroyUnit and DestroyUnit:getTypeName() == UnitType then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + DestroyCount = DestroyCount + 1 + end + end + end + return DestroyCount +end +--- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. +-- @module PICKUPTASK +-- @parent TASK + +--- The PICKUPTASK class +-- @type +PICKUPTASK = { + ClassName = "PICKUPTASK", + TEXT = { "Pick-Up", "picked-up", "loaded" }, + GoalVerb = "Pick-Up" +} + +--- Creates a new PICKUPTASK. +-- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. +-- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. +-- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. +function PICKUPTASK:New( CargoType, OnBoardSide ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. + + local Valid = true + + if Valid then + self.Name = 'Pickup Cargo' + self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.OnBoardSide = OnBoardSide + self.IsLandingRequired = true -- required to decide whether the client needs to land or not + self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function PICKUPTASK:FromZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + +function PICKUPTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + +function PICKUPTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + +function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + + -- If the Cargo has no status, allow the menu option. + if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then + + local MenuAdd = false + if Cargo:IsNear( Client, self.CurrentCargoZone ) then + MenuAdd = true + end + + if MenuAdd then + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].PickupMenu then + Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( + Client:GetClientGroupID(), + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) + end + + if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then + Client._Menus[Cargo.CargoType].PickupSubMenus = {} + end + + Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( + Client:GetClientGroupID(), + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].PickupMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + end + +end + +function PICKUPTASK:RemoveCargoMenus( Client ) + self:F() + + for MenuID, MenuData in pairs( Client._Menus ) do + for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do + missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) + self:T( "Removed PickupSubMenu " ) + SubMenuData = nil + end + if MenuData.PickupMenu then + missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) + self:T( "Removed PickupMenu " ) + MenuData.PickupMenu = nil + end + end + + for CargoID, Cargo in pairs( CARGOS ) do + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then + Cargo:StatusNone() + end + end + +end + + + +function PICKUPTASK:HasFailed( ClientDead ) + self:F() + + local TaskHasFailed = self.TaskFailed + return TaskHasFailed +end + +--- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. +-- @module DEPLOYTASK + + + +--- A DeployTask +-- @type DEPLOYTASK +DEPLOYTASK = { + ClassName = "DEPLOYTASK", + TEXT = { "Deploy", "deployed", "unloaded" }, + GoalVerb = "Deployment" +} + + +--- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. +-- @function [parent=#DEPLOYTASK] New +-- @param #string CargoType Type of the Cargo. +-- @return #DEPLOYTASK The created DeployTask +function DEPLOYTASK:New( CargoType ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Deploy Cargo' + self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function DEPLOYTASK:ToZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + + +function DEPLOYTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + + +function DEPLOYTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + + +--- When the cargo is unloaded, it will move to the target zone name. +-- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. +function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) + self:F() + + local Valid = true + + Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) + + if Valid then + self.TargetZoneName = TargetZoneName + end + + return Valid + +end + +function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + + self:T( ClientGroupID ) + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) + + if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then + + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].DeployMenu then + Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( + ClientGroupID, + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added DeployMenu ' .. self.TEXT[1] ) + end + + if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then + Client._Menus[Cargo.CargoType].DeploySubMenus = {} + end + + if Client._Menus[Cargo.CargoType].DeployMenu == nil then + self:T( 'deploymenu is nil' ) + end + + Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( + ClientGroupID, + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].DeployMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + +end + +function DEPLOYTASK:RemoveCargoMenus( Client ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + self:T( ClientGroupID ) + + for MenuID, MenuData in pairs( Client._Menus ) do + if MenuData.DeploySubMenus ~= nil then + for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do + missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) + self:T( "Removed DeploySubMenu " ) + SubMenuData = nil + end + end + if MenuData.DeployMenu then + missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) + self:T( "Removed DeployMenu " ) + MenuData.DeployMenu = nil + end + end + +end +--- A NOTASK is a dummy activity... But it will show a Mission Briefing... +-- @module NOTASK + +--- The NOTASK class +-- @type +NOTASK = { + ClassName = "NOTASK", +} + +--- Creates a new NOTASK. +function NOTASK:New() + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Nothing' + self.TaskBriefing = "Task: Execute your mission." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. +-- @module ROUTETASK + +--- The ROUTETASK class +-- @type +ROUTETASK = { + ClassName = "ROUTETASK", + GoalVerb = "Route", +} + +--- Creates a new ROUTETASK. +-- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. +-- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. +-- @return ROUTETASK +function ROUTETASK:New( LandingZones, TaskBriefing ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones, TaskBriefing } ) + + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Route To Zone' + if TaskBriefing then + self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + else + self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + end + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +--- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. +-- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. +-- @module Mission + +--- The MISSION class +-- @type MISSION +-- @extends Base#BASE +-- @field #MISSION.Clients _Clients +-- @field #string MissionBriefing +MISSION = { + ClassName = "MISSION", + Name = "", + MissionStatus = "PENDING", + _Clients = {}, + _Tasks = {}, + _ActiveTasks = {}, + GoalFunction = nil, + MissionReportTrigger = 0, + MissionProgressTrigger = 0, + MissionReportShow = false, + MissionReportFlash = false, + MissionTimeInterval = 0, + MissionCoalition = "", + SUCCESS = 1, + FAILED = 2, + REPEAT = 3, + _GoalTasks = {} +} + +--- @type MISSION.Clients +-- @list + +function MISSION:Meta() + + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + return self +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. +-- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. +-- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. +-- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... +-- @return MISSION +-- @usage +-- -- Declare a few missions. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) +function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) + + self = MISSION:Meta() + self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) + + local Valid = true + + Valid = routines.ValidateString( MissionName, "MissionName", Valid ) + Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) + Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) + Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) + + if Valid then + self.Name = MissionName + self.MissionPriority = MissionPriority + self.MissionBriefing = MissionBriefing + self.MissionCoalition = MissionCoalition + end + + return self +end + +--- Returns if a Mission has completed. +-- @return bool +function MISSION:IsCompleted() + self:F() + return self.MissionStatus == "ACCOMPLISHED" +end + +--- Set a Mission to completed. +function MISSION:Completed() + self:F() + self.MissionStatus = "ACCOMPLISHED" + self:StatusToClients() +end + +--- Returns if a Mission is ongoing. +-- treturn bool +function MISSION:IsOngoing() + self:F() + return self.MissionStatus == "ONGOING" +end + +--- Set a Mission to ongoing. +function MISSION:Ongoing() + self:F() + self.MissionStatus = "ONGOING" + --self:StatusToClients() +end + +--- Returns if a Mission is pending. +-- treturn bool +function MISSION:IsPending() + self:F() + return self.MissionStatus == "PENDING" +end + +--- Set a Mission to pending. +function MISSION:Pending() + self:F() + self.MissionStatus = "PENDING" + self:StatusToClients() +end + +--- Returns if a Mission has failed. +-- treturn bool +function MISSION:IsFailed() + self:F() + return self.MissionStatus == "FAILED" +end + +--- Set a Mission to failed. +function MISSION:Failed() + self:F() + self.MissionStatus = "FAILED" + self:StatusToClients() +end + +--- Send the status of the MISSION to all Clients. +function MISSION:StatusToClients() + self:F() + if self.MissionReportFlash then + for ClientID, Client in pairs( self._Clients ) do + Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") + end + end +end + +--- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. +function MISSION:ReportTrigger() + self:F() + + if self.MissionReportShow == true then + self.MissionReportShow = false + return true + else + if self.MissionReportFlash == true then + if timer.getTime() >= self.MissionReportTrigger then + self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval + return true + else + return false + end + else + return false + end + end +end + +--- Report the status of all MISSIONs to all active Clients. +function MISSION:ReportToAll() + self:F() + + local AlivePlayers = '' + for ClientID, Client in pairs( self._Clients ) do + if Client:GetDCSGroup() then + if Client:GetClientGroupDCSUnit() then + if Client:GetClientGroupDCSUnit():getLife() > 0.0 then + if AlivePlayers == '' then + AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() + else + AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() + end + end + end + end + end + local Tasks = self:GetTasks() + local TaskText = "" + for TaskID, TaskData in pairs( Tasks ) do + TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" + end + MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), 10, "Mission Command: Mission Report" ):ToAll() +end + + +--- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. +-- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. +-- @usage +-- PatriotActivation = { +-- { "US SAM Patriot Zerti", false }, +-- { "US SAM Patriot Zegduleti", false }, +-- { "US SAM Patriot Gvleti", false } +-- } +-- +-- function DeployPatriotTroopsGoal( Mission, Client ) +-- +-- +-- -- Check if the cargo is all deployed for mission success. +-- for CargoID, CargoData in pairs( Mission._Cargos ) do +-- if Group.getByName( CargoData.CargoGroupName ) then +-- CargoGroup = Group.getByName( CargoData.CargoGroupName ) +-- if CargoGroup then +-- -- Check if the cargo is ready to activate +-- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon +-- if CurrentLandingZoneID then +-- if PatriotActivation[CurrentLandingZoneID][2] == false then +-- -- Now check if this is a new Mission Task to be completed... +-- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) +-- PatriotActivation[CurrentLandingZoneID][2] = true +-- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) +-- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) +-- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. +-- end +-- end +-- end +-- end +-- end +-- end +-- +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) +function MISSION:AddGoalFunction( GoalFunction ) + self:F() + self.GoalFunction = GoalFunction +end + +--- Register a new @{CLIENT} to participate within the mission. +-- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. +-- @return CLIENT +-- @usage +-- Add a number of Client objects to the Mission. +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +function MISSION:AddClient( Client ) + self:F( { Client } ) + + local Valid = true + + if Valid then + self._Clients[Client.ClientName] = Client + end + + return Client +end + +--- Find a @{CLIENT} object within the @{MISSION} by its ClientName. +-- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. +-- @return CLIENT +-- @usage +-- -- Seach for Client "Bomber" within the Mission. +-- local BomberClient = Mission:FindClient( "Bomber" ) +function MISSION:FindClient( ClientName ) + self:F( { self._Clients[ClientName] } ) + return self._Clients[ClientName] +end + + +--- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. +-- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. +-- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. +-- @return TASK +-- @usage +-- -- Define a few tasks for the Mission. +-- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } +-- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } +-- +-- -- Assign the Pickup Task +-- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) +-- PickupTask:AddSmokeBlue( PickupSignalUnits ) +-- PickupTask:SetGoalTotal( 3 ) +-- Mission:AddTask( PickupTask, 1 ) +-- +-- -- Assign the Deploy Task +-- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } +-- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } +-- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) +-- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) +-- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) +-- DeployTask:SetGoalTotal( 3 ) +-- DeployTask:SetGoalTotal( 3, "Patriots activated" ) +-- Mission:AddTask( DeployTask, 2 ) + +function MISSION:AddTask( Task, TaskNumber ) + self:F() + + self._Tasks[TaskNumber] = Task + self._Tasks[TaskNumber]:EnableEvents() + self._Tasks[TaskNumber].ID = TaskNumber + + return Task + end + +--- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. +-- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. +-- @return TASK +-- @usage +-- -- Get Task 2 from the Mission. +-- Task2 = Mission:GetTask( 2 ) + +function MISSION:GetTask( TaskNumber ) + self:F() + + local Valid = true + + local Task = nil + + if type(TaskNumber) ~= "number" then + Valid = false + end + + if Valid then + Task = self._Tasks[TaskNumber] + end + + return Task +end + +--- Get all the TASKs from the Mission. This function is useful in GoalFunctions. +-- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. +-- @usage +-- -- Get Tasks from the Mission. +-- Tasks = Mission:GetTasks() +-- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) +function MISSION:GetTasks() + self:F() + + return self._Tasks +end + + +--[[ + _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. + + - _TransportExecuteStage.EXECUTING + - _TransportExecuteStage.SUCCESS + - _TransportExecuteStage.FAILED + +--]] +_TransportExecuteStage = { + NONE = 0, + EXECUTING = 1, + SUCCESS = 2, + FAILED = 3 +} + + +--- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. +-- @type MISSIONSCHEDULER +-- @field #MISSIONSCHEDULER.MISSIONS Missions +MISSIONSCHEDULER = { + Missions = {}, + MissionCount = 0, + TimeIntervalCount = 0, + TimeIntervalShow = 150, + TimeSeconds = 14400, + TimeShow = 5 +} + +--- @type MISSIONSCHEDULER.MISSIONS +-- @list <#MISSION> Mission + +--- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. +function MISSIONSCHEDULER.Scheduler() + + + -- loop through the missions in the TransportTasks + for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do + + local Mission = MissionData -- #MISSION + + if not Mission:IsCompleted() then + + -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). + local ClientsAlive = false + + for ClientID, ClientData in pairs( Mission._Clients ) do + + local Client = ClientData -- Client#CLIENT + + if Client:IsAlive() then + + -- There is at least one Client that is alive... So the Mission status is set to Ongoing. + ClientsAlive = true + + -- If this Client was not registered as Alive before: + -- 1. We register the Client as Alive. + -- 2. We initialize the Client Tasks and make a link to the original Mission Task. + -- 3. We initialize the Cargos. + -- 4. We flag the Mission as Ongoing. + if not Client.ClientAlive then + Client.ClientAlive = true + Client.ClientBriefingShown = false + for TaskNumber, Task in pairs( Mission._Tasks ) do + -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! + Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) + -- Each MissionTask must point to the original Mission. + Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] + Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos + Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones + end + + Mission:Ongoing() + end + + + -- For each Client, check for each Task the state and evolve the mission. + -- This flag will indicate if the Task of the Client is Complete. + local TaskComplete = false + + for TaskNumber, Task in pairs( Client._Tasks ) do + + if not Task.Stage then + Task:SetStage( 1 ) + end + + + local TransportTime = timer.getTime() + + if not Task:IsDone() then + + if Task:Goal() then + Task:ShowGoalProgress( Mission, Client ) + end + + --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) + + -- Action + if Task:StageExecute() then + Task.Stage:Execute( Mission, Client, Task ) + end + + -- Wait until execution is finished + if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then + Task.Stage:Executing( Mission, Client, Task ) + end + + -- Validate completion or reverse to earlier stage + if Task.Time + Task.Stage.WaitTime <= TransportTime then + Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) + end + + if Task:IsDone() then + --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + TaskComplete = true -- when a task is not yet completed, a mission cannot be completed + + else + -- break only if this task is not yet done, so that future task are not yet activated. + TaskComplete = false -- when a task is not yet completed, a mission cannot be completed + --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + break + end + + if TaskComplete then + + if Mission.GoalFunction ~= nil then + Mission.GoalFunction( Mission, Client ) + end + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) + end + +-- if not Mission:IsCompleted() then +-- end + end + end + end + + local MissionComplete = true + for TaskNumber, Task in pairs( Mission._Tasks ) do + if Task:Goal() then +-- Task:ShowGoalProgress( Mission, Client ) + if Task:IsGoalReached() then + else + MissionComplete = false + end + else + MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. + end + end + + if MissionComplete then + Mission:Completed() + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) + end + else + if TaskComplete then + -- Reset for new tasking of active client + Client.ClientAlive = false -- Reset the client tasks. + end + end + + + else + if Client.ClientAlive then + env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) + Client.ClientAlive = false + + -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. + -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... + --Client._Tasks[TaskNumber].MissionTask = nil + --Client._Tasks = nil + end + end + end + + -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. + -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. + if ClientsAlive == false then + if Mission:IsOngoing() then + -- Mission status back to pending... + Mission:Pending() + end + end + end + + Mission:StatusToClients() + + if Mission:ReportTrigger() then + Mission:ReportToAll() + end + end + + return true +end + +--- Start the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Start() + if MISSIONSCHEDULER ~= nil then + --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + end +end + +--- Stop the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Stop() + if MISSIONSCHEDULER.SchedulerId then + routines.removeFunction(MISSIONSCHEDULER.SchedulerId) + MISSIONSCHEDULER.SchedulerId = nil + end +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param Mission is the MISSION object instantiated by @{MISSION:New}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +function MISSIONSCHEDULER.AddMission( Mission ) + MISSIONSCHEDULER.Missions[Mission.Name] = Mission + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 + -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. + --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) + + return Mission +end + +--- Remove a MISSION from the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now remove the Mission. +-- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.RemoveMission( MissionName ) + MISSIONSCHEDULER.Missions[MissionName] = nil + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 +end + +--- Find a MISSION within the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now find the Mission. +-- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.FindMission( MissionName ) + return MISSIONSCHEDULER.Missions[MissionName] +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsShow( ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = true + Mission.MissionReportFlash = false + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) + local Count = 0 + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = true + Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval + Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval + env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) + Count = Count + 1 + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsHide( Prm ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = false + end +end + +--- Enables a MENU option in the communications menu under F10 to control the status of the active missions. +-- This function should be called only once when starting the MISSIONSCHEDULER. +function MISSIONSCHEDULER.ReportMenu() + local ReportMenu = SUBMENU:New( 'Status' ) + local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) + local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) + local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) +end + +--- Show the remaining mission time. +function MISSIONSCHEDULER:TimeShow() + self.TimeIntervalCount = self.TimeIntervalCount + 1 + if self.TimeIntervalCount >= self.TimeTriggerShow then + local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' + MESSAGE:New( TimeMsg, self.TimeShow, "Mission time" ):ToAll() + self.TimeIntervalCount = 0 + end +end + +function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) + + self.TimeIntervalCount = 0 + self.TimeSeconds = TimeSeconds + self.TimeIntervalShow = TimeIntervalShow + self.TimeShow = TimeShow +end + +--- Adds a mission scoring to the game. +function MISSIONSCHEDULER:Scoring( Scoring ) + + self.Scoring = Scoring +end + +--- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. +-- @module CleanUp +-- @author Flightcontrol + + + + + + + +--- The CLEANUP class. +-- @type CLEANUP +-- @extends Base#BASE +CLEANUP = { + ClassName = "CLEANUP", + ZoneNames = {}, + TimeInterval = 300, + CleanUpList = {}, +} + +--- Creates the main object which is handling the cleaning of the debris within the given Zone Names. +-- @param #CLEANUP self +-- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. +-- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. +-- @return #CLEANUP +-- @usage +-- -- Clean these Zones. +-- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) +-- or +-- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) +-- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) +function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { ZoneNames, TimeInterval } ) + + if type( ZoneNames ) == 'table' then + self.ZoneNames = ZoneNames + else + self.ZoneNames = { ZoneNames } + end + if TimeInterval then + self.TimeInterval = TimeInterval + end + + _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) + + --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) + + return self +end + + +--- Destroys a group from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSGroup#Group GroupObject The object to be destroyed. +-- @param #string CleanUpGroupName The groupname... +function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) + self:F( { GroupObject, CleanUpGroupName } ) + + if GroupObject then -- and GroupObject:isExist() then + trigger.action.deactivateGroup(GroupObject) + self:T( { "GroupObject Destroyed", GroupObject } ) + end +end + +--- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. +-- @param #string CleanUpUnitName The Unit name ... +function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + if CleanUpUnit then + local CleanUpGroup = Unit.getGroup(CleanUpUnit) + -- TODO Client bug in 1.5.3 + if CleanUpGroup and CleanUpGroup:isExist() then + local CleanUpGroupUnits = CleanUpGroup:getUnits() + if #CleanUpGroupUnits == 1 then + local CleanUpGroupName = CleanUpGroup:getName() + --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) + CleanUpGroup:destroy() + self:T( { "Destroyed Group:", CleanUpGroupName } ) + else + CleanUpUnit:destroy() + self:T( { "Destroyed Unit:", CleanUpUnitName } ) + end + self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list + CleanUpUnit = nil + end + end +end + +-- TODO check DCSTypes#Weapon +--- Destroys a missile from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSTypes#Weapon MissileObject +function CLEANUP:_DestroyMissile( MissileObject ) + self:F( { MissileObject } ) + + if MissileObject and MissileObject:isExist() then + MissileObject:destroy() + self:T( "MissileObject Destroyed") + end +end + +function CLEANUP:_OnEventBirth( Event ) + self:F( { Event } ) + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + + _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) + + --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) + --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) +-- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) +-- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) +-- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) +-- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) +-- +-- self:EnableEvents() + + +end + +--- Detects if a crash event occurs. +-- Crashed units go into a CleanUpList for removal. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventCrash( Event ) + self:F( { Event } ) + + --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. + -- self:T("before getGroup") + -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired + -- self:T("after getGroup") + -- _grp:destroy() + -- self:T("after deactivateGroup") + -- event.initiator:destroy() + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + +end + +--- Detects if a unit shoots a missile. +-- If this occurs within one of the zones, then the weapon used must be destroyed. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventShot( Event ) + self:F( { Event } ) + + -- Test if the missile was fired within one of the CLEANUP.ZoneNames. + local CurrentLandingZoneID = 0 + CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) + if ( CurrentLandingZoneID ) then + -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. + --_SEADmissile:destroy() + --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) + end +end + + +--- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventHitCleanUp( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) + if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) + end + end + end + + if Event.TgtDCSUnit then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) + if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) + end + end + end +end + +--- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. +function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + self.CleanUpList[CleanUpUnitName] = {} + self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit + self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName + self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) + self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() + self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() + self.CleanUpList[CleanUpUnitName].CleanUpMoved = false + + self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) + +end + +--- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventAddForCleanUp( Event ) + + if Event.IniDCSUnit then + if self.CleanUpList[Event.IniDCSUnitName] == nil then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) + end + end + end + + if Event.TgtDCSUnit then + if self.CleanUpList[Event.TgtDCSUnitName] == nil then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) + end + end + end + +end + +local CleanUpSurfaceTypeText = { + "LAND", + "SHALLOW_WATER", + "WATER", + "ROAD", + "RUNWAY" + } + +--- At the defined time interval, CleanUp the Groups within the CleanUpList. +-- @param #CLEANUP self +function CLEANUP:_CleanUpScheduler() + self:F( { "CleanUp Scheduler" } ) + + local CleanUpCount = 0 + for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do + CleanUpCount = CleanUpCount + 1 + + self:T( { CleanUpUnitName, UnitData } ) + local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) + local CleanUpGroupName = UnitData.CleanUpGroupName + local CleanUpUnitName = UnitData.CleanUpUnitName + if CleanUpUnit then + self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) + if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then + local CleanUpUnitVec3 = CleanUpUnit:getPoint() + --self:T( CleanUpUnitVec3 ) + local CleanUpUnitVec2 = {} + CleanUpUnitVec2.x = CleanUpUnitVec3.x + CleanUpUnitVec2.y = CleanUpUnitVec3.z + --self:T( CleanUpUnitVec2 ) + local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) + --self:T( CleanUpSurfaceType ) + + if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then + if CleanUpSurfaceType == land.SurfaceType.RUNWAY then + if CleanUpUnit:inAir() then + local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) + local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight + self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) + if CleanUpUnitHeight < 30 then + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + else + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + end + -- Clean Units which are waiting for a very long time in the CleanUpZone. + if CleanUpUnit then + local CleanUpUnitVelocity = CleanUpUnit:getVelocity() + local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) + if CleanUpUnitVelocityTotal < 1 then + if UnitData.CleanUpMoved then + if UnitData.CleanUpTime + 180 <= timer.getTime() then + self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + else + UnitData.CleanUpTime = timer.getTime() + UnitData.CleanUpMoved = true + end + end + + else + -- Do nothing ... + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + else + self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + end + self:T(CleanUpCount) + + return true +end + +--- This module contains the SPAWN class. +-- +-- 1) @{Spawn#SPAWN} class, extends @{Base#BASE} +-- ============================================= +-- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. +-- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. +-- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. +-- +-- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. +-- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. +-- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. +-- +-- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. +-- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. +-- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. +-- Groups will follow the following naming structure when spawned at run-time: +-- +-- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. +-- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. +-- +-- Some additional notes that need to be remembered: +-- +-- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. +-- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. +-- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. +-- +-- 1.1) SPAWN construction methods +-- ------------------------------- +-- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: +-- +-- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. +-- +-- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. +-- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. +-- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. +-- +-- 1.2) SPAWN initialization methods +-- --------------------------------- +-- A spawn object will behave differently based on the usage of initialization methods: +-- +-- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. +-- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. +-- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. +-- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. +-- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. +-- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. +-- +-- 1.3) SPAWN spawning methods +-- --------------------------- +-- Groups can be spawned at different times and methods: +-- +-- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. +-- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. +-- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. +-- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. +-- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. +-- +-- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. +-- You can use the @{GROUP} object to do further actions with the DCSGroup. +-- +-- 1.4) SPAWN object cleaning +-- -------------------------- +-- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. +-- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, +-- and it may occur that no new groups are or can be spawned as limits are reached. +-- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. +-- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. +-- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... +-- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. +-- This models AI that has succesfully returned to their airbase, to restart their combat activities. +-- Check the @{#SPAWN.CleanUp} for further info. +-- +-- +-- @module Spawn +-- @author FlightControl + +--- SPAWN Class +-- @type SPAWN +-- @extends Base#BASE +-- @field ClassName +-- @field #string SpawnTemplatePrefix +-- @field #string SpawnAliasPrefix +SPAWN = { + ClassName = "SPAWN", + SpawnTemplatePrefix = nil, + SpawnAliasPrefix = nil, +} + + + +--- Creates the main object to spawn a GROUP defined in the DCS ME. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) +-- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. +function SPAWN:New( SpawnTemplatePrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + +--- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. +-- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) +-- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. +function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnAliasPrefix = SpawnAliasPrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + + +--- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. +-- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. +-- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... +-- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. +-- @param #SPAWN self +-- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. +-- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. +-- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. +-- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. +-- -- There will be maximum 24 groups spawned during the whole mission lifetime. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) +function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) + self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) + + self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_InitializeSpawnGroups( SpawnGroupID ) + end + + return self +end + + +--- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. +-- @param #SPAWN self +-- @param #number SpawnStartPoint is the waypoint where the randomization begins. +-- Note that the StartPoint = 0 equaling the point where the group is spawned. +-- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. +-- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. +-- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). +-- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. +-- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) +function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) + self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) + + self.SpawnRandomizeRoute = true + self.SpawnRandomizeRouteStartPoint = SpawnStartPoint + self.SpawnRandomizeRouteEndPoint = SpawnEndPoint + self.SpawnRandomizeRouteRadius = SpawnRadius + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + + +--- This function is rather complicated to understand. But I'll try to explain. +-- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, +-- but they will all follow the same Template route and have the same prefix name. +-- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. +-- @return #SPAWN +-- @usage +-- -- NATO Tank Platoons invading Gori. +-- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the +-- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. +-- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and +-- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. +-- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', +-- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', +-- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } +-- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) + self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) + + self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable + self.SpawnRandomizeTemplate = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_RandomizeTemplate( SpawnGroupID ) + end + + return self +end + + + + + +--- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. +-- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. +-- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... +-- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. +-- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... +-- @param #SPAWN self +-- @return #SPAWN self +-- @usage +-- -- RU Su-34 - AI Ship Attack +-- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. +-- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() +function SPAWN:InitRepeat() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + self.Repeat = true + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + +--- Respawn group after landing. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnLanding() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + + +--- Respawn after landing when its engines have shut down. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnEngineShutDown() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = true + self.RepeatOnLanding = false + + return self +end + + +--- CleanUp groups when they are still alive, but inactive. +-- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. +-- @param #SPAWN self +-- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. +-- @return #SPAWN self +-- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. +function SPAWN:CleanUp( SpawnCleanUpInterval ) + self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) + + self.SpawnCleanUpInterval = SpawnCleanUpInterval + self.SpawnCleanUpTimeStamps = {} + --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) + return self +end + + + +--- Makes the groups visible before start (like a batallion). +-- The method will take the position of the group as the first position in the array. +-- @param #SPAWN self +-- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. +-- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. +-- @param #number SpawnDeltaX The space between each Group on the X-axis. +-- @param #number SpawnDeltaY The space between each Group on the Y-axis. +-- @return #SPAWN self +-- @usage +-- -- Define an array of Groups. +-- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) +function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) + self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) + + self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. + + local SpawnX = 0 + local SpawnY = 0 + local SpawnXIndex = 0 + local SpawnYIndex = 0 + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) + + self.SpawnGroups[SpawnGroupID].Visible = true + self.SpawnGroups[SpawnGroupID].Spawned = false + + SpawnXIndex = SpawnXIndex + 1 + if SpawnWidth and SpawnWidth ~= 0 then + if SpawnXIndex >= SpawnWidth then + SpawnXIndex = 0 + SpawnYIndex = SpawnYIndex + 1 + end + end + + local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x + local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y + + self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + + self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true + self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true + + self.SpawnGroups[SpawnGroupID].Visible = true + + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) + + SpawnX = SpawnXIndex * SpawnDeltaX + SpawnY = SpawnYIndex * SpawnDeltaY + end + + return self +end + + + +--- Will spawn a group based on the internal index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:Spawn() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + return self:SpawnWithIndex( self.SpawnIndex + 1 ) +end + +--- Will re-spawn a group based on a given index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnIndex The index of the group to be spawned. +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:ReSpawn( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + +-- TODO: This logic makes DCS crash and i don't know why (yet). + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup then + local SpawnDCSGroup = SpawnGroup:GetDCSGroup() + if SpawnDCSGroup then + SpawnGroup:Destroy() + end + end + + return self:SpawnWithIndex( SpawnIndex ) +end + +--- Will spawn a group with a specified index number. +-- Uses @{DATABASE} global object defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:SpawnWithIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) + + if self:_GetSpawnIndex( SpawnIndex ) then + + if self.SpawnGroups[self.SpawnIndex].Visible then + self.SpawnGroups[self.SpawnIndex].Group:Activate() + else + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + -- If there is a SpawnFunction hook defined, call it. + if self.SpawnFunctionHook then + self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) + end + -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. + --if self.Repeat then + -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) + --end + end + + self.SpawnGroups[self.SpawnIndex].Spawned = true + return self.SpawnGroups[self.SpawnIndex].Group + else + --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) + end + + return nil +end + +--- Spawns new groups at varying time intervals. +-- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. +-- @param #SPAWN self +-- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. +-- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. +-- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. +-- -- The time variation in this case will be between 450 seconds and 750 seconds. +-- -- This is calculated as follows: +-- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 +-- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 +-- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) +function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) + self:F( { SpawnTime, SpawnTimeVariation } ) + + if SpawnTime ~= nil and SpawnTimeVariation ~= nil then + self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) + end + + return self +end + +--- Will re-start the spawning scheduler. +-- Note: This function is only required to be called when the schedule was stopped. +function SPAWN:SpawnScheduleStart() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Start() +end + +--- Will stop the scheduled spawning scheduler. +function SPAWN:SpawnScheduleStop() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Stop() +end + + +--- Allows to place a CallFunction hook when a new group spawns. +-- The provided function will be called when a new group is spawned, including its given parameters. +-- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. +-- @param #SPAWN self +-- @param #function SpawnFunctionHook The function to be called when a group spawns. +-- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. +-- @return #SPAWN +function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) + self:F( SpawnFunction ) + + self.SpawnFunctionHook = SpawnFunctionHook + self.SpawnFunctionArguments = {} + if arg then + self.SpawnFunctionArguments = arg + end + + return self +end + + + + +--- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. +-- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. +-- You can use the returned group to further define the route to be followed. +-- @param #SPAWN self +-- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. +-- @param #number OuterRadius The outer radius in meters where the new group will be spawned. +-- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) + + if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local UnitPoint = HostUnit:GetPointVec2() + + self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) + + --for PointID, Point in pairs( SpawnTemplate.route.points ) do + --Point.x = UnitPoint.x + --Point.y = UnitPoint.y + --Point.alt = nil + --Point.alt_type = nil + --end + + SpawnTemplate.route.points[1].x = UnitPoint.x + SpawnTemplate.route.points[1].y = UnitPoint.y + + if not InnerRadius then + InnerRadius = 10 + end + + if not OuterRadius then + OuterRadius = 50 + end + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + if InnerRadius == 0 then + SpawnTemplate.units[UnitID].x = UnitPoint.x + SpawnTemplate.units[UnitID].y = UnitPoint.y + else + local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + SpawnTemplate.units[UnitID].x = CirclePos.x + SpawnTemplate.units[UnitID].y = CirclePos.y + end + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + local Point = {} + Point.type = "Turning Point" + Point.x = SpawnPos.x + Point.y = SpawnPos.y + Point.action = "Cone" + Point.speed = 5 + + table.insert( SpawnTemplate.route.points, 2, Point ) + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + +--- Will spawn a Group within a given @{Zone#ZONE}. +-- Once the group is spawned within the zone, it will continue on its route. +-- The first waypoint (where the group is spawned) is replaced with the zone coordinates. +-- @param #SPAWN self +-- @param Zone#ZONE Zone The zone where the group is to be spawned. +-- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil when nothing was spawned. +function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) + + if Zone then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local ZonePoint + + if ZoneRandomize == true then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + SpawnTemplate.route.points[1].x = ZonePoint.x + SpawnTemplate.route.points[1].y = ZonePoint.y + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + local ZonePointUnit = Zone:GetRandomPointVec2() + SpawnTemplate.units[UnitID].x = ZonePointUnit.x + SpawnTemplate.units[UnitID].y = ZonePointUnit.y + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + + + + +--- Will spawn a plane group in uncontrolled mode... +-- This will be similar to the uncontrolled flag setting in the ME. +-- @return #SPAWN self +function SPAWN:UnControlled() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnUnControlled = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self.SpawnGroups[SpawnGroupID].UnControlled = true + end + + return self +end + + + +--- Will return the SpawnGroupName either with with a specific count number or without any count. +-- @param #SPAWN self +-- @param #number SpawnIndex Is the number of the Group that is to be spawned. +-- @return #string SpawnGroupName +function SPAWN:SpawnGroupName( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + local SpawnPrefix = self.SpawnTemplatePrefix + if self.SpawnAliasPrefix then + SpawnPrefix = self.SpawnAliasPrefix + end + + if SpawnIndex then + local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) + self:T( SpawnName ) + return SpawnName + else + self:T( SpawnPrefix ) + return SpawnPrefix + end + +end + +--- Find the first alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the index from where to find the first group from. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetFirstAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + for SpawnIndex = 1, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + + +--- Find the next alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the last found previous index. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetNextAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + SpawnCursor = SpawnCursor + 1 + for SpawnIndex = SpawnCursor, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + +--- Find the last alive group during runtime. +function SPAWN:GetLastAliveGroup() + self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) + + self.SpawnIndex = self:_GetLastIndex() + for SpawnIndex = self.SpawnIndex, 1, -1 do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + self.SpawnIndex = SpawnIndex + return SpawnGroup + end + end + + self.SpawnIndex = nil + return nil +end + + + +--- Get the group from an index. +-- Returns the group from the SpawnGroups list. +-- If no index is given, it will return the first group in the list. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to return. +-- @return Group#GROUP self +function SPAWN:GetGroupFromIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + + if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then + local SpawnGroup = self.SpawnGroups[SpawnIndex].Group + return SpawnGroup + else + return nil + end +end + +--- Get the group index from a DCSUnit. +-- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) + self:T( IndexString ) + + if IndexString then + local Index = tonumber( IndexString ) + self:T( { "Index:", IndexString, Index } ) + return Index + end + end + + return nil +end + +--- Return the prefix of a DCSUnit. +-- The method will search for a #-mark, and will return the text before the #-mark. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) + if SpawnPrefix then + SpawnPrefix = SpawnPrefix:sub( 1, -2 ) + end + self:T( SpawnPrefix ) + return SpawnPrefix + end + + return nil +end + +--- Return the group within the SpawnGroups collection with input a DCSUnit. +function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit then + local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) + + if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then + local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) + local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group + self:T( SpawnGroup ) + return SpawnGroup + end + end + + return nil +end + + +--- Get the index from a given group. +-- The function will search the name of the group for a #, and will return the number behind the #-mark. +function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) + + local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) + local Index = tonumber( IndexString ) + + self:T( IndexString, Index ) + return Index + +end + +--- Return the last maximum index that can be used. +function SPAWN:_GetLastIndex() + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + return self.SpawnMaxGroups +end + +--- Initalize the SpawnGroups collection. +function SPAWN:_InitializeSpawnGroups( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not self.SpawnGroups[SpawnIndex] then + self.SpawnGroups[SpawnIndex] = {} + self.SpawnGroups[SpawnIndex].Visible = false + self.SpawnGroups[SpawnIndex].Spawned = false + self.SpawnGroups[SpawnIndex].UnControlled = false + self.SpawnGroups[SpawnIndex].SpawnTime = 0 + + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + end + + self:_RandomizeTemplate( SpawnIndex ) + self:_RandomizeRoute( SpawnIndex ) + --self:_TranslateRotate( SpawnIndex ) + + return self.SpawnGroups[SpawnIndex] +end + + + +--- Gets the CategoryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCategoryID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCategory() + else + return nil + end +end + +--- Gets the CoalitionID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCoalition() + else + return nil + end +end + +--- Gets the CountryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCountryID( SpawnPrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) + + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + local TemplateUnits = TemplateGroup:getUnits() + return TemplateUnits[1]:getCountry() + else + return nil + end +end + +--- Gets the Group Template from the ME environment definition. +-- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @return @SPAWN self +function SPAWN:_GetTemplate( SpawnTemplatePrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) + + local SpawnTemplate = nil + + SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) + + if SpawnTemplate == nil then + error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) + end + + SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) + + self:T( { SpawnTemplate } ) + return SpawnTemplate +end + +--- Prepares the new Group Template. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) + SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) + + SpawnTemplate.groupId = nil + --SpawnTemplate.lateActivation = false + SpawnTemplate.lateActivation = false -- TODO BUGFIX + + if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then + self:T( "For ground units, visible needs to be false..." ) + SpawnTemplate.visible = false -- TODO BUGFIX + end + + if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then + SpawnTemplate.uncontrolled = false + end + + for UnitID = 1, #SpawnTemplate.units do + SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) + SpawnTemplate.units[UnitID].unitId = nil + SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x + SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y + end + + self:T( { "Template:", SpawnTemplate } ) + return SpawnTemplate + +end + +--- Private method randomizing the routes. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to be spawned. +-- @return #SPAWN +function SPAWN:_RandomizeRoute( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) + + if self.SpawnRandomizeRoute then + local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate + local RouteCount = #SpawnTemplate.route.points + + for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do + SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + -- TODO: manage altitude for airborne units ... + SpawnTemplate.route.points[t].alt = nil + --SpawnGroup.route.points[t].alt_type = nil + self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) + end + end + + return self +end + +--- Private method that randomizes the template of the group. +-- @param #SPAWN self +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_RandomizeTemplate( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeTemplate } ) + + if self.SpawnRandomizeTemplate then + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y + self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time + for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading + end + end + + self:_RandomizeRoute( SpawnIndex ) + + return self +end + +function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY + + -- Rotate + -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations + -- x' = x \cos \theta - y \sin \theta\ + -- y' = x \sin \theta + y \cos \theta\ + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY + + + local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) + for u = 1, SpawnUnitCount do + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY - 10 * ( u - 1 ) + + -- Rotate + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) + end + + return self +end + +--- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. +function SPAWN:_GetSpawnIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) + + + if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then + if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then + if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then + self.SpawnCount = self.SpawnCount + 1 + SpawnIndex = self.SpawnCount + end + self.SpawnIndex = SpawnIndex + if not self.SpawnGroups[self.SpawnIndex] then + self:_InitializeSpawnGroups( self.SpawnIndex ) + end + else + return nil + end + else + return nil + end + + return self.SpawnIndex +end + + +-- TODO Need to delete this... _DATABASE does this now ... +function SPAWN:_OnBirth( event ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Birth event: " .. event.initiator:getName(), event } ) + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits + 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end + end + +end + +--- Obscolete +-- @todo Need to delete this... _DATABASE does this now ... +function SPAWN:_OnDeadOrCrash( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Dead event: " .. event.initiator:getName(), event } ) +-- local DestroyedUnit = Unit.getByName( EventPrefix ) +-- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits - 1 + self:T( "Alive Units: " .. self.AliveUnits ) +-- end + end + end +end + +--- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... +-- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnTakeOff( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) + if SpawnGroup then + self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) + self:T( "self.Landed = false" ) + self.Landed = false + end + end +end + +--- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. +-- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnLand( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) + self.Landed = true + self:T( "self.Landed = true" ) + if self.Landed and self.RepeatOnLanding then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- Will detect AIR Units shutting down their engines ... +-- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. +-- But only when the Unit was registered to have landed. +-- @param #SPAWN self +-- @see _OnTakeOff +-- @see _OnLand +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnEngineShutDown( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) + if self.Landed and self.RepeatOnEngineShutDown then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- This function is called automatically by the Spawning scheduler. +-- It is the internal worker method SPAWNing new Groups on the defined time intervals. +function SPAWN:_Scheduler() + self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) + + -- Validate if there are still groups left in the batch... + self:Spawn() + + return true +end + +function SPAWN:_SpawnCleanUpScheduler() + self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) + + local SpawnCursor + local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + while SpawnGroup do + + if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then + if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() + else + if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then + self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) + SpawnGroup:Destroy() + end + end + else + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil + end + + SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + end + + return true -- Repeat + +end +--- Limit the simultaneous movement of Groups within a running Mission. +-- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. +-- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if +-- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units +-- on defined intervals (currently every minute). +-- @module MOVEMENT + +--- the MOVEMENT class +-- @type +MOVEMENT = { + ClassName = "MOVEMENT", +} + +--- Creates the main object which is handling the GROUND forces movement. +-- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. +-- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. +-- @return MOVEMENT +-- @usage +-- -- Limit the amount of simultaneous moving units on the ground to prevent lag. +-- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) + +function MOVEMENT:New( MovePrefixes, MoveMaximum ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MovePrefixes, MoveMaximum } ) + + if type( MovePrefixes ) == 'table' then + self.MovePrefixes = MovePrefixes + else + self.MovePrefixes = { MovePrefixes } + end + self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. + self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. + + _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) + +-- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) +-- +-- self:EnableEvents() + + self:ScheduleStart() + + return self +end + +--- Call this function to start the MOVEMENT scheduling. +function MOVEMENT:ScheduleStart() + self:F() + --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) + self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) +end + +--- Call this function to stop the MOVEMENT scheduling. +-- @todo need to implement it ... Forgot. +function MOVEMENT:ScheduleStop() + self:F() + +end + +--- Captures the birth events when new Units were spawned. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnBirth( Event ) + self:F( { Event } ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if Event.IniDCSUnit then + self:T( "Birth object : " .. Event.IniDCSUnitName ) + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits + 1 + self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName + self:T( self.AliveUnits ) + end + end + end + end + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + end + +end + +--- Captures the Dead or Crash events when Units crash or are destroyed. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnDeadOrCrash( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + self:T( "Dead object : " .. Event.IniDCSUnitName ) + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits - 1 + self.MoveUnits[Event.IniDCSUnitName] = nil + self:T( self.AliveUnits ) + end + end + end +end + +--- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. +function MOVEMENT:_Scheduler() + self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) + + if self.AliveUnits > 0 then + local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits + self:T( 'Move Probability = ' .. MoveProbability ) + + for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do + local MovementGroup = Group.getByName( MovementGroupName ) + if MovementGroup and MovementGroup:isExist() then + local MoveOrStop = math.random( 1, 100 ) + self:T( 'MoveOrStop = ' .. MoveOrStop ) + if MoveOrStop <= MoveProbability then + self:T( 'Group continues moving = ' .. MovementGroupName ) + trigger.action.groupContinueMoving( MovementGroup ) + else + self:T( 'Group stops moving = ' .. MovementGroupName ) + trigger.action.groupStopMoving( MovementGroup ) + end + else + self.MoveUnits[MovementUnitName] = nil + end + end + end + return true +end +--- Provides defensive behaviour to a set of SAM sites within a running Mission. +-- @module Sead +-- @author to be searched on the forum +-- @author (co) Flightcontrol (Modified and enriched with functionality) + +--- The SEAD class +-- @type SEAD +-- @extends Base#BASE +SEAD = { + ClassName = "SEAD", + TargetSkill = { + Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , + Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , + High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , + Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } + }, + SEADGroupPrefixes = {} +} + +--- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. +-- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... +-- Chances are big that the missile will miss. +-- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. +-- @return SEAD +-- @usage +-- -- CCCP SEAD Defenses +-- -- Defends the Russian SA installations from SEAD attacks. +-- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) +function SEAD:New( SEADGroupPrefixes ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( SEADGroupPrefixes ) + if type( SEADGroupPrefixes ) == 'table' then + for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do + self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix + end + else + self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes + end + _EVENTDISPATCHER:OnShot( self.EventShot, self ) + + return self +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @see SEAD +function SEAD:EventShot( Event ) + self:F( { Event } ) + + local SEADUnit = Event.IniDCSUnit + local SEADUnitName = Event.IniDCSUnitName + local SEADWeapon = Event.Weapon -- Identify the weapon fired + local SEADWeaponName = Event.WeaponName -- return weapon type + --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message + -- Start of the 2nd loop + self:T( "Missile Launched = " .. SEADWeaponName ) + if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD + local _evade = math.random (1,100) -- random number for chance of evading action + local _targetMim = Event.Weapon:getTarget() -- Identify target + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimgroupName = _targetMimgroup:getName() + local _targetMimcont= _targetMimgroup:getController() + local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill + self:T( self.SEADGroupPrefixes ) + self:T( _targetMimgroupName ) + local SEADGroupFound = false + for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do + if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then + SEADGroupFound = true + self:T( 'Group Found' ) + break + end + end + if SEADGroupFound == true then + if _targetskill == "Random" then -- when skill is random, choose a skill + local Skills = { "Average", "Good", "High", "Excellent" } + _targetskill = Skills[ math.random(1,4) ] + end + self:T( _targetskill ) -- debug message for skill check + if self.TargetSkill[_targetskill] then + if (_evade > self.TargetSkill[_targetskill].Evade) then + self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message + local _targetMim = Weapon.getTarget(SEADWeapon) + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimcont= _targetMimgroup:getController() + routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly + local SuppressedGroups1 = {} -- unit suppressed radar off for a random time + local function SuppressionEnd1(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + SuppressedGroups1[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) + if SuppressedGroups1[id.groupName] == nil then + SuppressedGroups1[id.groupName] = { + SuppressionEndTime1 = timer.getTime() + delay1, + SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function + } + Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) + end + + local SuppressedGroups = {} + local function SuppressionEnd(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) + SuppressedGroups[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) + if SuppressedGroups[id.groupName] == nil then + SuppressedGroups[id.groupName] = { + SuppressionEndTime = timer.getTime() + delay, + SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function + } + timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) + end + end + end + end + end +end +--- Taking the lead of AI escorting your flight. +-- +-- @{#ESCORT} class +-- ================ +-- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. +-- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). +-- +-- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. +-- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. +-- +-- RADIO MENUs that can be created: +-- ================================ +-- Find a summary below of the current available commands: +-- +-- Navigation ...: +-- --------------- +-- Escort group navigation functions: +-- +-- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. +-- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. +-- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. +-- +-- Hold position ...: +-- ------------------ +-- Escort group navigation functions: +-- +-- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- +-- Report targets ...: +-- ------------------- +-- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). +-- +-- * **"Report now":** Will report the current detected targets. +-- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. +-- * **"Report targets off":** Will stop detecting targets. +-- +-- Scan targets ...: +-- ----------------- +-- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. +-- +-- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. +-- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. +-- +-- Attack targets ...: +-- ------------------- +-- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. +-- +-- Request assistance from ...: +-- ---------------------------- +-- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. +-- This menu item allows to request attack support from other escorts supporting the current client group. +-- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. +-- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. +-- +-- ROE ...: +-- -------- +-- Sets the Rules of Engagement (ROE) of the escort group when in flight. +-- +-- * **"Hold Fire":** The escort group will hold fire. +-- * **"Return Fire":** The escort group will return fire. +-- * **"Open Fire":** The escort group will open fire on designated targets. +-- * **"Weapon Free":** The escort group will engage with any target. +-- +-- Evasion ...: +-- ------------ +-- Will define the evasion techniques that the escort group will perform during flight or combat. +-- +-- * **"Fight until death":** The escort group will have no reaction to threats. +-- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. +-- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. +-- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. +-- +-- Resume Mission ...: +-- ------------------- +-- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. +-- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. +-- +-- ESCORT construction methods. +-- ============================ +-- Create a new SPAWN object with the @{#ESCORT.New} method: +-- +-- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. +-- +-- ESCORT initialization methods. +-- ============================== +-- The following menus are created within the RADIO MENU of an active unit hosted by a player: +-- +-- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. +-- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. +-- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. +-- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. +-- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. +-- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. +-- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. +-- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. +-- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. +-- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. +-- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. +-- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. +-- +-- @module Escort +-- @author FlightControl + + + + + + + +--- +-- @type ESCORT +-- @extends Base#BASE +-- @field Client#CLIENT EscortClient +-- @field Group#GROUP EscortGroup +-- @field #string EscortName +-- @field #ESCORT.MODE EscortMode The mode the escort is in. +-- @field #number FollowScheduler The id of the _FollowScheduler function. +-- @field #boolean ReportTargets If true, nearby targets are reported. +-- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. +-- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. +-- @field Menu#MENU_CLIENT EscortMenuResumeMission +ESCORT = { + ClassName = "ESCORT", + EscortName = nil, -- The Escort Name + EscortClient = nil, + EscortGroup = nil, + EscortMode = nil, + MODE = { + FOLLOW = 1, + MISSION = 2, + }, + Targets = {}, -- The identified targets + FollowScheduler = nil, + ReportTargets = true, + OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, + OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, + TaskPoints = {} +} + +--- ESCORT.Mode class +-- @type ESCORT.MODE +-- @field #number FOLLOW +-- @field #number MISSION + +--- MENUPARAM type +-- @type MENUPARAM +-- @field #ESCORT ParamSelf +-- @field #Distance ParamDistance +-- @field #function ParamFunction +-- @field #string ParamMessage + +--- ESCORT class constructor for an AI group +-- @param #ESCORT self +-- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. +-- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. +-- @param #string EscortName Name of the escort. +-- @return #ESCORT self +function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { EscortClient, EscortGroup, EscortName } ) + + self.EscortClient = EscortClient -- Client#CLIENT + self.EscortGroup = EscortGroup -- Group#GROUP + self.EscortName = EscortName + self.EscortBriefing = EscortBriefing + + self:T( EscortGroup:GetClassNameAndID() ) + + -- Set EscortGroup known at EscortClient. + if not self.EscortClient._EscortGroups then + self.EscortClient._EscortGroups = {} + end + + if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then + self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName + self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} + self.EscortMode = ESCORT.MODE.FOLLOW + end + + + self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) + + self.EscortGroup:WayPointInitialize(1) + + self.EscortGroup:OptionROTVertical() + self.EscortGroup:OptionROEOpenFire() + + EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. + "We're escorting your flight. " .. + "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", + 60, EscortClient + ) + + return self +end + + +--- Defines the default menus +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:Menus() + self:F() + + self:MenuFollowAt( 100 ) + self:MenuFollowAt( 200 ) + self:MenuFollowAt( 300 ) + self:MenuFollowAt( 400 ) + + self:MenuScanForTargets( 100, 60 ) + + self:MenuHoldAtEscortPosition( 30 ) + self:MenuHoldAtLeaderPosition( 30 ) + + self:MenuFlare() + self:MenuSmoke() + + self:MenuReportTargets( 60 ) + self:MenuAssistedAttack() + self:MenuROE() + self:MenuEvasion() + self:MenuResumeMission() + + return self +end + + + +--- Defines a menu slot to let the escort Join and Follow you at a certain distance. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. +-- @return #ESCORT +function ESCORT:MenuFollowAt( Distance ) + self:F(Distance) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + if not self.EscortMenuJoinUpAndFollow then + self.EscortMenuJoinUpAndFollow = {} + end + + self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) + + self.EscortMode = ESCORT.MODE.FOLLOW + end + + return self +end + +--- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Hold position**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Hold at %d meter", Height ) + else + MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldPosition then + self.EscortMenuHoldPosition = {} + end + + self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortGroup, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + + +--- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Rejoin and hold at %d meter", Height ) + else + MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldAtLeaderPosition then + self.EscortMenuHoldAtLeaderPosition = {} + end + + self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortClient, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + +--- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. +-- This menu will appear under **Scan targets**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuScan then + self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) + end + + if not Height then + Height = 100 + end + + if not Seconds then + Seconds = 30 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "At %d meter", Height ) + else + MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuScanForTargets then + self.EscortMenuScanForTargets = {} + end + + self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuScan, + ESCORT._ScanTargets, + { ParamSelf = self, + ParamScanDuration = 30 + } + ) + end + + return self +end + + + +--- Defines a menu slot to let the escort disperse a flare in a certain color. +-- This menu will appear under **Navigation**. +-- The flare will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuFlare( MenuTextFormat ) + self:F() + + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Flare" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuFlare then + self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) + self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) + self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) + self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) + self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) + end + + return self +end + +--- Defines a menu slot to let the escort disperse a smoke in a certain color. +-- This menu will appear under **Navigation**. +-- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. +-- The smoke will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuSmoke( MenuTextFormat ) + self:F() + + if not self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Smoke" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuSmoke then + self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) + self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) + self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) + self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) + self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) + self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) + end + end + + return self +end + +--- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. +-- This menu will appear under **Report targets**. +-- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. +-- @param #ESCORT self +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. +-- @return #ESCORT +function ESCORT:MenuReportTargets( Seconds ) + self:F( { Seconds } ) + + if not self.EscortMenuReportNearbyTargets then + self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) + end + + if not Seconds then + Seconds = 30 + end + + -- Report Targets + self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) + self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) + self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) + + -- Attack Targets + self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) + + + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) + + return self +end + +--- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. +-- This menu will appear under **Request assistance from**. +-- Note that this method needs to be preceded with the method MenuReportTargets. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuAssistedAttack() + self:F() + + -- Request assistance from other escorts. + -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... + self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) + + return self +end + +--- Defines a menu to let the escort set its rules of engagement. +-- All rules of engagement will appear under the menu **ROE**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuROE( MenuTextFormat ) + self:F( MenuTextFormat ) + + if not self.EscortMenuROE then + -- Rules of Engagement + self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) + if self.EscortGroup:OptionROEHoldFirePossible() then + self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) + end + if self.EscortGroup:OptionROEReturnFirePossible() then + self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) + end + if self.EscortGroup:OptionROEOpenFirePossible() then + self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) + end + if self.EscortGroup:OptionROEWeaponFreePossible() then + self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) + end + end + + return self +end + + +--- Defines a menu to let the escort set its evasion when under threat. +-- All rules of engagement will appear under the menu **Evasion**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuEvasion( MenuTextFormat ) + self:F( MenuTextFormat ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuEvasion then + -- Reaction to Threats + self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) + if self.EscortGroup:OptionROTNoReactionPossible() then + self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) + end + if self.EscortGroup:OptionROTPassiveDefensePossible() then + self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) + end + if self.EscortGroup:OptionROTEvadeFirePossible() then + self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) + end + if self.EscortGroup:OptionROTVerticalPossible() then + self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) + end + end + end + + return self +end + +--- Defines a menu to let the escort resume its mission from a waypoint on its route. +-- All rules of engagement will appear under the menu **Resume mission from**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuResumeMission() + self:F() + + if not self.EscortMenuResumeMission then + -- Mission Resume Menu Root + self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) + end + + return self +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._HoldPosition( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP + local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT + local OrbitHeight = MenuParam.ParamHeight + local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet + + routines.removeFunction( self.FollowScheduler ) + + local PointFrom = {} + local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() + PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.speed = 250 + PointFrom.type = AI.Task.WaypointType.TURNING_POINT + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = AI.Task.AltitudeType.BARO + + local OrbitPoint = OrbitUnit:GetPointVec2() + local PointTo = {} + PointTo.x = OrbitPoint.x + PointTo.y = OrbitPoint.y + PointTo.speed = 250 + PointTo.type = AI.Task.WaypointType.TURNING_POINT + PointTo.alt = OrbitHeight + PointTo.alt_type = AI.Task.AltitudeType.BARO + PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) + + local Points = { PointFrom, PointTo } + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) + EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._JoinUpAndFollow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.Distance = MenuParam.ParamDistance + + self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) +end + +--- JoinsUp and Follows a CLIENT. +-- @param Escort#ESCORT self +-- @param Group#GROUP EscortGroup +-- @param Client#CLIENT EscortClient +-- @param DCSTypes#Distance Distance +function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) + self:F( { EscortGroup, EscortClient, Distance } ) + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + self.EscortMode = ESCORT.MODE.FOLLOW + + self.CT1 = 0 + self.GT1 = 0 + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) + self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) + EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Flare( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Flare( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Smoke( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Smoke( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._ReportNearbyTargetsNow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self:_ReportTargetsScheduler() + +end + +function ESCORT._SwitchReportNearbyTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.ReportTargets = MenuParam.ParamReportTargets + + if self.ReportTargets then + if not self.ReportTargetsScheduler then + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) + end + else + routines.removeFunction( self.ReportTargetsScheduler ) + self.ReportTargetsScheduler = nil + end +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ScanTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local ScanDuration = MenuParam.ParamScanDuration + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) + + if EscortGroup:IsHelicopter() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 200, 20 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + elseif EscortGroup:IsAirPlane() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 1000, 500 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + end + + EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) + + if self.EscortMode == ESCORT.MODE.FOLLOW then + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) + self.FollowScheduler:Start() + end + +end + +function _Resume( EscortGroup ) + env.info( '_Resume' ) + + local Escort = EscortGroup.Escort -- #ESCORT + env.info( "EscortMode = " .. Escort.EscortMode ) + if Escort.EscortMode == ESCORT.MODE.FOLLOW then + Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) + end + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AttackTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( AttackUnit ) + + if EscortGroup:IsAir() then + EscortGroup:OptionROEOpenFire() + EscortGroup:OptionROTPassiveDefense() + EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskAttackUnit( AttackUnit ), +-- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskAttackUnit( AttackUnit ), + EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) + + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AssistTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local EscortGroupAttack = MenuParam.ParamEscortGroup + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + + self:T( AttackUnit ) + + if EscortGroupAttack:IsAir() then + EscortGroupAttack:OptionROEOpenFire() + EscortGroupAttack:OptionROTVertical() +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), +-- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskAttackUnit( AttackUnit ), + EscortGroupAttack:TaskOrbitCircle( 500, 350 ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROE( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROEFunction = MenuParam.ParamFunction + local EscortROEMessage = MenuParam.ParamMessage + + pcall( function() EscortROEFunction() end ) + EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROT( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROTFunction = MenuParam.ParamFunction + local EscortROTMessage = MenuParam.ParamMessage + + pcall( function() EscortROTFunction() end ) + EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ResumeMission( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local WayPoint = MenuParam.ParamWayPoint + + routines.removeFunction( self.FollowScheduler ) + self.FollowScheduler = nil + + local WayPoints = EscortGroup:GetTaskRoute() + self:T( WayPoint, WayPoints ) + + for WayPointIgnore = 1, WayPoint do + table.remove( WayPoints, 1 ) + end + + --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) + SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) + + EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) +end + +--- Registers the waypoints +-- @param #ESCORT self +-- @return #table +function ESCORT:RegisterRoute() + self:F() + + local EscortGroup = self.EscortGroup -- Group#GROUP + + local TaskPoints = EscortGroup:GetTaskRoute() + + self:T( TaskPoints ) + + return TaskPoints +end + +--- @param Escort#ESCORT self +function ESCORT:_FollowScheduler( FollowDistance ) + self:F( { FollowDistance }) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + + local ClientUnit = self.EscortClient:GetClientGroupUnit() + local GroupUnit = self.EscortGroup:GetUnit( 1 ) + + if self.CT1 == 0 and self.GT1 == 0 then + self.CV1 = ClientUnit:GetPointVec3() + self.CT1 = timer.getTime() + self.GV1 = GroupUnit:GetPointVec3() + self.GT1 = timer.getTime() + else + local CT1 = self.CT1 + local CT2 = timer.getTime() + local CV1 = self.CV1 + local CV2 = ClientUnit:GetPointVec3() + self.CT1 = CT2 + self.CV1 = CV2 + + local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 + local CT = CT2 - CT1 + + local CS = ( 3600 / CT ) * ( CD / 1000 ) + + self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) + + local GT1 = self.GT1 + local GT2 = timer.getTime() + local GV1 = self.GV1 + local GV2 = GroupUnit:GetPointVec3() + self.GT1 = GT2 + self.GV1 = GV2 + + local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 + local GT = GT2 - GT1 + + local GS = ( 3600 / GT ) * ( GD / 1000 ) + + self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) + + -- Calculate the group direction vector + local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } + + -- Calculate GH2, GH2 with the same height as CV2. + local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } + + -- Calculate the angle of GV to the orthonormal plane + local alpha = math.atan2( GV.z, GV.x ) + + -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. + -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) + local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), + y = GH2.y, + z = CV2.z + FollowDistance * math.sin(alpha), + } + + -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. + local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } + + -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. + -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. + -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... + local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } + + -- Now we can calculate the group destination vector GDV. + local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } + + --trigger.action.smoke( GDV, trigger.smokeColor.Red ) + self:T2( { "CV2:", CV2 } ) + self:T2( { "CVI:", CVI } ) + self:T2( { "GDV:", GDV } ) + + -- Measure distance between client and group + local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 + + -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome + -- the requested Distance). + local Time = 10 + local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time + + local Speed = CS + CatchUpSpeed + if Speed < 0 then + Speed = 0 + end + + self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) + + -- Now route the escort to the desired point with the desired speed. + self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) + end + return true + end + + return false +end + + +--- Report Targets Scheduler. +-- @param #ESCORT self +function ESCORT:_ReportTargetsScheduler() + self:F( self.EscortGroup:GetName() ) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + local EscortGroupName = self.EscortGroup:GetName() + local EscortTargets = self.EscortGroup:GetDetectedTargets() + + local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets + + local EscortTargetMessages = "" + for EscortTargetID, EscortTarget in pairs( EscortTargets ) do + local EscortObject = EscortTarget.object + self:T( EscortObject ) + if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then + + local EscortTargetUnit = UNIT:Find( EscortObject ) + local EscortTargetUnitName = EscortTargetUnit:GetName() + + + + -- local EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity + -- = self.EscortGroup:IsTargetDetected( EscortObject ) + -- + -- self:T( { EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity } ) + + + local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) + + if Distance <= 15 then + + if not ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = {} + end + ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit + ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible + ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type + ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance + else + if ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = nil + end + end + end + end + + self:T( { "Sorting Targets Table:", ClientEscortTargets } ) + table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) + self:T( { "Sorted Targets Table:", ClientEscortTargets } ) + + -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. + self.EscortMenuAttackNearbyTargets:RemoveSubMenus() + + if self.EscortMenuTargetAssistance then + self.EscortMenuTargetAssistance:RemoveSubMenus() + end + + --for MenuIndex = 1, #self.EscortMenuAttackTargets do + -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) + -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() + --end + + + if ClientEscortTargets then + for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do + + for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do + + if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then + + local EscortTargetMessage = "" + local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() + local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() + if ClientEscortTargetData.type then + EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " + else + EscortTargetMessage = EscortTargetMessage .. "Unknown target at " + end + + local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) + if ClientEscortTargetData.visible == false then + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" + else + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" + end + + if ClientEscortTargetData.visible then + EscortTargetMessage = EscortTargetMessage .. ", visual" + end + + if ClientEscortGroupName == EscortGroupName then + + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + self.EscortMenuAttackNearbyTargets, + ESCORT._AttackTarget, + { ParamSelf = self, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage + else + if self.EscortMenuTargetAssistance then + local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + MenuTargetAssistance, + ESCORT._AssistTarget, + { ParamSelf = self, + ParamEscortGroup = EscortGroupData.EscortGroup, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + end + end + else + ClientEscortTargetData = nil + end + end + end + + if EscortTargetMessages ~= "" and self.ReportTargets == true then + self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) + else + self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) + end + end + + if self.EscortMenuResumeMission then + self.EscortMenuResumeMission:RemoveSubMenus() + + -- if self.EscortMenuResumeWayPoints then + -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do + -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) + -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() + -- end + -- end + + local TaskPoints = self:RegisterRoute() + for WayPointID, WayPoint in pairs( TaskPoints ) do + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + + ( WayPoint.y - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) + end + end + return true + end + + return false +end +--- Provides missile training functions. +-- +-- @{#MISSILETRAINER} class +-- ======================== +-- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, +-- the class will destroy the missile within a certain range, to avoid damage to your aircraft. +-- It suports the following functionality: +-- +-- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. +-- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … +-- * Provide alerts when a missile would have killed your aircraft. +-- * Provide alerts when the missile self destructs. +-- * Enable / Disable and Configure the Missile Trainer using the various menu options. +-- +-- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: +-- +-- * **Messages**: Menu to configure all messages. +-- * **Messages On**: Show all messages. +-- * **Messages Off**: Disable all messages. +-- * **Tracking**: Menu to configure missile tracking messages. +-- * **To All**: Shows missile tracking messages to all players. +-- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. +-- * **Tracking On**: Show missile tracking messages. +-- * **Tracking Off**: Disable missile tracking messages. +-- * **Frequency Increase**: Increases the missile tracking message frequency with one second. +-- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. +-- * **Alerts**: Menu to configure alert messages. +-- * **To All**: Shows alert messages to all players. +-- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. +-- * **Hits On**: Show missile hit alert messages. +-- * **Hits Off**: Disable missile hit alert messages. +-- * **Launches On**: Show missile launch messages. +-- * **Launches Off**: Disable missile launch messages. +-- * **Details**: Menu to configure message details. +-- * **Range On**: Shows range information when a missile is fired to a target. +-- * **Range Off**: Disable range information when a missile is fired to a target. +-- * **Bearing On**: Shows bearing information when a missile is fired to a target. +-- * **Bearing Off**: Disable bearing information when a missile is fired to a target. +-- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. +-- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. +-- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. +-- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. +-- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. +-- +-- +-- MISSILETRAINER construction methods: +-- ==================================== +-- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: +-- +-- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. +-- +-- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. +-- +-- MISSILETRAINER initialization methods: +-- ====================================== +-- A MISSILETRAINER object will behave differently based on the usage of initialization methods: +-- +-- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. +-- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. +-- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. +-- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. +-- +-- @module MissileTrainer +-- @author FlightControl + + +--- The MISSILETRAINER class +-- @type MISSILETRAINER +-- @field Set#SET_CLIENT DBClients +-- @extends Base#BASE +MISSILETRAINER = { + ClassName = "MISSILETRAINER", + TrackingMissiles = {}, +} + +function MISSILETRAINER._Alive( Client, self ) + + if self.Briefing then + Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) + end + + if self.MenusOnOff == true then + Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) + + Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT + + Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) + Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) + Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) + + Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) + Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) + Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) + Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) + Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) + Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) + Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) + + Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) + Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) + Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) + Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) + Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) + Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) + Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) + + Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) + Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) + Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) + Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) + Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) + + Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) + Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) + Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) + Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) + Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) + else + if Client.MainMenu then + Client.MainMenu:Remove() + end + end + + local ClientID = Client:GetID() + self:T( ClientID ) + if not self.TrackingMissiles[ClientID] then + self.TrackingMissiles[ClientID] = {} + end + self.TrackingMissiles[ClientID].Client = Client + if not self.TrackingMissiles[ClientID].MissileData then + self.TrackingMissiles[ClientID].MissileData = {} + end +end + +--- Creates the main object which is handling missile tracking. +-- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. +-- @param #MISSILETRAINER self +-- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. +-- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. +-- @return #MISSILETRAINER +function MISSILETRAINER:New( Distance, Briefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( Distance ) + + if Briefing then + self.Briefing = Briefing + end + + self.Schedulers = {} + self.SchedulerID = 0 + + self.MessageInterval = 2 + self.MessageLastTime = timer.getTime() + + self.Distance = Distance / 1000 + + _EVENTDISPATCHER:OnShot( self._EventShot, self ) + + self.DBClients = SET_CLIENT:New():FilterStart() + + +-- for ClientID, Client in pairs( self.DBClients.Database ) do +-- self:E( "ForEach:" .. Client.UnitName ) +-- Client:Alive( self._Alive, self ) +-- end +-- + self.DBClients:ForEachClient( + function( Client ) + self:E( "ForEach:" .. Client.UnitName ) + Client:Alive( self._Alive, self ) + end + ) + + + +-- self.DB:ForEachClient( +-- --- @param Client#CLIENT Client +-- function( Client ) +-- +-- ... actions ... +-- +-- end +-- ) + + self.MessagesOnOff = true + + self.TrackingToAll = false + self.TrackingOnOff = true + self.TrackingFrequency = 3 + + self.AlertsToAll = true + self.AlertsHitsOnOff = true + self.AlertsLaunchesOnOff = true + + self.DetailsRangeOnOff = true + self.DetailsBearingOnOff = true + + self.MenusOnOff = true + + self.TrackingMissiles = {} + + self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) + + return self +end + +-- Initialization methods. + + + +--- Sets by default the display of any message to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean MessagesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) + self:F( MessagesOnOff ) + + self.MessagesOnOff = MessagesOnOff + if self.MessagesOnOff == true then + MESSAGE:New( "Messages ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Messages OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) + self:F( TrackingToAll ) + + self.TrackingToAll = TrackingToAll + if self.TrackingToAll == true then + MESSAGE:New( "Missile tracking to all players ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Missile tracking to all players OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of missile tracking report to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) + self:F( TrackingOnOff ) + + self.TrackingOnOff = TrackingOnOff + if self.TrackingOnOff == true then + MESSAGE:New( "Missile tracking ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Missile tracking OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. +-- @param #MISSILETRAINER self +-- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) + self:F( TrackingFrequency ) + + self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency + if self.TrackingFrequency < 0.5 then + self.TrackingFrequency = 0.5 + end + if self.TrackingFrequency then + MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of alerts to be shown to all players or only to you. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) + self:F( AlertsToAll ) + + self.AlertsToAll = AlertsToAll + if self.AlertsToAll == true then + MESSAGE:New( "Alerts to all players ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts to all players OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of hit alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsHitsOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) + self:F( AlertsHitsOnOff ) + + self.AlertsHitsOnOff = AlertsHitsOnOff + if self.AlertsHitsOnOff == true then + MESSAGE:New( "Alerts Hits ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts Hits OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of launch alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsLaunchesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) + self:F( AlertsLaunchesOnOff ) + + self.AlertsLaunchesOnOff = AlertsLaunchesOnOff + if self.AlertsLaunchesOnOff == true then + MESSAGE:New( "Alerts Launches ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts Launches OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of range information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsRangeOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) + self:F( DetailsRangeOnOff ) + + self.DetailsRangeOnOff = DetailsRangeOnOff + if self.DetailsRangeOnOff == true then + MESSAGE:New( "Range display ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Range display OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of bearing information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsBearingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) + self:F( DetailsBearingOnOff ) + + self.DetailsBearingOnOff = DetailsBearingOnOff + if self.DetailsBearingOnOff == true then + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Enables / Disables the menus. +-- @param #MISSILETRAINER self +-- @param #boolean MenusOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) + self:F( MenusOnOff ) + + self.MenusOnOff = MenusOnOff + if self.MenusOnOff == true then + MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Menus are DISABLED", 15, "Menu" ):ToAll() + end + + return self +end + + +-- Menu functions + +function MISSILETRAINER._MenuMessages( MenuParameters ) + + local self = MenuParameters.MenuSelf + + if MenuParameters.MessagesOnOff ~= nil then + self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) + end + + if MenuParameters.TrackingToAll ~= nil then + self:InitTrackingToAll( MenuParameters.TrackingToAll ) + end + + if MenuParameters.TrackingOnOff ~= nil then + self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) + end + + if MenuParameters.TrackingFrequency ~= nil then + self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) + end + + if MenuParameters.AlertsToAll ~= nil then + self:InitAlertsToAll( MenuParameters.AlertsToAll ) + end + + if MenuParameters.AlertsHitsOnOff ~= nil then + self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) + end + + if MenuParameters.AlertsLaunchesOnOff ~= nil then + self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) + end + + if MenuParameters.DetailsRangeOnOff ~= nil then + self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) + end + + if MenuParameters.DetailsBearingOnOff ~= nil then + self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) + end + + if MenuParameters.Distance ~= nil then + self.Distance = MenuParameters.Distance + MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", 15, "Menu" ):ToAll() + end + +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @param #MISSILETRAINER self +-- @param Event#EVENTDATA Event +function MISSILETRAINER:_EventShot( Event ) + self:F( { Event } ) + + local TrainerSourceDCSUnit = Event.IniDCSUnit + local TrainerSourceDCSUnitName = Event.IniDCSUnitName + local TrainerWeapon = Event.Weapon -- Identify the weapon fired + local TrainerWeaponName = Event.WeaponName -- return weapon type + + self:T( "Missile Launched = " .. TrainerWeaponName ) + + local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target + local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) + local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill + + self:T(TrainerTargetDCSUnitName ) + + local Client = self.DBClients:FindClient( TrainerTargetDCSUnitName ) + if Client then + + local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) + local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) + + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + + local Message = MESSAGE:New( + string.format( "%s launched a %s", + TrainerSourceUnit:GetTypeName(), + TrainerWeaponName + ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ), 5, "Launch Alert" ) + + if self.AlertsToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + + local ClientID = Client:GetID() + self:T( ClientID ) + local MissileData = {} + MissileData.TrainerSourceUnit = TrainerSourceUnit + MissileData.TrainerWeapon = TrainerWeapon + MissileData.TrainerTargetUnit = TrainerTargetUnit + MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() + MissileData.TrainerWeaponLaunched = true + table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) + --self:T( self.TrackingMissiles ) + end +end + +function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) + + local RangeText = "" + + if self.DetailsRangeOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + RangeText = string.format( ", at %4.2fkm", Range ) + end + + return RangeText +end + +function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) + + local BearingText = "" + + if self.DetailsBearingOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + self:T2( { PositionTarget, PositionMissile }) + + local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } + local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) + --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) + if DirectionRadians < 0 then + DirectionRadians = DirectionRadians + 2 * math.pi + end + local DirectionDegrees = DirectionRadians * 180 / math.pi + + BearingText = string.format( ", %d degrees", DirectionDegrees ) + end + + return BearingText +end + + +function MISSILETRAINER:_TrackMissiles() + self:F2() + + + local ShowMessages = false + if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then + self.MessageLastTime = timer.getTime() + ShowMessages = true + end + + -- ALERTS PART + + -- Loop for all Player Clients to check the alerts and deletion of missiles. + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + for MissileDataID, MissileData in pairs( ClientData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + local PositionMissile = TrainerWeapon:getPosition().p + local PositionTarget = Client:GetPointVec3() + + local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + if Distance <= self.Distance then + -- Hit alert + TrainerWeapon:destroy() + if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then + + self:T( "killed" ) + + local Message = MESSAGE:New( + string.format( "%s launched by %s killed %s", + TrainerWeapon:getTypeName(), + TrainerSourceUnit:GetTypeName(), + TrainerTargetUnit:GetPlayerName() + ), 15, "Hit Alert" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T(ClientData.MissileData) + end + end + else + if not ( TrainerWeapon and TrainerWeapon:isExist() ) then + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + -- Weapon does not exist anymore. Delete from Table + local Message = MESSAGE:New( + string.format( "%s launched by %s self destructed!", + TrainerWeaponTypeName, + TrainerSourceUnit:GetTypeName() + ), 5, "Tracking" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T( ClientData.MissileData ) + end + end + end + end + + if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. + + -- TRACKING PART + + -- For the current client, the missile range and bearing details are displayed To the Player Client. + -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. + -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. + + -- Main Player Client loop + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + + ClientData.MessageToClient = "" + ClientData.MessageToAll = "" + + -- Other Players Client loop + for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do + + for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + + if ShowMessages == true then + local TrackingTo + TrackingTo = string.format( " -> %s", + TrainerWeaponTypeName + ) + + if ClientDataID == TrackingDataID then + if ClientData.MessageToClient == "" then + ClientData.MessageToClient = "Missiles to You:\n" + end + ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" + else + if self.TrackingToAll == true then + if ClientData.MessageToAll == "" then + ClientData.MessageToAll = "Missiles to other Players:\n" + end + ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" + end + end + end + end + end + end + + -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. + if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then + local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, 1, "Tracking" ):ToClient( Client ) + end + end + end + + return true +end +--- This module contains the AIBALANCER class. +-- +-- === +-- +-- 1) @{AIBalancer#AIBALANCER} class, extends @{Base#BASE} +-- ================================================ +-- The @{AIBalancer#AIBALANCER} class controls the dynamic spawning of AI GROUPS depending on a SET_CLIENT. +-- There will be as many AI GROUPS spawned as there at CLIENTS in SET_CLIENT not spawned. +-- +-- 1.1) AIBALANCER construction method: +-- ------------------------------------ +-- Create a new AIBALANCER object with the @{#AIBALANCER.New} method: +-- +-- * @{#AIBALANCER.New}: Creates a new AIBALANCER object. +-- +-- +-- === +-- @module AIBalancer +-- @author FlightControl + +--- AIBALANCER class +-- @type AIBALANCER +-- @field Set#SET_CLIENT SetClient +-- @field Spawn#SPAWN SpawnAI +-- @extends Base#BASE +AIBALANCER = { + ClassName = "AIBALANCER", +} + +--- Creates a new AIBALANCER object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #AIBALANCER self +-- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they are alive or not (joined by a player). +-- @param SpawnAI A SPAWN object that will spawn the AI units required, balancing the SetClient. +-- @return #AIBALANCER self +function AIBALANCER:New( SetClient, SpawnAI ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + self.SetClient = SetClient + self.SpawnAI = SpawnAI + + self.AIMonitorSchedule = SCHEDULER:New( self, self._ClientAliveMonitorScheduler, {}, 1, 10, 0 ) + + return self +end + +--- @param #AIBALANCER self +function AIBALANCER:_ClientAliveMonitorScheduler() + + self.SetClient:ForEachClient( + --- @param Client#CLIENT Client + function( Client ) + local ClientAIAliveState = Client:GetState( self, 'AIAlive' ) + self:T( ClientAIAliveState ) + if Client:IsAlive() then + if ClientAIAliveState == true then + Client:SetState( self, 'AIAlive', false ) + local AIGroup = Client:GetState( self, 'AIGroup' ) -- Group#GROUP + AIGroup:Destroy() + end + else + if not ClientAIAliveState or ClientAIAliveState == false then + Client:SetState( self, 'AIAlive', true ) + Client:SetState( self, 'AIGroup', self.SpawnAI:Spawn() ) + end + end + end + ) + return true +end + + + env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index 8e2cefd95..682e1f28d 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,6 +1,5 @@ -env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160611_0744' ) - +env.info( '*** MOOSE STATIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160611_1029' ) local base = _G Include = {} @@ -11,33 +10,20021 @@ Include.Path = function() end Include.File = function( IncludeFile ) - if not Include.Files[ IncludeFile ] then - Include.Files[IncludeFile] = IncludeFile - env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) - local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) - if f == nil then - env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) - local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) - if f == nil then - error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) - else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) - return f() +end + +Include.Files = {} +--- Various routines +-- @module routines +-- @author Flightcontrol + +env.setErrorMessageBoxEnabled(false) + +--- Extract of MIST functions. +-- @author Grimes + +routines = {} + + +-- don't change these +routines.majorVersion = 3 +routines.minorVersion = 3 +routines.build = 22 + +----------------------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------- +-- Utils- conversion, Lua utils, etc. +routines.utils = {} + +--from http://lua-users.org/wiki/CopyTable +routines.utils.deepCopy = function(object) + local lookup_table = {} + local function _copy(object) + if type(object) ~= "table" then + return object + elseif lookup_table[object] then + return lookup_table[object] + end + local new_table = {} + lookup_table[object] = new_table + for index, value in pairs(object) do + new_table[_copy(index)] = _copy(value) + end + return setmetatable(new_table, getmetatable(object)) + end + local objectreturn = _copy(object) + return objectreturn +end + + +-- porting in Slmod's serialize_slmod2 +routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function + + lookup_table = {} + + local function _Serialize( tbl ) + + if type(tbl) == 'table' then --function only works for tables! + + if lookup_table[tbl] then + return lookup_table[object] end + + local tbl_str = {} + + lookup_table[tbl] = tbl_str + + tbl_str[#tbl_str + 1] = '{' + + for ind,val in pairs(tbl) do -- serialize its fields + local ind_str = {} + if type(ind) == "number" then + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = tostring(ind) + ind_str[#ind_str + 1] = ']=' + else --must be a string + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) + ind_str[#ind_str + 1] = ']=' + end + + local val_str = {} + if ((type(val) == 'number') or (type(val) == 'boolean')) then + val_str[#val_str + 1] = tostring(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'string' then + val_str[#val_str + 1] = routines.utils.basicSerialize(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'nil' then -- won't ever happen, right? + val_str[#val_str + 1] = 'nil,' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'table' then + if ind == "__index" then + -- tbl_str[#tbl_str + 1] = "__index" + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else + + val_str[#val_str + 1] = _Serialize(val) + val_str[#val_str + 1] = ',' --I think this is right, I just added it + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + end + elseif type(val) == 'function' then + -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else +-- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) +-- env.info( debug.traceback() ) + end + + end + tbl_str[#tbl_str + 1] = '}' + return table.concat(tbl_str) else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) - return f() + return tostring(tbl) + end + end + + local objectreturn = _Serialize(tbl) + return objectreturn +end + +--porting in Slmod's "safestring" basic serialize +routines.utils.basicSerialize = function(s) + if s == nil then + return "\"\"" + else + if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then + return tostring(s) + elseif type(s) == 'string' then + s = string.format('%q', s) + return s end end end -Include.ProgramPath = "Scripts/Moose/" -Include.MissionPath = Include.Path() -env.info( "Include.ProgramPath = " .. Include.ProgramPath) -env.info( "Include.MissionPath = " .. Include.MissionPath) +routines.utils.toDegree = function(angle) + return angle*180/math.pi +end -Include.Files = {} +routines.utils.toRadian = function(angle) + return angle*math.pi/180 +end +routines.utils.metersToNM = function(meters) + return meters/1852 +end + +routines.utils.metersToFeet = function(meters) + return meters/0.3048 +end + +routines.utils.NMToMeters = function(NM) + return NM*1852 +end + +routines.utils.feetToMeters = function(feet) + return feet*0.3048 +end + +routines.utils.mpsToKnots = function(mps) + return mps*3600/1852 +end + +routines.utils.mpsToKmph = function(mps) + return mps*3.6 +end + +routines.utils.knotsToMps = function(knots) + return knots*1852/3600 +end + +routines.utils.kmphToMps = function(kmph) + return kmph/3.6 +end + +function routines.utils.makeVec2(Vec3) + if Vec3.z then + return {x = Vec3.x, y = Vec3.z} + else + return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. + end +end + +function routines.utils.makeVec3(Vec2, y) + if not Vec2.z then + if not y then + y = 0 + end + return {x = Vec2.x, y = y, z = Vec2.y} + else + return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. + end +end + +function routines.utils.makeVec3GL(Vec2, offset) + local adj = offset or 0 + + if not Vec2.z then + return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} + else + return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} + end +end + +routines.utils.zoneToVec3 = function(zone) + local new = {} + if type(zone) == 'table' and zone.point then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + elseif type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + if zone then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + end + end +end + +-- gets heading-error corrected direction from point along vector vec. +function routines.utils.getDir(vec, point) + local dir = math.atan2(vec.z, vec.x) + dir = dir + routines.getNorthCorrection(point) + if dir < 0 then + dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi + end + return dir +end + +-- gets distance in meters between two points (2 dimensional) +function routines.utils.get2DDist(point1, point2) + point1 = routines.utils.makeVec3(point1) + point2 = routines.utils.makeVec3(point2) + return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) +end + +-- gets distance in meters between two points (3 dimensional) +function routines.utils.get3DDist(point1, point2) + return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) +end + + + +-- From http://lua-users.org/wiki/SimpleRound +-- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place +routines.utils.round = function(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + +-- porting in Slmod's dostring +routines.utils.dostring = function(s) + local f, err = loadstring(s) + if f then + return true, f() + else + return false, err + end +end + + +--3D Vector manipulation +routines.vec = {} + +routines.vec.add = function(vec1, vec2) + return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} +end + +routines.vec.sub = function(vec1, vec2) + return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} +end + +routines.vec.scalarMult = function(vec, mult) + return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} +end + +routines.vec.scalar_mult = routines.vec.scalarMult + +routines.vec.dp = function(vec1, vec2) + return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z +end + +routines.vec.cp = function(vec1, vec2) + return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} +end + +routines.vec.mag = function(vec) + return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 +end + +routines.vec.getUnitVec = function(vec) + local mag = routines.vec.mag(vec) + return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } +end + +routines.vec.rotateVec2 = function(vec2, theta) + return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} +end +--------------------------------------------------------------------------------------------------------------------------- + + + + +-- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. +routines.tostringMGRS = function(MGRS, acc) + if acc == 0 then + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph + else + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) + .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) + end +end + +--[[acc: +in DM: decimal point of minutes. +In DMS: decimal point of seconds. +position after the decimal of the least significant digit: +So: +42.32 - acc of 2. +]] +routines.tostringLL = function(lat, lon, acc, DMS) + + local latHemi, lonHemi + if lat > 0 then + latHemi = 'N' + else + latHemi = 'S' + end + + if lon > 0 then + lonHemi = 'E' + else + lonHemi = 'W' + end + + lat = math.abs(lat) + lon = math.abs(lon) + + local latDeg = math.floor(lat) + local latMin = (lat - latDeg)*60 + + local lonDeg = math.floor(lon) + local lonMin = (lon - lonDeg)*60 + + if DMS then -- degrees, minutes, and seconds. + local oldLatMin = latMin + latMin = math.floor(latMin) + local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) + + local oldLonMin = lonMin + lonMin = math.floor(lonMin) + local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) + + if latSec == 60 then + latSec = 0 + latMin = latMin + 1 + end + + if lonSec == 60 then + lonSec = 0 + lonMin = lonMin + 1 + end + + local secFrmtStr -- create the formatting string for the seconds place + if acc <= 0 then -- no decimal place. + secFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi + + else -- degrees, decimal minutes. + latMin = routines.utils.round(latMin, acc) + lonMin = routines.utils.round(lonMin, acc) + + if latMin == 60 then + latMin = 0 + latDeg = latDeg + 1 + end + + if lonMin == 60 then + lonMin = 0 + lonDeg = lonDeg + 1 + end + + local minFrmtStr -- create the formatting string for the minutes place + if acc <= 0 then -- no decimal place. + minFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi + + end +end + +--[[ required: az - radian + required: dist - meters + optional: alt - meters (set to false or nil if you don't want to use it). + optional: metric - set true to get dist and alt in km and m. + precision will always be nearest degree and NM or km.]] +routines.tostringBR = function(az, dist, alt, metric) + az = routines.utils.round(routines.utils.toDegree(az), 0) + + if metric then + dist = routines.utils.round(dist/1000, 2) + else + dist = routines.utils.round(routines.utils.metersToNM(dist), 2) + end + + local s = string.format('%03d', az) .. ' for ' .. dist + + if alt then + if metric then + s = s .. ' at ' .. routines.utils.round(alt, 0) + else + s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) + end + end + return s +end + +routines.getNorthCorrection = function(point) --gets the correction needed for true north + if not point.z then --Vec2; convert to Vec3 + point.z = point.y + point.y = 0 + end + local lat, lon = coord.LOtoLL(point) + local north_posit = coord.LLtoLO(lat + 1, lon) + return math.atan2(north_posit.z - point.z, north_posit.x - point.x) +end + + +-- the main area +do + -- THE MAIN FUNCTION -- Accessed 100 times/sec. + routines.main = function() + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error + ---------------------------------------------------------------------------------------------------------- + --area to add new stuff in + + routines.do_scheduled_functions() + end -- end of routines.main + + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) + +end + + +do + local idNum = 0 + + --Simplified event handler + routines.addEventHandler = function(f) --id is optional! + local handler = {} + idNum = idNum + 1 + handler.id = idNum + handler.f = f + handler.onEvent = function(self, event) + self.f(event) + end + world.addEventHandler(handler) + end + + routines.removeEventHandler = function(id) + for key, handler in pairs(world.eventHandlers) do + if handler.id and handler.id == id then + world.eventHandlers[key] = nil + return true + end + end + return false + end +end + +-- need to return a Vec3 or Vec2? +function routines.getRandPointInCircle(point, radius, innerRadius) + local theta = 2*math.pi*math.random() + local rad = math.random() + math.random() + if rad > 1 then + rad = 2 - rad + end + + local radMult + if innerRadius and innerRadius <= radius then + radMult = (radius - innerRadius)*rad + innerRadius + else + radMult = radius*rad + end + + if not point.z then --might as well work with vec2/3 + point.z = point.y + end + + local rndCoord + if radius > 0 then + rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} + else + rndCoord = {x = point.x, y = point.z} + end + return rndCoord +end + +routines.goRoute = function(group, path) + local misTask = { + id = 'Mission', + params = { + route = { + points = routines.utils.deepCopy(path), + }, + }, + } + if type(group) == 'string' then + group = Group.getByName(group) + end + local groupCon = group:getController() + if groupCon then + groupCon:setTask(misTask) + return true + end + + Controller.setTask(groupCon, misTask) + return false +end + + +-- Useful atomic functions from mist, ported. + +routines.ground = {} +routines.fixedWing = {} +routines.heli = {} + +routines.ground.buildWP = function(point, overRideForm, overRideSpeed) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + local form, speed + + if point.speed and not overRideSpeed then + wp.speed = point.speed + elseif type(overRideSpeed) == 'number' then + wp.speed = overRideSpeed + else + wp.speed = routines.utils.kmphToMps(20) + end + + if point.form and not overRideForm then + form = point.form + else + form = overRideForm + end + + if not form then + wp.action = 'Cone' + else + form = string.lower(form) + if form == 'off_road' or form == 'off road' then + wp.action = 'Off Road' + elseif form == 'on_road' or form == 'on road' then + wp.action = 'On Road' + elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then + wp.action = 'Rank' + elseif form == 'cone' then + wp.action = 'Cone' + elseif form == 'diamond' then + wp.action = 'Diamond' + elseif form == 'vee' then + wp.action = 'Vee' + elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then + wp.action = 'EchelonL' + elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then + wp.action = 'EchelonR' + else + wp.action = 'Cone' -- if nothing matched + end + end + + wp.type = 'Turning Point' + + return wp + +end + +routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 2000 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(500) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.heli.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 500 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(200) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.groupToRandomPoint = function(vars) + local group = vars.group --Required + local point = vars.point --required + local radius = vars.radius or 0 + local innerRadius = vars.innerRadius + local form = vars.form or 'Cone' + local heading = vars.heading or math.random()*2*math.pi + local headingDegrees = vars.headingDegrees + local speed = vars.speed or routines.utils.kmphToMps(20) + + + local useRoads + if not vars.disableRoads then + useRoads = true + else + useRoads = false + end + + local path = {} + + if headingDegrees then + heading = headingDegrees*math.pi/180 + end + + if heading >= 2*math.pi then + heading = heading - 2*math.pi + end + + local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) + + local offset = {} + local posStart = routines.getLeadPos(group) + + offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) + offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) + path[#path + 1] = routines.ground.buildWP(posStart, form, speed) + + + if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) + path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) + path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) + else + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) + end + + path[#path + 1] = routines.ground.buildWP(offset, form, speed) + path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) + + routines.goRoute(group, path) + + return +end + +routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) + local pos = routines.getLeadPos(gpData) + local fakeZone = {} + fakeZone.radius = dist or math.random(300, 1000) + fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} + routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) + + return +end + +routines.groupToRandomZone = function(gpData, zone, form, heading, speed) + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + if type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + elseif type(zone) == 'table' and not zone.radius then + zone = trigger.misc.getZone(zone[math.random(1, #zone)]) + end + + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.radius = zone.radius + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.point = routines.utils.zoneToVec3(zone) + + routines.groupToRandomPoint(vars) + + return +end + +routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types + if coord.z then + coord.y = coord.z + end + local typeConverted = {} + + if type(terrainTypes) == 'string' then -- if its a string it does this check + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then + table.insert(typeConverted, constId) + end + end + elseif type(terrainTypes) == 'table' then -- if its a table it does this check + for typeId, typeData in pairs(terrainTypes) do + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then + table.insert(typeConverted, constId) + end + end + end + end + for validIndex, validData in pairs(typeConverted) do + if land.getSurfaceType(coord) == land.SurfaceType[validData] then + return true + end + end + return false +end + +routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) + if type(point) == 'string' then + point = trigger.misc.getZone(point) + end + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.disableRoads = useRoads + vars.point = routines.utils.zoneToVec3(point) + routines.groupToRandomPoint(vars) + + return +end + + +routines.getLeadPos = function(group) + if type(group) == 'string' then -- group name + group = Group.getByName(group) + end + + local units = group:getUnits() + + local leader = units[1] + if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. + local lowestInd = math.huge + for ind, unit in pairs(units) do + if ind < lowestInd then + lowestInd = ind + leader = unit + end + end + end + if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... + return leader:getPosition().p + end +end + +--[[ vars for routines.getMGRSString: +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +]] +routines.getMGRSString = function(vars) + local units = vars.units + local acc = vars.acc or 5 + local avgPos = routines.getAvgPos(units) + if avgPos then + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) + end +end + +--[[ vars for routines.getLLString +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. + + +]] +routines.getLLString = function(vars) + local units = vars.units + local acc = vars.acc or 3 + local DMS = vars.DMS + local avgPos = routines.getAvgPos(units) + if avgPos then + local lat, lon = coord.LOtoLL(avgPos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + +--[[ +vars.zone - table of a zone name. +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRStringZone = function(vars) + local zone = trigger.misc.getZone( vars.zone ) + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + if zone then + local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(zone.point, ref) + if alt then + alt = zone.y + end + return routines.tostringBR(dir, dist, alt, metric) + else + env.info( 'routines.getBRStringZone: error: zone is nil' ) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRString = function(vars) + local units = vars.units + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + local avgPos = routines.getAvgPos(units) + if avgPos then + local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(avgPos, ref) + if alt then + alt = avgPos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + + +-- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. +--[[ vars for routines.getLeadingPos: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +]] +routines.getLeadingPos = function(vars) + local units = vars.units + local heading = vars.heading + local radius = vars.radius + if vars.headingDegrees then + heading = routines.utils.toRadian(vars.headingDegrees) + end + + local unitPosTbl = {} + for i = 1, #units do + local unit = Unit.getByName(units[i]) + if unit and unit:isExist() then + unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p + end + end + if #unitPosTbl > 0 then -- one more more units found. + -- first, find the unit most in the heading direction + local maxPos = -math.huge + + local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = + for i = 1, #unitPosTbl do + local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) + if (not maxPos) or maxPos < rotatedVec2.x then + maxPos = rotatedVec2.x + maxPosInd = i + end + end + + --now, get all the units around this unit... + local avgPos + if radius then + local maxUnitPos = unitPosTbl[maxPosInd] + local avgx, avgy, avgz, totNum = 0, 0, 0, 0 + for i = 1, #unitPosTbl do + if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then + avgx = avgx + unitPosTbl[i].x + avgy = avgy + unitPosTbl[i].y + avgz = avgz + unitPosTbl[i].z + totNum = totNum + 1 + end + end + avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} + else + avgPos = unitPosTbl[maxPosInd] + end + + return avgPos + end +end + + +--[[ vars for routines.getLeadingMGRSString: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number, 0 to 5. +]] +routines.getLeadingMGRSString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 5 + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) + end +end + +--[[ vars for routines.getLeadingLLString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. +]] +routines.getLeadingLLString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 3 + local DMS = vars.DMS + local lat, lon = coord.LOtoLL(pos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + + + +--[[ vars for routines.getLeadingBRString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.metric - boolean, if true, use km instead of NM. +vars.alt - boolean, if true, include altitude. +vars.ref - vec3/vec2 reference point. +]] +routines.getLeadingBRString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local ref = vars.ref + local alt = vars.alt + local metric = vars.metric + + local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(pos, ref) + if alt then + alt = pos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + +--[[ vars for routines.message.add + vars.text = 'Hello World' + vars.displayTime = 20 + vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} + +]] + +--[[ vars for routines.msgMGRS +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgMGRS = function(vars) + local units = vars.units + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getMGRSString{units = units, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + +--[[ vars for routines.msgLL +vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLLString{units = units, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local alt = vars.alt + local metric = vars.metric + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +-------------------------------------------------------------------------------------------- +-- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - string red, blue +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBullseye = function(vars) + if string.lower(vars.ref) == 'red' then + vars.ref = routines.DBs.missionData.bullseye.red + routines.msgBR(vars) + elseif string.lower(vars.ref) == 'blue' then + vars.ref = routines.DBs.missionData.bullseye.blue + routines.msgBR(vars) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - unit name of reference point +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] + +routines.msgBRA = function(vars) + if Unit.getByName(vars.ref) then + vars.ref = Unit.getByName(vars.ref):getPosition().p + if not vars.alt then + vars.alt = true + end + routines.msgBR(vars) + end +end +-------------------------------------------------------------------------------------------- + +--[[ vars for routines.msgLeadingMGRS: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number, 0 to 5. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingMGRS = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + + +end +--[[ vars for routines.msgLeadingLL: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. (optional) +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + +--[[ +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.metric - boolean, if true, use km instead of NM. (optional) +vars.alt - boolean, if true, include altitude. (optional) +vars.ref - vec3/vec2 reference point. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local metric = vars.metric + local alt = vars.alt + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + + +function spairs(t, order) + -- collect the keys + local keys = {} + for k in pairs(t) do keys[#keys+1] = k end + + -- if order function given, sort by it by passing the table and keys a, b, + -- otherwise just sort the keys + if order then + table.sort(keys, function(a,b) return order(t, a, b) end) + else + table.sort(keys) + end + + -- return the iterator function + local i = 0 + return function() + i = i + 1 + if keys[i] then + return keys[i], t[keys[i]] + end + end +end + + +function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) +--trace.f() + + local CurrentZoneID = nil + + if CargoGroup then + local CargoUnits = CargoGroup:getUnits() + for CargoUnitID, CargoUnit in pairs( CargoUnits ) do + if CargoUnit and CargoUnit:getLife() >= 1.0 then + CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) + if CurrentZoneID then + break + end + end + end + end + +--trace.r( "", "", { CurrentZoneID } ) + return CurrentZoneID +end + + + +function routines.IsUnitInZones( TransportUnit, LandingZones ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + +function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + + +function routines.IsStaticInZones( TransportStatic, LandingZones ) +--trace.f() + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local TransportStaticPos = TransportStatic:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + +--trace.r( "", "", { TransportZoneResult } ) + return TransportZoneResult +end + + +function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local CargoPos = CargoUnit:getPosition().p + local ReferenceP = ReferencePosition.p + + if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + end + + return Valid +end + +function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) + + -- fill-up some local variables to support further calculations to determine location of units within the zone + local CargoUnits = CargoGroup:getUnits() + for CargoUnitId, CargoUnit in pairs( CargoUnits ) do + local CargoUnitPos = CargoUnit:getPosition().p +-- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) + local ReferenceP = ReferencePosition.p +-- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) + + if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + break + end + end + + return Valid +end + + +function routines.ValidateString( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "string" then + if Variable == "" then + error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) + Valid = false + end + else + error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateNumber( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "number" then + else + error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid + +end + +function routines.ValidateGroup( Variable, VariableName, Valid ) +--trace.f() + + if Variable == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateZone( LandingZones, VariableName, Valid ) +--trace.f() + + if LandingZones == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + if trigger.misc.getZone( LandingZoneName ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) + Valid = false + break + end + end + else + if trigger.misc.getZone( LandingZones ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) + Valid = false + end + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) +--trace.f() + + local ValidVariable = false + + for EnumId, EnumData in pairs( Enum ) do + if Variable == EnumData then + ValidVariable = true + break + end + end + + if ValidVariable then + else + error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} + -- refactor to search by groupId and allow groupId and groupName as inputs + local gpId = groupIdent + if type(groupIdent) == 'string' and not tonumber(groupIdent) then + gpId = _DATABASE.Templates.Groups[groupIdent].groupId + end + + for coa_name, coa_data in pairs(env.mission.coalition) do + if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + for obj_type_name, obj_type_data in pairs(cntry_data) do + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + for group_num, group_data in pairs(obj_type_data.group) do + if group_data and group_data.groupId == gpId then -- this is the group we are looking for + if group_data.route and group_data.route.points and #group_data.route.points > 0 then + local points = {} + + for point_num, point in pairs(group_data.route.points) do + local routeData = {} + if not point.point then + routeData.x = point.x + routeData.y = point.y + else + routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. + end + routeData.form = point.action + routeData.speed = point.speed + routeData.alt = point.alt + routeData.alt_type = point.alt_type + routeData.airdromeId = point.airdromeId + routeData.helipadId = point.helipadId + routeData.type = point.type + routeData.action = point.action + if task then + routeData.task = point.task + end + points[point_num] = routeData + end + + return points + end + return + end --if group_data and group_data.name and group_data.name == 'groupname' + end --for group_num, group_data in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do +end + +routines.ground.patrolRoute = function(vars) + + + local tempRoute = {} + local useRoute = {} + local gpData = vars.gpData + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + local useGroupRoute + if not vars.useGroupRoute then + useGroupRoute = vars.gpData + else + useGroupRoute = vars.useGroupRoute + end + local routeProvided = false + if not vars.route then + if useGroupRoute then + tempRoute = routines.getGroupRoute(useGroupRoute) + end + else + useRoute = vars.route + local posStart = routines.getLeadPos(gpData) + useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) + routeProvided = true + end + + + local overRideSpeed = vars.speed or 'default' + local pType = vars.pType + local offRoadForm = vars.offRoadForm or 'default' + local onRoadForm = vars.onRoadForm or 'default' + + if routeProvided == false and #tempRoute > 0 then + local posStart = routines.getLeadPos(gpData) + + + useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) + for i = 1, #tempRoute do + local tempForm = tempRoute[i].action + local tempSpeed = tempRoute[i].speed + + if offRoadForm == 'default' then + tempForm = tempRoute[i].action + end + if onRoadForm == 'default' then + onRoadForm = 'On Road' + end + if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then + tempForm = onRoadForm + else + tempForm = offRoadForm + end + + if type(overRideSpeed) == 'number' then + tempSpeed = overRideSpeed + end + + + useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) + end + + if pType and string.lower(pType) == 'doubleback' then + local curRoute = routines.utils.deepCopy(useRoute) + for i = #curRoute, 2, -1 do + useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) + end + end + + useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP + end + + local cTask3 = {} + local newPatrol = {} + newPatrol.route = useRoute + newPatrol.gpData = gpData:getName() + cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' + cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) + cTask3[#cTask3 + 1] = ')' + cTask3 = table.concat(cTask3) + local tempTask = { + id = 'WrappedAction', + params = { + action = { + id = 'Script', + params = { + command = cTask3, + + }, + }, + }, + } + + + useRoute[#useRoute].task = tempTask + routines.goRoute(gpData, useRoute) + + return +end + +routines.ground.patrol = function(gpData, pType, form, speed) + local vars = {} + + if type(gpData) == 'table' and gpData:getName() then + gpData = gpData:getName() + end + + vars.useGroupRoute = gpData + vars.gpData = gpData + vars.pType = pType + vars.offRoadForm = form + vars.speed = speed + + routines.ground.patrolRoute(vars) + + return +end + +function routines.GetUnitHeight( CheckUnit ) +--trace.f( "routines" ) + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } + local UnitHeight = UnitPoint.y + + local LandHeight = land.getHeight( UnitPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) + + return UnitHeight - LandHeight + +end + + + +Su34Status = { status = {} } +boardMsgRed = { statusMsg = "" } +boardMsgAll = { timeMsg = "" } +SpawnSettings = {} +Su34MenuPath = {} +Su34Menus = 0 + + +function Su34AttackCarlVinson(groupName) +--trace.menu("", "Su34AttackCarlVinson") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupCarlVinson = Group.getByName("US Carl Vinson #001") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupCarlVinson ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 1 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackWest(groupName) +--trace.f("","Su34AttackWest") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipWest1 = Group.getByName("US Ship West #001") + local groupShipWest2 = Group.getByName("US Ship West #002") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipWest1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + if groupShipWest2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 2 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackNorth(groupName) +--trace.menu("","Su34AttackNorth") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipNorth1 = Group.getByName("US Ship North #001") + local groupShipNorth2 = Group.getByName("US Ship North #002") + local groupShipNorth3 = Group.getByName("US Ship North #003") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipNorth1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth3 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + Su34Status.status[groupName] = 3 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Orbit(groupName) +--trace.menu("","Su34Orbit") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) + Su34Status.status[groupName] = 4 + MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) +end + +function Su34TakeOff(groupName) +--trace.menu("","Su34TakeOff") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 8 + MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Hold(groupName) +--trace.menu("","Su34Hold") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 5 + MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) +end + +function Su34RTB(groupName) +--trace.menu("","Su34RTB") + Su34Status.status[groupName] = 6 + MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Destroyed(groupName) +--trace.menu("","Su34Destroyed") + Su34Status.status[groupName] = 7 + MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) +end + +function GroupAlive( groupName ) +--trace.menu("","GroupAlive") + local groupTest = Group.getByName( groupName ) + + local groupExists = false + + if groupTest then + groupExists = groupTest:isExist() + end + + --trace.r( "", "", { groupExists } ) + return groupExists +end + +function Su34IsDead() +--trace.f() + +end + +function Su34OverviewStatus() +--trace.menu("","Su34OverviewStatus") + local msg = "" + local currentStatus = 0 + local Exists = false + + for groupName, currentStatus in pairs(Su34Status.status) do + + env.info(('Su34 Overview Status: GroupName = ' .. groupName )) + Alive = GroupAlive( groupName ) + + if Alive then + if currentStatus == 1 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking carrier Carl Vinson. " + elseif currentStatus == 2 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking supporting ships in the west. " + elseif currentStatus == 3 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking invading ships in the north. " + elseif currentStatus == 4 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "In orbit and awaiting further instructions. " + elseif currentStatus == 5 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Holding Weapons. " + elseif currentStatus == 6 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Return to Krasnodar. " + elseif currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + elseif currentStatus == 8 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Take-Off. " + end + else + if currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + else + Su34Destroyed(groupName) + end + end + end + + boardMsgRed.statusMsg = msg +end + + +function UpdateBoardMsg() +--trace.f() + Su34OverviewStatus() + MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) +end + +function MusicReset( flg ) +--trace.f() + trigger.action.setUserFlag(95,flg) +end + +function PlaneActivate(groupNameFormat, flg) +--trace.f() + local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) + --trigger.action.outText(groupName,10) + trigger.action.activateGroup(Group.getByName(groupName)) +end + +function Su34Menu(groupName) +--trace.f() + + --env.info(( 'Su34Menu(' .. groupName .. ')' )) + local groupSu34 = Group.getByName( groupName ) + + if Su34Status.status[groupName] == 1 or + Su34Status.status[groupName] == 2 or + Su34Status.status[groupName] == 3 or + Su34Status.status[groupName] == 4 or + Su34Status.status[groupName] == 5 then + if Su34MenuPath[groupName] == nil then + if planeMenuPath == nil then + planeMenuPath = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "SU-34 anti-ship flights", + nil + ) + end + Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "Flight " .. groupName, + planeMenuPath + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack carrier Carl Vinson", + Su34MenuPath[groupName], + Su34AttackCarlVinson, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the west", + Su34MenuPath[groupName], + Su34AttackWest, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the north", + Su34MenuPath[groupName], + Su34AttackNorth, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Hold position and await instructions", + Su34MenuPath[groupName], + Su34Orbit, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Report status", + Su34MenuPath[groupName], + Su34OverviewStatus + ) + end + else + if Su34MenuPath[groupName] then + missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) + end + end +end + +--- Obsolete function, but kept to rework in framework. + +function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) +--trace.f("Spawn") + --env.info(( 'ChooseInfantry: ' )) + + TeleportPrefixTableCount = #TeleportPrefixTable + TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) + + --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) + + local TeleportFound = false + local TeleportLoop = true + local Index = TeleportPrefixTableIndex + local TeleportPrefix = '' + + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableCount then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + + if TeleportFound == false then + TeleportLoop = true + Index = 1 + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableIndex then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + end + + local TeleportGroupName = '' + if TeleportFound == true then + TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) + else + TeleportGroupName = '' + end + + --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) + --env.info(('ChooseInfantry: return')) + + return TeleportGroupName +end + +SpawnedInfantry = 0 + +function LandCarrier ( CarrierGroup, LandingZonePrefix ) +--trace.f() + --env.info(( 'LandCarrier: ' )) + --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) + + local controllerGroup = CarrierGroup:getController() + + local LandingZone = trigger.misc.getZone(LandingZonePrefix) + local LandingZonePos = {} + LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) + LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) + + controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) + + --env.info(( 'LandCarrier: end' )) +end + +EscortCount = 0 +function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) +--trace.f() + --env.info(( 'EscortCarrier: ' )) + --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) + + local CarrierName = CarrierGroup:getName() + + local EscortMission = {} + local CarrierMission = {} + + local EscortMission = SpawnMissionGroup( EscortPrefix ) + local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) + + if EscortMission ~= nil and CarrierMission ~= nil then + + EscortCount = EscortCount + 1 + EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) + EscortMission.name = EscortMissionName + EscortMission.groupId = nil + EscortMission.lateActivation = false + EscortMission.taskSelected = false + + local EscortUnits = #EscortMission.units + for u = 1, EscortUnits do + EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) + EscortMission.units[u].unitId = nil + end + + + EscortMission.route.points[1].task = { id = "ComboTask", + params = + { + tasks = + { + [1] = + { + enabled = true, + auto = false, + id = "Escort", + number = 1, + params = + { + lastWptIndexFlagChangedManually = false, + groupId = CarrierGroup:getID(), + lastWptIndex = nil, + lastWptIndexFlag = false, + engagementDistMax = EscortEngagementDistanceMax, + targetTypes = EscortTargetTypes, + pos = + { + y = 20, + x = 20, + z = 0, + } -- end of ["pos"] + } -- end of ["params"] + } -- end of [1] + } -- end of ["tasks"] + } -- end of ["params"] + } -- end of ["task"] + + SpawnGroupAdd( EscortPrefix, EscortMission ) + + end +end + +function SendMessageToCarrier( CarrierGroup, CarrierMessage ) +--trace.f() + + if CarrierGroup ~= nil then + MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) + end + +end + +function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) +--trace.f() + + if type(MsgGroup) == 'string' then + --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) + MsgGroup = Group.getByName( MsgGroup ) + end + + if MsgGroup ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) + end +end + +function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) +--trace.f() + + if UnitName ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { UnitName } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + end +end + +function MessageToAll( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, MsgTime, "Message" ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) +end + +function MessageToRed( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, MsgTime, "To Red Coalition" ):ToCoalition( coalition.side.RED ) +end + +function MessageToBlue( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, MsgTime, "To Blue Coalition" ):ToCoalition( coalition.side.RED ) +end + +function getCarrierHeight( CarrierGroup ) +--trace.f() + + if CarrierGroup ~= nil then + if table.getn(CarrierGroup:getUnits()) == 1 then + local CarrierUnit = CarrierGroup:getUnits()[1] + local CurrentPoint = CarrierUnit:getPoint() + + local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local CarrierHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return CarrierHeight - LandHeight + else + return 999999 + end + else + return 999999 + end + +end + +function GetUnitHeight( CheckUnit ) +--trace.f() + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local UnitHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return UnitHeight - LandHeight + +end + + +_MusicTable = {} +_MusicTable.Files = {} +_MusicTable.Queue = {} +_MusicTable.FileCnt = 0 + + +function MusicRegister( SndRef, SndFile, SndTime ) +--trace.f() + + env.info(( 'MusicRegister: SndRef = ' .. SndRef )) + env.info(( 'MusicRegister: SndFile = ' .. SndFile )) + env.info(( 'MusicRegister: SndTime = ' .. SndTime )) + + + _MusicTable.FileCnt = _MusicTable.FileCnt + 1 + + _MusicTable.Files[_MusicTable.FileCnt] = {} + _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef + _MusicTable.Files[_MusicTable.FileCnt].File = SndFile + _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime + + if not _MusicTable.Function then + _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) + end + +end + +function MusicToPlayer( SndRef, PlayerName, SndContinue ) +--trace.f() + + --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) + + local PlayerUnits = AlivePlayerUnits() + for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do + local PlayerUnitName = PlayerUnit:getPlayerName() + --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) + if PlayerName == PlayerUnitName then + PlayerGroup = PlayerUnit:getGroup() + if PlayerGroup then + --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) + MusicToGroup( SndRef, PlayerGroup, SndContinue ) + end + break + end + end + + --env.info(( 'MusicToPlayer: end' )) + +end + +function MusicToGroup( SndRef, SndGroup, SndContinue ) +--trace.f() + + --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) + + if SndGroup ~= nil then + if _MusicTable and _MusicTable.FileCnt > 0 then + if SndGroup:isExist() then + if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then + --env.info(( 'MusicToGroup: OK for Sound.' )) + local SndIdx = 0 + if SndRef == '' then + --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) + SndIdx = math.random( 1, _MusicTable.FileCnt ) + else + for SndIdx = 1, _MusicTable.FileCnt do + if _MusicTable.Files[SndIdx].Ref == SndRef then + break + end + end + end + --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) + --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) + trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) + MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) + + local SndQueueRef = SndGroup:getUnit(1):getPlayerName() + if _MusicTable.Queue[SndQueueRef] == nil then + _MusicTable.Queue[SndQueueRef] = {} + end + _MusicTable.Queue[SndQueueRef].Start = timer.getTime() + _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() + _MusicTable.Queue[SndQueueRef].Group = SndGroup + _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() + _MusicTable.Queue[SndQueueRef].Ref = SndIdx + _MusicTable.Queue[SndQueueRef].Continue = SndContinue + _MusicTable.Queue[SndQueueRef].Type = Group + end + end + end + end +end + +function MusicCanStart(PlayerName) +--trace.f() + + --env.info(( 'MusicCanStart:' )) + + local MusicOut = false + + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) + local PlayerFound = false + local MusicStart = 0 + local MusicTime = 0 + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.PlayerName == PlayerName then + PlayerFound = true + MusicStart = SndQueue.Start + MusicTime = _MusicTable.Files[SndQueue.Ref].Time + break + end + end + if PlayerFound then + --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) + --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) + --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) + + if MusicStart + MusicTime <= timer.getTime() then + MusicOut = true + end + else + MusicOut = true + end + end + + if MusicOut then + --env.info(( 'MusicCanStart: true' )) + else + --env.info(( 'MusicCanStart: false' )) + end + + return MusicOut +end + +function MusicScheduler() +--trace.scheduled("", "MusicScheduler") + + --env.info(( 'MusicScheduler:' )) + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicScheduler: Walking Sound Queue.')) + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.Continue then + if MusicCanStart(SndQueue.PlayerName) then + --env.info(('MusicScheduler: MusicToGroup')) + MusicToPlayer( '', SndQueue.PlayerName, true ) + end + end + end + end + +end + + +env.info(( 'Init: Scripts Loaded v1.1' )) + +--- BASE classes. +-- +-- @{#BASE} class +-- ============== +-- The @{#BASE} class is the super class for most of the classes defined within MOOSE. +-- +-- It handles: +-- +-- * The construction and inheritance of child classes. +-- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). +-- +-- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. +-- +-- BASE Trace functionality +-- ======================== +-- The BASE class contains trace methods to trace progress within a mission execution of a certain object. +-- Note that these trace methods are inherited by each MOOSE class interiting BASE. +-- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. +-- +-- Trace a function call +-- --------------------- +-- There are basically 3 types of tracing methods available within BASE: +-- +-- * @{#BASE.F}: Trace the beginning of a function and its given parameters. +-- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. +-- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. +-- +-- Tracing levels +-- -------------- +-- There are 3 tracing levels within MOOSE. +-- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. +-- +-- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: +-- +-- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. +-- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. +-- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. +-- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. +-- +-- BASE Inheritance support +-- ======================== +-- The following methods are available to support inheritance: +-- +-- * @{#BASE.Inherit}: Inherits from a class. +-- * @{#BASE.Inherited}: Returns the parent class from the class. +-- +-- Future +-- ====== +-- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. +-- +-- ==== +-- +-- @module Base +-- @author FlightControl + + + +local _TraceOn = true +local _TraceLevel = 1 +local _TraceAll = false +local _TraceClass = {} +local _TraceClassMethod = {} + +--- The BASE Class +-- @type BASE +-- @field ClassName The name of the class. +-- @field ClassID The ID number of the class. +BASE = { + ClassName = "BASE", + ClassID = 0, + Events = {}, + States = {} +} + +--- The Formation Class +-- @type FORMATION +-- @field Cone A cone formation. +FORMATION = { + Cone = "Cone" +} + + + +--- The base constructor. This is the top top class of all classed defined within the MOOSE. +-- Any new class needs to be derived from this class for proper inheritance. +-- @param #BASE self +-- @return #BASE The new instance of the BASE class. +-- @usage +-- function TASK:New() +-- +-- local self = BASE:Inherit( self, BASE:New() ) +-- +-- -- assign Task default values during construction +-- self.TaskBriefing = "Task: No Task." +-- self.Time = timer.getTime() +-- self.ExecuteStage = _TransportExecuteStage.NONE +-- +-- return self +-- end +-- @todo need to investigate if the deepCopy is really needed... Don't think so. +function BASE:New() + local Child = routines.utils.deepCopy( self ) + local Parent = {} + setmetatable( Child, Parent ) + Child.__index = Child + self.ClassID = self.ClassID + 1 + Child.ClassID = self.ClassID + --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) + return Child +end + +--- This is the worker method to inherit from a parent class. +-- @param #BASE self +-- @param Child is the Child class that inherits. +-- @param #BASE Parent is the Parent class that the Child inherits from. +-- @return #BASE Child +function BASE:Inherit( Child, Parent ) + local Child = routines.utils.deepCopy( Child ) + --local Parent = routines.utils.deepCopy( Parent ) + --local Parent = Parent + if Child ~= nil then + setmetatable( Child, Parent ) + Child.__index = Child + end + --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID + self:T( 'Inherited from ' .. Parent.ClassName ) + return Child +end + +--- This is the worker method to retrieve the Parent class. +-- @param #BASE self +-- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. +-- @return #BASE +function BASE:Inherited( Child ) + local Parent = getmetatable( Child ) +-- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) + return Parent +end + +--- Get the ClassName + ClassID of the class instance. +-- The ClassName + ClassID is formatted as '%s#%09d'. +-- @param #BASE self +-- @return #string The ClassName + ClassID of the class instance. +function BASE:GetClassNameAndID() + return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) +end + +--- Get the ClassName of the class instance. +-- @param #BASE self +-- @return #string The ClassName of the class instance. +function BASE:GetClassName() + return self.ClassName +end + +--- Get the ClassID of the class instance. +-- @param #BASE self +-- @return #string The ClassID of the class instance. +function BASE:GetClassID() + return self.ClassID +end + +--- Set a new listener for the class. +-- @param self +-- @param DCSTypes#Event Event +-- @param #function EventFunction +-- @return #BASE +function BASE:AddEvent( Event, EventFunction ) + self:F( Event ) + + self.Events[#self.Events+1] = {} + self.Events[#self.Events].Event = Event + self.Events[#self.Events].EventFunction = EventFunction + self.Events[#self.Events].EventEnabled = false + + return self +end + +--- Returns the event dispatcher +-- @param #BASE self +-- @return Event#EVENT +function BASE:Event() + + return _EVENTDISPATCHER +end + + + + + +--- Enable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:EnableEvents() + self:F( #self.Events ) + + for EventID, Event in pairs( self.Events ) do + Event.Self = self + Event.EventEnabled = true + end + self.Events.Handler = world.addEventHandler( self ) + + return self +end + + +--- Disable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:DisableEvents() + self:F() + + world.removeEventHandler( self ) + for EventID, Event in pairs( self.Events ) do + Event.Self = nil + Event.EventEnabled = false + end + + return self +end + + +local BaseEventCodes = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} +-- Event = { +-- id = enum world.event, +-- time = Time, +-- initiator = Unit, +-- target = Unit, +-- place = Unit, +-- subPlace = enum world.BirthPlace, +-- weapon = Weapon +-- } + +--- Creation of a Birth Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +-- @param #string IniUnitName The initiating unit name. +-- @param place +-- @param subplace +function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) + self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) + + local Event = { + id = world.event.S_EVENT_BIRTH, + time = EventTime, + initiator = Initiator, + IniUnitName = IniUnitName, + place = place, + subplace = subplace + } + + world.onEvent( Event ) +end + +--- Creation of a Crash Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +function BASE:CreateEventCrash( EventTime, Initiator ) + self:F( { EventTime, Initiator } ) + + local Event = { + id = world.event.S_EVENT_CRASH, + time = EventTime, + initiator = Initiator, + } + + world.onEvent( Event ) +end + +-- TODO: Complete DCSTypes#Event structure. +--- The main event handling function... This function captures all events generated for the class. +-- @param #BASE self +-- @param DCSTypes#Event event +function BASE:onEvent(event) + --self:F( { BaseEventCodes[event.id], event } ) + + if self then + for EventID, EventObject in pairs( self.Events ) do + if EventObject.EventEnabled then + --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) + --env.info( 'onEvent event.id = ' .. tostring(event.id) ) + --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) + if event.id == EventObject.Event then + if self == EventObject.Self then + if event.initiator and event.initiator:isExist() then + event.IniUnitName = event.initiator:getName() + end + if event.target and event.target:isExist() then + event.TgtUnitName = event.target:getName() + end + --self:T( { BaseEventCodes[event.id], event } ) + --EventObject.EventFunction( self, event ) + end + end + end + end + end +end + +function BASE:SetState( Object, StateName, State ) + + local ClassNameAndID = Object:GetClassNameAndID() + if not self.States[ClassNameAndID] then + self.States[ClassNameAndID] = {} + end + + self.States[ClassNameAndID][StateName] = State + + return self.States[ClassNameAndID][StateName] +end + +function BASE:GetState( Object, StateName ) + + local ClassNameAndID = Object:GetClassNameAndID() + if self.States[ClassNameAndID] then + return self.States[ClassNameAndID][StateName] + end + + return nil +end + +function BASE:ClearState( Object, StateName ) + + local ClassNameAndID = Object:GetClassNameAndID() + if self.States[ClassNameAndID] then + self.States[ClassNameAndID][StateName] = nil + end +end + +-- Trace section + +-- Log a trace (only shown when trace is on) +-- TODO: Make trace function using variable parameters. + +--- Set trace level +-- @param #BASE self +-- @param #number Level +function BASE:TraceLevel( Level ) + _TraceLevel = Level + self:E( "Tracing level " .. Level ) +end + +--- Trace all methods in MOOSE +-- @param #BASE self +-- @param #boolean TraceAll true = trace all methods in MOOSE. +function BASE:TraceAll( TraceAll ) + + _TraceAll = TraceAll + + if _TraceAll then + self:E( "Tracing all methods in MOOSE " ) + else + self:E( "Switched off tracing all methods in MOOSE" ) + end +end + +--- Set tracing for a class +-- @param #BASE self +-- @param #string Class +function BASE:TraceClass( Class ) + _TraceClass[Class] = true + _TraceClassMethod[Class] = {} + self:E( "Tracing class " .. Class ) +end + +--- Set tracing for a specific method of class +-- @param #BASE self +-- @param #string Class +-- @param #string Method +function BASE:TraceClassMethod( Class, Method ) + if not _TraceClassMethod[Class] then + _TraceClassMethod[Class] = {} + _TraceClassMethod[Class].Method = {} + end + _TraceClassMethod[Class].Method[Method] = true + self:E( "Tracing method " .. Method .. " of class " .. Class ) +end + +--- Trace a function call. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if _TraceOn and ( ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) ) then + + local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) + local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function call level 2. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F2( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function call level 3. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F3( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:_T( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if _TraceOn and ( ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) ) then + + local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) + local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function logic level 1. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 1 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + + +--- Trace a function logic level 2. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T2( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function logic level 3. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T3( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Log an exception which will be traced always. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:E( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = -1 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) +end + + + +--- Models time events calling event handing functions. +-- +-- @{SCHEDULER} class +-- =================== +-- The @{SCHEDULER} class models time events calling given event handling functions. +-- +-- SCHEDULER constructor +-- ===================== +-- The SCHEDULER class is quite easy to use: +-- +-- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. +-- +-- SCHEDULER timer methods +-- ======================= +-- The SCHEDULER can be stopped and restarted with the following methods: +-- +-- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. +-- * @{#SCHEDULER.Start}: Stop the scheduler. +-- +-- @module Scheduler +-- @author FlightControl + +--- The SCHEDULER class +-- @type SCHEDULER +-- @extends Base#BASE +SCHEDULER = { + ClassName = "SCHEDULER", +} + + +--- Constructor. +-- @param #SCHEDULER self +-- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. +-- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. +-- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. +-- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. +-- @return #SCHEDULER self +function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) + + self.TimeEventObject = TimeEventObject + self.TimeEventFunction = TimeEventFunction + self.TimeEventFunctionArguments = TimeEventFunctionArguments + self.StartSeconds = StartSeconds + + if RepeatSecondsInterval then + self.RepeatSecondsInterval = RepeatSecondsInterval + self.Repeat = true + else + self.RepeatSecondsInterval = 0 + self.Repeat = false + end + + if RandomizationFactor then + self.RandomizationFactor = RandomizationFactor + else + self.RandomizationFactor = 0 + end + + if StopSeconds then + self.StopSeconds = StopSeconds + end + + + self.StartTime = timer.getTime() + + self:Start() + + return self +end + +--- (Re-)Starts the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Start() + self:F2( self.TimeEventObject ) + + timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) + + return self +end + +--- Stops the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Stop() + self:F2( self.TimeEventObject ) + + self.Repeat = false + + return self +end + +-- Private Functions + +function SCHEDULER:_Scheduler() + self:F2( self.TimeEventFunctionArguments ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + env.info( debug.traceback() ) + + return errmsg + end + + local Status, Result + if self.TimeEventObject then + Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + else + Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + end + + self:T( { Status, Result, self.StartTime, self.RepeatSecondsInterval, self.RandomizationFactor, self.StopSeconds } ) + + if Status and ( ( Result == nil ) or ( Result and Result ~= false ) ) then + if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then + local ScheduleTime = timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 + self:T( { timer.getTime(), ScheduleTime } ) + timer.scheduleFunction( + self._Scheduler, + self, + ScheduleTime + ) + end + end + +end + + + + + + + + +--- The EVENT class models an efficient event handling process between other classes and its units, weapons. +-- @module Event +-- @author FlightControl + +--- The EVENT structure +-- @type EVENT +-- @field #EVENT.Events Events +EVENT = { + ClassName = "EVENT", + ClassID = 0, +} + +local _EVENTCODES = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--- The Event structure +-- @type EVENTDATA +-- @field id +-- @field initiator +-- @field target +-- @field weapon +-- @field IniDCSUnit +-- @field IniDCSUnitName +-- @field IniDCSGroup +-- @field IniDCSGroupName +-- @field TgtDCSUnit +-- @field TgtDCSUnitName +-- @field TgtDCSGroup +-- @field TgtDCSGroupName +-- @field Weapon +-- @field WeaponName +-- @field WeaponTgtDCSUnit + +--- The Events structure +-- @type EVENT.Events +-- @field #number IniUnit + +function EVENT:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F2() + self.EventHandler = world.addEventHandler( self ) + return self +end + +function EVENT:EventText( EventID ) + + local EventText = _EVENTCODES[EventID] + + return EventText +end + + +--- Initializes the Events structure for the event +-- @param #EVENT self +-- @param DCSWorld#world.event EventID +-- @param #string EventClass +-- @return #EVENT.Events +function EVENT:Init( EventID, EventClass ) + self:F3( { _EVENTCODES[EventID], EventClass } ) + if not self.Events[EventID] then + self.Events[EventID] = {} + end + if not self.Events[EventID][EventClass] then + self.Events[EventID][EventClass] = {} + end + return self.Events[EventID][EventClass] +end + + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @param #function OnEventFunction +-- @return #EVENT +function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) + self:F2( EventTemplate.name ) + + for EventUnitID, EventUnit in pairs( EventTemplate.units ) do + OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) + end + return self +end + +--- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) + self:F2( { EventID } ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + Event.EventFunction = EventFunction + Event.EventSelf = EventSelf + return self +end + + +--- Set a new listener for an S_EVENT_X event +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) + self:F2( EventDCSUnitName ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + if not Event.IniUnit then + Event.IniUnit = {} + end + Event.IniUnit[EventDCSUnitName] = {} + Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction + Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf + return self +end + + +--- Create an OnBirth event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirth( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName The id of the unit for the event to be handled. +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Create an OnCrash event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnCrash( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnDead( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + +--- Set a new listener for an S_EVENT_PILOT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_LAND event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_TAKEOFF event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_STARTUP event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShot( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event for a unit. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) + + return self +end + + + +function EVENT:onEvent( Event ) + self:F2( { _EVENTCODES[Event.id], Event } ) + + if self and self.Events and self.Events[Event.id] then + if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then + Event.IniDCSUnit = Event.initiator + Event.IniDCSGroup = Event.IniDCSUnit:getGroup() + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniDCSGroupName = "" + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + Event.IniDCSGroupName = Event.IniDCSGroup:getName() + end + end + if Event.target then + if Event.target and Event.target:getCategory() == Object.Category.UNIT then + Event.TgtDCSUnit = Event.target + Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtDCSGroupName = "" + if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then + Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() + end + end + end + if Event.weapon then + Event.Weapon = Event.weapon + Event.WeaponName = Event.Weapon:getTypeName() + --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() + end + self:E( { _EVENTCODES[Event.id], Event } ) + for ClassName, EventData in pairs( self.Events[Event.id] ) do + if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then + self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) + EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) + else + if Event.IniDCSUnit and not EventData.IniUnit then + self:T2( { "Calling event function for class ", ClassName } ) + EventData.EventFunction( EventData.EventSelf, Event ) + end + end + end + end +end + +--- Encapsulation of DCS World Menu system in a set of MENU classes. +-- @module Menu + +--- The MENU class +-- @type MENU +-- @extends Base#BASE +MENU = { + ClassName = "MENU", + MenuPath = nil, + MenuText = "", + MenuParentPath = nil +} + +--- +function MENU:New( MenuText, MenuParentPath ) + + -- Arrange meta tables + local Child = BASE:Inherit( self, BASE:New() ) + + Child.MenuPath = nil + Child.MenuText = MenuText + Child.MenuParentPath = MenuParentPath + return Child +end + +--- The COMMANDMENU class +-- @type COMMANDMENU +-- @extends Menu#MENU +COMMANDMENU = { + ClassName = "COMMANDMENU", + CommandMenuFunction = nil, + CommandMenuArgument = nil +} + +function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + Child.CommandMenuFunction = CommandMenuFunction + Child.CommandMenuArgument = CommandMenuArgument + return Child +end + +--- The SUBMENU class +-- @type SUBMENU +-- @extends Menu#MENU +SUBMENU = { + ClassName = "SUBMENU" +} + +function SUBMENU:New( MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) + return Child +end + +-- This local variable is used to cache the menus registered under clients. +-- Menus don't dissapear when clients are destroyed and restarted. +-- So every menu for a client created must be tracked so that program logic accidentally does not create +-- the same menus twice during initialization logic. +-- These menu classes are handling this logic with this variable. +local _MENUCLIENTS = {} + +--- The MENU_CLIENT class +-- @type MENU_CLIENT +-- @extends Menu#MENU +MENU_CLIENT = { + ClassName = "MENU_CLIENT" +} + +--- Creates a new menu item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_CLIENT self +function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuClient, MenuText, ParentMenu } ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) + MenuPath[MenuPathID] = self.MenuPath + + self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_CLIENT_COMMAND class +-- @type MENU_CLIENT_COMMAND +-- @extends Menu#MENU +MENU_CLIENT_COMMAND = { + ClassName = "MENU_CLIENT_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return Menu#MENU_CLIENT_COMMAND self +function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + MenuPath[MenuPathID] = self.MenuPath + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +function MENU_CLIENT_COMMAND:Remove() + self:F( self.MenuPath ) + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_COALITION class +-- @type MENU_COALITION +-- @extends Menu#MENU +MENU_COALITION = { + ClassName = "MENU_COALITION" +} + +--- Creates a new coalition menu item +-- @param #MENU_COALITION self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_COALITION self +function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuCoalition, MenuText, ParentMenu } ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + self:T( { MenuParentPath, MenuText } ) + + self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) + + self:T( { self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + + return nil +end + + +--- The MENU_COALITION_COMMAND class +-- @type MENU_COALITION_COMMAND +-- @extends Menu#MENU +MENU_COALITION_COMMAND = { + ClassName = "MENU_COALITION_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param #MENU_COALITION_COMMAND self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +--- Removes a radio command item for a coalition +-- @param #MENU_COALITION_COMMAND self +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:Remove() + self:F( self.MenuPath ) + + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end +--- This module contains the GROUP class. +-- +-- 1) @{Group#GROUP} class, extends @{Base#BASE} +-- ============================================= +-- The @{Group#GROUP} class is a wrapper class to handle the DCS Group objects: +-- +-- * Support all DCS Group APIs. +-- * Enhance with Group specific APIs not in the DCS Group API set. +-- * Handle local Group Controller. +-- * Manage the "state" of the DCS Group. +-- +-- **IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil).** +-- +-- 1.1) GROUP reference methods +-- ----------------------- +-- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). +-- +-- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Group or the DCS GroupName. +-- +-- Another thing to know is that GROUP objects do not "contain" the DCS Group object. +-- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. +-- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. +-- +-- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: +-- +-- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. +-- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. +-- +-- 1.2) GROUP task methods +-- ----------------------- +-- Several group task methods are available that help you to prepare tasks. +-- These methods return a string consisting of the task description, which can then be given to either a @{Group#GROUP.PushTask} or @{Group#SetTask} method to assign the task to the GROUP. +-- Tasks are specific for the category of the GROUP, more specific, for AIR, GROUND or AIR and GROUND. +-- Each task description where applicable indicates for which group category the task is valid. +-- There are 2 main subdivisions of tasks: Assigned tasks and EnRoute tasks. +-- +-- ### 1.2.1) Assigned task methods +-- +-- Assigned task methods make the group execute the task where the location of the (possible) targets of the task are known before being detected. +-- This is different from the EnRoute tasks, where the targets of the task need to be detected before the task can be executed. +-- +-- Find below a list of the **assigned task** methods: +-- +-- * @{#GROUP.TaskAttackGroup}: (AIR) Attack a Group. +-- * @{#GROUP.TaskAttackMapObject}: (AIR) Attacking the map object (building, structure, e.t.c). +-- * @{#GROUP.TaskAttackUnit}: (AIR) Attack the Unit. +-- * @{#GROUP.TaskBombing}: (AIR) Delivering weapon at the point on the ground. +-- * @{#GROUP.TaskBombingRunway}: (AIR) Delivering weapon on the runway. +-- * @{#GROUP.TaskEmbarking}: (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. +-- * @{#GROUP.TaskEmbarkToTransport}: (GROUND) Embark to a Transport landed at a location. +-- * @{#GROUP.TaskEscort}: (AIR) Escort another airborne group. +-- * @{#GROUP.TaskFAC_AttackGroup}: (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. +-- * @{#GROUP.TaskFireAtPoint}: (GROUND) Fire at a VEC2 point until ammunition is finished. +-- * @{#GROUP.TaskFollow}: (AIR) Following another airborne group. +-- * @{#GROUP.TaskHold}: (GROUND) Hold ground group from moving. +-- * @{#GROUP.TaskHoldPosition}: (AIR) Hold position at the current position of the first unit of the group. +-- * @{#GROUP.TaskLand}: (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- * @{#GROUP.TaskLandAtZone}: (AIR) Land the group at a @{Zone#ZONE_RADIUS). +-- * @{#GROUP.TaskOrbitCircle}: (AIR) Orbit at the current position of the first unit of the group at a specified alititude. +-- * @{#GROUP.TaskOrbitCircleAtVec2}: (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- * @{#GROUP.TaskRefueling}: (AIR) Refueling from the nearest tanker. No parameters. +-- * @{#GROUP.TaskRoute}: (AIR + GROUND) Return a Misson task to follow a given route defined by Points. +-- * @{#GROUP.TaskRouteToVec2}: (AIR + GROUND) Make the Group move to a given point. +-- * @{#GROUP.TaskRouteToVec3}: (AIR + GROUND) Make the Group move to a given point. +-- * @{#GROUP.TaskRouteToZone}: (AIR + GROUND) Route the group to a given zone. +-- +-- ### 1.2.2) EnRoute task methods +-- +-- EnRoute tasks require the targets of the task need to be detected by the group (using its sensors) before the task can be executed: +-- +-- * @{#GROUP.EnRouteTaskAWACS}: (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- * @{#GROUP.EnRouteTaskEngageGroup}: (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskEngageTargets}: (AIR) Engaging targets of defined types. +-- * @{#GROUP.EnRouteTaskEWR}: (AIR) Attack the Unit. +-- * @{#GROUP.EnRouteTaskFAC}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskFAC_EngageGroup}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskTanker}: (AIR) Aircraft will act as a tanker for friendly units. No parameters. +-- +-- ### 1.2.3) Preparation task methods +-- +-- There are certain task methods that allow to tailor the task behaviour: +-- +-- * @{#GROUP.TaskWrappedAction}: Return a WrappedAction Task taking a Command. +-- * @{#GROUP.TaskCombo}: Return a Combo Task taking an array of Tasks. +-- * @{#GROUP.TaskCondition}: Return a condition section for a controlled task. +-- * @{#GROUP.TaskControlled}: Return a Controlled Task taking a Task and a TaskCondition. +-- +-- ### 1.2.4) Obtain the mission from group templates +-- +-- Group templates contain complete mission descriptions. Sometimes you want to copy a complete mission from a group and assign it to another: +-- +-- * @{#GROUP.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. +-- +-- 1.3) GROUP Command methods +-- -------------------------- +-- Group **command methods** prepare the execution of commands using the @{#GROUP.SetCommand} method: +-- +-- * @{#GROUP.CommandDoScript}: Do Script command. +-- * @{#GROUP.CommandSwitchWayPoint}: Perform a switch waypoint command. +-- +-- 1.4) GROUP Option methods +-- ------------------------- +-- Group **Option methods** change the behaviour of the Group while being alive. +-- +-- ### 1.4.1) Rule of Engagement: +-- +-- * @{#GROUP.OptionROEWeaponFree} +-- * @{#GROUP.OptionROEOpenFire} +-- * @{#GROUP.OptionROEReturnFire} +-- * @{#GROUP.OptionROEEvadeFire} +-- +-- To check whether an ROE option is valid for a specific group, use: +-- +-- * @{#GROUP.OptionROEWeaponFreePossible} +-- * @{#GROUP.OptionROEOpenFirePossible} +-- * @{#GROUP.OptionROEReturnFirePossible} +-- * @{#GROUP.OptionROEEvadeFirePossible} +-- +-- ### 1.4.2) Rule on thread: +-- +-- * @{#GROUP.OptionROTNoReaction} +-- * @{#GROUP.OptionROTPassiveDefense} +-- * @{#GROUP.OptionROTEvadeFire} +-- * @{#GROUP.OptionROTVertical} +-- +-- To test whether an ROT option is valid for a specific group, use: +-- +-- * @{#GROUP.OptionROTNoReactionPossible} +-- * @{#GROUP.OptionROTPassiveDefensePossible} +-- * @{#GROUP.OptionROTEvadeFirePossible} +-- * @{#GROUP.OptionROTVerticalPossible} +-- +-- 1.5) GROUP Zone validation methods +-- ---------------------------------- +-- The group can be validated whether it is completely, partly or not within a @{Zone}. +-- Use the following Zone validation methods on the group: +-- +-- * @{#GROUP.IsCompletelyInZone}: Returns true if all units of the group are within a @{Zone}. +-- * @{#GROUP.IsPartlyInZone}: Returns true if some units of the group are within a @{Zone}. +-- * @{#GROUP.IsNotInZone}: Returns true if none of the group units of the group are within a @{Zone}. +-- +-- The zone can be of any @{Zone} class derived from @{Zone#ZONE_BASE}. So, these methods are polymorphic to the zones tested on. +-- +-- @module Group +-- @author FlightControl + +--- The GROUP class +-- @type GROUP +-- @extends Base#BASE +-- @field DCSGroup#Group DCSGroup The DCS group class. +-- @field #string GroupName The name of the group. +GROUP = { + ClassName = "GROUP", + GroupName = "", + GroupID = 0, + Controller = nil, + DCSGroup = nil, + WayPointFunctions = {}, +} + +--- A DCSGroup +-- @type DCSGroup +-- @field id_ The ID of the group in DCS + +--- Create a new GROUP from a DCSGroup +-- @param #GROUP self +-- @param DCSGroup#Group GroupName The DCS Group name +-- @return #GROUP self +function GROUP:Register( GroupName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( GroupName ) + self.GroupName = GroupName + return self +end + +-- Reference methods. + +--- Find the GROUP wrapper class instance using the DCS Group. +-- @param #GROUP self +-- @param DCSGroup#Group DCSGroup The DCS Group. +-- @return #GROUP The GROUP. +function GROUP:Find( DCSGroup ) + + local GroupName = DCSGroup:getName() -- Group#GROUP + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +--- Find the created GROUP using the DCS Group Name. +-- @param #GROUP self +-- @param #string GroupName The DCS Group Name. +-- @return #GROUP The GROUP. +function GROUP:FindByName( GroupName ) + + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +-- DCS Group methods support. + +--- Returns the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group The DCS Group. +function GROUP:GetDCSGroup() + local DCSGroup = Group.getByName( self.GroupName ) + + if DCSGroup then + return DCSGroup + end + + return nil +end + + +--- Returns if the DCS Group is alive. +-- When the group exists at run-time, this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean true if the DCS Group is alive. +function GROUP:IsAlive() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupIsAlive = DCSGroup:isExist() + self:T3( GroupIsAlive ) + return GroupIsAlive + end + + return nil +end + +--- Destroys the DCS Group and all of its DCS Units. +-- Note that this destroy method also raises a destroy event at run-time. +-- So all event listeners will catch the destroy event of this DCS Group. +-- @param #GROUP self +function GROUP:Destroy() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + self:CreateEventCrash( timer.getTime(), UnitData ) + end + DCSGroup:destroy() + DCSGroup = nil + end + + return nil +end + +--- Returns category of the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group.Category The category ID +function GROUP:GetCategory() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + return GroupCategory + end + + return nil +end + +--- Returns the category name of the DCS Group. +-- @param #GROUP self +-- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship +function GROUP:GetCategoryName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local CategoryNames = { + [Group.Category.AIRPLANE] = "Airplane", + [Group.Category.HELICOPTER] = "Helicopter", + [Group.Category.GROUND] = "Ground Unit", + [Group.Category.SHIP] = "Ship", + } + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + + return CategoryNames[GroupCategory] + end + + return nil +end + + +--- Returns the coalition of the DCS Group. +-- @param #GROUP self +-- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. +function GROUP:GetCoalition() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCoalition = DCSGroup:getCoalition() + self:T3( GroupCoalition ) + return GroupCoalition + end + + return nil +end + +--- Returns the country of the DCS Group. +-- @param #GROUP self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Group is not existing or alive. +function GROUP:GetCountry() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCountry = DCSGroup:getUnit(1):getCountry() + self:T3( GroupCountry ) + return GroupCountry + end + + return nil +end + +--- Returns the name of the DCS Group. +-- @param #GROUP self +-- @return #string The DCS Group name. +function GROUP:GetName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupName = DCSGroup:getName() + self:T3( GroupName ) + return GroupName + end + + return nil +end + +--- Returns the DCS Group identifier. +-- @param #GROUP self +-- @return #number The identifier of the DCS Group. +function GROUP:GetID() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupID = DCSGroup:getID() + self:T3( GroupID ) + return GroupID + end + + return nil +end + +--- Returns the UNIT wrapper class with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the UNIT wrapper class to be returned. +-- @return Unit#UNIT The UNIT wrapper class. +function GROUP:GetUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) + self:T3( UnitFound.UnitName ) + self:T2( UnitFound ) + return UnitFound + end + + return nil +end + +--- Returns the DCS Unit with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the DCS Unit to be returned. +-- @return DCSUnit#Unit The DCS Unit. +function GROUP:GetDCSUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) + self:T3( DCSUnitFound ) + return DCSUnitFound + end + + return nil +end + +--- Returns current size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. +-- @param #GROUP self +-- @return #number The DCS Group size. +function GROUP:GetSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupSize = DCSGroup:getSize() + self:T3( GroupSize ) + return GroupSize + end + + return nil +end + +--- +--- Returns the initial size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. +-- @param #GROUP self +-- @return #number The DCS Group initial size. +function GROUP:GetInitialSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupInitialSize = DCSGroup:getInitialSize() + self:T3( GroupInitialSize ) + return GroupInitialSize + end + + return nil +end + +--- Returns the UNITs wrappers of the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The UNITs wrappers. +function GROUP:GetUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + local Units = {} + for Index, UnitData in pairs( DCSUnits ) do + Units[#Units+1] = UNIT:Find( UnitData ) + end + self:T3( Units ) + return Units + end + + return nil +end + + +--- Returns the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The DCS Units. +function GROUP:GetDCSUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + self:T3( DCSUnits ) + return DCSUnits + end + + return nil +end + +--- Get the controller for the GROUP. +-- @param #GROUP self +-- @return DCSController#Controller +function GROUP:_GetController() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupController = DCSGroup:getController() + self:T3( GroupController ) + return GroupController + end + + return nil +end + + +--- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. +-- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. +-- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. +-- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! +-- @param #GROUP self +-- @return #GROUP +function GROUP:WayPointInitialize() + + self.WayPoints = self:GetTaskRoute() + + return self +end + + +--- Registers a waypoint function that will be executed when the group moves over the WayPoint. +-- @param #GROUP self +-- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! +-- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. +-- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. +-- @return #GROUP +function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) + self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) + + table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) + self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) + return self +end + + +function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) + + local DCSTask + + local DCSScript = {} + DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " + + if FunctionArguments.n > 0 then + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" + else + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" + end + + DCSTask = self:TaskWrappedAction( + self:CommandDoScript( + table.concat( DCSScript ) + ), WayPointIndex + ) + + self:T3( DCSTask ) + + return DCSTask + +end + + + +--- Executes the WayPoint plan. +-- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. +-- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! +-- @param #GROUP self +-- @param #number WayPoint The WayPoint from where to execute the mission. +-- @param #number WaitTime The amount seconds to wait before initiating the mission. +-- @return #GROUP +function GROUP:WayPointExecute( WayPoint, WaitTime ) + + if not WayPoint then + WayPoint = 1 + end + + -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. + for TaskPointID = 1, WayPoint - 1 do + table.remove( self.WayPoints, 1 ) + end + + self:T3( self.WayPoints ) + + self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) + + return self +end + + +--- Activates a GROUP. +-- @param #GROUP self +function GROUP:Activate() + self:F2( { self.GroupName } ) + trigger.action.activateGroup( self:GetDCSGroup() ) + return self:GetDCSGroup() +end + + +--- Gets the type name of the group. +-- @param #GROUP self +-- @return #string The type name of the group. +function GROUP:GetTypeName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupTypeName = DCSGroup:getUnit(1):getTypeName() + self:T3( GroupTypeName ) + return( GroupTypeName ) + end + + return nil +end + +--- Gets the CallSign of the first DCS Unit of the DCS Group. +-- @param #GROUP self +-- @return #string The CallSign of the first DCS Unit of the DCS Group. +function GROUP:GetCallsign() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCallSign = DCSGroup:getUnit(1):getCallsign() + self:T3( GroupCallSign ) + return GroupCallSign + end + + return nil +end + +--- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec2() + self:F2( self.GroupName ) + + local GroupPointVec2 = self:GetUnit(1):GetPointVec2() + self:T3( GroupPointVec2 ) + return GroupPointVec2 +end + +--- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec3() + self:F2( self.GroupName ) + + local GroupPointVec3 = self:GetUnit(1):GetPointVec3() + self:T3( GroupPointVec3 ) + return GroupPointVec3 +end + + + +-- Is Zone Functions + +--- Returns true if all units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsCompletelyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + else + return false + end + end + + return true +end + +--- Returns true if some units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsPartlyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + return true + end + end + + return false +end + +--- Returns true if none of the group units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsNotInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + return false + end + end + + return true +end + +--- Returns if the group is of an air category. +-- If the group is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean Air category evaluation result. +function GROUP:IsAir() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER + self:T3( IsAirResult ) + return IsAirResult + end + + return nil +end + +--- Returns if the DCS Group contains Helicopters. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Helicopters. +function GROUP:IsHelicopter() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.HELICOPTER + end + + return nil +end + +--- Returns if the DCS Group contains AirPlanes. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains AirPlanes. +function GROUP:IsAirPlane() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.AIRPLANE + end + + return nil +end + +--- Returns if the DCS Group contains Ground troops. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ground troops. +function GROUP:IsGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.GROUND + end + + return nil +end + +--- Returns if the DCS Group contains Ships. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ships. +function GROUP:IsShip() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.SHIP + end + + return nil +end + +--- Returns if all units of the group are on the ground or landed. +-- If all units of this group are on the ground, this function will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean All units on the ground result. +function GROUP:AllOnGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local AllOnGroundResult = true + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + if UnitData:inAir() then + AllOnGroundResult = false + end + end + + self:T3( AllOnGroundResult ) + return AllOnGroundResult + end + + return nil +end + +--- Returns the current maximum velocity of the group. +-- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. +-- @param #GROUP self +-- @return #number Maximum velocity found. +function GROUP:GetMaxVelocity() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local MaxVelocity = 0 + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + + local Velocity = UnitData:getVelocity() + local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) + + if VelocityTotal < MaxVelocity then + MaxVelocity = VelocityTotal + end + end + + return MaxVelocity + end + + return nil +end + +--- Returns the current minimum height of the group. +-- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. +-- @param #GROUP self +-- @return #number Minimum height found. +function GROUP:GetMinHeight() + self:F2() + +end + +--- Returns the current maximum height of the group. +-- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. +-- @param #GROUP self +-- @return #number Maximum height found. +function GROUP:GetMaxHeight() + self:F2() + +end + +-- Tasks + +--- Popping current Task from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PopCurrentTask() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:popTask() + return self + end + + return nil +end + +--- Pushing Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PushTask( DCSTask, WaitTime ) + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller:pushTask( DCSTask ) + + if WaitTime then + --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) + else + Controller:pushTask( DCSTask ) + end + + return self + end + + return nil +end + +--- Clearing the Task Queue and Setting the Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:SetTask( DCSTask, WaitTime ) + self:F2( { DCSTask } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller.setTask( Controller, DCSTask ) + + if not WaitTime then + WaitTime = 1 + end + --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) + + return self + end + + return nil +end + + +--- Return a condition section for a controlled task. +-- @param #GROUP self +-- @param DCSTime#Time time +-- @param #string userFlag +-- @param #boolean userFlagValue +-- @param #string condition +-- @param DCSTime#Time duration +-- @param #number lastWayPoint +-- return DCSTask#Task +function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) + self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) + + local DCSStopCondition = {} + DCSStopCondition.time = time + DCSStopCondition.userFlag = userFlag + DCSStopCondition.userFlagValue = userFlagValue + DCSStopCondition.condition = condition + DCSStopCondition.duration = duration + DCSStopCondition.lastWayPoint = lastWayPoint + + self:T3( { DCSStopCondition } ) + return DCSStopCondition +end + +--- Return a Controlled Task taking a Task and a TaskCondition. +-- @param #GROUP self +-- @param DCSTask#Task DCSTask +-- @param #DCSStopCondition DCSStopCondition +-- @return DCSTask#Task +function GROUP:TaskControlled( DCSTask, DCSStopCondition ) + self:F2( { DCSTask, DCSStopCondition } ) + + local DCSTaskControlled + + DCSTaskControlled = { + id = 'ControlledTask', + params = { + task = DCSTask, + stopCondition = DCSStopCondition + } + } + + self:T3( { DCSTaskControlled } ) + return DCSTaskControlled +end + +--- Return a Combo Task taking an array of Tasks. +-- @param #GROUP self +-- @param DCSTask#TaskArray DCSTasks Array of @{DCSTask#Task} +-- @return DCSTask#Task +function GROUP:TaskCombo( DCSTasks ) + self:F2( { DCSTasks } ) + + local DCSTaskCombo + + DCSTaskCombo = { + id = 'ComboTask', + params = { + tasks = DCSTasks + } + } + + self:T3( { DCSTaskCombo } ) + return DCSTaskCombo +end + +--- Return a WrappedAction Task taking a Command. +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return DCSTask#Task +function GROUP:TaskWrappedAction( DCSCommand, Index ) + self:F2( { DCSCommand } ) + + local DCSTaskWrappedAction + + DCSTaskWrappedAction = { + id = "WrappedAction", + enabled = true, + number = Index, + auto = false, + params = { + action = DCSCommand, + }, + } + + self:T3( { DCSTaskWrappedAction } ) + return DCSTaskWrappedAction +end + +--- Executes a command action +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return #GROUP self +function GROUP:SetCommand( DCSCommand ) + self:F2( DCSCommand ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:setCommand( DCSCommand ) + return self + end + + return nil +end + +--- Perform a switch waypoint command +-- @param #GROUP self +-- @param #number FromWayPoint +-- @param #number ToWayPoint +-- @return DCSTask#Task +function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) + self:F2( { FromWayPoint, ToWayPoint, Index } ) + + local CommandSwitchWayPoint = { + id = 'SwitchWaypoint', + params = { + fromWaypointIndex = FromWayPoint, + goToWaypointIndex = ToWayPoint, + }, + } + + self:T3( { CommandSwitchWayPoint } ) + return CommandSwitchWayPoint +end + + +-- TASKS FOR AIR GROUPS + + +--- (AIR) Attack a Group. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- AttackGroup = { + -- id = 'AttackGroup', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The unit. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- AttackUnit = { + -- id = 'AttackUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- } + -- } + + local DCSTask + DCSTask = { id = 'AttackUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon at the point on the ground. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- Bombing = { +-- id = 'Bombing', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'Bombing', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point to hold the position. +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) + self:F2( { self.GroupName, Point, Altitude, Speed } ) + + -- pattern = enum AI.Task.OribtPattern, + -- point = Vec2, + -- point2 = Vec2, + -- speed = Distance, + -- altitude = Distance + + local LandHeight = land.getHeight( Point ) + + self:T3( { LandHeight } ) + + local DCSTask = { id = 'Orbit', + params = { pattern = AI.Task.OrbitPattern.CIRCLE, + point = Point, + speed = Speed, + altitude = Altitude + LandHeight + } + } + + + -- local AITask = { id = 'ControlledTask', + -- params = { task = { id = 'Orbit', + -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, + -- point = Point, + -- speed = Speed, + -- altitude = Altitude + LandHeight + -- } + -- }, + -- stopCondition = { duration = Duration + -- } + -- } + -- } + -- ) + + return DCSTask +end + +--- (AIR) Orbit at the current position of the first unit of the group at a specified alititude. +-- @param #GROUP self +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircle( Altitude, Speed ) + self:F2( { self.GroupName, Altitude, Speed } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupPoint = self:GetPointVec2() + return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) + end + + return nil +end + + + +--- (AIR) Hold position at the current position of the first unit of the group. +-- @param #GROUP self +-- @param #number Duration The maximum duration in seconds to hold the position. +-- @return #GROUP self +function GROUP:TaskHoldPosition() + self:F2( { self.GroupName } ) + + return self:TaskOrbitCircle( 30, 10 ) +end + + + + +--- (AIR) Attacking the map object (building, structure, e.t.c). +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- AttackMapObject = { +-- id = 'AttackMapObject', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'AttackMapObject', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon on the runway. +-- @param #GROUP self +-- @param Airbase#AIRBASE Airbase Airbase to attack. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- BombingRunway = { +-- id = 'BombingRunway', +-- params = { +-- runwayId = AirdromeId, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'BombingRunway', + params = { + point = Airbase:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Refueling from the nearest tanker. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskRefueling() + self:F2( { self.GroupName } ) + +-- Refueling = { +-- id = 'Refueling', +-- params = {} +-- } + + local DCSTask + DCSTask = { id = 'Refueling', + params = { + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtVec2( Point, Duration ) + self:F2( { self.GroupName, Point, Duration } ) + +-- Land = { +-- id= 'Land', +-- params = { +-- point = Vec2, +-- durationFlag = boolean, +-- duration = Time +-- } +-- } + + local DCSTask + if Duration and Duration > 0 then + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = true, + duration = Duration, + }, + } + else + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = false, + }, + } + end + + self:T3( DCSTask ) + return DCSTask +end + +--- (AIR) Land the group at a @{Zone#ZONE_RADIUS). +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) + self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) + + local Point + if RandomPoint then + Point = Zone:GetRandomPointVec2() + else + Point = Zone:GetPointVec2() + end + + local DCSTask = self:TaskLandAtVec2( Point, Duration ) + + self:T3( DCSTask ) + return DCSTask +end + + + +--- (AIR) Following another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- If another group is on land the unit / group will orbit around. +-- @param #GROUP self +-- @param Group#GROUP FollowGroup The group to be followed. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) + +-- Follow = { +-- id = 'Follow', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Escort another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- The unit / group will also protect that group from threats of specified types. +-- @param #GROUP self +-- @param Group#GROUP EscortGroup The group to be escorted. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) + +-- Escort = { +-- id = 'Escort', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number, +-- engagementDistMax = Distance, +-- targetTypes = array of AttributeName, +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + engagementDistMax = EngagementDistance, + targetTypes = TargetTypes, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- GROUND TASKS + +--- (GROUND) Fire at a VEC2 point until ammunition is finished. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 The point to fire at. +-- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFireAtPoint( PointVec2, Radius ) + self:F2( { self.GroupName, PointVec2, Radius } ) + + -- FireAtPoint = { + -- id = 'FireAtPoint', + -- params = { + -- point = Vec2, + -- radius = Distance, + -- } + -- } + + local DCSTask + DCSTask = { id = 'FireAtPoint', + params = { + point = PointVec2, + radius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Hold ground group from moving. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskHold() + self:F2( { self.GroupName } ) + +-- Hold = { +-- id = 'Hold', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Hold', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS + +--- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) + +-- FAC_AttackGroup = { +-- id = 'FAC_AttackGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +-- EN-ROUTE TASKS FOR AIRBORNE GROUPS + +--- (AIR) Engaging targets of defined types. +-- @param #GROUP self +-- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) + self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) + +-- EngageTargets ={ +-- id = 'EngageTargets', +-- params = { +-- maxDist = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargets', + params = { + maxDist = Distance, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR) Engaging a targets of defined types at circle-shaped zone. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. +-- @param DCSTypes#Distance Radius Radius of the zone. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) + self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) + +-- EngageTargetsInZone = { +-- id = 'EngageTargetsInZone', +-- params = { +-- point = Vec2, +-- zoneRadius = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargetsInZone', + params = { + point = PointVec2, + zoneRadius = Radius, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- EngageGroup = { + -- id = 'EngageGroup ', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- priority = number, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The UNIT. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- EngageUnit = { + -- id = 'EngageUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- priority = number, + -- } + -- } + + local DCSTask + DCSTask = { id = 'EngageUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskAWACS( ) + self:F2( { self.GroupName } ) + +-- AWACS = { +-- id = 'AWACS', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'AWACS', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Aircraft will act as a tanker for friendly units. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskTanker( ) + self:F2( { self.GroupName } ) + +-- Tanker = { +-- id = 'Tanker', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Tanker', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for ground units/groups + +--- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEWR( ) + self:F2( { self.GroupName } ) + +-- EWR = { +-- id = 'EWR', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'EWR', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for airborne and ground units/groups + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) + +-- FAC_EngageGroup = { +-- id = 'FAC_EngageGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean, +-- priority = number, +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + priority = Priority, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC( Radius, Priority ) + self:F2( { self.GroupName, Radius, Priority } ) + +-- FAC = { +-- id = 'FAC', +-- params = { +-- radius = Distance, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC', + params = { + radius = Radius, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + + +--- (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Duration The duration in seconds to wait. +-- @param #GROUP EmbarkingGroup The group to be embarked. +-- @return DCSTask#Task The DCS task structure +function GROUP:TaskEmbarking( Point, Duration, EmbarkingGroup ) + self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) + + local DCSTask + DCSTask = { id = 'Embarking', + params = { x = Point.x, + y = Point.y, + duration = Duration, + groupsForEmbarking = { EmbarkingGroup.GroupID }, + durationFlag = true, + distributionFlag = false, + distribution = {}, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Embark to a Transport landed at a location. + +--- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Radius The radius of the embarking zone around the Point. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEmbarkToTransport( Point, Radius ) + self:F2( { self.GroupName, Point, Radius } ) + + local DCSTask --DCSTask#Task + DCSTask = { id = 'EmbarkToTransport', + params = { x = Point.x, + y = Point.y, + zoneRadius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR + GROUND) Return a mission task from a mission template. +-- @param #GROUP self +-- @param #table TaskMission A table containing the mission task. +-- @return DCSTask#Task +function GROUP:TaskMission( TaskMission ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { TaskMission, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Return a Misson task to follow a given route defined by Points. +-- @param #GROUP self +-- @param #table Points A table of route points. +-- @return DCSTask#Task +function GROUP:TaskRoute( Points ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR + GROUND) Make the Group move to fly to a given point. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec2( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.y + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + +--- (AIR + GROUND) Make the Group move to a given point. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec3( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec3() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = "BARO" + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.z + PointTo.alt = Point.y + PointTo.alt_type = "BARO" + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + + + +--- Make the group to follow a given route. +-- @param #GROUP self +-- @param #table GoPoints A table of Route Points. +-- @return #GROUP self +function GROUP:Route( GoPoints ) + self:F2( GoPoints ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Points = routines.utils.deepCopy( GoPoints ) + local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } + local Controller = self:_GetController() + --Controller.setTask( Controller, MissionTask ) + --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) + SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) + return self + end + + return nil +end + + + +--- (AIR + GROUND) Route the group to a given zone. +-- The group final destination point can be randomized. +-- A speed can be given in km/h. +-- A given formation can be given. +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to route to. +-- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. +-- @param #number Speed The speed. +-- @param Base#FORMATION Formation The formation string. +function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) + self:F2( Zone ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local GroupPoint = self:GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Cone" + PointFrom.speed = 20 / 1.6 + + + local PointTo = {} + local ZonePoint + + if Randomize then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + PointTo.x = ZonePoint.x + PointTo.y = ZonePoint.y + PointTo.type = "Turning Point" + + if Formation then + PointTo.action = Formation + else + PointTo.action = "Cone" + end + + if Speed then + PointTo.speed = Speed + else + PointTo.speed = 20 / 1.6 + end + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self + end + + return nil +end + +-- Commands + +--- Do Script command +-- @param #GROUP self +-- @param #string DoScript +-- @return #DCSCommand +function GROUP:CommandDoScript( DoScript ) + + local DCSDoScript = { + id = "Script", + params = { + command = DoScript, + }, + } + + self:T3( DCSDoScript ) + return DCSDoScript +end + + +--- Return the mission template of the group. +-- @param #GROUP self +-- @return #table The MissionTemplate +function GROUP:GetTaskMission() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) +end + +--- Return the mission route of the group. +-- @param #GROUP self +-- @return #table The mission route defined by points. +function GROUP:GetTaskRoute() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) +end + +--- Return the route of a group by using the @{Database#DATABASE} class. +-- @param #GROUP self +-- @param #number Begin The route point from where the copy will start. The base route point is 0. +-- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. +-- @param #boolean Randomize Randomization of the route, when true. +-- @param #number Radius When randomization is on, the randomization is within the radius. +function GROUP:CopyRoute( Begin, End, Randomize, Radius ) + self:F2( { Begin, End } ) + + local Points = {} + + -- Could be a Spawned Group + local GroupName = string.match( self:GetName(), ".*#" ) + if GroupName then + GroupName = GroupName:sub( 1, -2 ) + else + GroupName = self:GetName() + end + + self:T3( { GroupName } ) + + local Template = _DATABASE.Templates.Groups[GroupName].Template + + if Template then + if not Begin then + Begin = 0 + end + if not End then + End = 0 + end + + for TPointID = Begin + 1, #Template.route.points - End do + if Template.route.points[TPointID] then + Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) + if Randomize then + if not Radius then + Radius = 500 + end + Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) + Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) + end + end + end + return Points + end + + return nil +end + + +function GROUP:GetDetectedTargets() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return self:_GetController():getDetectedTargets() + end + + return nil +end + +function GROUP:IsTargetDetected( DCSObject ) + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + + local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, + Controller.Detection.VISUAL, + Controller.Detection.OPTIC, + Controller.Detection.RADAR, + Controller.Detection.IRST, + Controller.Detection.RWR, + Controller.Detection.DLINK + ) + return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + end + + return nil +end + +-- Options + +--- Can the GROUP hold their weapons? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEHoldFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Holding weapons. +-- @param Group#GROUP self +-- @return Group#GROUP self +function GROUP:OptionROEHoldFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack returning on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEReturnFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Return fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEReturnFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack designated targets? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEOpenFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Openfire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEOpenFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack targets of opportunity? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEWeaponFreePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Weapon free. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEWeaponFree() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) + end + + return self + end + + return nil +end + +--- Can the GROUP ignore enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTNoReactionPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- No evasion on enemy threats. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTNoReaction() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade using passive defenses? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTPassiveDefensePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Evasion passive defense. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTPassiveDefense() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTEvadeFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTEvadeFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on fire using vertical manoeuvres? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTVerticalPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire using vertical manoeuvres. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTVertical() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + end + + return self + end + + return nil +end + +-- Message APIs + +--- Returns a message for a coalition or a client. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @return Message#MESSAGE +function GROUP:Message( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return MESSAGE:New( Message, Duration, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")" ) + end + + return nil +end + +--- Send a message to all coalitions. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToAll( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToAll() + end + + return nil +end + +--- Send a message to the red coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTYpes#Duration Duration The duration of the message. +function GROUP:MessageToRed( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToRed() + end + + return nil +end + +--- Send a message to the blue coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToBlue( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToBlue() + end + + return nil +end + +--- Send a message to a client. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @param Client#CLIENT Client The client object receiving the message. +function GROUP:MessageToClient( Message, Duration, Client ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToClient( Client ) + end + + return nil +end +--- This module contains the UNIT class. +-- +-- 1) @{Unit#UNIT} class, extends @{Base#BASE} +-- =========================================== +-- The @{Unit#UNIT} class is a wrapper class to handle the DCS Unit objects: +-- +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Unit API set. +-- * Handle local Unit Controller. +-- * Manage the "state" of the DCS Unit. +-- +-- +-- 1.1) UNIT reference methods +-- ---------------------- +-- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). +-- +-- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. +-- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. +-- +-- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: +-- +-- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. +-- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). +-- +-- 1.2) DCS UNIT APIs +-- ------------------ +-- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. +-- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, +-- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() +-- is implemented in the UNIT class as @{#UNIT.GetName}(). +-- +-- 1.3) Smoke, Flare Units +-- ----------------------- +-- The UNIT class provides methods to smoke or flare units easily. +-- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods +-- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. +-- When the DCS Unit moves for whatever reason, the smoking will still continue! +-- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() +-- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. +-- +-- 1.4) Location Position, Point +-- ----------------------------- +-- The UNIT class provides methods to obtain the current point or position of the DCS Unit. +-- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current **location** of the DCS Unit in a Vec2 (2D) or a **point** in a Vec3 (3D) vector respectively. +-- If you want to obtain the complete **3D position** including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. +-- +-- 1.5) Test if alive +-- ------------------ +-- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. +-- +-- 1.6) Test for proximity +-- ----------------------- +-- The UNIT class contains methods to test the location or proximity against zones or other objects. +-- +-- ### 1.6.1) Zones +-- To test whether the Unit is within a **zone**, use the @{#UNIT.IsInZone}() or the @{#UNIT.IsNotInZone}() methods. Any zone can be tested on, but the zone must be derived from @{Zone#ZONE_BASE}. +-- +-- ### 1.6.2) Units +-- Test if another DCS Unit is within a given radius of the current DCS Unit, use the @{#UNIT.OtherUnitInRadius}() method. +-- +-- @module Unit +-- @author FlightControl + + + + + +--- The UNIT class +-- @type UNIT +-- @extends Base#BASE +-- @field #UNIT.FlareColor FlareColor +-- @field #UNIT.SmokeColor SmokeColor +UNIT = { + ClassName="UNIT", + CategoryName = { + [Unit.Category.AIRPLANE] = "Airplane", + [Unit.Category.HELICOPTER] = "Helicoper", + [Unit.Category.GROUND_UNIT] = "Ground Unit", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + }, + FlareColor = { + Green = trigger.flareColor.Green, + Red = trigger.flareColor.Red, + White = trigger.flareColor.White, + Yellow = trigger.flareColor.Yellow + }, + SmokeColor = { + Green = trigger.smokeColor.Green, + Red = trigger.smokeColor.Red, + White = trigger.smokeColor.White, + Orange = trigger.smokeColor.Orange, + Blue = trigger.smokeColor.Blue + }, + } + +--- FlareColor +-- @type UNIT.FlareColor +-- @field Green +-- @field Red +-- @field White +-- @field Yellow + +--- SmokeColor +-- @type UNIT.SmokeColor +-- @field Green +-- @field Red +-- @field White +-- @field Orange +-- @field Blue + +-- Registration. + +--- Create a new UNIT from DCSUnit. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit +-- @param Database#DATABASE Database +-- @return Unit#UNIT +function UNIT:Register( UnitName ) + + local self = BASE:Inherit( self, BASE:New() ) + self:F2( UnitName ) + self.UnitName = UnitName + return self +end + +-- Reference methods. + +--- Finds a UNIT from the _DATABASE using a DCSUnit object. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. +-- @return Unit#UNIT self +function UNIT:Find( DCSUnit ) + + local UnitName = DCSUnit:getName() + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +--- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. +-- @param #UNIT self +-- @param #string UnitName The Unit Name. +-- @return Unit#UNIT self +function UNIT:FindByName( UnitName ) + + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +function UNIT:GetDCSUnit() + local DCSUnit = Unit.getByName( self.UnitName ) + + if DCSUnit then + return DCSUnit + end + + self:E( "Unit " .. self.UnitName .. " not found!" ) + return nil +end + +--- Returns coalition of the Unit. +-- @param Unit#UNIT self +-- @return DCSCoalitionObject#coalition.side The side of the coalition. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCoalition() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCoalition = DCSUnit:getCoalition() + self:T3( UnitCoalition ) + return UnitCoalition + end + + return nil +end + +--- Returns country of the Unit. +-- @param Unit#UNIT self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCountry() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCountry = DCSUnit:getCountry() + self:T3( UnitCountry ) + return UnitCountry + end + + return nil +end + + +--- Returns DCS Unit object name. +-- The function provides access to non-activated units too. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitName = self.UnitName + return UnitName + end + + return nil +end + + +--- Returns if the unit is alive. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is alive. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsAlive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitIsAlive = DCSUnit:isExist() + return UnitIsAlive + end + + return false +end + +--- Returns if the unit is activated. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is activated. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsActive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local UnitIsActive = DCSUnit:isActive() + return UnitIsActive + end + + return nil +end + +--- Returns name of the player that control the unit or nil if the unit is controlled by A.I. +-- @param Unit#UNIT self +-- @return #string Player Name +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPlayerName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local PlayerName = DCSUnit:getPlayerName() + if PlayerName == nil then + PlayerName = "" + end + return PlayerName + end + + return nil +end + +--- Returns the unit's unique identifier. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.ID Unit ID +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetID() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitID = DCSUnit:getID() + return UnitID + end + + return nil +end + +--- Returns the unit's number in the group. +-- The number is the same number the unit has in ME. +-- It may not be changed during the mission. +-- If any unit in the group is destroyed, the numbers of another units will not be changed. +-- @param Unit#UNIT self +-- @return #number The Unit number. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetNumber() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitNumber = DCSUnit:getNumber() + return UnitNumber + end + + return nil +end + +--- Returns the unit's group if it exist and nil otherwise. +-- @param Unit#UNIT self +-- @return Group#GROUP The Group of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetGroup() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitGroup = DCSUnit:getGroup() + return UnitGroup + end + + return nil +end + + +--- Returns the unit's callsign - the localized string. +-- @param Unit#UNIT self +-- @return #string The Callsign of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCallSign() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCallSign = DCSUnit:getCallsign() + return UnitCallSign + end + + return nil +end + +--- Returns the unit's health. Dead units has health <= 1.0. +-- @param Unit#UNIT self +-- @return #number The Unit's health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife = DCSUnit:getLife() + return UnitLife + end + + return nil +end + +--- Returns the Unit's initial health. +-- @param Unit#UNIT self +-- @return #number The Unit's initial health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife0() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife0 = DCSUnit:getLife0() + return UnitLife0 + end + + return nil +end + +--- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. +-- @param Unit#UNIT self +-- @return #number The relative amount of fuel (from 0.0 to 1.0). +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetFuel() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitFuel = DCSUnit:getFuel() + return UnitFuel + end + + return nil +end + +--- Returns the Unit's ammunition. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Ammo +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAmmo() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitAmmo = DCSUnit:getAmmo() + return UnitAmmo + end + + return nil +end + +--- Returns the unit sensors. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Sensors +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetSensors() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitSensors = DCSUnit:getSensors() + return UnitSensors + end + + return nil +end + +-- Need to add here a function per sensortype +-- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) + +--- Returns two values: +-- +-- * First value indicates if at least one of the unit's radar(s) is on. +-- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @param Unit#UNIT self +-- @return #boolean Indicates if at least one of the unit's radar(s) is on. +-- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetRadar() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() + return UnitRadarOn, UnitRadarObject + end + + return nil, nil +end + +-- Need to add here functions to check if radar is on and which object etc. + +--- Returns unit descriptor. Descriptor type depends on unit category. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Desc The Unit descriptor. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetDesc() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitDesc = DCSUnit:getDesc() + self:T2( UnitDesc ) + return UnitDesc + end + + self:E( "Unit " .. self.UnitName .. "not found!" ) + return nil +end + + +--- Returns the type name of the DCS Unit. +-- @param Unit#UNIT self +-- @return #string The type name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetTypeName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitTypeName = DCSUnit:getTypeName() + self:T3( UnitTypeName ) + return UnitTypeName + end + + return nil +end + + + +--- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. +-- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. +-- The spawn sequence number and unit number are contained within the name after the '#' sign. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPrefix() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) + self:T3( UnitPrefix ) + return UnitPrefix + end + + return nil +end + + + +--- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec2() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + + local UnitPointVec2 = {} + UnitPointVec2.x = UnitPointVec3.x + UnitPointVec2.y = UnitPointVec3.z + + self:T2( UnitPointVec2 ) + return UnitPointVec2 + end + + return nil +end + + +--- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + self:T3( UnitPointVec3 ) + return UnitPointVec3 + end + + return nil +end + +--- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Position The 3D position vectors of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPositionVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPosition = DCSUnit:getPosition() + self:T3( UnitPosition ) + return UnitPosition + end + + return nil +end + +--- Returns the DCS Unit velocity vector. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The velocity vector +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetVelocity() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitVelocityVec3 = DCSUnit:getVelocity() + self:T3( UnitVelocityVec3 ) + return UnitVelocityVec3 + end + + return nil +end + +-- Is functions + +--- Returns true if the unit is within a @{Zone}. +-- @param #UNIT self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the unit is within the @{Zone#ZONE_BASE} +function UNIT:IsInZone( Zone ) + self:F2( { self.UnitName, Zone } ) + + local IsInZone = Zone:IsPointVec3InZone( self:GetPointVec3() ) + + self:T( { IsInZone } ) + return IsInZone +end + +--- Returns true if the unit is not within a @{Zone}. +-- @param #UNIT self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the unit is not within the @{Zone#ZONE_BASE} +function UNIT:IsNotInZone( Zone ) + self:F2( { self.UnitName, Zone } ) + + local IsInZone = not Zone:IsPointVec3InZone( self:GetPointVec3() ) + + self:T( { IsInZone } ) + return IsInZone +end + +--- Returns true if the DCS Unit is in the air. +-- @param Unit#UNIT self +-- @return #boolean true if in the air. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:InAir() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitInAir = DCSUnit:inAir() + self:T3( UnitInAir ) + return UnitInAir + end + + return nil +end + +--- Returns the altitude of the DCS Unit. +-- @param Unit#UNIT self +-- @return DCSTypes#Distance The altitude of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAltitude() + self:F2() + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 + return UnitPointVec3.y + end + + return nil +end + +--- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. +-- @param Unit#UNIT self +-- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. +-- @param Radius The radius in meters with the DCS Unit in the centre. +-- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) + self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPos = self:GetPointVec3() + local AwaitUnitPos = AwaitUnit:GetPointVec3() + + if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then + self:T3( "true" ) + return true + else + self:T3( "false" ) + return false + end + end + + return nil +end + +--- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. +-- @param Unit#UNIT self +-- @return #string The DCS Unit Category Name +function UNIT:GetCategoryName() + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] + return UnitCategoryName + end + + return nil +end + +--- Signal a flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:Flare( FlareColor ) + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) +end + +--- Signal a white flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareWhite() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) +end + +--- Signal a yellow flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareYellow() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) +end + +--- Signal a green flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareGreen() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) +end + +--- Signal a red flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareRed() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) +end + +--- Smoke the UNIT. +-- @param #UNIT self +function UNIT:Smoke( SmokeColor ) + self:F2() + trigger.action.smoke( self:GetPointVec3(), SmokeColor ) +end + +--- Smoke the UNIT Green. +-- @param #UNIT self +function UNIT:SmokeGreen() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) +end + +--- Smoke the UNIT Red. +-- @param #UNIT self +function UNIT:SmokeRed() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) +end + +--- Smoke the UNIT White. +-- @param #UNIT self +function UNIT:SmokeWhite() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) +end + +--- Smoke the UNIT Orange. +-- @param #UNIT self +function UNIT:SmokeOrange() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) +end + +--- Smoke the UNIT Blue. +-- @param #UNIT self +function UNIT:SmokeBlue() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) +end + +-- Is methods + +--- Returns if the unit is of an air category. +-- If the unit is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #UNIT self +-- @return #boolean Air category evaluation result. +function UNIT:IsAir() + self:F2() + + local UnitDescriptor = self.DCSUnit:getDesc() + self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) + + local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) + + self:T3( IsAirResult ) + return IsAirResult +end + +--- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. +-- There are essentially two core functions that zones accomodate: +-- +-- * Test if an object is within the zone boundaries. +-- * Provide the zone behaviour. Some zones are static, while others are moveable. +-- +-- The object classes are using the zone classes to test the zone boundaries, which can take various forms: +-- +-- * Test if completely within the zone. +-- * Test if partly within the zone (for @{Group#GROUP} objects). +-- * Test if not in the zone. +-- * Distance to the nearest intersecting point of the zone. +-- * Distance to the center of the zone. +-- * ... +-- +-- Each of these ZONE classes have a zone name, and specific parameters defining the zone type: +-- +-- * @{Zone#ZONE_BASE}: The ZONE_BASE class defining the base for all other zone classes. +-- * @{Zone#ZONE_RADIUS}: The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- * @{Zone#ZONE}: The ZONE class, defined by the zone name as defined within the Mission Editor. +-- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: +-- +-- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. +-- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. +-- +-- === +-- +-- 1) @{Zone#ZONE_BASE} class, extends @{Base#BASE} +-- ================================================ +-- The ZONE_BASE class defining the base for all other zone classes. +-- +-- === +-- +-- 2) @{Zone#ZONE_RADIUS} class, extends @{Zone#ZONE_BASE} +-- ======================================================= +-- The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- +-- === +-- +-- 3) @{Zone#ZONE} class, extends @{Zone#ZONE_RADIUS} +-- ========================================== +-- The ZONE class, defined by the zone name as defined within the Mission Editor. +-- +-- === +-- +-- 4) @{Zone#ZONE_UNIT} class, extends @{Zone#ZONE_RADIUS} +-- ======================================================= +-- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- +-- === +-- +-- 5) @{Zone#ZONE_POLYGON} class, extends @{Zone#ZONE_BASE} +-- ======================================================== +-- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- === +-- +-- @module Zone +-- @author FlightControl + + + + + + + + + +--- The ZONE_BASE class +-- @type ZONE_BASE +-- @extends Base#BASE +ZONE_BASE = { + ClassName = "ZONE_BASE", + } + +--- ZONE_BASE constructor +-- @param #ZONE_BASE self +-- @param #string ZoneName Name of the zone. +-- @return #ZONE_BASE self +function ZONE_BASE:New( ZoneName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( ZoneName ) + + self.ZoneName = ZoneName + + return self +end + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_BASE:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_BASE:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_BASE self +-- @param SmokeColor The smoke color. +function ZONE_BASE:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + +end + + +--- The ZONE_RADIUS class, defined by a zone name, a location and a radius. +-- @type ZONE_RADIUS +-- @field DCSTypes#Vec2 PointVec2 The current location of the zone. +-- @field DCSTypes#Distance Radius The radius of the zone. +-- @extends Zone#ZONE_BASE +ZONE_RADIUS = { + ClassName="ZONE_RADIUS", + } + +--- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. +-- @param #ZONE_RADIUS self +-- @param #string ZoneName Name of the zone. +-- @param DCSTypes#Vec2 PointVec2 The location of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, PointVec2, Radius } ) + + self.Radius = Radius + self.PointVec2 = PointVec2 + + return self +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @param #number Points (optional) The amount of points in the circle. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:SmokeZone( SmokeColor, Points ) + self:F2( SmokeColor ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + Points = Points and Points or 360 + + local Angle + local RadialBase = math.pi*2 + + for Angle = 0, 360, 360 / Points do + local Radial = Angle * RadialBase / 360 + Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() + POINT_VEC2:New( Point.x, Point.y ):Smoke( SmokeColor ) + end + + return self +end + + +--- Flares the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param #POINT_VEC3.FlareColor FlareColor The flare color. +-- @param #number Points (optional) The amount of points in the circle. +-- @param DCSTypes#Azimuth Azimuth (optional) Azimuth The azimuth of the flare. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth ) + self:F2( { FlareColor, Azimuth } ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + Points = Points and Points or 360 + + local Angle + local RadialBase = math.pi*2 + + for Angle = 0, 360, 360 / Points do + local Radial = Angle * RadialBase / 360 + Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() + POINT_VEC2:New( Point.x, Point.y ):Flare( FlareColor, Azimuth ) + end + + return self +end + +--- Returns the radius of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:GetRadius() + self:F2( self.ZoneName ) + + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Sets the radius of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:SetRadius( Radius ) + self:F2( self.ZoneName ) + + self.Radius = Radius + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Returns the location of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The location of the zone. +function ZONE_RADIUS:GetPointVec2() + self:F2( self.ZoneName ) + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Sets the location of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The new location of the zone. +-- @return DCSTypes#Vec2 The new location of the zone. +function ZONE_RADIUS:SetPointVec2( PointVec2 ) + self:F2( self.ZoneName ) + + self.PointVec2 = PointVec2 + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Returns the point of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return DCSTypes#Vec3 The point of the zone. +function ZONE_RADIUS:GetPointVec3( Height ) + self:F2( self.ZoneName ) + + local PointVec2 = self:GetPointVec2() + + local PointVec3 = { x = PointVec2.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = PointVec2.y } + + self:T2( { PointVec3 } ) + + return PointVec3 +end + + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + local ZonePointVec2 = self:GetPointVec2() + + if (( PointVec2.x - ZonePointVec2.x )^2 + ( PointVec2.y - ZonePointVec2.y ) ^2 ) ^ 0.5 <= self:GetRadius() then + return true + end + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + +--- Returns a random location within the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The random location within the zone. +function ZONE_RADIUS:GetRandomPointVec2() + self:F( self.ZoneName ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + local angle = math.random() * math.pi*2; + Point.x = PointVec2.x + math.cos( angle ) * math.random() * self:GetRadius(); + Point.y = PointVec2.y + math.sin( angle ) * math.random() * self:GetRadius(); + + self:T( { Point } ) + + return Point +end + + + +--- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. +-- @type ZONE +-- @extends Zone#ZONE_RADIUS +ZONE = { + ClassName="ZONE", + } + + +--- Constructor of ZONE, taking the zone name. +-- @param #ZONE self +-- @param #string ZoneName The name of the zone as defined within the mission editor. +-- @return #ZONE +function ZONE:New( ZoneName ) + + local Zone = trigger.misc.getZone( ZoneName ) + + if not Zone then + error( "Zone " .. ZoneName .. " does not exist." ) + return nil + end + + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.point.x, y = Zone.point.z }, Zone.radius ) ) + self:F( ZoneName ) + + self.Zone = Zone + + return self +end + + +--- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- @type ZONE_UNIT +-- @field Unit#UNIT ZoneUNIT +-- @extends Zone#ZONE_RADIUS +ZONE_UNIT = { + ClassName="ZONE_UNIT", + } + +--- Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius. +-- @param #ZONE_UNIT self +-- @param #string ZoneName Name of the zone. +-- @param Unit#UNIT ZoneUNIT The unit as the center of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_UNIT self +function ZONE_UNIT:New( ZoneName, ZoneUNIT, Radius ) + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneUNIT:GetPointVec2(), Radius ) ) + self:F( { ZoneName, ZoneUNIT:GetPointVec2(), Radius } ) + + self.ZoneUNIT = ZoneUNIT + + return self +end + + +--- Returns the current location of the @{Unit#UNIT}. +-- @param #ZONE_UNIT self +-- @return DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. +function ZONE_UNIT:GetPointVec2() + self:F( self.ZoneName ) + + local ZonePointVec2 = self.ZoneUNIT:GetPointVec2() + + self:T( { ZonePointVec2 } ) + + return ZonePointVec2 +end + + +--- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- @type ZONE_POLYGON +-- @extends Zone#ZONE_BASE +ZONE_POLYGON = { + ClassName="ZONE_POLYGON", + } + +--- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor. +-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON. +-- @param #ZONE_POLYGON self +-- @param #string ZoneName Name of the zone. +-- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:New( ZoneName, ZoneGroup ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, ZoneGroup } ) + + local GroupPoints = ZoneGroup:GetTaskRoute() + local i = 0 + + self.Polygon = {} + + for i = 1, #GroupPoints do + self.Polygon[i] = {} + self.Polygon[i].x = GroupPoints[i].x + self.Polygon[i].y = GroupPoints[i].y + end + + return self +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_POLYGON self +-- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + + local i + local j + local Segments = 10 + + i = 1 + j = #self.Polygon + + while i <= #self.Polygon do + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + + local DeltaX = self.Polygon[j].x - self.Polygon[i].x + local DeltaY = self.Polygon[j].y - self.Polygon[i].y + + for Segment = 0, Segments do -- We divide each line in 5 segments and smoke a point on the line. + local PointX = self.Polygon[i].x + ( Segment * DeltaX / Segments ) + local PointY = self.Polygon[i].y + ( Segment * DeltaY / Segments ) + POINT_VEC2:New( PointX, PointY ):Smoke( SmokeColor ) + end + j = i + i = i + 1 + end + + return self +end + + + + +--- Returns if a location is within the zone. +-- @param #ZONE_POLYGON self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + local i + local j + local c = false + + i = 1 + j = #self.Polygon + + while i < #self.Polygon do + j = i + i = i + 1 + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + if ( ( ( self.Polygon[i].y > PointVec2.y ) ~= ( self.Polygon[j].y > PointVec2.y ) ) and + ( PointVec2.x < ( self.Polygon[j].x - self.Polygon[i].x ) * ( PointVec2.y - self.Polygon[i].y ) / ( self.Polygon[j].y - self.Polygon[i].y ) + self.Polygon[i].x ) + ) then + c = not c + end + self:T2( { "c = ", c } ) + end + + self:T( { "c = ", c } ) + return c +end + +--- This module contains the CLIENT class. +-- +-- 1) @{Client#CLIENT} class, extends @{Unit#UNIT} +-- =============================================== +-- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. +-- Note that clients are NOT the same as Units, they are NOT necessarily alive. +-- The @{Client#CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: +-- +-- * Wraps the DCS Unit objects with skill level set to Player or Client. +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Group API set. +-- * When player joins Unit, execute alive init logic. +-- * Handles messages to players. +-- * Manage the "state" of the DCS Unit. +-- +-- Clients are being used by the @{MISSION} class to follow players and register their successes. +-- +-- 1.1) CLIENT reference methods +-- ----------------------------- +-- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts). +-- +-- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. +-- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. +-- +-- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: +-- +-- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. +-- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). +-- +-- @module Client +-- @author FlightControl + + + + + + + +--- The CLIENT class +-- @type CLIENT +-- @extends Unit#UNIT +CLIENT = { + ONBOARDSIDE = { + NONE = 0, + LEFT = 1, + RIGHT = 2, + BACK = 3, + FRONT = 4 + }, + ClassName = "CLIENT", + ClientName = nil, + ClientAlive = false, + ClientTransport = false, + ClientBriefingShown = false, + _Menus = {}, + _Tasks = {}, + Messages = { + } +} + + +--- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:Find( DCSUnit ) + local ClientName = DCSUnit:getName() + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( ClientName ) + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + + +--- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. +-- As an optional parameter, a briefing text can be given also. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:FindByName( ClientName, ClientBriefing ) + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( { ClientName, ClientBriefing } ) + ClientFound:AddBriefing( ClientBriefing ) + ClientFound.MessageSwitch = true + + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + +function CLIENT:Register( ClientName ) + local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) + + self:F( ClientName ) + self.ClientName = ClientName + self.MessageSwitch = true + self.ClientAlive2 = false + + --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) + self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) + + self:E( self ) + return self +end + + +--- Transport defines that the Client is a Transport. Transports show cargo. +-- @param #CLIENT self +-- @return #CLIENT +function CLIENT:Transport() + self:F() + + self.ClientTransport = true + return self +end + +--- AddBriefing adds a briefing to a CLIENT when a player joins a mission. +-- @param #CLIENT self +-- @param #string ClientBriefing is the text defining the Mission briefing. +-- @return #CLIENT self +function CLIENT:AddBriefing( ClientBriefing ) + self:F( ClientBriefing ) + self.ClientBriefing = ClientBriefing + self.ClientBriefingShown = false + + return self +end + +--- Show the briefing of a CLIENT. +-- @param #CLIENT self +-- @return #CLIENT self +function CLIENT:ShowBriefing() + self:F( { self.ClientName, self.ClientBriefingShown } ) + + if not self.ClientBriefingShown then + self.ClientBriefingShown = true + local Briefing = "" + if self.ClientBriefing then + Briefing = Briefing .. self.ClientBriefing + end + Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." + self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) + end + + return self +end + +--- Show the mission briefing of a MISSION to the CLIENT. +-- @param #CLIENT self +-- @param #string MissionBriefing +-- @return #CLIENT self +function CLIENT:ShowMissionBriefing( MissionBriefing ) + self:F( { self.ClientName } ) + + if MissionBriefing then + self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) + end + + return self +end + + + +--- Resets a CLIENT. +-- @param #CLIENT self +-- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. +function CLIENT:Reset( ClientName ) + self:F() + self._Menus = {} +end + +-- Is Functions + +--- Checks if the CLIENT is a multi-seated UNIT. +-- @param #CLIENT self +-- @return #boolean true if multi-seated. +function CLIENT:IsMultiSeated() + self:F( self.ClientName ) + + local ClientMultiSeatedTypes = { + ["Mi-8MT"] = "Mi-8MT", + ["UH-1H"] = "UH-1H", + ["P-51B"] = "P-51B" + } + + if self:IsAlive() then + local ClientTypeName = self:GetClientGroupUnit():GetTypeName() + if ClientMultiSeatedTypes[ClientTypeName] then + return true + end + end + + return false +end + +--- Checks for a client alive event and calls a function on a continuous basis. +-- @param #CLIENT self +-- @param #function CallBack Function. +-- @return #CLIENT +function CLIENT:Alive( CallBackFunction, ... ) + self:F() + + self.ClientCallBack = CallBackFunction + self.ClientParameters = arg + + return self +end + +--- @param #CLIENT self +function CLIENT:_AliveCheckScheduler() + self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown, self.ClientCallBack } ) + + if self:IsAlive() then -- Polymorphic call of UNIT + if self.ClientAlive2 == false then + self:ShowBriefing() + if self.ClientCallBack then + self:T("Calling Callback function") + self.ClientCallBack( self, unpack( self.ClientParameters ) ) + end + self.ClientAlive2 = true + end + else + if self.ClientAlive2 == true then + self.ClientAlive2 = false + end + end + + return true +end + +--- Return the DCSGroup of a Client. +-- This function is modified to deal with a couple of bugs in DCS 1.5.3 +-- @param #CLIENT self +-- @return DCSGroup#Group +function CLIENT:GetDCSGroup() + self:F3() + +-- local ClientData = Group.getByName( self.ClientName ) +-- if ClientData and ClientData:isExist() then +-- self:T( self.ClientName .. " : group found!" ) +-- return ClientData +-- else +-- return nil +-- end + + local ClientUnit = Unit.getByName( self.ClientName ) + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "CoalitionData:", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + + --self:E(self.ClientName) + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() and UnitData:getGroup():isExist() then + if ClientGroup:getID() == UnitData:getGroup():getID() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + self.ClientGroupID = ClientGroup:getID() + self.ClientGroupName = ClientGroup:getName() + return ClientGroup + end + else + -- Now we need to resolve the bugs in DCS 1.5 ... + -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) + self:T3( "Bug 1.5 logic" ) + local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate + self.ClientGroupID = ClientGroupTemplate.groupId + self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName + self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) + return ClientGroup + end + -- else + -- error( "Client " .. self.ClientName .. " not found!" ) + end + else + --self:E( { "Client not found!", self.ClientName } ) + end + end + end + end + + -- For non player clients + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + return ClientGroup + end + end + end + + self.ClientGroupID = nil + self.ClientGroupUnit = nil + + return nil +end + + +-- TODO: Check DCSTypes#Group.ID +--- Get the group ID of the client. +-- @param #CLIENT self +-- @return DCSTypes#Group.ID +function CLIENT:GetClientGroupID() + + local ClientGroup = self:GetDCSGroup() + + --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() + return self.ClientGroupID +end + + +--- Get the name of the group of the client. +-- @param #CLIENT self +-- @return #string +function CLIENT:GetClientGroupName() + + local ClientGroup = self:GetDCSGroup() + + self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() + return self.ClientGroupName +end + +--- Returns the UNIT of the CLIENT. +-- @param #CLIENT self +-- @return Unit#UNIT +function CLIENT:GetClientGroupUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + self:T( self.ClientDCSUnit ) + if ClientDCSUnit and ClientDCSUnit:isExist() then + local ClientUnit = _DATABASE:FindUnit( self.ClientName ) + self:T2( ClientUnit ) + return ClientUnit + end +end + +--- Returns the DCSUnit of the CLIENT. +-- @param #CLIENT self +-- @return DCSTypes#Unit +function CLIENT:GetClientGroupDCSUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + if ClientDCSUnit and ClientDCSUnit:isExist() then + self:T2( ClientDCSUnit ) + return ClientDCSUnit + end +end + + +--- Evaluates if the CLIENT is a transport. +-- @param #CLIENT self +-- @return #boolean true is a transport. +function CLIENT:IsTransport() + self:F() + return self.ClientTransport +end + +--- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. +-- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. +-- @param #CLIENT self +function CLIENT:ShowCargo() + self:F() + + local CargoMsg = "" + + for CargoName, Cargo in pairs( CARGOS ) do + if self == Cargo:IsLoadedInClient() then + CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" + end + end + + if CargoMsg == "" then + CargoMsg = "empty" + end + + self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) + +end + +-- TODO (1) I urgently need to revise this. +--- A local function called by the DCS World Menu system to switch off messages. +function CLIENT.SwitchMessages( PrmTable ) + PrmTable[1].MessageSwitch = PrmTable[2] +end + +--- The main message driver for the CLIENT. +-- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. +-- @param #CLIENT self +-- @param #string Message is the text describing the message. +-- @param #number MessageDuration is the duration in seconds that the Message should be displayed. +-- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId +-- @param #string MessageCategory is the category of the message (the title). +-- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. +function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) + self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) + + if not self.MenuMessages then + if self:GetClientGroupID() then + self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) + self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) + self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) + end + end + + if self.MessageSwitch == true then + if MessageCategory == nil then + MessageCategory = "Messages" + end + if self.Messages[MessageId] == nil then + self.Messages[MessageId] = {} + self.Messages[MessageId].MessageId = MessageId + self.Messages[MessageId].MessageTime = timer.getTime() + self.Messages[MessageId].MessageDuration = MessageDuration + if MessageInterval == nil then + self.Messages[MessageId].MessageInterval = 600 + else + self.Messages[MessageId].MessageInterval = MessageInterval + end + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) + else + if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then + MESSAGE:New( Message, MessageDuration , MessageCategory):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + else + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + end + end + end +end +--- This module contains the STATIC class. +-- +-- 1) @{Static#STATIC} class, extends @{Unit#UNIT} +-- =============================================== +-- Statics are **Static Units** defined within the Mission Editor. +-- Note that Statics are almost the same as Units, but they don't have a controller. +-- The @{Static#STATIC} class is a wrapper class to handle the DCS Static objects: +-- +-- * Wraps the DCS Static objects. +-- * Support all DCS Static APIs. +-- * Enhance with Static specific APIs not in the DCS API set. +-- +-- 1.1) STATIC reference methods +-- ----------------------------- +-- For each DCS Static will have a STATIC wrapper object (instance) within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts). +-- +-- The STATIC class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the Static Name. +-- +-- Another thing to know is that STATIC objects do not "contain" the DCS Static object. +-- The STATIc methods will reference the DCS Static object by name when it is needed during API execution. +-- If the DCS Static object does not exist or is nil, the STATIC methods will return nil and log an exception in the DCS.log file. +-- +-- The STATIc class provides the following functions to retrieve quickly the relevant STATIC instance: +-- +-- * @{#STATIC.FindByName}(): Find a STATIC instance from the _DATABASE object using a DCS Static name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these STATIC OBJECT REFERENCES! (make the STATIC object references nil). +-- +-- @module Static +-- @author FlightControl + + + + + + +--- The STATIC class +-- @type STATIC +-- @extends Unit#UNIT +STATIC = { + ClassName = "STATIC", +} + + +--- Finds a STATIC from the _DATABASE using the relevant Static Name. +-- As an optional parameter, a briefing text can be given also. +-- @param #STATIC self +-- @param #string StaticName Name of the DCS **Static** as defined within the Mission Editor. +-- @return #STATIC +function STATIC:FindByName( StaticName ) + local StaticFound = _DATABASE:FindStatic( StaticName ) + + if StaticFound then + StaticFound:F( { StaticName } ) + + return StaticFound + end + + error( "STATIC not found for: " .. StaticName ) +end + +function STATIC:Register( StaticName ) + local self = BASE:Inherit( self, UNIT:Register( StaticName ) ) + + self:F( StaticName ) + + return self +end + + +function STATIC:GetDCSUnit() + local DCSStatic = StaticObject.getByName( self.UnitName ) + + if DCSStatic then + return DCSStatic + end + + return nil +end +--- Manage the mission database. +-- +-- @{#DATABASE} class +-- ================== +-- Mission designers can use the DATABASE class to refer to: +-- +-- * UNITS +-- * GROUPS +-- * players +-- * alive players +-- * CLIENTS +-- * alive CLIENTS +-- +-- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. +-- +-- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. +-- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. +-- +-- DATABASE iterators: +-- =================== +-- You can iterate the database with the available iterator methods. +-- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the DATABASE: +-- +-- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. +-- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. +-- +-- @module Database +-- @author FlightControl + + + + + + + + + + + + +--- DATABASE class +-- @type DATABASE +-- @extends Base#BASE +DATABASE = { + ClassName = "DATABASE", + Templates = { + Units = {}, + Groups = {}, + ClientsByName = {}, + ClientsByID = {}, + }, + DCSUnits = {}, + DCSGroups = {}, + DCSStatics = {}, + UNITS = {}, + STATICS = {}, + GROUPS = {}, + PLAYERS = {}, + PLAYERSALIVE = {}, + CLIENTS = {}, + CLIENTSALIVE = {}, + NavPoints = {}, +} + +local _DATABASECoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _DATABASECategory = + { + ["plane"] = Unit.Category.AIRPLANE, + ["helicopter"] = Unit.Category.HELICOPTER, + ["vehicle"] = Unit.Category.GROUND_UNIT, + ["ship"] = Unit.Category.SHIP, + ["static"] = Unit.Category.STRUCTURE, + } + + +--- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #DATABASE self +-- @return #DATABASE +-- @usage +-- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. +-- DBObject = DATABASE:New() +function DATABASE:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + + + -- Follow alive players and clients + _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) + _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) + + self:_RegisterTemplates() + self:_RegisterGroupsAndUnits() + self:_RegisterClients() + self:_RegisterStatics() + self:_RegisterPlayers() + + return self +end + +--- Finds a Unit based on the Unit Name. +-- @param #DATABASE self +-- @param #string UnitName +-- @return Unit#UNIT The found Unit. +function DATABASE:FindUnit( UnitName ) + + local UnitFound = self.UNITS[UnitName] + return UnitFound +end + + +--- Adds a Unit based on the Unit Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddUnit( DCSUnit, DCSUnitName ) + + self.DCSUnits[DCSUnitName] = DCSUnit + self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) +end + + +--- Deletes a Unit from the DATABASE based on the Unit Name. +-- @param #DATABASE self +function DATABASE:DeleteUnit( DCSUnitName ) + + self.DCSUnits[DCSUnitName] = nil +end + +--- Adds a Static based on the Static Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddStatic( DCSStatic, DCSStaticName ) + + self.DCSStatics[DCSStaticName] = DCSStatic + self.STATICS[DCSStaticName] = STATIC:Register( DCSStaticName ) +end + + +--- Deletes a Static from the DATABASE based on the Static Name. +-- @param #DATABASE self +function DATABASE:DeleteStatic( DCSStaticName ) + + self.DCSStatics[DCSStaticName] = nil +end + +--- Finds a STATIC based on the StaticName. +-- @param #DATABASE self +-- @param #string StaticName +-- @return Static#STATIC The found STATIC. +function DATABASE:FindStatic( StaticName ) + + local StaticFound = self.STATICS[StaticName] + return StaticFound +end + + +--- Finds a CLIENT based on the ClientName. +-- @param #DATABASE self +-- @param #string ClientName +-- @return Client#CLIENT The found CLIENT. +function DATABASE:FindClient( ClientName ) + + local ClientFound = self.CLIENTS[ClientName] + return ClientFound +end + + +--- Adds a CLIENT based on the ClientName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddClient( ClientName ) + + self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) + self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) +end + + +--- Finds a GROUP based on the GroupName. +-- @param #DATABASE self +-- @param #string GroupName +-- @return Group#GROUP The found GROUP. +function DATABASE:FindGroup( GroupName ) + + local GroupFound = self.GROUPS[GroupName] + return GroupFound +end + + +--- Adds a GROUP based on the GroupName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddGroup( DCSGroup, GroupName ) + + self.DCSGroups[GroupName] = DCSGroup + self.GROUPS[GroupName] = GROUP:Register( GroupName ) +end + +--- Adds a player based on the Player Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddPlayer( UnitName, PlayerName ) + + if PlayerName then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self.PLAYERS[PlayerName] = PlayerName + self.PLAYERSALIVE[PlayerName] = PlayerName + self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) + end +end + +--- Deletes a player from the DATABASE based on the Player Name. +-- @param #DATABASE self +function DATABASE:DeletePlayer( PlayerName ) + + if PlayerName then + self:E( { "Clean player:", PlayerName } ) + self.PLAYERSALIVE[PlayerName] = nil + self.CLIENTSALIVE[PlayerName] = nil + end +end + + +--- Instantiate new Groups within the DCSRTE. +-- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: +-- SpawnCountryID, SpawnCategoryID +-- This method is used by the SPAWN class. +-- @param #DATABASE self +-- @param #table SpawnTemplate +-- @return #DATABASE self +function DATABASE:Spawn( SpawnTemplate ) + self:F2( SpawnTemplate.name ) + + self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) + + -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. + local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID + local SpawnCountryID = SpawnTemplate.SpawnCountryID + local SpawnCategoryID = SpawnTemplate.SpawnCategoryID + + -- Nullify + SpawnTemplate.SpawnCoalitionID = nil + SpawnTemplate.SpawnCountryID = nil + SpawnTemplate.SpawnCategoryID = nil + + self:_RegisterTemplate( SpawnTemplate, SpawnCoalitionID, SpawnCategoryID, SpawnCountryID ) + + self:T3( SpawnTemplate ) + coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) + + -- Restore + SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID + SpawnTemplate.SpawnCountryID = SpawnCountryID + SpawnTemplate.SpawnCategoryID = SpawnCategoryID + + local SpawnGroup = GROUP:Register( SpawnTemplate.name ) + return SpawnGroup +end + +--- Set a status to a Group within the Database, this to check crossing events for example. +function DATABASE:SetStatusGroup( GroupName, Status ) + self:F2( Status ) + + self.Templates.Groups[GroupName].Status = Status +end + +--- Get a status to a Group within the Database, this to check crossing events for example. +function DATABASE:GetStatusGroup( GroupName ) + self:F2( Status ) + + if self.Templates.Groups[GroupName] then + return self.Templates.Groups[GroupName].Status + else + return "" + end +end + +--- Private method that registers new Group Templates within the DATABASE Object. +-- @param #DATABASE self +-- @param #table GroupTemplate +-- @return #DATABASE self +function DATABASE:_RegisterTemplate( GroupTemplate, CoalitionID, CategoryID, CountryID ) + + local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) + + local TraceTable = {} + + if not self.Templates.Groups[GroupTemplateName] then + self.Templates.Groups[GroupTemplateName] = {} + self.Templates.Groups[GroupTemplateName].Status = nil + end + + -- Delete the spans from the route, it is not needed and takes memory. + if GroupTemplate.route and GroupTemplate.route.spans then + GroupTemplate.route.spans = nil + end + + self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName + self.Templates.Groups[GroupTemplateName].Template = GroupTemplate + self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId + self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units + self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units + self.Templates.Groups[GroupTemplateName].CategoryID = CategoryID + self.Templates.Groups[GroupTemplateName].CoalitionID = CoalitionID + self.Templates.Groups[GroupTemplateName].CountryID = CountryID + + + TraceTable[#TraceTable+1] = "Group" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].GroupName + + TraceTable[#TraceTable+1] = "Coalition" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CoalitionID + TraceTable[#TraceTable+1] = "Category" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CategoryID + TraceTable[#TraceTable+1] = "Country" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CountryID + + TraceTable[#TraceTable+1] = "Units" + + for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do + + local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) + self.Templates.Units[UnitTemplateName] = {} + self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName + self.Templates.Units[UnitTemplateName].Template = UnitTemplate + self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName + self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate + self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId + self.Templates.Units[UnitTemplateName].CategoryID = CategoryID + self.Templates.Units[UnitTemplateName].CoalitionID = CoalitionID + self.Templates.Units[UnitTemplateName].CountryID = CountryID + + if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then + self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate + self.Templates.ClientsByName[UnitTemplateName].CategoryID = CategoryID + self.Templates.ClientsByName[UnitTemplateName].CoalitionID = CoalitionID + self.Templates.ClientsByName[UnitTemplateName].CountryID = CountryID + self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate + end + + TraceTable[#TraceTable+1] = self.Templates.Units[UnitTemplateName].UnitName + end + + self:E( TraceTable ) +end + +function DATABASE:GetCoalitionFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CoalitionID +end + +function DATABASE:GetCategoryFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CategoryID +end + +function DATABASE:GetCountryFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CountryID +end + +--- Private method that registers all alive players in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterPlayers() + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + if not self.PLAYERS[PlayerName] then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self:AddPlayer( UnitName, PlayerName ) + end + end + end + end + + return self +end + + +--- Private method that registers all Groups and Units within in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterGroupsAndUnits() + + local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSGroupId, DCSGroup in pairs( CoalitionData ) do + + if DCSGroup:isExist() then + local DCSGroupName = DCSGroup:getName() + + self:E( { "Register Group:", DCSGroup, DCSGroupName } ) + self:AddGroup( DCSGroup, DCSGroupName ) + + for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do + + local DCSUnitName = DCSUnit:getName() + self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) + self:AddUnit( DCSUnit, DCSUnitName ) + end + else + self:E( { "Group does not exist: ", DCSGroup } ) + end + + end + end + + return self +end + +--- Private method that registers all Units of skill Client or Player within in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterClients() + + for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do + self:E( { "Register Client:", ClientName } ) + self:AddClient( ClientName ) + end + + return self +end + +function DATABASE:_RegisterStatics() + + local CoalitionsData = { GroupsRed = coalition.getStaticObjects( coalition.side.RED ), GroupsBlue = coalition.getStaticObjects( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSStaticId, DCSStatic in pairs( CoalitionData ) do + + if DCSStatic:isExist() then + local DCSStaticName = DCSStatic:getName() + + self:E( { "Register Static:", DCSStatic, DCSStaticName } ) + self:AddStatic( DCSStatic, DCSStaticName ) + else + self:E( { "Static does not exist: ", DCSStatic } ) + end + end + end + + return self +end + + +--- Events + +--- Handles the OnBirth event for the alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnBirth( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) + self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) + self:_EventOnPlayerEnterUnit( Event ) + end +end + + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnDeadOrCrash( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + if self.DCSUnits[Event.IniDCSUnitName] then + self:DeleteUnit( Event.IniDCSUnitName ) + -- add logic to correctly remove a group once all units are destroyed... + end + end +end + + +--- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerEnterUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if not self.PLAYERSALIVE[PlayerName] then + self:AddPlayer( Event.IniDCSUnitName, PlayerName ) + end + end +end + + +--- Handles the OnPlayerLeaveUnit event to clean the active players table. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerLeaveUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if self.PLAYERSALIVE[PlayerName] then + self:DeletePlayer( PlayerName ) + end + end +end + +--- Iterators + +--- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. +-- @return #DATABASE self +function DATABASE:ForEach( IteratorFunction, arg, Set ) + self:F2( arg ) + + local function CoRoutine() + local Count = 0 + for ObjectID, Object in pairs( Set ) do + self:T2( Object ) + IteratorFunction( Object, unpack( arg ) ) + Count = Count + 1 + if Count % 10 == 0 then + coroutine.yield( false ) + end + end + return true + end + + local co = coroutine.create( CoRoutine ) + + local function Schedule() + + local status, res = coroutine.resume( co ) + self:T2( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + + return false + end + + local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. +-- @return #DATABASE self +function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.DCSUnits ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.UNITS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. +-- @return #DATABASE self +function DATABASE:ForEachGroup( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.GROUPS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. +-- @return #DATABASE self +function DATABASE:ForEachPlayer( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClient( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClientAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) + + return self +end + + +function DATABASE:_RegisterTemplates() + self:F2() + + self.Navpoints = {} + self.UNITS = {} + --Build routines.db.units and self.Navpoints + for CoalitionName, coa_data in pairs(env.mission.coalition) do + + if (CoalitionName == 'red' or CoalitionName == 'blue') and type(coa_data) == 'table' then + --self.Units[coa_name] = {} + + ---------------------------------------------- + -- build nav points DB + self.Navpoints[CoalitionName] = {} + if coa_data.nav_points then --navpoints + for nav_ind, nav_data in pairs(coa_data.nav_points) do + + if type(nav_data) == 'table' then + self.Navpoints[CoalitionName][nav_ind] = routines.utils.deepCopy(nav_data) + + self.Navpoints[CoalitionName][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. + self.Navpoints[CoalitionName][nav_ind]['point'] = {} -- point is used by SSE, support it. + self.Navpoints[CoalitionName][nav_ind]['point']['x'] = nav_data.x + self.Navpoints[CoalitionName][nav_ind]['point']['y'] = 0 + self.Navpoints[CoalitionName][nav_ind]['point']['z'] = nav_data.y + end + end + end + ------------------------------------------------- + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + + local CountryName = string.upper(cntry_data.name) + --self.Units[coa_name][countryName] = {} + --self.Units[coa_name][countryName]["countryId"] = cntry_data.id + + if type(cntry_data) == 'table' then --just making sure + + for obj_type_name, obj_type_data in pairs(cntry_data) do + + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check + + local CategoryName = obj_type_name + + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + + --self.Units[coa_name][countryName][category] = {} + + for group_num, GroupTemplate in pairs(obj_type_data.group) do + + if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group + self:_RegisterTemplate( + GroupTemplate, + coalition.side[string.upper(CoalitionName)], + _DATABASECategory[string.lower(CategoryName)], + country.id[string.upper(CountryName)] + ) + end --if GroupTemplate and GroupTemplate.units then + end --for group_num, GroupTemplate in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --if type(cntry_data) == 'table' then + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do + + return self +end + + + + +--- This module contains the SET classes. +-- +-- === +-- +-- 1) @{Set#SET_BASE} class, extends @{Base#BASE} +-- ================================================ +-- The @{Set#SET_BASE} class defines the core functions that define a collection of objects. +-- A SET provides iterators to iterate the SET, but will **temporarily** yield the ForEach interator loop at defined **"intervals"** to the mail simulator loop. +-- In this way, large loops can be done while not blocking the simulator main processing loop. +-- The default **"yield interval"** is after 10 objects processed. +-- The default **"time interval"** is after 0.001 seconds. +-- +-- 1.1) Add or remove objects from the SET +-- --------------------------------------- +-- Some key core functions are @{Set#SET_BASE.Add} and @{Set#SET_BASE.Remove} to add or remove objects from the SET in your logic. +-- +-- 1.2) Define the SET iterator **"yield interval"** and the **"time interval"**. +-- ------------------------------------------------------------------------------------- +-- Modify the iterator intervals with the @{Set#SET_BASE.SetInteratorIntervals} method. +-- You can set the **"yield interval"**, and the **"time interval"**. (See above). +-- +-- === +-- +-- 2) @{Set#SET_GROUP} class, extends @{Set#SET_BASE} +-- ==================================================== +-- Mission designers can use the @{Set#SET_GROUP} class to build sets of groups belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Starting with certain prefix strings. +-- +-- 2.1) SET_GROUP construction method: +-- ----------------------------------- +-- Create a new SET_GROUP object with the @{#SET_GROUP.New} method: +-- +-- * @{#SET_GROUP.New}: Creates a new SET_GROUP object. +-- +-- 2.2) Add or Remove GROUP(s) from SET_GROUP: +-- ------------------------------------------- +-- GROUPS can be added and removed using the @{Set#SET_GROUP.AddGroupsByName} and @{Set#SET_GROUP.RemoveGroupsByName} respectively. +-- These methods take a single GROUP name or an array of GROUP names to be added or removed from SET_GROUP. +-- +-- 2.3) SET_GROUP filter criteria: +-- ------------------------------- +-- You can set filter criteria to define the set of groups within the SET_GROUP. +-- Filter criteria are defined by: +-- +-- * @{#SET_GROUP.FilterCoalitions}: Builds the SET_GROUP with the groups belonging to the coalition(s). +-- * @{#SET_GROUP.FilterCategories}: Builds the SET_GROUP with the groups belonging to the category(ies). +-- * @{#SET_GROUP.FilterCountries}: Builds the SET_GROUP with the gruops belonging to the country(ies). +-- * @{#SET_GROUP.FilterPrefixes}: Builds the SET_GROUP with the groups starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_GROUP, you can start filtering using: +-- +-- * @{#SET_GROUP.FilterStart}: Starts the filtering of the groups within the SET_GROUP and add or remove GROUP objects **dynamically**. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_GROUP.FilterZones}: Builds the SET_GROUP with the groups within a @{Zone#ZONE}. +-- +-- 2.4) SET_GROUP iterators: +-- ------------------------- +-- Once the filters have been defined and the SET_GROUP has been built, you can iterate the SET_GROUP with the available iterator methods. +-- The iterator methods will walk the SET_GROUP set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_GROUP: +-- +-- * @{#SET_GROUP.ForEachGroup}: Calls a function for each alive group it finds within the SET_GROUP. +-- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupPartlyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- +-- ==== +-- +-- 3) @{Set#SET_UNIT} class, extends @{Set#SET_BASE} +-- =================================================== +-- Mission designers can use the @{Set#SET_UNIT} class to build sets of units belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Unit types +-- * Starting with certain prefix strings. +-- +-- 3.1) SET_UNIT construction method: +-- ---------------------------------- +-- Create a new SET_UNIT object with the @{#SET_UNIT.New} method: +-- +-- * @{#SET_UNIT.New}: Creates a new SET_UNIT object. +-- +-- 3.2) Add or Remove UNIT(s) from SET_UNIT: +-- ----------------------------------------- +-- UNITs can be added and removed using the @{Set#SET_UNIT.AddUnitsByName} and @{Set#SET_UNIT.RemoveUnitsByName} respectively. +-- These methods take a single UNIT name or an array of UNIT names to be added or removed from SET_UNIT. +-- +-- 3.3) SET_UNIT filter criteria: +-- ------------------------------ +-- You can set filter criteria to define the set of units within the SET_UNIT. +-- Filter criteria are defined by: +-- +-- * @{#SET_UNIT.FilterCoalitions}: Builds the SET_UNIT with the units belonging to the coalition(s). +-- * @{#SET_UNIT.FilterCategories}: Builds the SET_UNIT with the units belonging to the category(ies). +-- * @{#SET_UNIT.FilterTypes}: Builds the SET_UNIT with the units belonging to the unit type(s). +-- * @{#SET_UNIT.FilterCountries}: Builds the SET_UNIT with the units belonging to the country(ies). +-- * @{#SET_UNIT.FilterPrefixes}: Builds the SET_UNIT with the units starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_UNIT, you can start filtering using: +-- +-- * @{#SET_UNIT.FilterStart}: Starts the filtering of the units within the SET_UNIT. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_UNIT.FilterZones}: Builds the SET_UNIT with the units within a @{Zone#ZONE}. +-- +-- 3.4) SET_UNIT iterators: +-- ------------------------ +-- Once the filters have been defined and the SET_UNIT has been built, you can iterate the SET_UNIT with the available iterator methods. +-- The iterator methods will walk the SET_UNIT set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_UNIT: +-- +-- * @{#SET_UNIT.ForEachUnit}: Calls a function for each alive unit it finds within the SET_UNIT. +-- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- +-- Planned iterators methods in development are (so these are not yet available): +-- +-- * @{#SET_UNIT.ForEachUnitInUnit}: Calls a function for each unit contained within the SET_UNIT. +-- * @{#SET_UNIT.ForEachUnitCompletelyInZone}: Iterate and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- * @{#SET_UNIT.ForEachUnitNotInZone}: Iterate and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- +-- 4) @{Set#SET_CLIENT} class, extends @{Set#SET_BASE} +-- =================================================== +-- Mission designers can use the @{Set#SET_CLIENT} class to build sets of units belonging to certain: +-- +-- * Coalitions +-- * Categories +-- * Countries +-- * Client types +-- * Starting with certain prefix strings. +-- +-- 4.1) SET_CLIENT construction method: +-- ---------------------------------- +-- Create a new SET_CLIENT object with the @{#SET_CLIENT.New} method: +-- +-- * @{#SET_CLIENT.New}: Creates a new SET_CLIENT object. +-- +-- 4.2) Add or Remove CLIENT(s) from SET_CLIENT: +-- ----------------------------------------- +-- CLIENTs can be added and removed using the @{Set#SET_CLIENT.AddClientsByName} and @{Set#SET_CLIENT.RemoveClientsByName} respectively. +-- These methods take a single CLIENT name or an array of CLIENT names to be added or removed from SET_CLIENT. +-- +-- 4.3) SET_CLIENT filter criteria: +-- ------------------------------ +-- You can set filter criteria to define the set of clients within the SET_CLIENT. +-- Filter criteria are defined by: +-- +-- * @{#SET_CLIENT.FilterCoalitions}: Builds the SET_CLIENT with the clients belonging to the coalition(s). +-- * @{#SET_CLIENT.FilterCategories}: Builds the SET_CLIENT with the clients belonging to the category(ies). +-- * @{#SET_CLIENT.FilterTypes}: Builds the SET_CLIENT with the clients belonging to the client type(s). +-- * @{#SET_CLIENT.FilterCountries}: Builds the SET_CLIENT with the clients belonging to the country(ies). +-- * @{#SET_CLIENT.FilterPrefixes}: Builds the SET_CLIENT with the clients starting with the same prefix string(s). +-- +-- Once the filter criteria have been set for the SET_CLIENT, you can start filtering using: +-- +-- * @{#SET_CLIENT.FilterStart}: Starts the filtering of the clients within the SET_CLIENT. +-- +-- Planned filter criteria within development are (so these are not yet available): +-- +-- * @{#SET_CLIENT.FilterZones}: Builds the SET_CLIENT with the clients within a @{Zone#ZONE}. +-- +-- 4.4) SET_CLIENT iterators: +-- ------------------------ +-- Once the filters have been defined and the SET_CLIENT has been built, you can iterate the SET_CLIENT with the available iterator methods. +-- The iterator methods will walk the SET_CLIENT set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the SET_CLIENT: +-- +-- * @{#SET_CLIENT.ForEachClient}: Calls a function for each alive client it finds within the SET_CLIENT. +-- +-- ==== +-- +-- @module Set +-- @author FlightControl + +--- SET_BASE class +-- @type SET_BASE +-- @extends Base#BASE +SET_BASE = { + ClassName = "SET_BASE", + Set = {}, +} + +--- Creates a new SET_BASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_BASE self +-- @return #SET_BASE +-- @usage +-- -- Define a new SET_BASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. +-- DBObject = SET_BASE:New() +function SET_BASE:New( Database ) + + env.info( tostring( Database ) ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + self.Database = Database + + self.YieldInterval = 10 + self.TimeInterval = 0.001 + + return self +end + +--- Finds an @{Base#BASE} object based on the object Name. +-- @param #SET_BASE self +-- @param #string ObjectName +-- @return Base#BASE The Object found. +function SET_BASE:_Find( ObjectName ) + + local ObjectFound = self.Set[ObjectName] + return ObjectFound +end + + +--- Adds a @{Base#BASE} object in the @{Set#SET_BASE}, using the Object Name as the index. +-- @param #SET_BASE self +-- @param #string ObjectName +-- @param Base#BASE Object +-- @return Base#BASE The added BASE Object. +function SET_BASE:Add( ObjectName, Object ) + + self.Set[ObjectName] = Object +end + +--- Removes a @{Base#BASE} object from the @{Set#SET_BASE} and derived classes, based on the Object Name. +-- @param #SET_BASE self +-- @param #string ObjectName +function SET_BASE:Remove( ObjectName ) + + self.Set[ObjectName] = nil +end + +--- Define the SET iterator **"yield interval"** and the **"time interval"**. +-- @param #SET_BASE self +-- @param #number YieldInterval Sets the frequency when the iterator loop will yield after the number of objects processed. The default frequency is 10 objects processed. +-- @param #number TimeInterval Sets the time in seconds when the main logic will resume the iterator loop. The default time is 0.001 seconds. +-- @return #SET_BASE self +function SET_BASE:SetIteratorIntervals( YieldInterval, TimeInterval ) + + self.YieldInterval = YieldInterval + self.TimeInterval = TimeInterval + + return self +end + + + +--- Starts the filtering for the defined collection. +-- @param #SET_BASE self +-- @return #SET_BASE self +function SET_BASE:_FilterStart() + + for ObjectName, Object in pairs( self.Database ) do + + if self:IsIncludeObject( Object ) then + self:E( { "Adding Object:", ObjectName } ) + self:Add( ObjectName, Object ) + end + end + + _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + + -- Follow alive players and clients +-- _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) +-- _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) + + + return self +end + + + +----- Private method that registers all alive players in the mission. +---- @param #SET_BASE self +---- @return #SET_BASE self +--function SET_BASE:_RegisterPlayers() +-- +-- local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } +-- for CoalitionId, CoalitionData in pairs( CoalitionsData ) do +-- for UnitId, UnitData in pairs( CoalitionData ) do +-- self:T3( { "UnitData:", UnitData } ) +-- if UnitData and UnitData:isExist() then +-- local UnitName = UnitData:getName() +-- if not self.PlayersAlive[UnitName] then +-- self:E( { "Add player for unit:", UnitName, UnitData:getPlayerName() } ) +-- self.PlayersAlive[UnitName] = UnitData:getPlayerName() +-- end +-- end +-- end +-- end +-- +-- return self +--end + +--- Events + +--- Handles the OnBirth event for the Set. +-- @param #SET_BASE self +-- @param Event#EVENTDATA Event +function SET_BASE:_EventOnBirth( Event ) + self:F3( { Event } ) + + if Event.IniDCSUnit then + local ObjectName, Object = self:AddInDatabase( Event ) + self:T3( ObjectName, Object ) + if self:IsIncludeObject( Object ) then + self:Add( ObjectName, Object ) + --self:_EventOnPlayerEnterUnit( Event ) + end + end +end + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #SET_BASE self +-- @param Event#EVENTDATA Event +function SET_BASE:_EventOnDeadOrCrash( Event ) + self:F3( { Event } ) + + if Event.IniDCSUnit then + local ObjectName, Object = self:FindInDatabase( Event ) + if ObjectName and Object then + self:Remove( ObjectName ) + end + end +end + +----- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +---- @param #SET_BASE self +---- @param Event#EVENTDATA Event +--function SET_BASE:_EventOnPlayerEnterUnit( Event ) +-- self:F3( { Event } ) +-- +-- if Event.IniDCSUnit then +-- if self:IsIncludeObject( Event.IniDCSUnit ) then +-- if not self.PlayersAlive[Event.IniDCSUnitName] then +-- self:E( { "Add player for unit:", Event.IniDCSUnitName, Event.IniDCSUnit:getPlayerName() } ) +-- self.PlayersAlive[Event.IniDCSUnitName] = Event.IniDCSUnit:getPlayerName() +-- self.ClientsAlive[Event.IniDCSUnitName] = _DATABASE.Clients[ Event.IniDCSUnitName ] +-- end +-- end +-- end +--end +-- +----- Handles the OnPlayerLeaveUnit event to clean the active players table. +---- @param #SET_BASE self +---- @param Event#EVENTDATA Event +--function SET_BASE:_EventOnPlayerLeaveUnit( Event ) +-- self:F3( { Event } ) +-- +-- if Event.IniDCSUnit then +-- if self:IsIncludeObject( Event.IniDCSUnit ) then +-- if self.PlayersAlive[Event.IniDCSUnitName] then +-- self:E( { "Cleaning player for unit:", Event.IniDCSUnitName, Event.IniDCSUnit:getPlayerName() } ) +-- self.PlayersAlive[Event.IniDCSUnitName] = nil +-- self.ClientsAlive[Event.IniDCSUnitName] = nil +-- end +-- end +-- end +--end + +-- Iterators + +--- Iterate the SET_BASE and derived classes and call an iterator function for the given SET_BASE, providing the Object for each element within the set and optional parameters. +-- @param #SET_BASE self +-- @param #function IteratorFunction The function that will be called. +-- @return #SET_BASE self +function SET_BASE:ForEach( IteratorFunction, arg, Set, Function, FunctionArguments ) + self:F3( arg ) + + local function CoRoutine() + local Count = 0 + for ObjectID, Object in pairs( Set ) do + self:T2( Object ) + if Function then + if Function( unpack( FunctionArguments ), Object ) == true then + IteratorFunction( Object, unpack( arg ) ) + end + else + IteratorFunction( Object, unpack( arg ) ) + end + Count = Count + 1 + if Count % self.YieldInterval == 0 then + coroutine.yield( false ) + end + end + return true + end + + local co = coroutine.create( CoRoutine ) + + local function Schedule() + + local status, res = coroutine.resume( co ) + self:T3( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + + return false + end + + local Scheduler = SCHEDULER:New( self, Schedule, {}, self.TimeInterval, self.TimeInterval, 0 ) + + return self +end + + +----- Interate the SET_BASE and call an interator function for each **alive** unit, providing the Unit and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive unit in the SET_BASE. The function needs to accept a UNIT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachDCSUnitAlive( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.DCSUnitsAlive ) +-- +-- return self +--end +-- +----- Interate the SET_BASE and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a UNIT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachPlayer( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Interate the SET_BASE and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_BASE self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a CLIENT parameter. +---- @return #SET_BASE self +--function SET_BASE:ForEachClient( IteratorFunction, ... ) +-- self:F3( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- Decides whether to include the Object +-- @param #SET_BASE self +-- @param #table Object +-- @return #SET_BASE self +function SET_BASE:IsIncludeObject( Object ) + self:F3( Object ) + + return true +end + +--- Flushes the current SET_BASE contents in the log ... (for debug reasons). +-- @param #SET_BASE self +-- @return #string A string with the names of the objects. +function SET_BASE:Flush() + self:F3() + + local ObjectNames = "" + for ObjectName, Object in pairs( self.Set ) do + ObjectNames = ObjectNames .. ObjectName .. ", " + end + self:T( { "Objects in Set:", ObjectNames } ) + + return ObjectNames +end + +-- SET_GROUP + +--- SET_GROUP class +-- @type SET_GROUP +-- @extends Set#SET_BASE +SET_GROUP = { + ClassName = "SET_GROUP", + Filter = { + Coalitions = nil, + Categories = nil, + Countries = nil, + GroupPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Group.Category.AIRPLANE, + helicopter = Group.Category.HELICOPTER, + ground = Group.Category.GROUND_UNIT, + ship = Group.Category.SHIP, + structure = Group.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_GROUP object, building a set of groups belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_GROUP self +-- @return #SET_GROUP +-- @usage +-- -- Define a new SET_GROUP Object. This DBObject will contain a reference to all alive GROUPS. +-- DBObject = SET_GROUP:New() +function SET_GROUP:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.GROUPS ) ) + + return self +end + +--- Add GROUP(s) to SET_GROUP. +-- @param Set#SET_GROUP self +-- @param #string AddGroupNames A single name or an array of GROUP names. +-- @return self +function SET_GROUP:AddGroupsByName( AddGroupNames ) + + local AddGroupNamesArray = ( type( AddGroupNames ) == "table" ) and AddGroupNames or { AddGroupNames } + + for AddGroupID, AddGroupName in pairs( AddGroupNamesArray ) do + self:Add( AddGroupName, GROUP:FindByName( AddGroupName ) ) + end + + return self +end + +--- Remove GROUP(s) from SET_GROUP. +-- @param Set#SET_GROUP self +-- @param Group#GROUP RemoveGroupNames A single name or an array of GROUP names. +-- @return self +function SET_GROUP:RemoveGroupsByName( RemoveGroupNames ) + + local RemoveGroupNamesArray = ( type( RemoveGroupNames ) == "table" ) and RemoveGroupNames or { RemoveGroupNames } + + for RemoveGroupID, RemoveGroupName in pairs( RemoveGroupNamesArray ) do + self:Remove( RemoveGroupName.GroupName ) + end + + return self +end + + + + +--- Finds a Group based on the Group Name. +-- @param #SET_GROUP self +-- @param #string GroupName +-- @return Group#GROUP The found Group. +function SET_GROUP:FindGroup( GroupName ) + + local GroupFound = self.Set[GroupName] + return GroupFound +end + + + +--- Builds a set of groups of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_GROUP self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_GROUP self +function SET_GROUP:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of groups out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_GROUP self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_GROUP self +function SET_GROUP:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + +--- Builds a set of groups of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_GROUP self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_GROUP self +function SET_GROUP:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of groups of defined GROUP prefixes. +-- All the groups starting with the given prefixes will be included within the set. +-- @param #SET_GROUP self +-- @param #string Prefixes The prefix of which the group name starts with. +-- @return #SET_GROUP self +function SET_GROUP:FilterPrefixes( Prefixes ) + if not self.Filter.GroupPrefixes then + self.Filter.GroupPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.GroupPrefixes[Prefix] = Prefix + end + return self +end + + +--- Starts the filtering. +-- @param #SET_GROUP self +-- @return #SET_GROUP self +function SET_GROUP:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_GROUP self +-- @param Event#EVENTDATA Event +-- @return #string The name of the GROUP +-- @return #table The GROUP +function SET_GROUP:AddInDatabase( Event ) + self:F3( { Event } ) + + if not self.Database[Event.IniDCSGroupName] then + self.Database[Event.IniDCSGroupName] = GROUP:Register( Event.IniDCSGroupName ) + self:T3( self.Database[Event.IniDCSGroupName] ) + end + + return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_GROUP self +-- @param Event#EVENTDATA Event +-- @return #string The name of the GROUP +-- @return #table The GROUP +function SET_GROUP:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. +-- @param #SET_GROUP self +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroup( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupCompletelyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsCompletelyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupPartlyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsPartlyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. +-- @param #SET_GROUP self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. +-- @return #SET_GROUP self +function SET_GROUP:ForEachGroupNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Group#GROUP GroupObject + function( ZoneObject, GroupObject ) + if GroupObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + + +----- Interate the SET_GROUP and call an interator function for each **alive** player, providing the Group of the player and optional parameters. +---- @param #SET_GROUP self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a GROUP parameter. +---- @return #SET_GROUP self +--function SET_GROUP:ForEachPlayer( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Interate the SET_GROUP and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_GROUP self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a CLIENT parameter. +---- @return #SET_GROUP self +--function SET_GROUP:ForEachClient( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- +-- @param #SET_GROUP self +-- @param Group#GROUP MooseGroup +-- @return #SET_GROUP self +function SET_GROUP:IsIncludeObject( MooseGroup ) + self:F2( MooseGroup ) + local MooseGroupInclude = true + + if self.Filter.Coalitions then + local MooseGroupCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + self:T3( { "Coalition:", MooseGroup:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MooseGroup:GetCoalition() then + MooseGroupCoalition = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCoalition + end + + if self.Filter.Categories then + local MooseGroupCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + self:T3( { "Category:", MooseGroup:GetCategory(), self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MooseGroup:GetCategory() then + MooseGroupCategory = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCategory + end + + if self.Filter.Countries then + local MooseGroupCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + self:T3( { "Country:", MooseGroup:GetCountry(), CountryName } ) + if country.id[CountryName] == MooseGroup:GetCountry() then + MooseGroupCountry = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupCountry + end + + if self.Filter.GroupPrefixes then + local MooseGroupPrefix = false + for GroupPrefixId, GroupPrefix in pairs( self.Filter.GroupPrefixes ) do + self:T3( { "Prefix:", string.find( MooseGroup:GetName(), GroupPrefix, 1 ), GroupPrefix } ) + if string.find( MooseGroup:GetName(), GroupPrefix, 1 ) then + MooseGroupPrefix = true + end + end + MooseGroupInclude = MooseGroupInclude and MooseGroupPrefix + end + + self:T2( MooseGroupInclude ) + return MooseGroupInclude +end + +--- SET_UNIT class +-- @type SET_UNIT +-- @extends Set#SET_BASE +SET_UNIT = { + ClassName = "SET_UNIT", + Units = {}, + Filter = { + Coalitions = nil, + Categories = nil, + Types = nil, + Countries = nil, + UnitPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Unit.Category.AIRPLANE, + helicopter = Unit.Category.HELICOPTER, + ground = Unit.Category.GROUND_UNIT, + ship = Unit.Category.SHIP, + structure = Unit.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_UNIT object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_UNIT self +-- @return #SET_UNIT +-- @usage +-- -- Define a new SET_UNIT Object. This DBObject will contain a reference to all alive Units. +-- DBObject = SET_UNIT:New() +function SET_UNIT:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.UNITS ) ) + + return self +end + +--- Add UNIT(s) to SET_UNIT. +-- @param Set#SET_UNIT self +-- @param #string AddUnitNames A single name or an array of UNIT names. +-- @return self +function SET_UNIT:AddUnitsByName( AddUnitNames ) + + local AddUnitNamesArray = ( type( AddUnitNames ) == "table" ) and AddUnitNames or { AddUnitNames } + + for AddUnitID, AddUnitName in pairs( AddUnitNamesArray ) do + self:Add( AddUnitName, UNIT:FindByName( AddUnitName ) ) + end + + return self +end + +--- Remove UNIT(s) from SET_UNIT. +-- @param Set#SET_UNIT self +-- @param Unit#UNIT RemoveUnitNames A single name or an array of UNIT names. +-- @return self +function SET_UNIT:RemoveUnitsByName( RemoveUnitNames ) + + local RemoveUnitNamesArray = ( type( RemoveUnitNames ) == "table" ) and RemoveUnitNames or { RemoveUnitNames } + + for RemoveUnitID, RemoveUnitName in pairs( RemoveUnitNamesArray ) do + self:Remove( RemoveUnitName.UnitName ) + end + + return self +end + + +--- Finds a Unit based on the Unit Name. +-- @param #SET_UNIT self +-- @param #string UnitName +-- @return Unit#UNIT The found Unit. +function SET_UNIT:FindUnit( UnitName ) + + local UnitFound = self.Set[UnitName] + return UnitFound +end + + + +--- Builds a set of units of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_UNIT self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_UNIT self +function SET_UNIT:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of units out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_UNIT self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_UNIT self +function SET_UNIT:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + + +--- Builds a set of units of defined unit types. +-- Possible current types are those types known within DCS world. +-- @param #SET_UNIT self +-- @param #string Types Can take those type strings known within DCS world. +-- @return #SET_UNIT self +function SET_UNIT:FilterTypes( Types ) + if not self.Filter.Types then + self.Filter.Types = {} + end + if type( Types ) ~= "table" then + Types = { Types } + end + for TypeID, Type in pairs( Types ) do + self.Filter.Types[Type] = Type + end + return self +end + + +--- Builds a set of units of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_UNIT self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_UNIT self +function SET_UNIT:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of units of defined unit prefixes. +-- All the units starting with the given prefixes will be included within the set. +-- @param #SET_UNIT self +-- @param #string Prefixes The prefix of which the unit name starts with. +-- @return #SET_UNIT self +function SET_UNIT:FilterPrefixes( Prefixes ) + if not self.Filter.UnitPrefixes then + self.Filter.UnitPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.UnitPrefixes[Prefix] = Prefix + end + return self +end + + + + +--- Starts the filtering. +-- @param #SET_UNIT self +-- @return #SET_UNIT self +function SET_UNIT:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_UNIT self +-- @param Event#EVENTDATA Event +-- @return #string The name of the UNIT +-- @return #table The UNIT +function SET_UNIT:AddInDatabase( Event ) + self:F3( { Event } ) + + if not self.Database[Event.IniDCSUnitName] then + self.Database[Event.IniDCSUnitName] = UNIT:Register( Event.IniDCSUnitName ) + self:T3( self.Database[Event.IniDCSUnitName] ) + end + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_UNIT self +-- @param Event#EVENTDATA Event +-- @return #string The name of the UNIT +-- @return #table The UNIT +function SET_UNIT:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Interate the SET_UNIT and call an interator function for each **alive** UNIT, providing the UNIT and optional parameters. +-- @param #SET_UNIT self +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- @param #SET_UNIT self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnitCompletelyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Unit#UNIT UnitObject + function( ZoneObject, UnitObject ) + if UnitObject:IsCompletelyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. +-- @param #SET_UNIT self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. +-- @return #SET_UNIT self +function SET_UNIT:ForEachUnitNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Unit#UNIT UnitObject + function( ZoneObject, UnitObject ) + if UnitObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + + + +----- Interate the SET_UNIT and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. +---- @param #SET_UNIT self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a UNIT parameter. +---- @return #SET_UNIT self +--function SET_UNIT:ForEachPlayer( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) +-- +-- return self +--end +-- +-- +----- Interate the SET_UNIT and call an interator function for each client, providing the Client to the function and optional parameters. +---- @param #SET_UNIT self +---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a CLIENT parameter. +---- @return #SET_UNIT self +--function SET_UNIT:ForEachClient( IteratorFunction, ... ) +-- self:F2( arg ) +-- +-- self:ForEach( IteratorFunction, arg, self.Clients ) +-- +-- return self +--end + + +--- +-- @param #SET_UNIT self +-- @param Unit#UNIT MUnit +-- @return #SET_UNIT self +function SET_UNIT:IsIncludeObject( MUnit ) + self:F2( MUnit ) + local MUnitInclude = true + + if self.Filter.Coalitions then + local MUnitCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + self:T3( { "Coalition:", MUnit:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MUnit:GetCoalition() then + MUnitCoalition = true + end + end + MUnitInclude = MUnitInclude and MUnitCoalition + end + + if self.Filter.Categories then + local MUnitCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + self:T3( { "Category:", MUnit:GetDesc().category, self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MUnit:GetDesc().category then + MUnitCategory = true + end + end + MUnitInclude = MUnitInclude and MUnitCategory + end + + if self.Filter.Types then + local MUnitType = false + for TypeID, TypeName in pairs( self.Filter.Types ) do + self:T3( { "Type:", MUnit:GetTypeName(), TypeName } ) + if TypeName == MUnit:GetTypeName() then + MUnitType = true + end + end + MUnitInclude = MUnitInclude and MUnitType + end + + if self.Filter.Countries then + local MUnitCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + self:T3( { "Country:", MUnit:GetCountry(), CountryName } ) + if country.id[CountryName] == MUnit:GetCountry() then + MUnitCountry = true + end + end + MUnitInclude = MUnitInclude and MUnitCountry + end + + if self.Filter.UnitPrefixes then + local MUnitPrefix = false + for UnitPrefixId, UnitPrefix in pairs( self.Filter.UnitPrefixes ) do + self:T3( { "Prefix:", string.find( MUnit:GetName(), UnitPrefix, 1 ), UnitPrefix } ) + if string.find( MUnit:GetName(), UnitPrefix, 1 ) then + MUnitPrefix = true + end + end + MUnitInclude = MUnitInclude and MUnitPrefix + end + + self:T2( MUnitInclude ) + return MUnitInclude +end + + +--- SET_CLIENT + +--- SET_CLIENT class +-- @type SET_CLIENT +-- @extends Set#SET_BASE +SET_CLIENT = { + ClassName = "SET_CLIENT", + Clients = {}, + Filter = { + Coalitions = nil, + Categories = nil, + Types = nil, + Countries = nil, + ClientPrefixes = nil, + }, + FilterMeta = { + Coalitions = { + red = coalition.side.RED, + blue = coalition.side.BLUE, + neutral = coalition.side.NEUTRAL, + }, + Categories = { + plane = Unit.Category.AIRPLANE, + helicopter = Unit.Category.HELICOPTER, + ground = Unit.Category.GROUND_UNIT, + ship = Unit.Category.SHIP, + structure = Unit.Category.STRUCTURE, + }, + }, +} + + +--- Creates a new SET_CLIENT object, building a set of clients belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #SET_CLIENT self +-- @return #SET_CLIENT +-- @usage +-- -- Define a new SET_CLIENT Object. This DBObject will contain a reference to all Clients. +-- DBObject = SET_CLIENT:New() +function SET_CLIENT:New() + -- Inherits from BASE + local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.CLIENTS ) ) + + return self +end + +--- Add CLIENT(s) to SET_CLIENT. +-- @param Set#SET_CLIENT self +-- @param #string AddClientNames A single name or an array of CLIENT names. +-- @return self +function SET_CLIENT:AddClientsByName( AddClientNames ) + + local AddClientNamesArray = ( type( AddClientNames ) == "table" ) and AddClientNames or { AddClientNames } + + for AddClientID, AddClientName in pairs( AddClientNamesArray ) do + self:Add( AddClientName, CLIENT:FindByName( AddClientName ) ) + end + + return self +end + +--- Remove CLIENT(s) from SET_CLIENT. +-- @param Set#SET_CLIENT self +-- @param Client#CLIENT RemoveClientNames A single name or an array of CLIENT names. +-- @return self +function SET_CLIENT:RemoveClientsByName( RemoveClientNames ) + + local RemoveClientNamesArray = ( type( RemoveClientNames ) == "table" ) and RemoveClientNames or { RemoveClientNames } + + for RemoveClientID, RemoveClientName in pairs( RemoveClientNamesArray ) do + self:Remove( RemoveClientName.ClientName ) + end + + return self +end + + +--- Finds a Client based on the Client Name. +-- @param #SET_CLIENT self +-- @param #string ClientName +-- @return Client#CLIENT The found Client. +function SET_CLIENT:FindClient( ClientName ) + + local ClientFound = self.Set[ClientName] + return ClientFound +end + + + +--- Builds a set of clients of coalitions. +-- Possible current coalitions are red, blue and neutral. +-- @param #SET_CLIENT self +-- @param #string Coalitions Can take the following values: "red", "blue", "neutral". +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCoalitions( Coalitions ) + if not self.Filter.Coalitions then + self.Filter.Coalitions = {} + end + if type( Coalitions ) ~= "table" then + Coalitions = { Coalitions } + end + for CoalitionID, Coalition in pairs( Coalitions ) do + self.Filter.Coalitions[Coalition] = Coalition + end + return self +end + + +--- Builds a set of clients out of categories. +-- Possible current categories are plane, helicopter, ground, ship. +-- @param #SET_CLIENT self +-- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCategories( Categories ) + if not self.Filter.Categories then + self.Filter.Categories = {} + end + if type( Categories ) ~= "table" then + Categories = { Categories } + end + for CategoryID, Category in pairs( Categories ) do + self.Filter.Categories[Category] = Category + end + return self +end + + +--- Builds a set of clients of defined client types. +-- Possible current types are those types known within DCS world. +-- @param #SET_CLIENT self +-- @param #string Types Can take those type strings known within DCS world. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterTypes( Types ) + if not self.Filter.Types then + self.Filter.Types = {} + end + if type( Types ) ~= "table" then + Types = { Types } + end + for TypeID, Type in pairs( Types ) do + self.Filter.Types[Type] = Type + end + return self +end + + +--- Builds a set of clients of defined countries. +-- Possible current countries are those known within DCS world. +-- @param #SET_CLIENT self +-- @param #string Countries Can take those country strings known within DCS world. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterCountries( Countries ) + if not self.Filter.Countries then + self.Filter.Countries = {} + end + if type( Countries ) ~= "table" then + Countries = { Countries } + end + for CountryID, Country in pairs( Countries ) do + self.Filter.Countries[Country] = Country + end + return self +end + + +--- Builds a set of clients of defined client prefixes. +-- All the clients starting with the given prefixes will be included within the set. +-- @param #SET_CLIENT self +-- @param #string Prefixes The prefix of which the client name starts with. +-- @return #SET_CLIENT self +function SET_CLIENT:FilterPrefixes( Prefixes ) + if not self.Filter.ClientPrefixes then + self.Filter.ClientPrefixes = {} + end + if type( Prefixes ) ~= "table" then + Prefixes = { Prefixes } + end + for PrefixID, Prefix in pairs( Prefixes ) do + self.Filter.ClientPrefixes[Prefix] = Prefix + end + return self +end + + + + +--- Starts the filtering. +-- @param #SET_CLIENT self +-- @return #SET_CLIENT self +function SET_CLIENT:FilterStart() + + if _DATABASE then + self:_FilterStart() + end + + return self +end + +--- Handles the Database to check on an event (birth) that the Object was added in the Database. +-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! +-- @param #SET_CLIENT self +-- @param Event#EVENTDATA Event +-- @return #string The name of the CLIENT +-- @return #table The CLIENT +function SET_CLIENT:AddInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Handles the Database to check on any event that Object exists in the Database. +-- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! +-- @param #SET_CLIENT self +-- @param Event#EVENTDATA Event +-- @return #string The name of the CLIENT +-- @return #table The CLIENT +function SET_CLIENT:FindInDatabase( Event ) + self:F3( { Event } ) + + return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] +end + +--- Interate the SET_CLIENT and call an interator function for each **alive** CLIENT, providing the CLIENT and optional parameters. +-- @param #SET_CLIENT self +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClient( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set ) + + return self +end + +--- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence completely in a @{Zone}, providing the CLIENT and optional parameters to the called function. +-- @param #SET_CLIENT self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClientCompletelyInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Client#CLIENT ClientObject + function( ZoneObject, ClientObject ) + if ClientObject:IsCompletelyInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence not in a @{Zone}, providing the CLIENT and optional parameters to the called function. +-- @param #SET_CLIENT self +-- @param Zone#ZONE ZoneObject The Zone to be tested for. +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. +-- @return #SET_CLIENT self +function SET_CLIENT:ForEachClientNotInZone( ZoneObject, IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.Set, + --- @param Zone#ZONE_BASE ZoneObject + -- @param Client#CLIENT ClientObject + function( ZoneObject, ClientObject ) + if ClientObject:IsNotInZone( ZoneObject ) then + return true + else + return false + end + end, { ZoneObject } ) + + return self +end + +--- +-- @param #SET_CLIENT self +-- @param Client#CLIENT MClient +-- @return #SET_CLIENT self +function SET_CLIENT:IsIncludeObject( MClient ) + self:F2( MClient ) + + local MClientInclude = true + + if MClient then + local MClientName = MClient.UnitName + + if self.Filter.Coalitions then + local MClientCoalition = false + for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do + local ClientCoalitionID = _DATABASE:GetCoalitionFromClientTemplate( MClientName ) + self:T3( { "Coalition:", ClientCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionID then + MClientCoalition = true + end + end + self:T( { "Evaluated Coalition", MClientCoalition } ) + MClientInclude = MClientInclude and MClientCoalition + end + + if self.Filter.Categories then + local MClientCategory = false + for CategoryID, CategoryName in pairs( self.Filter.Categories ) do + local ClientCategoryID = _DATABASE:GetCategoryFromClientTemplate( MClientName ) + self:T3( { "Category:", ClientCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == ClientCategoryID then + MClientCategory = true + end + end + self:T( { "Evaluated Category", MClientCategory } ) + MClientInclude = MClientInclude and MClientCategory + end + + if self.Filter.Types then + local MClientType = false + for TypeID, TypeName in pairs( self.Filter.Types ) do + self:T3( { "Type:", MClient:GetTypeName(), TypeName } ) + if TypeName == MClient:GetTypeName() then + MClientType = true + end + end + self:T( { "Evaluated Type", MClientType } ) + MClientInclude = MClientInclude and MClientType + end + + if self.Filter.Countries then + local MClientCountry = false + for CountryID, CountryName in pairs( self.Filter.Countries ) do + local ClientCountryID = _DATABASE:GetCountryFromClientTemplate(MClientName) + self:T3( { "Country:", ClientCountryID, country.id[CountryName], CountryName } ) + if country.id[CountryName] and country.id[CountryName] == ClientCountryID then + MClientCountry = true + end + end + self:T( { "Evaluated Country", MClientCountry } ) + MClientInclude = MClientInclude and MClientCountry + end + + if self.Filter.ClientPrefixes then + local MClientPrefix = false + for ClientPrefixId, ClientPrefix in pairs( self.Filter.ClientPrefixes ) do + self:T3( { "Prefix:", string.find( MClient.UnitName, ClientPrefix, 1 ), ClientPrefix } ) + if string.find( MClient.UnitName, ClientPrefix, 1 ) then + MClientPrefix = true + end + end + self:T( { "Evaluated Prefix", MClientPrefix } ) + MClientInclude = MClientInclude and MClientPrefix + end + end + + self:T2( MClientInclude ) + return MClientInclude +end + +--- This module contains the POINT classes. +-- +-- 1) @{Point#POINT_VEC3} class, extends @{Base#BASE} +-- =============================================== +-- The @{Point#POINT_VEC3} class defines a 3D point in the simulator. +-- +-- 1.1) POINT_VEC3 constructor +-- --------------------------- +-- +-- A new POINT instance can be created with: +-- +-- * @{#POINT_VEC3.New}(): a 3D point. +-- +-- 2) @{Point#POINT_VEC2} class, extends @{Point#POINT_VEC3} +-- ========================================================= +-- The @{Point#POINT_VEC2} class defines a 2D point in the simulator. The height coordinate (if needed) will be the land height + an optional added height specified. +-- +-- 2.1) POINT_VEC2 constructor +-- --------------------------- +-- +-- A new POINT instance can be created with: +-- +-- * @{#POINT_VEC2.New}(): a 2D point. +-- +-- @module Point +-- @author FlightControl + +--- The POINT_VEC3 class +-- @type POINT_VEC3 +-- @extends Base#BASE +-- @field #POINT_VEC3.SmokeColor SmokeColor +-- @field #POINT_VEC3.FlareColor FlareColor +POINT_VEC3 = { + ClassName = "POINT_VEC3", + SmokeColor = { + Green = trigger.smokeColor.Green, + Red = trigger.smokeColor.Red, + White = trigger.smokeColor.White, + Orange = trigger.smokeColor.Orange, + Blue = trigger.smokeColor.Blue + }, + FlareColor = { + Green = trigger.flareColor.Green, + Red = trigger.flareColor.Red, + White = trigger.flareColor.White, + Yellow = trigger.flareColor.Yellow + }, + } + +--- SmokeColor +-- @type POINT_VEC3.SmokeColor +-- @field Green +-- @field Red +-- @field White +-- @field Orange +-- @field Blue + +--- FlareColor +-- @type POINT_VEC3.FlareColor +-- @field Green +-- @field Red +-- @field White +-- @field Yellow + +-- Constructor. + +--- Create a new POINT_VEC3 object. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. +-- @param DCSTypes#Distance y The y coordinate of the Vec3 point, pointing Upwards. +-- @param DCSTypes#Distance z The z coordinate of the Vec3 point, pointing to the Right. +-- @return Point#POINT_VEC3 +function POINT_VEC3:New( x, y, z ) + + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { x, y, z } ) + self.PointVec3 = { x = x, y = y, z = z } + return self +end + +--- Smokes the point in a color. +-- @param #POINT_VEC3 self +-- @param Point#POINT_VEC3.SmokeColor SmokeColor +function POINT_VEC3:Smoke( SmokeColor ) + self:F2( { SmokeColor, self.PointVec3 } ) + trigger.action.smoke( self.PointVec3, SmokeColor ) +end + +--- Smoke the POINT_VEC3 Green. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeGreen() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Green ) +end + +--- Smoke the POINT_VEC3 Red. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeRed() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Red ) +end + +--- Smoke the POINT_VEC3 White. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeWhite() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.White ) +end + +--- Smoke the POINT_VEC3 Orange. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeOrange() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Orange ) +end + +--- Smoke the POINT_VEC3 Blue. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeBlue() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Blue ) +end + +--- Flares the point in a color. +-- @param #POINT_VEC3 self +-- @param Point#POINT_VEC3.FlareColor +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:Flare( FlareColor, Azimuth ) + self:F2( { FlareColor, self.PointVec3 } ) + trigger.action.signalFlare( self.PointVec3, FlareColor, Azimuth and Azimuth or 0 ) +end + +--- Flare the POINT_VEC3 White. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:FlareWhite( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.White, Azimuth ) +end + +--- Flare the POINT_VEC3 Yellow. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:FlareYellow( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.Yellow, Azimuth ) +end + +--- Flare the POINT_VEC3 Green. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:FlareGreen( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.Green, Azimuth ) +end + +--- Flare the POINT_VEC3 Red. +-- @param #POINT_VEC3 self +function POINT_VEC3:FlareRed( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.Red, Azimuth ) +end + + +--- The POINT_VEC2 class +-- @type POINT_VEC2 +-- @extends Point#POINT_VEC3 +POINT_VEC2 = { + ClassName = "POINT_VEC2", + } + +--- Create a new POINT_VEC2 object. +-- @param #POINT_VEC2 self +-- @param DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. +-- @param DCSTypes#Distance y The y coordinate of the Vec3 point, pointing to the Right. +-- @param DCSTypes#Distance LandHeightAdd (optional) The default height if required to be evaluated will be the land height of the x, y coordinate. You can specify an extra height to be added to the land height. +-- @return Point#POINT_VEC2 +function POINT_VEC2:New( x, y, LandHeightAdd ) + + local LandHeight = land.getHeight( { ["x"] = x, ["y"] = y } ) + if LandHeightAdd then + LandHeight = LandHeight + LandHeightAdd + end + + local self = BASE:Inherit( self, POINT_VEC3:New( x, LandHeight, y ) ) + self:F2( { x, y, LandHeightAdd } ) + + return self +end + + +--- The main include file for the MOOSE system. + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Scheduler" ) +Include.File( "Event" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Unit" ) +Include.File( "Zone" ) +Include.File( "Client" ) +Include.File( "Static" ) +Include.File( "Database" ) +Include.File( "Set" ) +Include.File( "Point" ) Include.File( "Moose" ) +Include.File( "Scoring" ) +Include.File( "Cargo" ) +Include.File( "Message" ) +Include.File( "Stage" ) +Include.File( "Task" ) +Include.File( "GoHomeTask" ) +Include.File( "DestroyBaseTask" ) +Include.File( "DestroyGroupsTask" ) +Include.File( "DestroyRadarsTask" ) +Include.File( "DestroyUnitTypesTask" ) +Include.File( "PickupTask" ) +Include.File( "DeployTask" ) +Include.File( "NoTask" ) +Include.File( "RouteTask" ) +Include.File( "Mission" ) +Include.File( "CleanUp" ) +Include.File( "Spawn" ) +Include.File( "Movement" ) +Include.File( "Sead" ) +Include.File( "Escort" ) +Include.File( "MissileTrainer" ) +Include.File( "AIBalancer" ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-- The order of the declarations is important here. Don't touch it. + +--- Declare the event dispatcher based on the EVENT class +_EVENTDISPATCHER = EVENT:New() -- #EVENT + +--- Declare the main database object, which is used internally by the MOOSE classes. +_DATABASE = DATABASE:New() -- Database#DATABASE + +--- Scoring system for MOOSE. +-- This scoring class calculates the hits and kills that players make within a simulation session. +-- Scoring is calculated using a defined algorithm. +-- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded +-- to a database or a BI tool to publish the scoring results to the player community. +-- @module Scoring +-- @author FlightControl + + +--- The Scoring class +-- @type SCORING +-- @field Players A collection of the current players that have joined the game. +-- @extends Base#BASE +SCORING = { + ClassName = "SCORING", + ClassID = 0, + Players = {}, +} + +local _SCORINGCoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _SCORINGCategory = + { + [Unit.Category.AIRPLANE] = "Plane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Vehicle", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + +--- Creates a new SCORING object to administer the scoring achieved by players. +-- @param #SCORING self +-- @param #string GameName The name of the game. This name is also logged in the CSV score file. +-- @return #SCORING self +-- @usage +-- -- Define a new scoring object for the mission Gori Valley. +-- ScoringObject = SCORING:New( "Gori Valley" ) +function SCORING:New( GameName ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + if GameName then + self.GameName = GameName + else + error( "A game name must be given to register the scoring results" ) + end + + + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) + + --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) + self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) + + self:ScoreMenu() + + return self + +end + +--- Creates a score radio menu. Can be accessed using Radio -> F10. +-- @param #SCORING self +-- @return #SCORING self +function SCORING:ScoreMenu() + self.Menu = SUBMENU:New( 'Scoring' ) + self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) + --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) + return self +end + +--- Follows new players entering Clients within the DCSRTE. +-- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... +function SCORING:_FollowPlayersScheduled() + self:F3( "_FollowPlayersScheduled" ) + + local ClientUnit = 0 + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } + local unitId + local unitData + local AlivePlayerUnits = {} + + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "_FollowPlayersScheduled", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:_AddPlayerFromUnit( UnitData ) + end + end + + return true +end + + +--- Track DEAD or CRASH events for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnDeadOrCrash( Event ) + self:F( { Event } ) + + local TargetUnit = nil + local TargetGroup = nil + local TargetUnitName = "" + local TargetGroupName = "" + local TargetPlayerName = "" + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + TargetUnit = Event.IniDCSUnit + TargetUnitName = Event.IniDCSUnitName + TargetGroup = Event.IniDCSGroup + TargetGroupName = Event.IniDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category -- Workaround + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) + end + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Something got killed" ) + + -- Some variables + local InitUnitName = PlayerData.UnitName + local InitUnitType = PlayerData.UnitType + local InitCoalition = PlayerData.UnitCoalition + local InitCategory = PlayerData.UnitCategory + local InitUnitCoalition = _SCORINGCoalition[InitCoalition] + local InitUnitCategory = _SCORINGCategory[InitCategory] + + self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) + + -- What is he hitting? + if TargetCategory then + if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? + if not PlayerData.Kill[TargetCategory] then + PlayerData.Kill[TargetCategory] = {} + end + if not PlayerData.Kill[TargetCategory][TargetType] then + PlayerData.Kill[TargetCategory][TargetType] = {} + PlayerData.Kill[TargetCategory][TargetType].Score = 0 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 + PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 + end + + if InitCoalition == TargetCoalition then + PlayerData.Penalty = PlayerData.Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + 5 ):ToAll() + self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + PlayerData.Score = PlayerData.Score + 10 + PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + 5 ):ToAll() + self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + end + end +end + + + +--- Add a new player entering a Unit. +function SCORING:_AddPlayerFromUnit( UnitData ) + self:F( UnitData ) + + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + local UnitDesc = UnitData:getDesc() + local UnitCategory = UnitDesc.category + local UnitCoalition = UnitData:getCoalition() + local UnitTypeName = UnitData:getTypeName() + + self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) + + if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... + self.Players[PlayerName] = {} + self.Players[PlayerName].Hit = {} + self.Players[PlayerName].Kill = {} + self.Players[PlayerName].Mission = {} + + -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do + -- self.Players[PlayerName].Hit[CategoryID] = {} + -- self.Players[PlayerName].Kill[CategoryID] = {} + -- end + self.Players[PlayerName].HitPlayers = {} + self.Players[PlayerName].HitUnits = {} + self.Players[PlayerName].Score = 0 + self.Players[PlayerName].Penalty = 0 + self.Players[PlayerName].PenaltyCoalition = 0 + self.Players[PlayerName].PenaltyWarning = 0 + end + + if not self.Players[PlayerName].UnitCoalition then + self.Players[PlayerName].UnitCoalition = UnitCoalition + else + if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then + self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 + self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. + "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", + 2 + ):ToAll() + self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, + UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) + end + end + self.Players[PlayerName].UnitName = UnitName + self.Players[PlayerName].UnitCoalition = UnitCoalition + self.Players[PlayerName].UnitCategory = UnitCategory + self.Players[PlayerName].UnitType = UnitTypeName + + if self.Players[PlayerName].Penalty > 100 then + if self.Players[PlayerName].PenaltyWarning < 1 then + MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, + 30 + ):ToAll() + self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 + end + end + + if self.Players[PlayerName].Penalty > 150 then + ClientGroup = GROUP:NewFromDCSUnit( UnitData ) + ClientGroup:Destroy() + MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", + 10 + ):ToAll() + end + + end +end + + +--- Registers Scores the players completing a Mission Task. +function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) + self:F( { PlayerUnit, MissionName, Score } ) + + local PlayerName = PlayerUnit:getPlayerName() + + if not self.Players[PlayerName].Mission[MissionName] then + self.Players[PlayerName].Mission[MissionName] = {} + self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 + self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 + end + + self:T( PlayerName ) + self:T( self.Players[PlayerName].Mission[MissionName] ) + + self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score + self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score + + MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + 20 ):ToAll() + + self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) +end + + +--- Registers Mission Scores for possible multiple players that contributed in the Mission. +function SCORING:_AddMissionScore( MissionName, Score ) + self:F( { MissionName, Score } ) + + for PlayerName, PlayerData in pairs( self.Players ) do + + if PlayerData.Mission[MissionName] then + PlayerData.Score = PlayerData.Score + Score + PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score + MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + 20 ):ToAll() + self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) + end + end +end + +--- Handles the OnHit event for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnHit( Event ) + self:F( { Event } ) + + local InitUnit = nil + local InitUnitName = "" + local InitGroup = nil + local InitGroupName = "" + local InitPlayerName = nil + + local InitCoalition = nil + local InitCategory = nil + local InitType = nil + local InitUnitCoalition = nil + local InitUnitCategory = nil + local InitUnitType = nil + + local TargetUnit = nil + local TargetUnitName = "" + local TargetGroup = nil + local TargetGroupName = "" + local TargetPlayerName = "" + + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + InitUnit = Event.IniDCSUnit + InitUnitName = Event.IniDCSUnitName + InitGroup = Event.IniDCSGroup + InitGroupName = Event.IniDCSGroupName + InitPlayerName = InitUnit:getPlayerName() + + InitCoalition = InitUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --InitCategory = InitUnit:getCategory() + InitCategory = InitUnit:getDesc().category + InitType = InitUnit:getTypeName() + + InitUnitCoalition = _SCORINGCoalition[InitCoalition] + InitUnitCategory = _SCORINGCategory[InitCategory] + InitUnitType = InitType + + self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) + end + + + if Event.TgtDCSUnit then + + TargetUnit = Event.TgtDCSUnit + TargetUnitName = Event.TgtDCSUnitName + TargetGroup = Event.TgtDCSGroup + TargetGroupName = Event.TgtDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) + end + + if InitPlayerName ~= nil then -- It is a player that is hitting something + self:_AddPlayerFromUnit( InitUnit ) + if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + self:_AddPlayerFromUnit( TargetUnit ) + self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 + end + + self:T( "Hitting Something" ) + -- What is he hitting? + if TargetCategory then + if not self.Players[InitPlayerName].Hit[TargetCategory] then + self.Players[InitPlayerName].Hit[TargetCategory] = {} + end + if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 + end + local Score = 0 + if InitCoalition == TargetCoalition then + self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + 2 + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + 2 + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + elseif InitPlayerName == nil then -- It is an AI hitting a player??? + + end +end + + +function SCORING:ReportScoreAll() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = ":\n" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() +end + + +function SCORING:ReportScorePlayer() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = "" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() + +end + + +function SCORING:SecondsToClock(sSeconds) + local nSeconds = sSeconds + if nSeconds == 0 then + --return nil; + return "00:00:00"; + else + nHours = string.format("%02.f", math.floor(nSeconds/3600)); + nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); + nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); + return nHours..":"..nMins..":"..nSecs + end +end + +--- Opens a score CSV file to log the scores. +-- @param #SCORING self +-- @param #string ScoringCSV +-- @return #SCORING self +-- @usage +-- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". +-- ScoringObject = SCORING:New( "Gori Valley" ) +-- ScoringObject:OpenCSV( "Player Scores" ) +function SCORING:OpenCSV( ScoringCSV ) + self:F( ScoringCSV ) + + if lfs and io and os then + if ScoringCSV then + self.ScoringCSV = ScoringCSV + local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" + + self.CSVFile, self.err = io.open( fdir, "w+" ) + if not self.CSVFile then + error( "Error: Cannot open CSV file in " .. lfs.writedir() ) + end + + self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) + + self.RunTime = os.date("%y-%m-%d_%H-%M-%S") + else + error( "A string containing the CSV file name must be given." ) + end + else + self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) + end + return self +end + + +--- Registers a score for a player. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @param #string ScoreType The type of the score. +-- @param #string ScoreTimes The amount of scores achieved. +-- @param #string ScoreAmount The score given. +-- @param #string PlayerUnitName The unit name of the player. +-- @param #string PlayerUnitCoalition The coalition of the player unit. +-- @param #string PlayerUnitCategory The category of the player unit. +-- @param #string PlayerUnitType The type of the player unit. +-- @param #string TargetUnitName The name of the target unit. +-- @param #string TargetUnitCoalition The coalition of the target unit. +-- @param #string TargetUnitCategory The category of the target unit. +-- @param #string TargetUnitType The type of the target unit. +-- @return #SCORING self +function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + --write statistic information to file + local ScoreTime = self:SecondsToClock( timer.getTime() ) + PlayerName = PlayerName:gsub( '"', '_' ) + + if PlayerUnitName and PlayerUnitName ~= '' then + local PlayerUnit = Unit.getByName( PlayerUnitName ) + + if PlayerUnit then + if not PlayerUnitCategory then + --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] + PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] + end + + if not PlayerUnitCoalition then + PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] + end + + if not PlayerUnitType then + PlayerUnitType = PlayerUnit:getTypeName() + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + + if not TargetUnitCoalition then + TargetUnitCoalition = '' + end + + if not TargetUnitCategory then + TargetUnitCategory = '' + end + + if not TargetUnitType then + TargetUnitType = '' + end + + if not TargetUnitName then + TargetUnitName = '' + end + + if lfs and io and os then + self.CSVFile:write( + '"' .. self.GameName .. '"' .. ',' .. + '"' .. self.RunTime .. '"' .. ',' .. + '' .. ScoreTime .. '' .. ',' .. + '"' .. PlayerName .. '"' .. ',' .. + '"' .. ScoreType .. '"' .. ',' .. + '"' .. PlayerUnitCoalition .. '"' .. ',' .. + '"' .. PlayerUnitCategory .. '"' .. ',' .. + '"' .. PlayerUnitType .. '"' .. ',' .. + '"' .. PlayerUnitName .. '"' .. ',' .. + '"' .. TargetUnitCoalition .. '"' .. ',' .. + '"' .. TargetUnitCategory .. '"' .. ',' .. + '"' .. TargetUnitType .. '"' .. ',' .. + '"' .. TargetUnitName .. '"' .. ',' .. + '' .. ScoreTimes .. '' .. ',' .. + '' .. ScoreAmount + ) + + self.CSVFile:write( "\n" ) + end +end + + +function SCORING:CloseCSV() + if lfs and io and os then + self.CSVFile:close() + end +end + +--- CARGO Classes +-- @module CARGO + + + + + + + +--- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". +-- These clients are defined within the Mission Orchestration Framework (MOF) + +CARGOS = {} + + +CARGO_ZONE = { + ClassName="CARGO_ZONE", + CargoZoneName = '', + CargoHostUnitName = '', + SIGNAL = { + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + }, + COLOR = { + GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, + RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, + WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, + BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } + } + } +} + +--- Creates a new zone where cargo can be collected or deployed. +-- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. +-- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. +-- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. +-- The CargoHostName is the "host" of the cargo zone: +-- +-- * It will smoke the zone position when a client is approaching the zone. +-- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. +-- +-- @param #CARGO_ZONE self +-- @param #string CargoZoneName The name of the zone as declared within the mission editor. +-- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. +function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) + self:F( { CargoZoneName, CargoHostName } ) + + self.CargoZoneName = CargoZoneName + self.SignalHeight = 2 + --self.CargoZone = trigger.misc.getZone( CargoZoneName ) + + + if CargoHostName then + self.CargoHostName = CargoHostName + end + + self:T( self.CargoZoneName ) + + return self +end + +function CARGO_ZONE:Spawn() + self:F( self.CargoHostName ) + + if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + if CargoHostGroup and CargoHostGroup:IsAlive() then + else + self.CargoHostSpawn:ReSpawn( 1 ) + end + else + self:T( "Initialize CargoHostSpawn" ) + self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) + self.CargoHostSpawn:ReSpawn( 1 ) + end + end + + return self +end + +function CARGO_ZONE:GetHostUnit() + self:F( self ) + + if self.CargoHostName then + + -- A Host has been given, signal the host + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + local CargoHostUnit + if CargoHostGroup and CargoHostGroup:IsAlive() then + CargoHostUnit = CargoHostGroup:GetUnit(1) + else + CargoHostUnit = StaticObject.getByName( self.CargoHostName ) + end + + return CargoHostUnit + end + + return nil +end + +function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) + self:F() + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + local SignalUnitTypeName = SignalUnit:getTypeName() + + local HostMessage = "" + + local IsCargo = false + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + if Cargo:IsStatusNone() then + HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" + IsCargo = true + end + end + end + + if not IsCargo then + HostMessage = "No Cargo Available." + end + + Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) + end +end + + +function CARGO_ZONE:Signal() + self:F() + + local Signalled = false + + if self.SignalType then + + if self.CargoHostName then + + -- A Host has been given, signal the host + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + self:T( 'Signalling Unit' ) + local SignalVehiclePos = SignalUnit:GetPointVec3() + SignalVehiclePos.y = SignalVehiclePos.y + 2 + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + + trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) + Signalled = false + + end + end + + else + + local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) + Signalled = false + + end + end + end + + return Signalled + +end + +function CARGO_ZONE:WhiteSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:BlueSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:OrangeSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:WhiteFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:YellowFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:GetCargoHostUnit() + self:F( self ) + + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) + if CargoHostGroup and CargoHostGroup:IsAlive() then + local CargoHostUnit = CargoHostGroup:GetUnit(1) + if CargoHostUnit and CargoHostUnit:IsAlive() then + return CargoHostUnit + end + end + end + + return nil +end + +function CARGO_ZONE:GetCargoZoneName() + self:F() + + return self.CargoZoneName +end + +CARGO = { + ClassName = "CARGO", + STATUS = { + NONE = 0, + LOADED = 1, + UNLOADED = 2, + LOADING = 3 + }, + CargoClient = nil +} + +--- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... +function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { CargoType, CargoName, CargoWeight } ) + + + self.CargoType = CargoType + self.CargoName = CargoName + self.CargoWeight = CargoWeight + + self:StatusNone() + + return self +end + +function CARGO:Spawn( Client ) + self:F() + + return self + +end + +function CARGO:IsNear( Client, LandingZone ) + self:F() + + local Near = true + + return Near + +end + + +function CARGO:IsLoadingToClient() + self:F() + + if self:IsStatusLoading() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:IsLoadedInClient() + self:F() + + if self:IsStatusLoaded() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:UnLoad( Client, TargetZoneName ) + self:F() + + self:StatusUnLoaded() + + return self +end + +function CARGO:OnBoard( Client, LandingZone ) + self:F() + + local Valid = true + + self.CargoClient = Client + local ClientUnit = Client:GetClientGroupDCSUnit() + + return Valid +end + +function CARGO:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = true + + return OnBoarded +end + +function CARGO:Load( Client ) + self:F() + + self:StatusLoaded( Client ) + + return self +end + +function CARGO:IsLandingRequired() + self:F() + return true +end + +function CARGO:IsSlingLoad() + self:F() + return false +end + + +function CARGO:StatusNone() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.NONE + + return self +end + +function CARGO:StatusLoading( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADING + self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusLoaded( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADED + self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusUnLoaded() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.UNLOADED + + return self +end + + +function CARGO:IsStatusNone() + self:F() + + return self.CargoStatus == CARGO.STATUS.NONE +end + +function CARGO:IsStatusLoading() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADING +end + +function CARGO:IsStatusLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADED +end + +function CARGO:IsStatusUnLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.UNLOADED +end + + +CARGO_GROUP = { + ClassName = "CARGO_GROUP" +} + + +function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) + + self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) + self.CargoZone = CargoZone + + CARGOS[self.CargoName] = self + + return self + +end + +function CARGO_GROUP:Spawn( Client ) + self:F( { Client } ) + + local SpawnCargo = true + + if self:IsStatusNone() then + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + + elseif self:IsStatusLoading() then + + local Client = self:IsLoadingToClient() + if Client and Client:GetDCSGroup() then + SpawnCargo = false + else + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + end + + elseif self:IsStatusLoaded() then + + local ClientLoaded = self:IsLoadedInClient() + -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. + if ClientLoaded and ClientLoaded ~= Client then + local ClientGroup = Client:GetDCSGroup() + if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then + SpawnCargo = false + else + self:StatusNone() + end + else + -- Same Client, but now in initialize, so set back the status to None. + self:StatusNone() + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + end + + if SpawnCargo then + if self.CargoZone:GetCargoHostUnit() then + --- ReSpawn the Cargo from the CargoHost + self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() + else + --- ReSpawn the Cargo in the CargoZone without a host ... + self:T( self.CargoZone ) + self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() + end + self:StatusNone() + end + + self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) + + return self +end + +function CARGO_GROUP:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoGroupName then + local CargoGroup = Group.getByName( self.CargoGroupName ) + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + local CargoUnit = CargoGroup:getUnit(1) + local CargoPos = CargoUnit:getPoint() + + self.CargoInAir = CargoUnit:inAir() + + self:T( self.CargoInAir ) + + -- Only move the group to the carrier when the cargo is not in the air + -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). + if not self.CargoInAir then + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) + Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) + + end + self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) + + --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) + end + + self:StatusLoading( Client ) + + return Valid + +end + + +function CARGO_GROUP:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + if not self.CargoInAir then + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + else + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + + return OnBoarded +end + + +function CARGO_GROUP:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + + local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) + + self.CargoGroupName = CargoGroup:GetName() + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) + + self:StatusUnLoaded() + + return self +end + + +CARGO_PACKAGE = { + ClassName = "CARGO_PACKAGE" +} + + +function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) + + self.CargoClient = CargoClient + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_PACKAGE:Spawn( Client ) + self:F( { self, Client } ) + + -- this needs to be checked thoroughly + + local CargoClientGroup = self.CargoClient:GetDCSGroup() + if not CargoClientGroup then + if not self.CargoClientSpawn then + self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) + end + self.CargoClientSpawn:ReSpawn( 1 ) + end + + local SpawnCargo = true + + if self:IsStatusNone() then + + elseif self:IsStatusLoading() or self:IsStatusLoaded() then + + local CargoClientLoaded = self:IsLoadedInClient() + if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then + SpawnCargo = false + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + else + + end + + if SpawnCargo then + self:StatusLoaded( self.CargoClient ) + end + + return self +end + + +function CARGO_PACKAGE:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + self:T( self.CargoClient.ClientName ) + self:T( 'Client Exists.' ) + + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + local CarrierPosMoveAway = ClientUnit:getPoint() + + local CargoHostGroup = self.CargoClient:GetDCSGroup() + local CargoHostName = self.CargoClient:GetDCSGroup():getName() + + local CargoHostUnits = CargoHostGroup:getUnits() + local CargoPos = CargoHostUnits[1]:getPoint() + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + end + self:T( "Routing " .. CargoHostName ) + + --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) + + return Valid + +end + + +function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then + + -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. + self:StatusLoaded( Client ) + + -- All done, onboarded the Cargo to the new Client. + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) + + --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) + self:StatusUnLoaded() + + return Cargo +end + + +CARGO_SLINGLOAD = { + ClassName = "CARGO_SLINGLOAD" +} + + +function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) + local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) + + self.CargoHostName = CargoHostName + + -- Cargo will be initialized around the CargoZone position. + self.CargoZone = CargoZone + + self.CargoCount = 0 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + -- The country ID needs to be correctly set. + self.CargoCountryID = CargoCountryID + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_SLINGLOAD:IsLandingRequired() + self:F() + return false +end + + +function CARGO_SLINGLOAD:IsSlingLoad() + self:F() + return true +end + + +function CARGO_SLINGLOAD:Spawn( Client ) + self:F( { self, Client } ) + + local Zone = trigger.misc.getZone( self.CargoZone ) + + local ZonePos = {} + ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + + self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) + + --[[ + -- This does not work in 1.5.2. + CargoStatic = StaticObject.getByName( self.CargoName ) + if CargoStatic then + CargoStatic:destroy() + end + --]] + + CargoStatic = StaticObject.getByName( self.CargoStaticName ) + + if CargoStatic and CargoStatic:isExist() then + CargoStatic:destroy() + end + + -- I need to make every time a new cargo due to bugs in 1.5.2. + + self.CargoCount = self.CargoCount + 1 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + local CargoTemplate = { + ["category"] = "Cargo", + ["shape_name"] = "ab-212_cargo", + ["type"] = "Cargo1", + ["x"] = ZonePos.x, + ["y"] = ZonePos.y, + ["mass"] = self.CargoWeight, + ["name"] = self.CargoStaticName, + ["canCargo"] = true, + ["heading"] = 0, + } + + coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) + +-- end + + return self +end + + +function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + return Near +end + + +function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) + self:F() + + local Near = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + Near = true + end + end + + return Near +end + + +function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + + return Valid +end + + +function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + self:StatusUnLoaded() + + return Cargo +end +--- This module contains the MESSAGE class. +-- +-- 1) @{Message#MESSAGE} class, extends @{Base#BASE} +-- ================================================= +-- Message System to display Messages to Clients, Coalitions or All. +-- Messages are shown on the display panel for an amount of seconds, and will then disappear. +-- Messages can contain a category which is indicating the category of the message. +-- +-- 1.1) MESSAGE construction methods +-- --------------------------------- +-- Messages are created with @{Message#MESSAGE.New}. Note that when the MESSAGE object is created, no message is sent yet. +-- To send messages, you need to use the To functions. +-- +-- 1.2) Send messages with MESSAGE To methods +-- ------------------------------------------ +-- Messages are sent to: +-- +-- * Clients with @{Message#MESSAGE.ToClient}. +-- * Coalitions with @{Message#MESSAGE.ToCoalition}. +-- * All Players with @{Message#MESSAGE.ToAll}. +-- +-- @module Message +-- @author FlightControl + +--- The MESSAGE class +-- @type MESSAGE +-- @extends Base#BASE +MESSAGE = { + ClassName = "MESSAGE", + MessageCategory = 0, + MessageID = 0, +} + + +--- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. +-- @param self +-- @param #string MessageText is the text of the Message. +-- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. +-- @param #string MessageCategory (optional) is a string expressing the "category" of the Message. The category will be shown as the first text in the message followed by a ": ". +-- @return #MESSAGE +-- @usage +-- -- Create a series of new Messages. +-- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". +-- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", 25, "End of Mission" ) +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", 25, "Penalty" ) +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", 25, "Score") +function MESSAGE:New( MessageText, MessageDuration, MessageCategory ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MessageText, MessageDuration, MessageCategory } ) + + -- When no MessageCategory is given, we don't show it as a title... + if MessageCategory and MessageCategory ~= "" then + self.MessageCategory = MessageCategory .. ": " + else + self.MessageCategory = "" + end + + self.MessageDuration = MessageDuration + self.MessageTime = timer.getTime() + self.MessageText = MessageText + + self.MessageSent = false + self.MessageGroup = false + self.MessageCoalition = false + + return self +end + +--- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". +-- @param #MESSAGE self +-- @param Client#CLIENT Client is the Group of the Client. +-- @return #MESSAGE +-- @usage +-- -- Send the 2 messages created with the @{New} method to the Client Group. +-- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. +-- ClientGroup = Group.getByName( "ClientGroup" ) +-- +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) +-- MessageClient1:ToClient( ClientGroup ) +-- MessageClient2:ToClient( ClientGroup ) +function MESSAGE:ToClient( Client ) + self:F( Client ) + + if Client and Client:GetClientGroupID() then + + local ClientGroupID = Client:GetClientGroupID() + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to the Blue coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the BLUE coalition. +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageBLUE:ToBlue() +function MESSAGE:ToBlue() + self:F() + + self:ToCoalition( coalition.side.BLUE ) + + return self +end + +--- Sends a MESSAGE to the Red Coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToRed() +function MESSAGE:ToRed( ) + self:F() + + self:ToCoalition( coalition.side.RED ) + + return self +end + +--- Sends a MESSAGE to a Coalition. +-- @param #MESSAGE self +-- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToCoalition( coalition.side.RED ) +function MESSAGE:ToCoalition( CoalitionSide ) + self:F( CoalitionSide ) + + if CoalitionSide then + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to all players. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created to all players. +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) +-- MessageAll:ToAll() +function MESSAGE:ToAll() + self:F() + + self:ToCoalition( coalition.side.RED ) + self:ToCoalition( coalition.side.BLUE ) + + return self +end + + + +----- The MESSAGEQUEUE class +---- @type MESSAGEQUEUE +--MESSAGEQUEUE = { +-- ClientGroups = {}, +-- CoalitionSides = {} +--} +-- +--function MESSAGEQUEUE:New( RefreshInterval ) +-- local self = BASE:Inherit( self, BASE:New() ) +-- self:F( { RefreshInterval } ) +-- +-- self.RefreshInterval = RefreshInterval +-- +-- --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) +-- self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) +-- +-- return self +--end +-- +----- This function is called automatically by the MESSAGEQUEUE scheduler. +--function MESSAGEQUEUE:_DisplayMessages() +-- +-- -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). +-- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do +-- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do +-- if MessageData.MessageSent == false then +-- --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageSent = true +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- end +-- +-- -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. +-- -- Because the Client messages will overwrite the Coalition messages (for that Client). +-- for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do +-- for MessageID, MessageData in pairs( ClientGroupData.Messages ) do +-- if MessageData.MessageGroup == false then +-- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageGroup = true +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- +-- -- Now check if the Client also has messages that belong to the Coalition of the Client... +-- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do +-- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do +-- local CoalitionGroup = Group.getByName( ClientGroupName ) +-- if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then +-- if MessageData.MessageCoalition == false then +-- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageCoalition = true +-- end +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- end +-- end +-- +-- return true +--end +-- +----- The _MessageQueue object is created when the MESSAGE class module is loaded. +----_MessageQueue = MESSAGEQUEUE:New( 0.5 ) +-- +--- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. +-- @module STAGE +-- @author Flightcontrol + + + + + + + +--- The STAGE class +-- @type +STAGE = { + ClassName = "STAGE", + MSG = { ID = "None", TIME = 10 }, + FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, + + Name = "NoStage", + StageType = '', + WaitTime = 1, + Frequency = 1, + MessageCount = 0, + MessageInterval = 15, + MessageShown = {}, + MessageShow = false, + MessageFlash = false +} + + +function STAGE:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + return self +end + +function STAGE:Execute( Mission, Client, Task ) + + local Valid = true + + return Valid +end + +function STAGE:Executing( Mission, Client, Task ) + +end + +function STAGE:Validate( Mission, Client, Task ) + local Valid = true + + return Valid +end + + +STAGEBRIEF = { + ClassName = "BRIEF", + MSG = { ID = "Brief", TIME = 1 }, + Name = "Brief", + StageBriefingTime = 0, + StageBriefingDuration = 1 +} + +function STAGEBRIEF:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute +-- @param #STAGEBRIEF self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +-- @return #boolean +function STAGEBRIEF:Execute( Mission, Client, Task ) + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + self:F() + Client:ShowMissionBriefing( Mission.MissionBriefing ) + self.StageBriefingTime = timer.getTime() + return Valid +end + +function STAGEBRIEF:Validate( Mission, Client, Task ) + local Valid = STAGE:Validate( Mission, Client, Task ) + self:T() + + if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then + return 0 + else + self.StageBriefingTime = timer.getTime() + return 1 + end + +end + + +STAGESTART = { + ClassName = "START", + MSG = { ID = "Start", TIME = 1 }, + Name = "Start", + StageStartTime = 0, + StageStartDuration = 1 +} + +function STAGESTART:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGESTART:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + if Task.TaskBriefing then + Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) + else + Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) + end + self.StageStartTime = timer.getTime() + return Valid +end + +function STAGESTART:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + if timer.getTime() - self.StageStartTime <= self.StageStartDuration then + return 0 + else + self.StageStartTime = timer.getTime() + return 1 + end + + return 1 + +end + +STAGE_CARGO_LOAD = { + ClassName = "STAGE_CARGO_LOAD" +} + +function STAGE_CARGO_LOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do + LoadCargo:Load( Client ) + end + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + +STAGE_CARGO_INIT = { + ClassName = "STAGE_CARGO_INIT" +} + +function STAGE_CARGO_INIT:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do + self:T( InitLandingZone ) + InitLandingZone:Spawn() + end + + + self:T( Task.Cargos.InitCargos ) + for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do + self:T( { InitCargoData } ) + InitCargoData:Spawn( Client ) + end + + return Valid +end + + +function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + + +STAGEROUTE = { + ClassName = "STAGEROUTE", + MSG = { ID = "Route", TIME = 5 }, + Frequency = STAGE.FREQUENCY.REPEAT, + Name = "Route" +} + +function STAGEROUTE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + self.MessageSwitch = true + return self +end + + +--- Execute the routing. +-- @param #STAGEROUTE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEROUTE:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + local RouteMessage = "Fly to: " + self:T( Task.LandingZones ) + for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do + RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' + end + + if Client:IsMultiSeated() then + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) + else + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) + end + + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGEROUTE:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + -- check if the Client is in the landing zone + self:T( Task.LandingZones.LandingZoneNames ) + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + + if Task.CurrentLandingZoneName then + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + + self:T( 1 ) + return 1 + end + + self:T( 0 ) + return 0 +end + + + +STAGELANDING = { + ClassName = "STAGELANDING", + MSG = { ID = "Landing", TIME = 10 }, + Name = "Landing", + Signalled = false +} + +function STAGELANDING:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute the landing coordination. +-- @param #STAGELANDING self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGELANDING:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) + else + Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) + end + + Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() + + self:T( { Task.HostUnit } ) + + if Task.HostUnit then + + Task.HostUnitName = Task.HostUnit:GetPrefix() + Task.HostUnitTypeName = Task.HostUnit:GetTypeName() + + local HostMessage = "" + Task.CargoNames = "" + + local IsFirst = true + + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + + if Cargo:IsLandingRequired() then + self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") + Task.IsLandingRequired = true + end + + if Cargo:IsSlingLoad() then + self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") + Task.IsSlingLoad = true + end + + if IsFirst then + IsFirst = false + Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + else + Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + end + end + end + + if Task.IsLandingRequired then + HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + else + HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + end + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) + + end +end + +function STAGELANDING:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + if Task.CurrentLandingZoneName then + + -- Client is in de landing zone. + self:T( Task.CurrentLandingZoneName ) + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + else + if Task.CurrentLandingZone then + Task.CurrentLandingZone = nil + end + if Task.CurrentCargoZone then + Task.CurrentCargoZone = nil + end + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -1 ) + return -1 + end + + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then + self:T( 1 ) + Task.IsInAirTestRequired = true + return 1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then + self:T( 1 ) + Task.IsInAirTestRequired = false + return 1 + end + + self:T( 0 ) + return 0 +end + +STAGELANDED = { + ClassName = "STAGELANDED", + MSG = { ID = "Land", TIME = 10 }, + Name = "Landed", + MenusAdded = false +} + +function STAGELANDED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELANDED:Execute( Mission, Client, Task ) + self:F() + + if Task.IsLandingRequired then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', + self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) + + if not self.MenusAdded then + Task.Cargo = nil + Task:RemoveCargoMenus( Client ) + Task:AddCargoMenus( Client, CARGOS, 250 ) + end + end +end + + + +function STAGELANDED:Validate( Mission, Client, Task ) + self:F() + + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -2 ) + return -2 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + self:T( "Client went back in the air. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + -- Wait until cargo is selected from the menu. + if Task.IsLandingRequired then + if not Task.Cargo then + self:T( 0 ) + return 0 + end + end + + self:T( 1 ) + return 1 +end + +STAGEUNLOAD = { + ClassName = "STAGEUNLOAD", + MSG = { ID = "Unload", TIME = 10 }, + Name = "Unload" +} + +function STAGEUNLOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Coordinate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) + else + Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) + end + Task:RemoveCargoMenus( Client ) +end + +function STAGEUNLOAD:Executing( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) + + local TargetZoneName + + if Task.TargetZoneName then + TargetZoneName = Task.TargetZoneName + else + TargetZoneName = Task.CurrentLandingZoneName + end + + if Task.Cargo:UnLoad( Client, TargetZoneName ) then + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + if Mission.MissionReportFlash then + Client:ShowCargo() + end + end +end + +--- Validate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Validate( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Validate()' ) + + if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if not Client:GetClientGroupDCSUnit():inAir() then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) + end + Task:RemoveCargoMenus( Client ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. + return 1 + end + + return 1 +end + +STAGELOAD = { + ClassName = "STAGELOAD", + MSG = { ID = "Load", TIME = 10 }, + Name = "Load" +} + +function STAGELOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELOAD:Execute( Mission, Client, Task ) + self:F() + + if not Task.IsSlingLoad then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) + + -- Route the cargo to the Carrier + + Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + else + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + end +end + +function STAGELOAD:Executing( Mission, Client, Task ) + self:F() + + -- If the Cargo is ready to be loaded, load it into the Client. + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + self:T( Task.Cargo.CargoName) + + if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then + + -- Load the Cargo onto the Client + Task.Cargo:Load( Client ) + + -- Message to the pilot that cargo has been loaded. + Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", + 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + + Client:ShowCargo() + end + else + Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) + for CargoID, Cargo in pairs( CARGOS ) do + self:T( "Cargo.CargoName = " .. Cargo.CargoName ) + + if Cargo:IsSlingLoad() then + local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) + if CargoStatic then + self:T( "Cargo is found in the DCS simulator.") + local CargoStaticPosition = CargoStatic:getPosition().p + self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) + local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) + if CargoStaticHeight > 5 then + self:T( "Cargo is airborne.") + Cargo:StatusLoaded() + Task.Cargo = Cargo + Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', + self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + break + end + else + self:T( "Cargo not found in the DCS simulator." ) + end + end + end + end + +end + +function STAGELOAD:Validate( Mission, Client, Task ) + self:F() + + self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + Task:RemoveCargoMenus( Client ) + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) + self:T( 1 ) + return 1 + end + + else + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) + if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) + self:T( 1 ) + return 1 + end + end + + end + + + self:T( 0 ) + return 0 +end + + +STAGEDONE = { + ClassName = "STAGEDONE", + MSG = { ID = "Done", TIME = 10 }, + Name = "Done" +} + +function STAGEDONE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +function STAGEDONE:Execute( Mission, Client, Task ) + self:F() + +end + +function STAGEDONE:Validate( Mission, Client, Task ) + self:F() + + Task:Done() + + return 0 +end + +STAGEARRIVE = { + ClassName = "STAGEARRIVE", + MSG = { ID = "Arrive", TIME = 10 }, + Name = "Arrive" +} + +function STAGEARRIVE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + + +--- Execute Arrival +-- @param #STAGEARRIVE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEARRIVE:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) + end + +end + +function STAGEARRIVE:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) + if ( Task.CurrentLandingZoneID ) then + else + return -1 + end + + return 1 +end + +STAGEGROUPSDESTROYED = { + ClassName = "STAGEGROUPSDESTROYED", + DestroyGroupSize = -1, + Frequency = STAGE.FREQUENCY.REPEAT, + MSG = { ID = "DestroyGroup", TIME = 10 }, + Name = "GroupsDestroyed" +} + +function STAGEGROUPSDESTROYED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +--function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) +-- +-- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) +-- +--end + +function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) + self:F() + + if Task.MissionTask:IsGoalReached() then + return 1 + else + return 0 + end +end + +function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) + self:F() + self:T( { Task.ClassName, Task.Destroyed } ) + --env.info( 'Event Table Task = ' .. tostring(Task) ) + +end + + + + + + + + + + + + + +--[[ + _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. + + - _TransportStage.START + - _TransportStage.ROUTE + - _TransportStage.LAND + - _TransportStage.EXECUTE + - _TransportStage.DONE + - _TransportStage.REMOVE +--]] +_TransportStage = { + HOLD = "HOLD", + START = "START", + ROUTE = "ROUTE", + LANDING = "LANDING", + LANDED = "LANDED", + EXECUTING = "EXECUTING", + LOAD = "LOAD", + UNLOAD = "UNLOAD", + DONE = "DONE", + NEXT = "NEXT" +} + +_TransportStageMsgTime = { + HOLD = 10, + START = 60, + ROUTE = 5, + LANDING = 10, + LANDED = 30, + EXECUTING = 30, + LOAD = 30, + UNLOAD = 30, + DONE = 30, + NEXT = 0 +} + +_TransportStageTime = { + HOLD = 10, + START = 5, + ROUTE = 5, + LANDING = 1, + LANDED = 1, + EXECUTING = 5, + LOAD = 5, + UNLOAD = 5, + DONE = 1, + NEXT = 0 +} + +_TransportStageAction = { + REPEAT = -1, + NONE = 0, + ONCE = 1 +} +--- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. +-- @module TASK + + + + + + + +--- The TASK class +-- @type TASK +-- @extends Base#BASE +TASK = { + + -- Defines the different signal types with a Task. + SIGNAL = { + COLOR = { + RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, + GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, + BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } + }, + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + } + }, + ClassName = "TASK", + Mission = {}, -- Owning mission of the Task + Name = '', + Stages = {}, + Stage = {}, + Cargos = { + InitCargos = {}, + LoadCargos = {} + }, + LandingZones = { + LandingZoneNames = {}, + LandingZones = {} + }, + ActiveStage = 0, + TaskDone = false, + TaskFailed = false, + GoalTasks = {} +} + +--- Instantiates a new TASK Base. Should never be used. Interface Class. +-- @return TASK +function TASK:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + -- assign Task default values during construction + self.TaskBriefing = "Task: No Task." + self.Time = timer.getTime() + self.ExecuteStage = _TransportExecuteStage.NONE + + return self +end + +function TASK:SetStage( StageSequenceIncrement ) + self:F( { StageSequenceIncrement } ) + + local Valid = false + if StageSequenceIncrement ~= 0 then + self.ActiveStage = self.ActiveStage + StageSequenceIncrement + if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then + self.Stage = self.Stages[self.ActiveStage] + self:T( { self.Stage.Name } ) + self.Frequency = self.Stage.Frequency + Valid = true + else + Valid = false + env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) + end + end + self.Time = timer.getTime() + return Valid +end + +function TASK:Init() + self:F() + self.ActiveStage = 0 + self:SetStage(1) + self.TaskDone = false + self.TaskFailed = false +end + + +--- Get progress of a TASK. +-- @return string GoalsText +function TASK:GetGoalProgress() + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + Goals = '(' .. Goals .. ')' + else + Goals = '( - )' + end + GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' + end + + if GoalsText == "" then + GoalsText = "( - )" + end + + return GoalsText +end + +--- Show progress of a TASK. +-- @param MISSION Mission Group structure describing the Mission. +-- @param CLIENT Client Group structure describing the Client. +function TASK:ShowGoalProgress( Mission, Client ) + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + if Mission:IsCompleted() then + else + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + else + Goals = "-" + end + GoalsText = GoalsText .. self:GetGoalProgress() + end + end + + if Mission.MissionReportFlash or Mission.MissionReportShow then + Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) + end +end + +--- Sets a TASK to status Done. +function TASK:Done() + self:F2() + self.TaskDone = true +end + +--- Returns if a TASK is done. +-- @return bool +function TASK:IsDone() + self:F2( self.TaskDone ) + return self.TaskDone +end + +--- Sets a TASK to status failed. +function TASK:Failed() + self:F() + self.TaskFailed = true +end + +--- Returns if a TASk has failed. +-- @return bool +function TASK:IsFailed() + self:F2( self.TaskFailed ) + return self.TaskFailed +end + +function TASK:Reset( Mission, Client ) + self:F2() + self.ExecuteStage = _TransportExecuteStage.NONE +end + +--- Returns the Goals of a TASK +-- @return @table Goals +function TASK:GetGoals() + return self.GoalTasks +end + +--- Returns if a TASK has Goal(s). +-- @param #TASK self +-- @param #string GoalVerb is the name of the Goal of the TASK. +-- @return bool +function TASK:Goal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self:T2( {self.GoalTasks[GoalVerb] } ) + if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then + return true + else + return false + end +end + +--- Sets the total Goals to be achieved of the Goal Name +-- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:SetGoalTotal( GoalTotal, GoalVerb ) + self:F2( { GoalTotal, GoalVerb } ) + + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self.GoalTasks[GoalVerb] = {} + self.GoalTasks[GoalVerb].Goals = {} + self.GoalTasks[GoalVerb].GoalTotal = GoalTotal + self.GoalTasks[GoalVerb].GoalCount = 0 + return self +end + +--- Gets the total of Goals to be achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:GetGoalTotal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalTotal + else + return 0 + end +end + +--- Sets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param number GoalCount is the total number of Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:SetGoalCount( GoalCount, GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = GoalCount + end + return self +end + +--- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. +-- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) + self:F2( { GoalCountIncrease, GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease + end + return self +end + +--- Gets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalCount( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalCount + else + return 0 + end +end + +--- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalPercentage( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) + else + return 100 + end +end + +--- Returns if all the Goals of the TASK were achieved. +-- @return bool +function TASK:IsGoalReached() + self:F2() + + local GoalReached = true + + for GoalVerb, Goals in pairs( self.GoalTasks ) do + self:T2( { "GoalVerb", GoalVerb } ) + if self:Goal( GoalVerb ) then + local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) + self:T2( "GoalToDo = " .. GoalToDo ) + if GoalToDo <= 0 then + else + GoalReached = false + break + end + else + break + end + end + + self:T( { GoalReached, self.GoalTasks } ) + return GoalReached +end + +--- Adds an Additional Goal for the TASK to be achieved. +-- @param string GoalVerb is the name of the Goal of the TASK. +-- @param string GoalTask is a text describing the Goal of the TASK to be achieved. +-- @param number GoalIncrease is a number by which the Goal achievement is increasing. +function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) + self:F2( { GoalVerb, GoalTask, GoalIncrease } ) + + if self:Goal( GoalVerb ) then + self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease + end + return self +end + +--- Returns if the additional Goal for the TASK was completed. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return string Goals +function TASK:GetGoalCompletion( GoalVerb ) + self:F2( { GoalVerb } ) + + if self:Goal( GoalVerb ) then + local Goals = "" + for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end + return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount + end +end + +function TASK.MenuAction( Parameter ) + Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING + Parameter.ReferenceTask.Cargo = Parameter.CargoTask +end + +function TASK:StageExecute() + self:F() + + local Execute = false + + if self.Frequency == STAGE.FREQUENCY.REPEAT then + Execute = true + elseif self.Frequency == STAGE.FREQUENCY.NONE then + Execute = false + elseif self.Frequency >= 0 then + Execute = true + self.Frequency = self.Frequency - 1 + end + + return Execute + +end + +--- Work function to set signal events within a TASK. +function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) + self:F() + + local Valid = true + + if Valid then + if type( SignalUnitNames ) == "table" then + self.LandingZoneSignalUnitNames = SignalUnitNames + else + self.LandingZoneSignalUnitNames = { SignalUnitNames } + end + self.LandingZoneSignalType = SignalType + self.LandingZoneSignalColor = SignalColor + self.Signalled = false + if SignalHeight ~= nil then + self.LandingZoneSignalHeight = SignalHeight + else + self.LandingZoneSignalHeight = 0 + end + + if self.TaskBriefing then + self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." + end + end + + return Valid +end + +--- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end +--- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. +-- @module GOHOMETASK + +--- The GOHOMETASK class +-- @type +GOHOMETASK = { + ClassName = "GOHOMETASK", +} + +--- Creates a new GOHOMETASK. +-- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. +-- @return GOHOMETASK +function GOHOMETASK:New( LandingZones ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones } ) + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Fly Home' + self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. +-- @module DESTROYBASETASK +-- @see DESTROYGROUPSTASK +-- @see DESTROYUNITTYPESTASK +-- @see DESTROY_RADARS_TASK + + + +--- The DESTROYBASETASK class +-- @type DESTROYBASETASK +DESTROYBASETASK = { + ClassName = "DESTROYBASETASK", + Destroyed = 0, + GoalVerb = "Destroy", + DestroyPercentage = 100, +} + +--- Creates a new DESTROYBASETASK. +-- @param #DESTROYBASETASK self +-- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". +-- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". +-- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +-- @return DESTROYBASETASK +function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + self.Name = 'Destroy' + self.Destroyed = 0 + self.DestroyGroupPrefixes = DestroyGroupPrefixes + self.DestroyGroupType = DestroyGroupType + self.DestroyUnitType = DestroyUnitType + if DestroyPercentage then + self.DestroyPercentage = DestroyPercentage + end + self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + + return self +end + +--- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. +-- @param #DESTROYBASETASK self +-- @param Event#EVENTDATA Event structure of MOOSE. +function DESTROYBASETASK:EventDead( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + local DestroyUnit = Event.IniDCSUnit + local DestroyUnitName = Event.IniDCSUnitName + local DestroyGroup = Event.IniDCSGroup + local DestroyGroupName = Event.IniDCSGroupName + + --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! + --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... + local UnitsDestroyed = 0 + for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do + self:T( DestroyGroupPrefix ) + if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then + self:T( BASE:Inherited(self).ClassName ) + UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:T( UnitsDestroyed ) + end + end + + self:T( { UnitsDestroyed } ) + self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) + end + +end + +--- Validate task completeness of DESTROYBASETASK. +-- @param DestroyGroup Group structure describing the group to be evaluated. +-- @param DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F() + + return 0 +end +--- DESTROYGROUPSTASK +-- @module DESTROYGROUPSTASK + + + +--- The DESTROYGROUPSTASK class +-- @type +DESTROYGROUPSTASK = { + ClassName = "DESTROYGROUPSTASK", + GoalVerb = "Destroy Groups", +} + +--- Creates a new DESTROYGROUPSTASK. +-- @param #DESTROYGROUPSTASK self +-- @param #string DestroyGroupType String describing the group to be destroyed. +-- @param #string DestroyUnitType String describing the unit to be destroyed. +-- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +---@return DESTROYGROUPSTASK +function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) + self:F() + + self.Name = 'Destroy Groups' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + _EVENTDISPATCHER:OnCrash( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param #DESTROYGROUPSTASK self +-- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. +-- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. +-- @return #number The DestroyCount reflecting the amount of units destroyed within the group. +function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) + + local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. + local DestroyGroupInitialSize = DestroyGroup:getInitialSize() + self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) + + local DestroyCount = 0 + if DestroyGroup then + if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then + DestroyCount = 1 + end + else + DestroyCount = 1 + end + + self:T( DestroyCount ) + + return DestroyCount +end +--- Task class to destroy radar installations. +-- @module DESTROYRADARSTASK + + + +--- The DESTROYRADARS class +-- @type +DESTROYRADARSTASK = { + ClassName = "DESTROYRADARSTASK", + GoalVerb = "Destroy Radars" +} + +--- Creates a new DESTROYRADARSTASK. +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @return DESTROYRADARSTASK +function DESTROYRADARSTASK:New( DestroyGroupNames ) + local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) + self:F() + + self.Name = 'Destroy Radars' + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + self:T( 'Destroyed a radar' ) + DestroyCount = 1 + end + end + return DestroyCount +end +--- Set TASK to destroy certain unit types. +-- @module DESTROYUNITTYPESTASK + + + +--- The DESTROYUNITTYPESTASK class +-- @type +DESTROYUNITTYPESTASK = { + ClassName = "DESTROYUNITTYPESTASK", + GoalVerb = "Destroy", +} + +--- Creates a new DESTROYUNITTYPESTASK. +-- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". +-- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. +-- @return DESTROYUNITTYPESTASK +function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) + self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) + + if type(DestroyUnitTypes) == 'table' then + self.DestroyUnitTypes = DestroyUnitTypes + else + self.DestroyUnitTypes = { DestroyUnitTypes } + end + + self.Name = 'Destroy Unit Types' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do + if DestroyUnit and DestroyUnit:getTypeName() == UnitType then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + DestroyCount = DestroyCount + 1 + end + end + end + return DestroyCount +end +--- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. +-- @module PICKUPTASK +-- @parent TASK + +--- The PICKUPTASK class +-- @type +PICKUPTASK = { + ClassName = "PICKUPTASK", + TEXT = { "Pick-Up", "picked-up", "loaded" }, + GoalVerb = "Pick-Up" +} + +--- Creates a new PICKUPTASK. +-- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. +-- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. +-- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. +function PICKUPTASK:New( CargoType, OnBoardSide ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. + + local Valid = true + + if Valid then + self.Name = 'Pickup Cargo' + self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.OnBoardSide = OnBoardSide + self.IsLandingRequired = true -- required to decide whether the client needs to land or not + self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function PICKUPTASK:FromZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + +function PICKUPTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + +function PICKUPTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + +function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + + -- If the Cargo has no status, allow the menu option. + if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then + + local MenuAdd = false + if Cargo:IsNear( Client, self.CurrentCargoZone ) then + MenuAdd = true + end + + if MenuAdd then + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].PickupMenu then + Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( + Client:GetClientGroupID(), + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) + end + + if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then + Client._Menus[Cargo.CargoType].PickupSubMenus = {} + end + + Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( + Client:GetClientGroupID(), + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].PickupMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + end + +end + +function PICKUPTASK:RemoveCargoMenus( Client ) + self:F() + + for MenuID, MenuData in pairs( Client._Menus ) do + for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do + missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) + self:T( "Removed PickupSubMenu " ) + SubMenuData = nil + end + if MenuData.PickupMenu then + missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) + self:T( "Removed PickupMenu " ) + MenuData.PickupMenu = nil + end + end + + for CargoID, Cargo in pairs( CARGOS ) do + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then + Cargo:StatusNone() + end + end + +end + + + +function PICKUPTASK:HasFailed( ClientDead ) + self:F() + + local TaskHasFailed = self.TaskFailed + return TaskHasFailed +end + +--- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. +-- @module DEPLOYTASK + + + +--- A DeployTask +-- @type DEPLOYTASK +DEPLOYTASK = { + ClassName = "DEPLOYTASK", + TEXT = { "Deploy", "deployed", "unloaded" }, + GoalVerb = "Deployment" +} + + +--- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. +-- @function [parent=#DEPLOYTASK] New +-- @param #string CargoType Type of the Cargo. +-- @return #DEPLOYTASK The created DeployTask +function DEPLOYTASK:New( CargoType ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Deploy Cargo' + self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function DEPLOYTASK:ToZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + + +function DEPLOYTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + + +function DEPLOYTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + + +--- When the cargo is unloaded, it will move to the target zone name. +-- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. +function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) + self:F() + + local Valid = true + + Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) + + if Valid then + self.TargetZoneName = TargetZoneName + end + + return Valid + +end + +function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + + self:T( ClientGroupID ) + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) + + if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then + + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].DeployMenu then + Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( + ClientGroupID, + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added DeployMenu ' .. self.TEXT[1] ) + end + + if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then + Client._Menus[Cargo.CargoType].DeploySubMenus = {} + end + + if Client._Menus[Cargo.CargoType].DeployMenu == nil then + self:T( 'deploymenu is nil' ) + end + + Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( + ClientGroupID, + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].DeployMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + +end + +function DEPLOYTASK:RemoveCargoMenus( Client ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + self:T( ClientGroupID ) + + for MenuID, MenuData in pairs( Client._Menus ) do + if MenuData.DeploySubMenus ~= nil then + for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do + missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) + self:T( "Removed DeploySubMenu " ) + SubMenuData = nil + end + end + if MenuData.DeployMenu then + missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) + self:T( "Removed DeployMenu " ) + MenuData.DeployMenu = nil + end + end + +end +--- A NOTASK is a dummy activity... But it will show a Mission Briefing... +-- @module NOTASK + +--- The NOTASK class +-- @type +NOTASK = { + ClassName = "NOTASK", +} + +--- Creates a new NOTASK. +function NOTASK:New() + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Nothing' + self.TaskBriefing = "Task: Execute your mission." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. +-- @module ROUTETASK + +--- The ROUTETASK class +-- @type +ROUTETASK = { + ClassName = "ROUTETASK", + GoalVerb = "Route", +} + +--- Creates a new ROUTETASK. +-- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. +-- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. +-- @return ROUTETASK +function ROUTETASK:New( LandingZones, TaskBriefing ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones, TaskBriefing } ) + + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Route To Zone' + if TaskBriefing then + self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + else + self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + end + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +--- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. +-- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. +-- @module Mission + +--- The MISSION class +-- @type MISSION +-- @extends Base#BASE +-- @field #MISSION.Clients _Clients +-- @field #string MissionBriefing +MISSION = { + ClassName = "MISSION", + Name = "", + MissionStatus = "PENDING", + _Clients = {}, + _Tasks = {}, + _ActiveTasks = {}, + GoalFunction = nil, + MissionReportTrigger = 0, + MissionProgressTrigger = 0, + MissionReportShow = false, + MissionReportFlash = false, + MissionTimeInterval = 0, + MissionCoalition = "", + SUCCESS = 1, + FAILED = 2, + REPEAT = 3, + _GoalTasks = {} +} + +--- @type MISSION.Clients +-- @list + +function MISSION:Meta() + + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + return self +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. +-- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. +-- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. +-- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... +-- @return MISSION +-- @usage +-- -- Declare a few missions. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) +function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) + + self = MISSION:Meta() + self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) + + local Valid = true + + Valid = routines.ValidateString( MissionName, "MissionName", Valid ) + Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) + Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) + Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) + + if Valid then + self.Name = MissionName + self.MissionPriority = MissionPriority + self.MissionBriefing = MissionBriefing + self.MissionCoalition = MissionCoalition + end + + return self +end + +--- Returns if a Mission has completed. +-- @return bool +function MISSION:IsCompleted() + self:F() + return self.MissionStatus == "ACCOMPLISHED" +end + +--- Set a Mission to completed. +function MISSION:Completed() + self:F() + self.MissionStatus = "ACCOMPLISHED" + self:StatusToClients() +end + +--- Returns if a Mission is ongoing. +-- treturn bool +function MISSION:IsOngoing() + self:F() + return self.MissionStatus == "ONGOING" +end + +--- Set a Mission to ongoing. +function MISSION:Ongoing() + self:F() + self.MissionStatus = "ONGOING" + --self:StatusToClients() +end + +--- Returns if a Mission is pending. +-- treturn bool +function MISSION:IsPending() + self:F() + return self.MissionStatus == "PENDING" +end + +--- Set a Mission to pending. +function MISSION:Pending() + self:F() + self.MissionStatus = "PENDING" + self:StatusToClients() +end + +--- Returns if a Mission has failed. +-- treturn bool +function MISSION:IsFailed() + self:F() + return self.MissionStatus == "FAILED" +end + +--- Set a Mission to failed. +function MISSION:Failed() + self:F() + self.MissionStatus = "FAILED" + self:StatusToClients() +end + +--- Send the status of the MISSION to all Clients. +function MISSION:StatusToClients() + self:F() + if self.MissionReportFlash then + for ClientID, Client in pairs( self._Clients ) do + Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") + end + end +end + +--- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. +function MISSION:ReportTrigger() + self:F() + + if self.MissionReportShow == true then + self.MissionReportShow = false + return true + else + if self.MissionReportFlash == true then + if timer.getTime() >= self.MissionReportTrigger then + self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval + return true + else + return false + end + else + return false + end + end +end + +--- Report the status of all MISSIONs to all active Clients. +function MISSION:ReportToAll() + self:F() + + local AlivePlayers = '' + for ClientID, Client in pairs( self._Clients ) do + if Client:GetDCSGroup() then + if Client:GetClientGroupDCSUnit() then + if Client:GetClientGroupDCSUnit():getLife() > 0.0 then + if AlivePlayers == '' then + AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() + else + AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() + end + end + end + end + end + local Tasks = self:GetTasks() + local TaskText = "" + for TaskID, TaskData in pairs( Tasks ) do + TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" + end + MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), 10, "Mission Command: Mission Report" ):ToAll() +end + + +--- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. +-- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. +-- @usage +-- PatriotActivation = { +-- { "US SAM Patriot Zerti", false }, +-- { "US SAM Patriot Zegduleti", false }, +-- { "US SAM Patriot Gvleti", false } +-- } +-- +-- function DeployPatriotTroopsGoal( Mission, Client ) +-- +-- +-- -- Check if the cargo is all deployed for mission success. +-- for CargoID, CargoData in pairs( Mission._Cargos ) do +-- if Group.getByName( CargoData.CargoGroupName ) then +-- CargoGroup = Group.getByName( CargoData.CargoGroupName ) +-- if CargoGroup then +-- -- Check if the cargo is ready to activate +-- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon +-- if CurrentLandingZoneID then +-- if PatriotActivation[CurrentLandingZoneID][2] == false then +-- -- Now check if this is a new Mission Task to be completed... +-- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) +-- PatriotActivation[CurrentLandingZoneID][2] = true +-- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) +-- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) +-- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. +-- end +-- end +-- end +-- end +-- end +-- end +-- +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) +function MISSION:AddGoalFunction( GoalFunction ) + self:F() + self.GoalFunction = GoalFunction +end + +--- Register a new @{CLIENT} to participate within the mission. +-- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. +-- @return CLIENT +-- @usage +-- Add a number of Client objects to the Mission. +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +function MISSION:AddClient( Client ) + self:F( { Client } ) + + local Valid = true + + if Valid then + self._Clients[Client.ClientName] = Client + end + + return Client +end + +--- Find a @{CLIENT} object within the @{MISSION} by its ClientName. +-- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. +-- @return CLIENT +-- @usage +-- -- Seach for Client "Bomber" within the Mission. +-- local BomberClient = Mission:FindClient( "Bomber" ) +function MISSION:FindClient( ClientName ) + self:F( { self._Clients[ClientName] } ) + return self._Clients[ClientName] +end + + +--- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. +-- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. +-- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. +-- @return TASK +-- @usage +-- -- Define a few tasks for the Mission. +-- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } +-- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } +-- +-- -- Assign the Pickup Task +-- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) +-- PickupTask:AddSmokeBlue( PickupSignalUnits ) +-- PickupTask:SetGoalTotal( 3 ) +-- Mission:AddTask( PickupTask, 1 ) +-- +-- -- Assign the Deploy Task +-- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } +-- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } +-- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) +-- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) +-- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) +-- DeployTask:SetGoalTotal( 3 ) +-- DeployTask:SetGoalTotal( 3, "Patriots activated" ) +-- Mission:AddTask( DeployTask, 2 ) + +function MISSION:AddTask( Task, TaskNumber ) + self:F() + + self._Tasks[TaskNumber] = Task + self._Tasks[TaskNumber]:EnableEvents() + self._Tasks[TaskNumber].ID = TaskNumber + + return Task + end + +--- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. +-- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. +-- @return TASK +-- @usage +-- -- Get Task 2 from the Mission. +-- Task2 = Mission:GetTask( 2 ) + +function MISSION:GetTask( TaskNumber ) + self:F() + + local Valid = true + + local Task = nil + + if type(TaskNumber) ~= "number" then + Valid = false + end + + if Valid then + Task = self._Tasks[TaskNumber] + end + + return Task +end + +--- Get all the TASKs from the Mission. This function is useful in GoalFunctions. +-- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. +-- @usage +-- -- Get Tasks from the Mission. +-- Tasks = Mission:GetTasks() +-- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) +function MISSION:GetTasks() + self:F() + + return self._Tasks +end + + +--[[ + _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. + + - _TransportExecuteStage.EXECUTING + - _TransportExecuteStage.SUCCESS + - _TransportExecuteStage.FAILED + +--]] +_TransportExecuteStage = { + NONE = 0, + EXECUTING = 1, + SUCCESS = 2, + FAILED = 3 +} + + +--- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. +-- @type MISSIONSCHEDULER +-- @field #MISSIONSCHEDULER.MISSIONS Missions +MISSIONSCHEDULER = { + Missions = {}, + MissionCount = 0, + TimeIntervalCount = 0, + TimeIntervalShow = 150, + TimeSeconds = 14400, + TimeShow = 5 +} + +--- @type MISSIONSCHEDULER.MISSIONS +-- @list <#MISSION> Mission + +--- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. +function MISSIONSCHEDULER.Scheduler() + + + -- loop through the missions in the TransportTasks + for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do + + local Mission = MissionData -- #MISSION + + if not Mission:IsCompleted() then + + -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). + local ClientsAlive = false + + for ClientID, ClientData in pairs( Mission._Clients ) do + + local Client = ClientData -- Client#CLIENT + + if Client:IsAlive() then + + -- There is at least one Client that is alive... So the Mission status is set to Ongoing. + ClientsAlive = true + + -- If this Client was not registered as Alive before: + -- 1. We register the Client as Alive. + -- 2. We initialize the Client Tasks and make a link to the original Mission Task. + -- 3. We initialize the Cargos. + -- 4. We flag the Mission as Ongoing. + if not Client.ClientAlive then + Client.ClientAlive = true + Client.ClientBriefingShown = false + for TaskNumber, Task in pairs( Mission._Tasks ) do + -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! + Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) + -- Each MissionTask must point to the original Mission. + Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] + Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos + Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones + end + + Mission:Ongoing() + end + + + -- For each Client, check for each Task the state and evolve the mission. + -- This flag will indicate if the Task of the Client is Complete. + local TaskComplete = false + + for TaskNumber, Task in pairs( Client._Tasks ) do + + if not Task.Stage then + Task:SetStage( 1 ) + end + + + local TransportTime = timer.getTime() + + if not Task:IsDone() then + + if Task:Goal() then + Task:ShowGoalProgress( Mission, Client ) + end + + --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) + + -- Action + if Task:StageExecute() then + Task.Stage:Execute( Mission, Client, Task ) + end + + -- Wait until execution is finished + if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then + Task.Stage:Executing( Mission, Client, Task ) + end + + -- Validate completion or reverse to earlier stage + if Task.Time + Task.Stage.WaitTime <= TransportTime then + Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) + end + + if Task:IsDone() then + --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + TaskComplete = true -- when a task is not yet completed, a mission cannot be completed + + else + -- break only if this task is not yet done, so that future task are not yet activated. + TaskComplete = false -- when a task is not yet completed, a mission cannot be completed + --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + break + end + + if TaskComplete then + + if Mission.GoalFunction ~= nil then + Mission.GoalFunction( Mission, Client ) + end + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) + end + +-- if not Mission:IsCompleted() then +-- end + end + end + end + + local MissionComplete = true + for TaskNumber, Task in pairs( Mission._Tasks ) do + if Task:Goal() then +-- Task:ShowGoalProgress( Mission, Client ) + if Task:IsGoalReached() then + else + MissionComplete = false + end + else + MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. + end + end + + if MissionComplete then + Mission:Completed() + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) + end + else + if TaskComplete then + -- Reset for new tasking of active client + Client.ClientAlive = false -- Reset the client tasks. + end + end + + + else + if Client.ClientAlive then + env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) + Client.ClientAlive = false + + -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. + -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... + --Client._Tasks[TaskNumber].MissionTask = nil + --Client._Tasks = nil + end + end + end + + -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. + -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. + if ClientsAlive == false then + if Mission:IsOngoing() then + -- Mission status back to pending... + Mission:Pending() + end + end + end + + Mission:StatusToClients() + + if Mission:ReportTrigger() then + Mission:ReportToAll() + end + end + + return true +end + +--- Start the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Start() + if MISSIONSCHEDULER ~= nil then + --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + end +end + +--- Stop the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Stop() + if MISSIONSCHEDULER.SchedulerId then + routines.removeFunction(MISSIONSCHEDULER.SchedulerId) + MISSIONSCHEDULER.SchedulerId = nil + end +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param Mission is the MISSION object instantiated by @{MISSION:New}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +function MISSIONSCHEDULER.AddMission( Mission ) + MISSIONSCHEDULER.Missions[Mission.Name] = Mission + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 + -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. + --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) + + return Mission +end + +--- Remove a MISSION from the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now remove the Mission. +-- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.RemoveMission( MissionName ) + MISSIONSCHEDULER.Missions[MissionName] = nil + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 +end + +--- Find a MISSION within the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now find the Mission. +-- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.FindMission( MissionName ) + return MISSIONSCHEDULER.Missions[MissionName] +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsShow( ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = true + Mission.MissionReportFlash = false + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) + local Count = 0 + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = true + Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval + Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval + env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) + Count = Count + 1 + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsHide( Prm ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = false + end +end + +--- Enables a MENU option in the communications menu under F10 to control the status of the active missions. +-- This function should be called only once when starting the MISSIONSCHEDULER. +function MISSIONSCHEDULER.ReportMenu() + local ReportMenu = SUBMENU:New( 'Status' ) + local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) + local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) + local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) +end + +--- Show the remaining mission time. +function MISSIONSCHEDULER:TimeShow() + self.TimeIntervalCount = self.TimeIntervalCount + 1 + if self.TimeIntervalCount >= self.TimeTriggerShow then + local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' + MESSAGE:New( TimeMsg, self.TimeShow, "Mission time" ):ToAll() + self.TimeIntervalCount = 0 + end +end + +function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) + + self.TimeIntervalCount = 0 + self.TimeSeconds = TimeSeconds + self.TimeIntervalShow = TimeIntervalShow + self.TimeShow = TimeShow +end + +--- Adds a mission scoring to the game. +function MISSIONSCHEDULER:Scoring( Scoring ) + + self.Scoring = Scoring +end + +--- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. +-- @module CleanUp +-- @author Flightcontrol + + + + + + + +--- The CLEANUP class. +-- @type CLEANUP +-- @extends Base#BASE +CLEANUP = { + ClassName = "CLEANUP", + ZoneNames = {}, + TimeInterval = 300, + CleanUpList = {}, +} + +--- Creates the main object which is handling the cleaning of the debris within the given Zone Names. +-- @param #CLEANUP self +-- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. +-- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. +-- @return #CLEANUP +-- @usage +-- -- Clean these Zones. +-- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) +-- or +-- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) +-- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) +function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { ZoneNames, TimeInterval } ) + + if type( ZoneNames ) == 'table' then + self.ZoneNames = ZoneNames + else + self.ZoneNames = { ZoneNames } + end + if TimeInterval then + self.TimeInterval = TimeInterval + end + + _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) + + --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) + + return self +end + + +--- Destroys a group from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSGroup#Group GroupObject The object to be destroyed. +-- @param #string CleanUpGroupName The groupname... +function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) + self:F( { GroupObject, CleanUpGroupName } ) + + if GroupObject then -- and GroupObject:isExist() then + trigger.action.deactivateGroup(GroupObject) + self:T( { "GroupObject Destroyed", GroupObject } ) + end +end + +--- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. +-- @param #string CleanUpUnitName The Unit name ... +function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + if CleanUpUnit then + local CleanUpGroup = Unit.getGroup(CleanUpUnit) + -- TODO Client bug in 1.5.3 + if CleanUpGroup and CleanUpGroup:isExist() then + local CleanUpGroupUnits = CleanUpGroup:getUnits() + if #CleanUpGroupUnits == 1 then + local CleanUpGroupName = CleanUpGroup:getName() + --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) + CleanUpGroup:destroy() + self:T( { "Destroyed Group:", CleanUpGroupName } ) + else + CleanUpUnit:destroy() + self:T( { "Destroyed Unit:", CleanUpUnitName } ) + end + self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list + CleanUpUnit = nil + end + end +end + +-- TODO check DCSTypes#Weapon +--- Destroys a missile from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSTypes#Weapon MissileObject +function CLEANUP:_DestroyMissile( MissileObject ) + self:F( { MissileObject } ) + + if MissileObject and MissileObject:isExist() then + MissileObject:destroy() + self:T( "MissileObject Destroyed") + end +end + +function CLEANUP:_OnEventBirth( Event ) + self:F( { Event } ) + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + + _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) + + --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) + --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) +-- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) +-- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) +-- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) +-- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) +-- +-- self:EnableEvents() + + +end + +--- Detects if a crash event occurs. +-- Crashed units go into a CleanUpList for removal. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventCrash( Event ) + self:F( { Event } ) + + --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. + -- self:T("before getGroup") + -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired + -- self:T("after getGroup") + -- _grp:destroy() + -- self:T("after deactivateGroup") + -- event.initiator:destroy() + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + +end + +--- Detects if a unit shoots a missile. +-- If this occurs within one of the zones, then the weapon used must be destroyed. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventShot( Event ) + self:F( { Event } ) + + -- Test if the missile was fired within one of the CLEANUP.ZoneNames. + local CurrentLandingZoneID = 0 + CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) + if ( CurrentLandingZoneID ) then + -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. + --_SEADmissile:destroy() + --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) + end +end + + +--- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventHitCleanUp( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) + if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) + end + end + end + + if Event.TgtDCSUnit then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) + if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) + end + end + end +end + +--- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. +function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + self.CleanUpList[CleanUpUnitName] = {} + self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit + self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName + self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) + self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() + self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() + self.CleanUpList[CleanUpUnitName].CleanUpMoved = false + + self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) + +end + +--- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventAddForCleanUp( Event ) + + if Event.IniDCSUnit then + if self.CleanUpList[Event.IniDCSUnitName] == nil then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) + end + end + end + + if Event.TgtDCSUnit then + if self.CleanUpList[Event.TgtDCSUnitName] == nil then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) + end + end + end + +end + +local CleanUpSurfaceTypeText = { + "LAND", + "SHALLOW_WATER", + "WATER", + "ROAD", + "RUNWAY" + } + +--- At the defined time interval, CleanUp the Groups within the CleanUpList. +-- @param #CLEANUP self +function CLEANUP:_CleanUpScheduler() + self:F( { "CleanUp Scheduler" } ) + + local CleanUpCount = 0 + for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do + CleanUpCount = CleanUpCount + 1 + + self:T( { CleanUpUnitName, UnitData } ) + local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) + local CleanUpGroupName = UnitData.CleanUpGroupName + local CleanUpUnitName = UnitData.CleanUpUnitName + if CleanUpUnit then + self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) + if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then + local CleanUpUnitVec3 = CleanUpUnit:getPoint() + --self:T( CleanUpUnitVec3 ) + local CleanUpUnitVec2 = {} + CleanUpUnitVec2.x = CleanUpUnitVec3.x + CleanUpUnitVec2.y = CleanUpUnitVec3.z + --self:T( CleanUpUnitVec2 ) + local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) + --self:T( CleanUpSurfaceType ) + + if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then + if CleanUpSurfaceType == land.SurfaceType.RUNWAY then + if CleanUpUnit:inAir() then + local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) + local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight + self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) + if CleanUpUnitHeight < 30 then + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + else + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + end + -- Clean Units which are waiting for a very long time in the CleanUpZone. + if CleanUpUnit then + local CleanUpUnitVelocity = CleanUpUnit:getVelocity() + local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) + if CleanUpUnitVelocityTotal < 1 then + if UnitData.CleanUpMoved then + if UnitData.CleanUpTime + 180 <= timer.getTime() then + self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + else + UnitData.CleanUpTime = timer.getTime() + UnitData.CleanUpMoved = true + end + end + + else + -- Do nothing ... + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + else + self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + end + self:T(CleanUpCount) + + return true +end + +--- This module contains the SPAWN class. +-- +-- 1) @{Spawn#SPAWN} class, extends @{Base#BASE} +-- ============================================= +-- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. +-- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. +-- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. +-- +-- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. +-- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. +-- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. +-- +-- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. +-- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. +-- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. +-- Groups will follow the following naming structure when spawned at run-time: +-- +-- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. +-- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. +-- +-- Some additional notes that need to be remembered: +-- +-- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. +-- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. +-- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. +-- +-- 1.1) SPAWN construction methods +-- ------------------------------- +-- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: +-- +-- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. +-- +-- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. +-- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. +-- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. +-- +-- 1.2) SPAWN initialization methods +-- --------------------------------- +-- A spawn object will behave differently based on the usage of initialization methods: +-- +-- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. +-- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. +-- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. +-- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. +-- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. +-- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. +-- +-- 1.3) SPAWN spawning methods +-- --------------------------- +-- Groups can be spawned at different times and methods: +-- +-- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. +-- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. +-- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. +-- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. +-- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. +-- +-- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. +-- You can use the @{GROUP} object to do further actions with the DCSGroup. +-- +-- 1.4) SPAWN object cleaning +-- -------------------------- +-- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. +-- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, +-- and it may occur that no new groups are or can be spawned as limits are reached. +-- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. +-- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. +-- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... +-- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. +-- This models AI that has succesfully returned to their airbase, to restart their combat activities. +-- Check the @{#SPAWN.CleanUp} for further info. +-- +-- +-- @module Spawn +-- @author FlightControl + +--- SPAWN Class +-- @type SPAWN +-- @extends Base#BASE +-- @field ClassName +-- @field #string SpawnTemplatePrefix +-- @field #string SpawnAliasPrefix +SPAWN = { + ClassName = "SPAWN", + SpawnTemplatePrefix = nil, + SpawnAliasPrefix = nil, +} + + + +--- Creates the main object to spawn a GROUP defined in the DCS ME. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) +-- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. +function SPAWN:New( SpawnTemplatePrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + +--- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. +-- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) +-- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. +function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnAliasPrefix = SpawnAliasPrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + + +--- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. +-- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. +-- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... +-- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. +-- @param #SPAWN self +-- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. +-- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. +-- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. +-- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. +-- -- There will be maximum 24 groups spawned during the whole mission lifetime. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) +function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) + self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) + + self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_InitializeSpawnGroups( SpawnGroupID ) + end + + return self +end + + +--- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. +-- @param #SPAWN self +-- @param #number SpawnStartPoint is the waypoint where the randomization begins. +-- Note that the StartPoint = 0 equaling the point where the group is spawned. +-- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. +-- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. +-- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). +-- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. +-- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) +function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) + self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) + + self.SpawnRandomizeRoute = true + self.SpawnRandomizeRouteStartPoint = SpawnStartPoint + self.SpawnRandomizeRouteEndPoint = SpawnEndPoint + self.SpawnRandomizeRouteRadius = SpawnRadius + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + + +--- This function is rather complicated to understand. But I'll try to explain. +-- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, +-- but they will all follow the same Template route and have the same prefix name. +-- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. +-- @return #SPAWN +-- @usage +-- -- NATO Tank Platoons invading Gori. +-- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the +-- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. +-- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and +-- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. +-- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', +-- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', +-- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } +-- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) + self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) + + self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable + self.SpawnRandomizeTemplate = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_RandomizeTemplate( SpawnGroupID ) + end + + return self +end + + + + + +--- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. +-- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. +-- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... +-- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. +-- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... +-- @param #SPAWN self +-- @return #SPAWN self +-- @usage +-- -- RU Su-34 - AI Ship Attack +-- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. +-- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() +function SPAWN:InitRepeat() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + self.Repeat = true + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + +--- Respawn group after landing. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnLanding() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + + +--- Respawn after landing when its engines have shut down. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnEngineShutDown() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = true + self.RepeatOnLanding = false + + return self +end + + +--- CleanUp groups when they are still alive, but inactive. +-- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. +-- @param #SPAWN self +-- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. +-- @return #SPAWN self +-- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. +function SPAWN:CleanUp( SpawnCleanUpInterval ) + self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) + + self.SpawnCleanUpInterval = SpawnCleanUpInterval + self.SpawnCleanUpTimeStamps = {} + --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) + return self +end + + + +--- Makes the groups visible before start (like a batallion). +-- The method will take the position of the group as the first position in the array. +-- @param #SPAWN self +-- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. +-- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. +-- @param #number SpawnDeltaX The space between each Group on the X-axis. +-- @param #number SpawnDeltaY The space between each Group on the Y-axis. +-- @return #SPAWN self +-- @usage +-- -- Define an array of Groups. +-- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) +function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) + self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) + + self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. + + local SpawnX = 0 + local SpawnY = 0 + local SpawnXIndex = 0 + local SpawnYIndex = 0 + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) + + self.SpawnGroups[SpawnGroupID].Visible = true + self.SpawnGroups[SpawnGroupID].Spawned = false + + SpawnXIndex = SpawnXIndex + 1 + if SpawnWidth and SpawnWidth ~= 0 then + if SpawnXIndex >= SpawnWidth then + SpawnXIndex = 0 + SpawnYIndex = SpawnYIndex + 1 + end + end + + local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x + local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y + + self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + + self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true + self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true + + self.SpawnGroups[SpawnGroupID].Visible = true + + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) + + SpawnX = SpawnXIndex * SpawnDeltaX + SpawnY = SpawnYIndex * SpawnDeltaY + end + + return self +end + + + +--- Will spawn a group based on the internal index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:Spawn() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + return self:SpawnWithIndex( self.SpawnIndex + 1 ) +end + +--- Will re-spawn a group based on a given index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnIndex The index of the group to be spawned. +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:ReSpawn( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + +-- TODO: This logic makes DCS crash and i don't know why (yet). + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup then + local SpawnDCSGroup = SpawnGroup:GetDCSGroup() + if SpawnDCSGroup then + SpawnGroup:Destroy() + end + end + + return self:SpawnWithIndex( SpawnIndex ) +end + +--- Will spawn a group with a specified index number. +-- Uses @{DATABASE} global object defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:SpawnWithIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) + + if self:_GetSpawnIndex( SpawnIndex ) then + + if self.SpawnGroups[self.SpawnIndex].Visible then + self.SpawnGroups[self.SpawnIndex].Group:Activate() + else + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + -- If there is a SpawnFunction hook defined, call it. + if self.SpawnFunctionHook then + self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) + end + -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. + --if self.Repeat then + -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) + --end + end + + self.SpawnGroups[self.SpawnIndex].Spawned = true + return self.SpawnGroups[self.SpawnIndex].Group + else + --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) + end + + return nil +end + +--- Spawns new groups at varying time intervals. +-- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. +-- @param #SPAWN self +-- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. +-- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. +-- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. +-- -- The time variation in this case will be between 450 seconds and 750 seconds. +-- -- This is calculated as follows: +-- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 +-- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 +-- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) +function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) + self:F( { SpawnTime, SpawnTimeVariation } ) + + if SpawnTime ~= nil and SpawnTimeVariation ~= nil then + self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) + end + + return self +end + +--- Will re-start the spawning scheduler. +-- Note: This function is only required to be called when the schedule was stopped. +function SPAWN:SpawnScheduleStart() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Start() +end + +--- Will stop the scheduled spawning scheduler. +function SPAWN:SpawnScheduleStop() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Stop() +end + + +--- Allows to place a CallFunction hook when a new group spawns. +-- The provided function will be called when a new group is spawned, including its given parameters. +-- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. +-- @param #SPAWN self +-- @param #function SpawnFunctionHook The function to be called when a group spawns. +-- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. +-- @return #SPAWN +function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) + self:F( SpawnFunction ) + + self.SpawnFunctionHook = SpawnFunctionHook + self.SpawnFunctionArguments = {} + if arg then + self.SpawnFunctionArguments = arg + end + + return self +end + + + + +--- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. +-- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. +-- You can use the returned group to further define the route to be followed. +-- @param #SPAWN self +-- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. +-- @param #number OuterRadius The outer radius in meters where the new group will be spawned. +-- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) + + if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local UnitPoint = HostUnit:GetPointVec2() + + self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) + + --for PointID, Point in pairs( SpawnTemplate.route.points ) do + --Point.x = UnitPoint.x + --Point.y = UnitPoint.y + --Point.alt = nil + --Point.alt_type = nil + --end + + SpawnTemplate.route.points[1].x = UnitPoint.x + SpawnTemplate.route.points[1].y = UnitPoint.y + + if not InnerRadius then + InnerRadius = 10 + end + + if not OuterRadius then + OuterRadius = 50 + end + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + if InnerRadius == 0 then + SpawnTemplate.units[UnitID].x = UnitPoint.x + SpawnTemplate.units[UnitID].y = UnitPoint.y + else + local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + SpawnTemplate.units[UnitID].x = CirclePos.x + SpawnTemplate.units[UnitID].y = CirclePos.y + end + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + local Point = {} + Point.type = "Turning Point" + Point.x = SpawnPos.x + Point.y = SpawnPos.y + Point.action = "Cone" + Point.speed = 5 + + table.insert( SpawnTemplate.route.points, 2, Point ) + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + +--- Will spawn a Group within a given @{Zone#ZONE}. +-- Once the group is spawned within the zone, it will continue on its route. +-- The first waypoint (where the group is spawned) is replaced with the zone coordinates. +-- @param #SPAWN self +-- @param Zone#ZONE Zone The zone where the group is to be spawned. +-- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil when nothing was spawned. +function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) + + if Zone then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local ZonePoint + + if ZoneRandomize == true then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + SpawnTemplate.route.points[1].x = ZonePoint.x + SpawnTemplate.route.points[1].y = ZonePoint.y + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + local ZonePointUnit = Zone:GetRandomPointVec2() + SpawnTemplate.units[UnitID].x = ZonePointUnit.x + SpawnTemplate.units[UnitID].y = ZonePointUnit.y + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + + + + +--- Will spawn a plane group in uncontrolled mode... +-- This will be similar to the uncontrolled flag setting in the ME. +-- @return #SPAWN self +function SPAWN:UnControlled() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnUnControlled = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self.SpawnGroups[SpawnGroupID].UnControlled = true + end + + return self +end + + + +--- Will return the SpawnGroupName either with with a specific count number or without any count. +-- @param #SPAWN self +-- @param #number SpawnIndex Is the number of the Group that is to be spawned. +-- @return #string SpawnGroupName +function SPAWN:SpawnGroupName( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + local SpawnPrefix = self.SpawnTemplatePrefix + if self.SpawnAliasPrefix then + SpawnPrefix = self.SpawnAliasPrefix + end + + if SpawnIndex then + local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) + self:T( SpawnName ) + return SpawnName + else + self:T( SpawnPrefix ) + return SpawnPrefix + end + +end + +--- Find the first alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the index from where to find the first group from. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetFirstAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + for SpawnIndex = 1, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + + +--- Find the next alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the last found previous index. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetNextAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + SpawnCursor = SpawnCursor + 1 + for SpawnIndex = SpawnCursor, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + +--- Find the last alive group during runtime. +function SPAWN:GetLastAliveGroup() + self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) + + self.SpawnIndex = self:_GetLastIndex() + for SpawnIndex = self.SpawnIndex, 1, -1 do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + self.SpawnIndex = SpawnIndex + return SpawnGroup + end + end + + self.SpawnIndex = nil + return nil +end + + + +--- Get the group from an index. +-- Returns the group from the SpawnGroups list. +-- If no index is given, it will return the first group in the list. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to return. +-- @return Group#GROUP self +function SPAWN:GetGroupFromIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + + if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then + local SpawnGroup = self.SpawnGroups[SpawnIndex].Group + return SpawnGroup + else + return nil + end +end + +--- Get the group index from a DCSUnit. +-- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) + self:T( IndexString ) + + if IndexString then + local Index = tonumber( IndexString ) + self:T( { "Index:", IndexString, Index } ) + return Index + end + end + + return nil +end + +--- Return the prefix of a DCSUnit. +-- The method will search for a #-mark, and will return the text before the #-mark. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) + if SpawnPrefix then + SpawnPrefix = SpawnPrefix:sub( 1, -2 ) + end + self:T( SpawnPrefix ) + return SpawnPrefix + end + + return nil +end + +--- Return the group within the SpawnGroups collection with input a DCSUnit. +function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit then + local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) + + if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then + local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) + local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group + self:T( SpawnGroup ) + return SpawnGroup + end + end + + return nil +end + + +--- Get the index from a given group. +-- The function will search the name of the group for a #, and will return the number behind the #-mark. +function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) + + local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) + local Index = tonumber( IndexString ) + + self:T( IndexString, Index ) + return Index + +end + +--- Return the last maximum index that can be used. +function SPAWN:_GetLastIndex() + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + return self.SpawnMaxGroups +end + +--- Initalize the SpawnGroups collection. +function SPAWN:_InitializeSpawnGroups( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not self.SpawnGroups[SpawnIndex] then + self.SpawnGroups[SpawnIndex] = {} + self.SpawnGroups[SpawnIndex].Visible = false + self.SpawnGroups[SpawnIndex].Spawned = false + self.SpawnGroups[SpawnIndex].UnControlled = false + self.SpawnGroups[SpawnIndex].SpawnTime = 0 + + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + end + + self:_RandomizeTemplate( SpawnIndex ) + self:_RandomizeRoute( SpawnIndex ) + --self:_TranslateRotate( SpawnIndex ) + + return self.SpawnGroups[SpawnIndex] +end + + + +--- Gets the CategoryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCategoryID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCategory() + else + return nil + end +end + +--- Gets the CoalitionID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCoalition() + else + return nil + end +end + +--- Gets the CountryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCountryID( SpawnPrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) + + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + local TemplateUnits = TemplateGroup:getUnits() + return TemplateUnits[1]:getCountry() + else + return nil + end +end + +--- Gets the Group Template from the ME environment definition. +-- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @return @SPAWN self +function SPAWN:_GetTemplate( SpawnTemplatePrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) + + local SpawnTemplate = nil + + SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) + + if SpawnTemplate == nil then + error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) + end + + SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) + + self:T( { SpawnTemplate } ) + return SpawnTemplate +end + +--- Prepares the new Group Template. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) + SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) + + SpawnTemplate.groupId = nil + --SpawnTemplate.lateActivation = false + SpawnTemplate.lateActivation = false -- TODO BUGFIX + + if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then + self:T( "For ground units, visible needs to be false..." ) + SpawnTemplate.visible = false -- TODO BUGFIX + end + + if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then + SpawnTemplate.uncontrolled = false + end + + for UnitID = 1, #SpawnTemplate.units do + SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) + SpawnTemplate.units[UnitID].unitId = nil + SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x + SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y + end + + self:T( { "Template:", SpawnTemplate } ) + return SpawnTemplate + +end + +--- Private method randomizing the routes. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to be spawned. +-- @return #SPAWN +function SPAWN:_RandomizeRoute( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) + + if self.SpawnRandomizeRoute then + local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate + local RouteCount = #SpawnTemplate.route.points + + for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do + SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + -- TODO: manage altitude for airborne units ... + SpawnTemplate.route.points[t].alt = nil + --SpawnGroup.route.points[t].alt_type = nil + self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) + end + end + + return self +end + +--- Private method that randomizes the template of the group. +-- @param #SPAWN self +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_RandomizeTemplate( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeTemplate } ) + + if self.SpawnRandomizeTemplate then + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y + self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time + for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading + end + end + + self:_RandomizeRoute( SpawnIndex ) + + return self +end + +function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY + + -- Rotate + -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations + -- x' = x \cos \theta - y \sin \theta\ + -- y' = x \sin \theta + y \cos \theta\ + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY + + + local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) + for u = 1, SpawnUnitCount do + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY - 10 * ( u - 1 ) + + -- Rotate + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) + end + + return self +end + +--- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. +function SPAWN:_GetSpawnIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) + + + if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then + if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then + if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then + self.SpawnCount = self.SpawnCount + 1 + SpawnIndex = self.SpawnCount + end + self.SpawnIndex = SpawnIndex + if not self.SpawnGroups[self.SpawnIndex] then + self:_InitializeSpawnGroups( self.SpawnIndex ) + end + else + return nil + end + else + return nil + end + + return self.SpawnIndex +end + + +-- TODO Need to delete this... _DATABASE does this now ... +function SPAWN:_OnBirth( event ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Birth event: " .. event.initiator:getName(), event } ) + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits + 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end + end + +end + +--- Obscolete +-- @todo Need to delete this... _DATABASE does this now ... +function SPAWN:_OnDeadOrCrash( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Dead event: " .. event.initiator:getName(), event } ) +-- local DestroyedUnit = Unit.getByName( EventPrefix ) +-- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits - 1 + self:T( "Alive Units: " .. self.AliveUnits ) +-- end + end + end +end + +--- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... +-- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnTakeOff( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) + if SpawnGroup then + self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) + self:T( "self.Landed = false" ) + self.Landed = false + end + end +end + +--- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. +-- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnLand( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) + self.Landed = true + self:T( "self.Landed = true" ) + if self.Landed and self.RepeatOnLanding then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- Will detect AIR Units shutting down their engines ... +-- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. +-- But only when the Unit was registered to have landed. +-- @param #SPAWN self +-- @see _OnTakeOff +-- @see _OnLand +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnEngineShutDown( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) + if self.Landed and self.RepeatOnEngineShutDown then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- This function is called automatically by the Spawning scheduler. +-- It is the internal worker method SPAWNing new Groups on the defined time intervals. +function SPAWN:_Scheduler() + self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) + + -- Validate if there are still groups left in the batch... + self:Spawn() + + return true +end + +function SPAWN:_SpawnCleanUpScheduler() + self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) + + local SpawnCursor + local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + while SpawnGroup do + + if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then + if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() + else + if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then + self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) + SpawnGroup:Destroy() + end + end + else + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil + end + + SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + end + + return true -- Repeat + +end +--- Limit the simultaneous movement of Groups within a running Mission. +-- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. +-- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if +-- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units +-- on defined intervals (currently every minute). +-- @module MOVEMENT + +--- the MOVEMENT class +-- @type +MOVEMENT = { + ClassName = "MOVEMENT", +} + +--- Creates the main object which is handling the GROUND forces movement. +-- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. +-- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. +-- @return MOVEMENT +-- @usage +-- -- Limit the amount of simultaneous moving units on the ground to prevent lag. +-- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) + +function MOVEMENT:New( MovePrefixes, MoveMaximum ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MovePrefixes, MoveMaximum } ) + + if type( MovePrefixes ) == 'table' then + self.MovePrefixes = MovePrefixes + else + self.MovePrefixes = { MovePrefixes } + end + self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. + self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. + + _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) + +-- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) +-- +-- self:EnableEvents() + + self:ScheduleStart() + + return self +end + +--- Call this function to start the MOVEMENT scheduling. +function MOVEMENT:ScheduleStart() + self:F() + --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) + self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) +end + +--- Call this function to stop the MOVEMENT scheduling. +-- @todo need to implement it ... Forgot. +function MOVEMENT:ScheduleStop() + self:F() + +end + +--- Captures the birth events when new Units were spawned. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnBirth( Event ) + self:F( { Event } ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if Event.IniDCSUnit then + self:T( "Birth object : " .. Event.IniDCSUnitName ) + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits + 1 + self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName + self:T( self.AliveUnits ) + end + end + end + end + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + end + +end + +--- Captures the Dead or Crash events when Units crash or are destroyed. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnDeadOrCrash( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + self:T( "Dead object : " .. Event.IniDCSUnitName ) + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits - 1 + self.MoveUnits[Event.IniDCSUnitName] = nil + self:T( self.AliveUnits ) + end + end + end +end + +--- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. +function MOVEMENT:_Scheduler() + self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) + + if self.AliveUnits > 0 then + local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits + self:T( 'Move Probability = ' .. MoveProbability ) + + for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do + local MovementGroup = Group.getByName( MovementGroupName ) + if MovementGroup and MovementGroup:isExist() then + local MoveOrStop = math.random( 1, 100 ) + self:T( 'MoveOrStop = ' .. MoveOrStop ) + if MoveOrStop <= MoveProbability then + self:T( 'Group continues moving = ' .. MovementGroupName ) + trigger.action.groupContinueMoving( MovementGroup ) + else + self:T( 'Group stops moving = ' .. MovementGroupName ) + trigger.action.groupStopMoving( MovementGroup ) + end + else + self.MoveUnits[MovementUnitName] = nil + end + end + end + return true +end +--- Provides defensive behaviour to a set of SAM sites within a running Mission. +-- @module Sead +-- @author to be searched on the forum +-- @author (co) Flightcontrol (Modified and enriched with functionality) + +--- The SEAD class +-- @type SEAD +-- @extends Base#BASE +SEAD = { + ClassName = "SEAD", + TargetSkill = { + Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , + Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , + High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , + Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } + }, + SEADGroupPrefixes = {} +} + +--- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. +-- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... +-- Chances are big that the missile will miss. +-- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. +-- @return SEAD +-- @usage +-- -- CCCP SEAD Defenses +-- -- Defends the Russian SA installations from SEAD attacks. +-- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) +function SEAD:New( SEADGroupPrefixes ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( SEADGroupPrefixes ) + if type( SEADGroupPrefixes ) == 'table' then + for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do + self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix + end + else + self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes + end + _EVENTDISPATCHER:OnShot( self.EventShot, self ) + + return self +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @see SEAD +function SEAD:EventShot( Event ) + self:F( { Event } ) + + local SEADUnit = Event.IniDCSUnit + local SEADUnitName = Event.IniDCSUnitName + local SEADWeapon = Event.Weapon -- Identify the weapon fired + local SEADWeaponName = Event.WeaponName -- return weapon type + --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message + -- Start of the 2nd loop + self:T( "Missile Launched = " .. SEADWeaponName ) + if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD + local _evade = math.random (1,100) -- random number for chance of evading action + local _targetMim = Event.Weapon:getTarget() -- Identify target + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimgroupName = _targetMimgroup:getName() + local _targetMimcont= _targetMimgroup:getController() + local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill + self:T( self.SEADGroupPrefixes ) + self:T( _targetMimgroupName ) + local SEADGroupFound = false + for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do + if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then + SEADGroupFound = true + self:T( 'Group Found' ) + break + end + end + if SEADGroupFound == true then + if _targetskill == "Random" then -- when skill is random, choose a skill + local Skills = { "Average", "Good", "High", "Excellent" } + _targetskill = Skills[ math.random(1,4) ] + end + self:T( _targetskill ) -- debug message for skill check + if self.TargetSkill[_targetskill] then + if (_evade > self.TargetSkill[_targetskill].Evade) then + self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message + local _targetMim = Weapon.getTarget(SEADWeapon) + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimcont= _targetMimgroup:getController() + routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly + local SuppressedGroups1 = {} -- unit suppressed radar off for a random time + local function SuppressionEnd1(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + SuppressedGroups1[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) + if SuppressedGroups1[id.groupName] == nil then + SuppressedGroups1[id.groupName] = { + SuppressionEndTime1 = timer.getTime() + delay1, + SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function + } + Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) + end + + local SuppressedGroups = {} + local function SuppressionEnd(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) + SuppressedGroups[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) + if SuppressedGroups[id.groupName] == nil then + SuppressedGroups[id.groupName] = { + SuppressionEndTime = timer.getTime() + delay, + SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function + } + timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) + end + end + end + end + end +end +--- Taking the lead of AI escorting your flight. +-- +-- @{#ESCORT} class +-- ================ +-- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. +-- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). +-- +-- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. +-- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. +-- +-- RADIO MENUs that can be created: +-- ================================ +-- Find a summary below of the current available commands: +-- +-- Navigation ...: +-- --------------- +-- Escort group navigation functions: +-- +-- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. +-- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. +-- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. +-- +-- Hold position ...: +-- ------------------ +-- Escort group navigation functions: +-- +-- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- +-- Report targets ...: +-- ------------------- +-- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). +-- +-- * **"Report now":** Will report the current detected targets. +-- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. +-- * **"Report targets off":** Will stop detecting targets. +-- +-- Scan targets ...: +-- ----------------- +-- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. +-- +-- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. +-- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. +-- +-- Attack targets ...: +-- ------------------- +-- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. +-- +-- Request assistance from ...: +-- ---------------------------- +-- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. +-- This menu item allows to request attack support from other escorts supporting the current client group. +-- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. +-- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. +-- +-- ROE ...: +-- -------- +-- Sets the Rules of Engagement (ROE) of the escort group when in flight. +-- +-- * **"Hold Fire":** The escort group will hold fire. +-- * **"Return Fire":** The escort group will return fire. +-- * **"Open Fire":** The escort group will open fire on designated targets. +-- * **"Weapon Free":** The escort group will engage with any target. +-- +-- Evasion ...: +-- ------------ +-- Will define the evasion techniques that the escort group will perform during flight or combat. +-- +-- * **"Fight until death":** The escort group will have no reaction to threats. +-- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. +-- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. +-- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. +-- +-- Resume Mission ...: +-- ------------------- +-- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. +-- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. +-- +-- ESCORT construction methods. +-- ============================ +-- Create a new SPAWN object with the @{#ESCORT.New} method: +-- +-- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. +-- +-- ESCORT initialization methods. +-- ============================== +-- The following menus are created within the RADIO MENU of an active unit hosted by a player: +-- +-- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. +-- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. +-- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. +-- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. +-- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. +-- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. +-- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. +-- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. +-- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. +-- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. +-- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. +-- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. +-- +-- @module Escort +-- @author FlightControl + + + + + + + +--- +-- @type ESCORT +-- @extends Base#BASE +-- @field Client#CLIENT EscortClient +-- @field Group#GROUP EscortGroup +-- @field #string EscortName +-- @field #ESCORT.MODE EscortMode The mode the escort is in. +-- @field #number FollowScheduler The id of the _FollowScheduler function. +-- @field #boolean ReportTargets If true, nearby targets are reported. +-- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. +-- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. +-- @field Menu#MENU_CLIENT EscortMenuResumeMission +ESCORT = { + ClassName = "ESCORT", + EscortName = nil, -- The Escort Name + EscortClient = nil, + EscortGroup = nil, + EscortMode = nil, + MODE = { + FOLLOW = 1, + MISSION = 2, + }, + Targets = {}, -- The identified targets + FollowScheduler = nil, + ReportTargets = true, + OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, + OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, + TaskPoints = {} +} + +--- ESCORT.Mode class +-- @type ESCORT.MODE +-- @field #number FOLLOW +-- @field #number MISSION + +--- MENUPARAM type +-- @type MENUPARAM +-- @field #ESCORT ParamSelf +-- @field #Distance ParamDistance +-- @field #function ParamFunction +-- @field #string ParamMessage + +--- ESCORT class constructor for an AI group +-- @param #ESCORT self +-- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. +-- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. +-- @param #string EscortName Name of the escort. +-- @return #ESCORT self +function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { EscortClient, EscortGroup, EscortName } ) + + self.EscortClient = EscortClient -- Client#CLIENT + self.EscortGroup = EscortGroup -- Group#GROUP + self.EscortName = EscortName + self.EscortBriefing = EscortBriefing + + self:T( EscortGroup:GetClassNameAndID() ) + + -- Set EscortGroup known at EscortClient. + if not self.EscortClient._EscortGroups then + self.EscortClient._EscortGroups = {} + end + + if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then + self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName + self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} + self.EscortMode = ESCORT.MODE.FOLLOW + end + + + self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) + + self.EscortGroup:WayPointInitialize(1) + + self.EscortGroup:OptionROTVertical() + self.EscortGroup:OptionROEOpenFire() + + EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. + "We're escorting your flight. " .. + "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", + 60, EscortClient + ) + + return self +end + + +--- Defines the default menus +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:Menus() + self:F() + + self:MenuFollowAt( 100 ) + self:MenuFollowAt( 200 ) + self:MenuFollowAt( 300 ) + self:MenuFollowAt( 400 ) + + self:MenuScanForTargets( 100, 60 ) + + self:MenuHoldAtEscortPosition( 30 ) + self:MenuHoldAtLeaderPosition( 30 ) + + self:MenuFlare() + self:MenuSmoke() + + self:MenuReportTargets( 60 ) + self:MenuAssistedAttack() + self:MenuROE() + self:MenuEvasion() + self:MenuResumeMission() + + return self +end + + + +--- Defines a menu slot to let the escort Join and Follow you at a certain distance. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. +-- @return #ESCORT +function ESCORT:MenuFollowAt( Distance ) + self:F(Distance) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + if not self.EscortMenuJoinUpAndFollow then + self.EscortMenuJoinUpAndFollow = {} + end + + self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) + + self.EscortMode = ESCORT.MODE.FOLLOW + end + + return self +end + +--- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Hold position**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Hold at %d meter", Height ) + else + MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldPosition then + self.EscortMenuHoldPosition = {} + end + + self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortGroup, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + + +--- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Rejoin and hold at %d meter", Height ) + else + MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldAtLeaderPosition then + self.EscortMenuHoldAtLeaderPosition = {} + end + + self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortClient, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + +--- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. +-- This menu will appear under **Scan targets**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuScan then + self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) + end + + if not Height then + Height = 100 + end + + if not Seconds then + Seconds = 30 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "At %d meter", Height ) + else + MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuScanForTargets then + self.EscortMenuScanForTargets = {} + end + + self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuScan, + ESCORT._ScanTargets, + { ParamSelf = self, + ParamScanDuration = 30 + } + ) + end + + return self +end + + + +--- Defines a menu slot to let the escort disperse a flare in a certain color. +-- This menu will appear under **Navigation**. +-- The flare will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuFlare( MenuTextFormat ) + self:F() + + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Flare" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuFlare then + self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) + self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) + self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) + self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) + self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) + end + + return self +end + +--- Defines a menu slot to let the escort disperse a smoke in a certain color. +-- This menu will appear under **Navigation**. +-- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. +-- The smoke will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuSmoke( MenuTextFormat ) + self:F() + + if not self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Smoke" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuSmoke then + self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) + self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) + self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) + self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) + self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) + self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) + end + end + + return self +end + +--- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. +-- This menu will appear under **Report targets**. +-- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. +-- @param #ESCORT self +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. +-- @return #ESCORT +function ESCORT:MenuReportTargets( Seconds ) + self:F( { Seconds } ) + + if not self.EscortMenuReportNearbyTargets then + self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) + end + + if not Seconds then + Seconds = 30 + end + + -- Report Targets + self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) + self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) + self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) + + -- Attack Targets + self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) + + + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) + + return self +end + +--- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. +-- This menu will appear under **Request assistance from**. +-- Note that this method needs to be preceded with the method MenuReportTargets. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuAssistedAttack() + self:F() + + -- Request assistance from other escorts. + -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... + self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) + + return self +end + +--- Defines a menu to let the escort set its rules of engagement. +-- All rules of engagement will appear under the menu **ROE**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuROE( MenuTextFormat ) + self:F( MenuTextFormat ) + + if not self.EscortMenuROE then + -- Rules of Engagement + self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) + if self.EscortGroup:OptionROEHoldFirePossible() then + self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) + end + if self.EscortGroup:OptionROEReturnFirePossible() then + self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) + end + if self.EscortGroup:OptionROEOpenFirePossible() then + self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) + end + if self.EscortGroup:OptionROEWeaponFreePossible() then + self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) + end + end + + return self +end + + +--- Defines a menu to let the escort set its evasion when under threat. +-- All rules of engagement will appear under the menu **Evasion**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuEvasion( MenuTextFormat ) + self:F( MenuTextFormat ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuEvasion then + -- Reaction to Threats + self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) + if self.EscortGroup:OptionROTNoReactionPossible() then + self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) + end + if self.EscortGroup:OptionROTPassiveDefensePossible() then + self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) + end + if self.EscortGroup:OptionROTEvadeFirePossible() then + self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) + end + if self.EscortGroup:OptionROTVerticalPossible() then + self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) + end + end + end + + return self +end + +--- Defines a menu to let the escort resume its mission from a waypoint on its route. +-- All rules of engagement will appear under the menu **Resume mission from**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuResumeMission() + self:F() + + if not self.EscortMenuResumeMission then + -- Mission Resume Menu Root + self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) + end + + return self +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._HoldPosition( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP + local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT + local OrbitHeight = MenuParam.ParamHeight + local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet + + routines.removeFunction( self.FollowScheduler ) + + local PointFrom = {} + local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() + PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.speed = 250 + PointFrom.type = AI.Task.WaypointType.TURNING_POINT + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = AI.Task.AltitudeType.BARO + + local OrbitPoint = OrbitUnit:GetPointVec2() + local PointTo = {} + PointTo.x = OrbitPoint.x + PointTo.y = OrbitPoint.y + PointTo.speed = 250 + PointTo.type = AI.Task.WaypointType.TURNING_POINT + PointTo.alt = OrbitHeight + PointTo.alt_type = AI.Task.AltitudeType.BARO + PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) + + local Points = { PointFrom, PointTo } + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) + EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._JoinUpAndFollow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.Distance = MenuParam.ParamDistance + + self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) +end + +--- JoinsUp and Follows a CLIENT. +-- @param Escort#ESCORT self +-- @param Group#GROUP EscortGroup +-- @param Client#CLIENT EscortClient +-- @param DCSTypes#Distance Distance +function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) + self:F( { EscortGroup, EscortClient, Distance } ) + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + self.EscortMode = ESCORT.MODE.FOLLOW + + self.CT1 = 0 + self.GT1 = 0 + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) + self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) + EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Flare( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Flare( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Smoke( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Smoke( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._ReportNearbyTargetsNow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self:_ReportTargetsScheduler() + +end + +function ESCORT._SwitchReportNearbyTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.ReportTargets = MenuParam.ParamReportTargets + + if self.ReportTargets then + if not self.ReportTargetsScheduler then + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) + end + else + routines.removeFunction( self.ReportTargetsScheduler ) + self.ReportTargetsScheduler = nil + end +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ScanTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local ScanDuration = MenuParam.ParamScanDuration + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) + + if EscortGroup:IsHelicopter() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 200, 20 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + elseif EscortGroup:IsAirPlane() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 1000, 500 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + end + + EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) + + if self.EscortMode == ESCORT.MODE.FOLLOW then + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) + self.FollowScheduler:Start() + end + +end + +function _Resume( EscortGroup ) + env.info( '_Resume' ) + + local Escort = EscortGroup.Escort -- #ESCORT + env.info( "EscortMode = " .. Escort.EscortMode ) + if Escort.EscortMode == ESCORT.MODE.FOLLOW then + Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) + end + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AttackTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( AttackUnit ) + + if EscortGroup:IsAir() then + EscortGroup:OptionROEOpenFire() + EscortGroup:OptionROTPassiveDefense() + EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskAttackUnit( AttackUnit ), +-- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskAttackUnit( AttackUnit ), + EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) + + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AssistTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local EscortGroupAttack = MenuParam.ParamEscortGroup + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + + self:T( AttackUnit ) + + if EscortGroupAttack:IsAir() then + EscortGroupAttack:OptionROEOpenFire() + EscortGroupAttack:OptionROTVertical() +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), +-- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskAttackUnit( AttackUnit ), + EscortGroupAttack:TaskOrbitCircle( 500, 350 ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROE( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROEFunction = MenuParam.ParamFunction + local EscortROEMessage = MenuParam.ParamMessage + + pcall( function() EscortROEFunction() end ) + EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROT( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROTFunction = MenuParam.ParamFunction + local EscortROTMessage = MenuParam.ParamMessage + + pcall( function() EscortROTFunction() end ) + EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ResumeMission( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local WayPoint = MenuParam.ParamWayPoint + + routines.removeFunction( self.FollowScheduler ) + self.FollowScheduler = nil + + local WayPoints = EscortGroup:GetTaskRoute() + self:T( WayPoint, WayPoints ) + + for WayPointIgnore = 1, WayPoint do + table.remove( WayPoints, 1 ) + end + + --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) + SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) + + EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) +end + +--- Registers the waypoints +-- @param #ESCORT self +-- @return #table +function ESCORT:RegisterRoute() + self:F() + + local EscortGroup = self.EscortGroup -- Group#GROUP + + local TaskPoints = EscortGroup:GetTaskRoute() + + self:T( TaskPoints ) + + return TaskPoints +end + +--- @param Escort#ESCORT self +function ESCORT:_FollowScheduler( FollowDistance ) + self:F( { FollowDistance }) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + + local ClientUnit = self.EscortClient:GetClientGroupUnit() + local GroupUnit = self.EscortGroup:GetUnit( 1 ) + + if self.CT1 == 0 and self.GT1 == 0 then + self.CV1 = ClientUnit:GetPointVec3() + self.CT1 = timer.getTime() + self.GV1 = GroupUnit:GetPointVec3() + self.GT1 = timer.getTime() + else + local CT1 = self.CT1 + local CT2 = timer.getTime() + local CV1 = self.CV1 + local CV2 = ClientUnit:GetPointVec3() + self.CT1 = CT2 + self.CV1 = CV2 + + local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 + local CT = CT2 - CT1 + + local CS = ( 3600 / CT ) * ( CD / 1000 ) + + self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) + + local GT1 = self.GT1 + local GT2 = timer.getTime() + local GV1 = self.GV1 + local GV2 = GroupUnit:GetPointVec3() + self.GT1 = GT2 + self.GV1 = GV2 + + local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 + local GT = GT2 - GT1 + + local GS = ( 3600 / GT ) * ( GD / 1000 ) + + self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) + + -- Calculate the group direction vector + local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } + + -- Calculate GH2, GH2 with the same height as CV2. + local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } + + -- Calculate the angle of GV to the orthonormal plane + local alpha = math.atan2( GV.z, GV.x ) + + -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. + -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) + local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), + y = GH2.y, + z = CV2.z + FollowDistance * math.sin(alpha), + } + + -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. + local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } + + -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. + -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. + -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... + local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } + + -- Now we can calculate the group destination vector GDV. + local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } + + --trigger.action.smoke( GDV, trigger.smokeColor.Red ) + self:T2( { "CV2:", CV2 } ) + self:T2( { "CVI:", CVI } ) + self:T2( { "GDV:", GDV } ) + + -- Measure distance between client and group + local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 + + -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome + -- the requested Distance). + local Time = 10 + local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time + + local Speed = CS + CatchUpSpeed + if Speed < 0 then + Speed = 0 + end + + self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) + + -- Now route the escort to the desired point with the desired speed. + self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) + end + return true + end + + return false +end + + +--- Report Targets Scheduler. +-- @param #ESCORT self +function ESCORT:_ReportTargetsScheduler() + self:F( self.EscortGroup:GetName() ) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + local EscortGroupName = self.EscortGroup:GetName() + local EscortTargets = self.EscortGroup:GetDetectedTargets() + + local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets + + local EscortTargetMessages = "" + for EscortTargetID, EscortTarget in pairs( EscortTargets ) do + local EscortObject = EscortTarget.object + self:T( EscortObject ) + if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then + + local EscortTargetUnit = UNIT:Find( EscortObject ) + local EscortTargetUnitName = EscortTargetUnit:GetName() + + + + -- local EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity + -- = self.EscortGroup:IsTargetDetected( EscortObject ) + -- + -- self:T( { EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity } ) + + + local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) + + if Distance <= 15 then + + if not ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = {} + end + ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit + ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible + ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type + ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance + else + if ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = nil + end + end + end + end + + self:T( { "Sorting Targets Table:", ClientEscortTargets } ) + table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) + self:T( { "Sorted Targets Table:", ClientEscortTargets } ) + + -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. + self.EscortMenuAttackNearbyTargets:RemoveSubMenus() + + if self.EscortMenuTargetAssistance then + self.EscortMenuTargetAssistance:RemoveSubMenus() + end + + --for MenuIndex = 1, #self.EscortMenuAttackTargets do + -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) + -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() + --end + + + if ClientEscortTargets then + for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do + + for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do + + if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then + + local EscortTargetMessage = "" + local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() + local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() + if ClientEscortTargetData.type then + EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " + else + EscortTargetMessage = EscortTargetMessage .. "Unknown target at " + end + + local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) + if ClientEscortTargetData.visible == false then + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" + else + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" + end + + if ClientEscortTargetData.visible then + EscortTargetMessage = EscortTargetMessage .. ", visual" + end + + if ClientEscortGroupName == EscortGroupName then + + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + self.EscortMenuAttackNearbyTargets, + ESCORT._AttackTarget, + { ParamSelf = self, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage + else + if self.EscortMenuTargetAssistance then + local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + MenuTargetAssistance, + ESCORT._AssistTarget, + { ParamSelf = self, + ParamEscortGroup = EscortGroupData.EscortGroup, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + end + end + else + ClientEscortTargetData = nil + end + end + end + + if EscortTargetMessages ~= "" and self.ReportTargets == true then + self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) + else + self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) + end + end + + if self.EscortMenuResumeMission then + self.EscortMenuResumeMission:RemoveSubMenus() + + -- if self.EscortMenuResumeWayPoints then + -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do + -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) + -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() + -- end + -- end + + local TaskPoints = self:RegisterRoute() + for WayPointID, WayPoint in pairs( TaskPoints ) do + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + + ( WayPoint.y - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) + end + end + return true + end + + return false +end +--- Provides missile training functions. +-- +-- @{#MISSILETRAINER} class +-- ======================== +-- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, +-- the class will destroy the missile within a certain range, to avoid damage to your aircraft. +-- It suports the following functionality: +-- +-- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. +-- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … +-- * Provide alerts when a missile would have killed your aircraft. +-- * Provide alerts when the missile self destructs. +-- * Enable / Disable and Configure the Missile Trainer using the various menu options. +-- +-- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: +-- +-- * **Messages**: Menu to configure all messages. +-- * **Messages On**: Show all messages. +-- * **Messages Off**: Disable all messages. +-- * **Tracking**: Menu to configure missile tracking messages. +-- * **To All**: Shows missile tracking messages to all players. +-- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. +-- * **Tracking On**: Show missile tracking messages. +-- * **Tracking Off**: Disable missile tracking messages. +-- * **Frequency Increase**: Increases the missile tracking message frequency with one second. +-- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. +-- * **Alerts**: Menu to configure alert messages. +-- * **To All**: Shows alert messages to all players. +-- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. +-- * **Hits On**: Show missile hit alert messages. +-- * **Hits Off**: Disable missile hit alert messages. +-- * **Launches On**: Show missile launch messages. +-- * **Launches Off**: Disable missile launch messages. +-- * **Details**: Menu to configure message details. +-- * **Range On**: Shows range information when a missile is fired to a target. +-- * **Range Off**: Disable range information when a missile is fired to a target. +-- * **Bearing On**: Shows bearing information when a missile is fired to a target. +-- * **Bearing Off**: Disable bearing information when a missile is fired to a target. +-- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. +-- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. +-- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. +-- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. +-- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. +-- +-- +-- MISSILETRAINER construction methods: +-- ==================================== +-- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: +-- +-- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. +-- +-- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. +-- +-- MISSILETRAINER initialization methods: +-- ====================================== +-- A MISSILETRAINER object will behave differently based on the usage of initialization methods: +-- +-- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. +-- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. +-- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. +-- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. +-- +-- @module MissileTrainer +-- @author FlightControl + + +--- The MISSILETRAINER class +-- @type MISSILETRAINER +-- @field Set#SET_CLIENT DBClients +-- @extends Base#BASE +MISSILETRAINER = { + ClassName = "MISSILETRAINER", + TrackingMissiles = {}, +} + +function MISSILETRAINER._Alive( Client, self ) + + if self.Briefing then + Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) + end + + if self.MenusOnOff == true then + Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) + + Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT + + Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) + Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) + Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) + + Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) + Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) + Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) + Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) + Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) + Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) + Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) + + Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) + Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) + Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) + Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) + Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) + Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) + Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) + + Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) + Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) + Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) + Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) + Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) + + Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) + Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) + Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) + Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) + Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) + else + if Client.MainMenu then + Client.MainMenu:Remove() + end + end + + local ClientID = Client:GetID() + self:T( ClientID ) + if not self.TrackingMissiles[ClientID] then + self.TrackingMissiles[ClientID] = {} + end + self.TrackingMissiles[ClientID].Client = Client + if not self.TrackingMissiles[ClientID].MissileData then + self.TrackingMissiles[ClientID].MissileData = {} + end +end + +--- Creates the main object which is handling missile tracking. +-- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. +-- @param #MISSILETRAINER self +-- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. +-- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. +-- @return #MISSILETRAINER +function MISSILETRAINER:New( Distance, Briefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( Distance ) + + if Briefing then + self.Briefing = Briefing + end + + self.Schedulers = {} + self.SchedulerID = 0 + + self.MessageInterval = 2 + self.MessageLastTime = timer.getTime() + + self.Distance = Distance / 1000 + + _EVENTDISPATCHER:OnShot( self._EventShot, self ) + + self.DBClients = SET_CLIENT:New():FilterStart() + + +-- for ClientID, Client in pairs( self.DBClients.Database ) do +-- self:E( "ForEach:" .. Client.UnitName ) +-- Client:Alive( self._Alive, self ) +-- end +-- + self.DBClients:ForEachClient( + function( Client ) + self:E( "ForEach:" .. Client.UnitName ) + Client:Alive( self._Alive, self ) + end + ) + + + +-- self.DB:ForEachClient( +-- --- @param Client#CLIENT Client +-- function( Client ) +-- +-- ... actions ... +-- +-- end +-- ) + + self.MessagesOnOff = true + + self.TrackingToAll = false + self.TrackingOnOff = true + self.TrackingFrequency = 3 + + self.AlertsToAll = true + self.AlertsHitsOnOff = true + self.AlertsLaunchesOnOff = true + + self.DetailsRangeOnOff = true + self.DetailsBearingOnOff = true + + self.MenusOnOff = true + + self.TrackingMissiles = {} + + self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) + + return self +end + +-- Initialization methods. + + + +--- Sets by default the display of any message to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean MessagesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) + self:F( MessagesOnOff ) + + self.MessagesOnOff = MessagesOnOff + if self.MessagesOnOff == true then + MESSAGE:New( "Messages ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Messages OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) + self:F( TrackingToAll ) + + self.TrackingToAll = TrackingToAll + if self.TrackingToAll == true then + MESSAGE:New( "Missile tracking to all players ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Missile tracking to all players OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of missile tracking report to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) + self:F( TrackingOnOff ) + + self.TrackingOnOff = TrackingOnOff + if self.TrackingOnOff == true then + MESSAGE:New( "Missile tracking ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Missile tracking OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. +-- @param #MISSILETRAINER self +-- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) + self:F( TrackingFrequency ) + + self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency + if self.TrackingFrequency < 0.5 then + self.TrackingFrequency = 0.5 + end + if self.TrackingFrequency then + MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of alerts to be shown to all players or only to you. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) + self:F( AlertsToAll ) + + self.AlertsToAll = AlertsToAll + if self.AlertsToAll == true then + MESSAGE:New( "Alerts to all players ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts to all players OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of hit alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsHitsOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) + self:F( AlertsHitsOnOff ) + + self.AlertsHitsOnOff = AlertsHitsOnOff + if self.AlertsHitsOnOff == true then + MESSAGE:New( "Alerts Hits ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts Hits OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of launch alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsLaunchesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) + self:F( AlertsLaunchesOnOff ) + + self.AlertsLaunchesOnOff = AlertsLaunchesOnOff + if self.AlertsLaunchesOnOff == true then + MESSAGE:New( "Alerts Launches ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Alerts Launches OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of range information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsRangeOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) + self:F( DetailsRangeOnOff ) + + self.DetailsRangeOnOff = DetailsRangeOnOff + if self.DetailsRangeOnOff == true then + MESSAGE:New( "Range display ON", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Range display OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Sets by default the display of bearing information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsBearingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) + self:F( DetailsBearingOnOff ) + + self.DetailsBearingOnOff = DetailsBearingOnOff + if self.DetailsBearingOnOff == true then + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() + end + + return self +end + +--- Enables / Disables the menus. +-- @param #MISSILETRAINER self +-- @param #boolean MenusOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) + self:F( MenusOnOff ) + + self.MenusOnOff = MenusOnOff + if self.MenusOnOff == true then + MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", 15, "Menu" ):ToAll() + else + MESSAGE:New( "Menus are DISABLED", 15, "Menu" ):ToAll() + end + + return self +end + + +-- Menu functions + +function MISSILETRAINER._MenuMessages( MenuParameters ) + + local self = MenuParameters.MenuSelf + + if MenuParameters.MessagesOnOff ~= nil then + self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) + end + + if MenuParameters.TrackingToAll ~= nil then + self:InitTrackingToAll( MenuParameters.TrackingToAll ) + end + + if MenuParameters.TrackingOnOff ~= nil then + self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) + end + + if MenuParameters.TrackingFrequency ~= nil then + self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) + end + + if MenuParameters.AlertsToAll ~= nil then + self:InitAlertsToAll( MenuParameters.AlertsToAll ) + end + + if MenuParameters.AlertsHitsOnOff ~= nil then + self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) + end + + if MenuParameters.AlertsLaunchesOnOff ~= nil then + self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) + end + + if MenuParameters.DetailsRangeOnOff ~= nil then + self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) + end + + if MenuParameters.DetailsBearingOnOff ~= nil then + self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) + end + + if MenuParameters.Distance ~= nil then + self.Distance = MenuParameters.Distance + MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", 15, "Menu" ):ToAll() + end + +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @param #MISSILETRAINER self +-- @param Event#EVENTDATA Event +function MISSILETRAINER:_EventShot( Event ) + self:F( { Event } ) + + local TrainerSourceDCSUnit = Event.IniDCSUnit + local TrainerSourceDCSUnitName = Event.IniDCSUnitName + local TrainerWeapon = Event.Weapon -- Identify the weapon fired + local TrainerWeaponName = Event.WeaponName -- return weapon type + + self:T( "Missile Launched = " .. TrainerWeaponName ) + + local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target + local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) + local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill + + self:T(TrainerTargetDCSUnitName ) + + local Client = self.DBClients:FindClient( TrainerTargetDCSUnitName ) + if Client then + + local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) + local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) + + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + + local Message = MESSAGE:New( + string.format( "%s launched a %s", + TrainerSourceUnit:GetTypeName(), + TrainerWeaponName + ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ), 5, "Launch Alert" ) + + if self.AlertsToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + + local ClientID = Client:GetID() + self:T( ClientID ) + local MissileData = {} + MissileData.TrainerSourceUnit = TrainerSourceUnit + MissileData.TrainerWeapon = TrainerWeapon + MissileData.TrainerTargetUnit = TrainerTargetUnit + MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() + MissileData.TrainerWeaponLaunched = true + table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) + --self:T( self.TrackingMissiles ) + end +end + +function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) + + local RangeText = "" + + if self.DetailsRangeOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + RangeText = string.format( ", at %4.2fkm", Range ) + end + + return RangeText +end + +function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) + + local BearingText = "" + + if self.DetailsBearingOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + self:T2( { PositionTarget, PositionMissile }) + + local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } + local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) + --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) + if DirectionRadians < 0 then + DirectionRadians = DirectionRadians + 2 * math.pi + end + local DirectionDegrees = DirectionRadians * 180 / math.pi + + BearingText = string.format( ", %d degrees", DirectionDegrees ) + end + + return BearingText +end + + +function MISSILETRAINER:_TrackMissiles() + self:F2() + + + local ShowMessages = false + if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then + self.MessageLastTime = timer.getTime() + ShowMessages = true + end + + -- ALERTS PART + + -- Loop for all Player Clients to check the alerts and deletion of missiles. + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + for MissileDataID, MissileData in pairs( ClientData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + local PositionMissile = TrainerWeapon:getPosition().p + local PositionTarget = Client:GetPointVec3() + + local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + if Distance <= self.Distance then + -- Hit alert + TrainerWeapon:destroy() + if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then + + self:T( "killed" ) + + local Message = MESSAGE:New( + string.format( "%s launched by %s killed %s", + TrainerWeapon:getTypeName(), + TrainerSourceUnit:GetTypeName(), + TrainerTargetUnit:GetPlayerName() + ), 15, "Hit Alert" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T(ClientData.MissileData) + end + end + else + if not ( TrainerWeapon and TrainerWeapon:isExist() ) then + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + -- Weapon does not exist anymore. Delete from Table + local Message = MESSAGE:New( + string.format( "%s launched by %s self destructed!", + TrainerWeaponTypeName, + TrainerSourceUnit:GetTypeName() + ), 5, "Tracking" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T( ClientData.MissileData ) + end + end + end + end + + if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. + + -- TRACKING PART + + -- For the current client, the missile range and bearing details are displayed To the Player Client. + -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. + -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. + + -- Main Player Client loop + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + + ClientData.MessageToClient = "" + ClientData.MessageToAll = "" + + -- Other Players Client loop + for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do + + for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + + if ShowMessages == true then + local TrackingTo + TrackingTo = string.format( " -> %s", + TrainerWeaponTypeName + ) + + if ClientDataID == TrackingDataID then + if ClientData.MessageToClient == "" then + ClientData.MessageToClient = "Missiles to You:\n" + end + ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" + else + if self.TrackingToAll == true then + if ClientData.MessageToAll == "" then + ClientData.MessageToAll = "Missiles to other Players:\n" + end + ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" + end + end + end + end + end + end + + -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. + if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then + local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, 1, "Tracking" ):ToClient( Client ) + end + end + end + + return true +end +--- This module contains the AIBALANCER class. +-- +-- === +-- +-- 1) @{AIBalancer#AIBALANCER} class, extends @{Base#BASE} +-- ================================================ +-- The @{AIBalancer#AIBALANCER} class controls the dynamic spawning of AI GROUPS depending on a SET_CLIENT. +-- There will be as many AI GROUPS spawned as there at CLIENTS in SET_CLIENT not spawned. +-- +-- 1.1) AIBALANCER construction method: +-- ------------------------------------ +-- Create a new AIBALANCER object with the @{#AIBALANCER.New} method: +-- +-- * @{#AIBALANCER.New}: Creates a new AIBALANCER object. +-- +-- +-- === +-- @module AIBalancer +-- @author FlightControl + +--- AIBALANCER class +-- @type AIBALANCER +-- @field Set#SET_CLIENT SetClient +-- @field Spawn#SPAWN SpawnAI +-- @extends Base#BASE +AIBALANCER = { + ClassName = "AIBALANCER", +} + +--- Creates a new AIBALANCER object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #AIBALANCER self +-- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they are alive or not (joined by a player). +-- @param SpawnAI A SPAWN object that will spawn the AI units required, balancing the SetClient. +-- @return #AIBALANCER self +function AIBALANCER:New( SetClient, SpawnAI ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + self.SetClient = SetClient + self.SpawnAI = SpawnAI + + self.AIMonitorSchedule = SCHEDULER:New( self, self._ClientAliveMonitorScheduler, {}, 1, 10, 0 ) + + return self +end + +--- @param #AIBALANCER self +function AIBALANCER:_ClientAliveMonitorScheduler() + + self.SetClient:ForEachClient( + --- @param Client#CLIENT Client + function( Client ) + local ClientAIAliveState = Client:GetState( self, 'AIAlive' ) + self:T( ClientAIAliveState ) + if Client:IsAlive() then + if ClientAIAliveState == true then + Client:SetState( self, 'AIAlive', false ) + local AIGroup = Client:GetState( self, 'AIGroup' ) -- Group#GROUP + AIGroup:Destroy() + end + else + if not ClientAIAliveState or ClientAIAliveState == false then + Client:SetState( self, 'AIAlive', true ) + Client:SetState( self, 'AIGroup', self.SpawnAI:Spawn() ) + end + end + end + ) + return true +end + + + env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Test Missions/Moose_Test_AIBALANCER/Moose_Test_AIBALANCER.miz b/Moose Test Missions/Moose_Test_AIBALANCER/Moose_Test_AIBALANCER.miz index 2a3b8714b2886345f4408dddf4bbc7d50992fc81..c21694b028f20dff2ef6dd4e67500c73b7658c02 100644 GIT binary patch delta 119027 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�l9 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 delta 626 zcmV-&0*(Fdwg{)80kFOp4}v|*NG^acbK(I20AmFJlg$_#f2CASYvV8wJtvU=Fz8Y% zWR(v}7YsR+BwGTTblGGN%eEB7mJ@?46-nMp>3^>zyNS}eC7~DN(Y%@WW~3P={*zo} zGJ=b4w+oBg+tm!Ff0x&b`2^<6$ID8mJ8do#%3(uo)EFLa+|gVlyiA?_^c>ja7d1P3n3W=N zsUzHJ13;BP8)aQ7+mu_fWyY%+^#H99CR&y%VIHiQDV1>OxS%H4MJOWOK1Mj!oQWV)vHzR)x)32hpr#7#z$KQ6--rVoY*>W0e z%NMtiOH2{}<8UjKCP&WXV!5RWZ1IS4LmkApJK?74t0GCZ0 M0viScO#lD@0Na2Xxc~qF diff --git a/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz b/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz index b70f9877f68eef00785641c69fab88e8e05ab4fc..47c6aeae9d408015b73a388e0b1a37cb5efe6dcc 100644 GIT binary patch delta 119340 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 delta 976 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�l9 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 T8Uq$f0+SGl8wSWt0ssI20fNXR delta 793 zcmeydoO9zOrVU9t{7tr}J@gv%iytvEFeI}wOfJ-su3sABoBh~8z*c?2e}fl6+9^}{ zy~KGer>I0T%`Ul_!hd?3$kA!S%{ro<_q<=$uUFaKd1;sGLh;8J_ssmBwnS3x-{hDS zqo(e>?cCkBZ(rqERzLlE_fM8*r%#@@zbv`t+V%a{AN&z-Sa_MQNh~Of&D_Vp)mM*o z&F7{}=kDVYZp{ztuRh4KsFA4Izh{k-b*`T9sYK`8D-v>fcP_@L?D3iV_lwMpC*r2o z)ib6l6|PjilgaEb)j>KnR`d3h=uN4|R!e?mSSz3wHBBo~Zp{qMsRb`~EKs}Ys-bk( z&duW5Q#Gk?`+5uZlQ` z>BTOQ#=qVtdfapGdn=-*Rd2HE{dQ;ht2>-SP4#3-jtk_8U77LAdGC+hH`TlNf4`pD zuXcI;qV3Dg)~`Q)zwGk8JMT~5ERxDOEgs;_%p$_Tz`(%(jClrjy?jo2CI$vIHU@_6 z{y!NPhM}j7>HqziOj%P88aXeSZW+L2%ao@#J@6-^>h!q*Oj=Cm45n}V%_uQlEs#lI zde+9G5aJ#%y*G$Sc6y};lYk(?=p{h8P!G510l`el z({+NGq?qQ_O>gvMlAbOT40K2_P=vXno?-fgU?vw8{{{wz^2DOljQrB#)ZzedR-j)Q O7{q~43dmw?2Jry;#6Z6Q diff --git a/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz b/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz index f118de2482b08e32c98cc1c0db81f42e392dcb2b..d41754feaac3997da7895999f37ae0f4d0426e2f 100644 GIT binary patch delta 119103 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�l9 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 E0EX6R`2YX_ diff --git a/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz b/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz index 03f135f9b28c5b017ae3c569b0da449ba98176eb..1159ed374adcb0f3956f9431b2b566dd73ae8e70 100644 GIT binary patch delta 119157 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±cEGr&FU?8 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�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 delta 732 zcmV<20wev&t_a_l0kCNnx6S?mcoMf={Q+tHB``=fRy&ENU*g!AF(!81X zW=1ni{3M0QWeiunUJsTJ59>M1o>#Za#S|8+>9?oZ9M+rL?;CLTE5Ok0u!GZ5O3mP& z38ttiq<~FPGHq!2p1^oGf4Ujoj7D$6uh-YLXSc&;N;zz)^_sxjy}Me7lvkNM|N0%A z$s;v;dzn`vb)jS2?EpX>KpSOE8QWGnvSY@p8TSFL5hhwzDrFw5n5mR-=%l13-Nz^< zy#Yoz(bYB{^}md9vU9)amNs`S1@}f zEHpX>1(;V$5gZ-%P-WCu5(I=CMYcx-xsoM>Ci1A{PSMgA&`FHyqUDx^YR#01eFq4a zG|O$AxYe_Ti|~pf+eshPCT=56KotC6f}c^nEVQ;2KB&H2cIf&)+3mU`rj%3=qp7TT z<~!16vjV zm*5rxE0=y20vZC-D3@#f0U4JB76K3)E`Tp{;{gBwV+8;J761SM000000RR91002WO zlW-Uqmjo695SPFe0vZBZER%2;6qoQ70wkBs6apFo{VbR16aqs6WG%T0xBeNMgRbJVRB_?Z*_BJb5KhK1^@s601N;O O044(f03%5N0000#5icYF diff --git a/Moose Test Missions/Moose_Test_SET_GROUP/Moose_Test_SET_GROUP.miz b/Moose Test Missions/Moose_Test_SET_GROUP/Moose_Test_SET_GROUP.miz index e1beebc70c684fe51b5455b46b150a75b4fc9435..a540aa486910a9ad44eee770c2052bd33733b4e1 100644 GIT binary patch delta 118981 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�l9 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 delta 661 zcmV;G0&4x^*9n}$03^>zyNS}eC7~DN(Y%@WW~3P={*zo} zGJ=b4w+oBg+tm!Ff0x&b`2^<6$ID8mJ8do#%3(uo)EFLa+|gVlyiA?_^c>ja7d1P3n3W=N zsUzHJ13;BP8)aQ7+mu_fWyY%+^#H99CR&y%VIHiQDV1>OxS%H4MJOWOK1Mj!oQWV)vHzR)x)32hpr#7#z$KQ6--rVoY*>W0e z%NI~f0|XQR000O80RR91qHc4?zXJdOy%PWcw{08(YE2J060RRAF1pt@k zX#zC`Wx+B-q?aIS0zCtaQ2>`>X=U8_DrAS9Skk zf-5D-Ue-e7E(r-qu)$|4JRHF1N{B-(+7)apX_eg-AYA0Pryuj&haP}2NzD0Rx2LDO zr>DE;JsS-#{dm|*nxgUi`E#*%aB#FOj*d5vcV3H~{nxwix9IioSYUEPw8Zz{S$X!7 zB#XpP(J)GbJWhsx;y4~eSsn~V>!QgwrgyYpMl*-yGbUz`PyXG5I+^!<0= zf44L2_QxTV5q~c9KKEKGj z$uLioK9DA5XHmYLrb)UNWm#|@y-KdPhrwAt3Y)#4pG6=Cv)jJT)1aG+q$l=vj*hk1 zneXuUDaA^E!c0m8t$o4^lVKwl-HTv&9*O)S$|8g54}yOt>CaJ`0bR(pW+%nNx}>vl z+z$cP=@5^{{`vAuNpbJEsJ%j7xD(63$A!UcFrw}#9&EiqojCFaIh%QX#X4~Db)Wtmg%Su z!K9IaIB6X88DJfO%PW03#35RUo=%9r|opMp>nO_lav~= zV^LLUB$G0S4TWitB;e$kqVYnkB4XongIH*r_P`{KIRiG@vR!*%>^YP+j{0E+8I^E< znAZ``C=pUfiOa+B;4DhDf8!6Nv0VIMbs|5D+Q$td#{mRNGZ<&NIE%pK zn8^3{m8Rei&y`4)z-@RWbG?1BNBGcWb%VTrDT~}%BoA;@d35-9i^t+N<|*6MT6&5Ft}gK~ z?(0w_uBbZ|L6<;W1fx*|y@C`wd4HT*6sGbdN<;Wg^#Ka-qL6WVN=>E{GgemWcpLoL zs8E#xo24Bf9S=X@?@YiyQl2Mv#6K}c1YsD35b=PXDgZg>RMnmqY^scYe@W(lQ@^UR zg)&)nCgahR+EY!Ts=!$lq?^uV;rnh7pPBhCisBjrqWGhSmW?ruaDcyQ*SIT3#S;w> zZbr1wYG?s2WC(KZ62fD#V6CzMa(IaYs^~1}ermR`>tWQb+W+Z|_ie-K@Vb>KQCq6l zY$0ml5Xp2t)gei>yyZHe(zw2r)wF9k zoMWI5owWf}a^si(YIuSun4yDHp}Im!`puKA=sb-a%?8;0wyKuipRfLZru`DQUHGF| zkt-8B48k}V&L$=ay#%6l#9)L2W7Fegf6pezP>UV|fY1+}S(M&HQ9ci?w!hZ?)o<#k z?e85YdxU7y+TXM2?C(9FCQlFKsG@;ziweFzpDxQ_1jYLEFv%S{0JX@#+w-*_+ig=2ixgnV6GX8sWydxC$}>lVoEU(@tPun?^x6 z5tkr@&ki}S&}&VU99T%XL45)tMs@|Amsg!9YX!e6)h|{@mBkU~@r8(={x1zp_0Ov-VB+OQn}p`Z>kXQjr1vdJI>r#B4(3IzJ2Bp&8k zJCM~!VNH^Mt>6=X7d}z&8y9|KX$F#|x{897n=ecON&r1Sk5ZV;&AO<qvA;FwMo=jYTDTCxI5zdLj6jYi*_Xc{DVGIvszciOhq`~qN=;K^M z0^q_QzuwG&_*R@Y0m0!PE&_=P+lGGm}7F7nY48-oj)R1aQ zVR9wEiX!OeTqRUmz-o2?5$5x7>KgjZQ#IAu+5(zfo>i%@4i=0dVxumI$SfMQGYhq2 zS{8!{iU+iRbM|be2xhp#kJ`=K;MgYpMx~SM-&IFz^Xq8M)zN)RBNHYjVKPtoWEtN~ zUtc(i2cv#;n2aG4qC+xx;yFwOUxG%$5lx?_n2ckF0DTaxFpRqK033uSeX)pHj5!L} zJSXuq!E9@anZ^OvMk3GOJz%vQtdP72Noat0w|>OoMi*z)D+7&O&uw#p3|E$0y} zC-kwvYg^)H3S&^vVLTf51D;B^tw^sYIi?kaj%ES0N}-Ew(X^omL&JN44{UY{IAI{0 zoC4l|DB#U4Nm^nIi>nJUUa4ZdQpI>>24kp|Al-u+FYx!s3@X_B*UvFUbM`0l{YJju z(EC(=r_w-cL@DJ8M>DmPDoCf+94!bCy$0)Ax}t6vVWI|UDa zzQDE}3>owX1DaoX*ckj^FR!cVo4ub7k8GXeyN3)oJmVAghTFv`jd=e1<2~&D^88@~ z{xBGSZN=wlFuIU2eDRDXsWfHOMkoqKI3Y|RRkf8(qPQ&;)5J#chZQUr*h0HSopnJ! z55$RjvX!h#-Sm?aNL>H^J7`(A_SRK@!_R#atWwx0GR}bqY@9)iqY9KPf@#taQMgNy z47nG9)ugZik6!y|9k4WgK8$;DHyC1H`8>`+fTIL{{i@@ybp%-#=D>0O$Bz}3vb$^B z3AC;rH0MLI6%VC^a_Yzdsc)k}Oc?k;wuDge2g{Ts7ET23H>9N$;71LmJtBdB^c)iK zu28oXi30qCMFL6dfy!BirQmQkw4v}?D9l!bk6Vl{o<|%9OXvl2rLN31IMuS}`pA;0+_{o)qU?h+! z*AX@k)mGm$lvgBW6jlWfR{~joHd#naIG=3Ea1q&(p(~pSr83MpQ9xC@Zaa*V*Le@8va?8s zoPy1%W!C~=(IptFT|$R{PkyLztqM8{YFvxy@I#erarqZ@EmqmxTnq9(j%xvJmEP9=swdzEm+1R8Ot5OSHTc5XeubqTfRdK$Uwn=xO8(?xfMuJw^nvaBq{B+$fS-UroCKkx1ojZsM#HrXHF^1(kfAF zF(qZ{(%q`oncHiBXnw(sG(CW``5_fq6jY5WhbdWM`C9Fjpxo6WlZM-RReYhmQ`Ucx zE@{3n`>)+wd&86oc4ZT0t{sCB&hJtv>>9*j6u~wWR1{k;4K2;8m0XxmySQ-Z{yVv| z8=Zny(oj%^w;^*(43K7^3wwXnumY00&?5}}-Ge;Y-EF#m>kTZ-DGhxL<}P3!V6%oz z15q)v2KL&7mD$V*TE{;&8rjg1mdaxCiVof)|Sk|L$_q05OtX3ZFhqib9}AE?L_ z8`?u|HXs?2EY2i-)bDvLK5xQ7fZuCMh*^n;J>vbaSe&M$tV6I}^fVeImr-5mjtXA+RRr$=mc1P6twpWah#oSt-xP=?gQmtqB7o(ji5KoWMRG#?gILwt;*1^cJ*lGFWO1IJvf2V-4LI+= z-;m|73Cq=nrc7CJiufEkzpz2Ne_%2zs?RNd;c8o?0q$%Nu(#tX>i6l019YkK3!3VE zS=}_13p@;8W7|SZBy(r_Ng)6YS|}+@AU{`O~45&;M zeS+i=9-Uot=a4vp#YvFLn*5Km;~@KlTsi*WxMMHQuyfk*NPj^Z3^Ij4jvuKvsa;He ztvQa>Bz7Jl-@+gH+u9Vua#e4}pd=vv6aGbqdNtV(1}aOTQ$fJj*s0*hb-;hkM+hMr zNMF!cnuh|cLk}KR(UdA_6&5QkvoTbCl}SuTg%CM&(w@l=2ymSxM*^h*hoLap{lhzyy#gb_ro0)_=wN{gjL z+pseg_5wLsosG9ubPTqkR6wcQE7`XQ#Pag#%G zSVeI-o#3#Z9<+j=Tw-`+?=(2WF?KmY)FnuGwE%~}q>_6VG;5?TYrQfPOlAy{VQp!* zIJq+GWmL=V=ct-n)P)cMTJJ}HJt}r7MbxJB>v(N*`tDSQcod?BV|`LOgXN)SS)*_q zO^`#-5+1hCICdxuv^kz(WWapK5Wo?adT~JCMD?qY9zj&a;wka9w575j=BRoysPsoGG{U^WmN3V$#Y{ z+_0Iq#rdJ#ZdEr@^ta4{<)~~bO3q;DVy<%KBGl9^zwsfJ{sfyVte65=)WA;(uEZ+J z^#(E?0D=*WBy*YOEIjFdmpGKu#I(dyO4KsU)J%#F;nXe6ff_Bi`fWkY<`NgS*KzNUa$yHI4_U%m`hvL%CR|v8cETi(YVk zyMQIXI0Sj-qkny8H{lQ;y*v`;Z1So4BIHk_nwNZ|rEn$$2JWm4QJP*XinMA_3s`*Jx_r-L&6G<0q z_~aS>R!6sMCXJd(2cA7Y10+<98e?KRqXxf8O6Ns4NdR72w3AsT-PlPtExEN>{6W?e zNDliclxZv=@8^@obpsI$U(5pQhbN62H{pg7Zar&;LzQoTF`imSIEQf`LR{TtGOC?j zj9RrSIzLpYf)Z}sN>(nnkiBpb972m3oU+xj!7UZ%ybBZEx)rNw!ngs$BT7fGDCSI< zkG5bbnRiquzS5(N0469@#{)^lVD{ix7w(EyK}Eg$s$nC3#WrRQw^QJzik6*)oW`se zWVBx3;gdOk6qWJ1L3O*0RCGBN+3K>+p-P)-l_GEIiJSERiCw)Qz-grw0hP%%&WAbb ziT*Y1^eQ#CH>UdLCVpbqF2tc{ME#>%f*xfGEC`eQvY&)x<$e=4D5Y?EdW2m%^c3juPz6Y zoRe|nmf<43Tr;FvjqvE4x+#tBfP)PlBYIQ$$R=c;izr&-VtU6Buu5?kH7M(A-bEAf za*kuNwq#|~-w4s1KZvwlZp9B_1w?3inJ#q^E ztz?WwcAW%_RRTQHkx`R&dH$|6lG#L{G69ksZeBxy8 z>e=1p@;^%5c!Jj^fUtbZs_t@-S@HB9_A%rI2O#ulj9yhf$)`{832}gKeHCX@GtgEb zV+}?Z4{8f*It@yq(%|vFCNgE?x3Pn1wggz^)2LM@Llwa-jBOJE4Qt3MR5hnj4=}Lb zzb4>WHvMcKv@U=bS)lRJ&_L~fGW?^=&F4t?Dn1a2XT3t{xgnSyAjCO5VP$5vy{bba zCi6Ksx_kG^rvd!Va(ThX{+?g1`B#Tr^VplHul;EQQDHQtGoU7>Tt=f5hes4BEK_Y! z!y(TDfF|fY!*)&Gx#er}ynLrLsKKlgmBMe3Sh#6PBFj5IiZ?Ea6%?L-CPCbk38&Dc zh?{c5DLhAFUvo6&S|rTSGU$A+rT%gt!%gQb9z$7z7bVxEyd}Bf)K3$HtUT*urUb1I zRMc6`Iv)>MC(c-7bY<@pry>V`z(D&y;(>RHy-&)|9w4?Grw#5 zIU!>`fEyMrE)s`Cg|tS0^~Wt>JPe?1SC=>hVDbUnY^JVzP;k60H-b&afdops8YFb! z2T{~m&D{UyPwhbwHkNdb4z9$|t5k-EOi`QtW&a4E<>935Y}r+eTkkS0be^d0j&ZWG zsCRO+>NVV{%gJQq44ApbS#!f|vm$r(kP*steAbr(b{>qu3(g3CQ#s@S%-}=fd-!9G zM|m(Ae^f?|?>LO0hjlfcvL=8G+mmPJSuMdJq%?3UkK62=f3S~GV^cCnQu&Ju(WAv2 zJ{ZR5)I9h@gGff1Zpzld@8FsZVZ|E57L#ElijpYg6+Rh0PT>zRF@(YDKn$4FIGZT0 zzq5#JAZ1e}cA2?)M!|f^Z1t0AN<<3X`UGwvqD^M*cer9)zcPNKVfsPNte-G zW?Wd--Q5R&s5CX9@+g%DLh(gd#Yr2Um~M9AHuy7h$!E)%#?ee^Hb>qI!8bwxLcKlA zo|AbT#$u?4?of zOB&b0J51|C7oV-N-mqp5IPY#)JRVi@X?S@cIdvp|SvejYl?Q{P@IK#lv>@ncz zp$C99?lIs`S;B#Py_}Xu*C;{bEzENy;sc&)Z&*uhFx5Q4OAP4Hje-xd^EU}yBG63& z{L_F9vyEF^%N-9voG2sU`%k!N9W`Jl*-sH%c^n6TLw*OVtP*E)WwrgfaeK=%&C^8B zsG*sE?agkr`KC4j)_J4vCcEj?m7e2h>oyc7$3 zr!lA-vo%=OwJw29a4Wi40F9>W-ICtDAg5+g>$8%T{(3AQ{=T(u?>}ad%Jfc(cXtsF<(XADUpkBdp$`qwj=c6OjqqJv`vE}GzFddTp$E|)Wr!38XECfuPyA_r z&R*`CeXSUhNoOz1w@%+exuv z_>#Y~NM2tQqHd~Ik?ys0^T=_8WG=@MsRmlN(#JPFEjd4Y>t#G#VEJ-CNFBd^$Sxw) z0iUv1p?%NjxUK{Gs0CQR!d_4R6AdnZ={_dJJdfx~R)m=-|@>-q6`HKg#uRjO%wZqsG zne0;4@ffk~+r-&}g*mGS|3t%om=#U#xN>Y!SacED$~yOY@)wSHUw{7X(IQ^$EL?f! z?u$$gew`Tl>hKH3(8BbfJ#}a%6u$-4`vg^D<9yvdlSj1iqmg*fl0KnBUsJ-Ht-Dls zytF^#1X4Y|^Vwns(!KuHac?{>N;oIa@b?ScPYejeT+@$x%u&Y+n%TgAfD1QX<3`*V ze*?)ZlXHeL?1O`_009I9Pt!}(A|xpvsT5?_9OVpxkUxA19`T!q>sjB?@y=TErhm=} zY9g*JEDNiOD!i5$xEo(w*!b+z@ooqqEUF!@nf}Y>L-GdY%x-6T1O@_L@>e z3tRI%#Sd!roDJ=+j-H!5+$dl`oemN{~*zByqqceXt9Vhq+M zWgm4ms89&=h8%X|9)3aO53t?XZ(Cb~3k9(?g;`w{A*84wy;<3Rp=579K7)qu)2wS5 zjH1(~SYGz%|IY=Yx58Xc?U?V5jw5PNswwP%ZO=NzafgrhfxNf zOwb?ksK9_(!)eJf%{XBX+S?VdsVsr$sc%e((S0)v+1Yr6dF6S5Q~*L(er24}L;P41 zY;B;-?s**g^aO8zZQ!$fWXP_TTw8Y2xF`lxeGo%mWZ>$X=GK=f3@s}rJM9tBcUSPyCa}tCc{ti`0-uPtd=!w-(OA<~-NB*Wv!s;;=fHiZTJQpph$ zaiukX5j|x>23Z-8NxyN@U1K@4Y{O|`S&8QJ5qkDpRWc(`wazuE?9?s69;$LB#Be46 zEb$N*m*cW|S@vYk*4MBRB!J;PH^)NfKwRd!&~2KD<)UfJj4wOcdSfT$XWFr0Y^y5|lX zr5f4vMR+)LaioKH01j|v@hn1j$2EE&@(Ugzlojaei~tWHfV$;PEm|w?W!_U-Vn)V) zws(P`tmNFMT{90_iM$bqD{4+{u@rM_i#a^Jw&u_mIrrk~T5{}|Ms2zqrnFMcYYwFZ zMD8+xQxw0D6SD=4EX}Eqr3J00+}&P8A$Gp6sFX(@g~q+vqZS@`7IiYWR*(d%#?Um{ z!4D&_Cq;OLoYGE7KYCnNHyoR8Ri?v+{6C2AreJ=ePex0KqTo1 zv%0e?qbY#w@)41pkcqipV<3<;uX2m2GuZ8>%Z&Tb^K=n_w41d)#y9lP&(_uK(0+;7 z1zfV?PpBoeW2!lL-w>2 z4VhrEARFAebWWoHKD?dCgOfBtK--Dn3mLG7h{hSPT-Lq7eN!w55d;cw{?3N*^S%@+ z9*)M=EhXoOv>{AMtca(8?w2m~Cy+n{Zfb2r?ZuMt>DK1)=Bv%4ZT~nLz?L<<8-kRQ zotRu7eSS7~O~OC^v`TO~L^q*-r_ix%=*z3~fzWj;)+ zn3O&t1EE7jXNBYQJv$Ti9SQ3r4Jw5QP(CgU0#D=6Bq z5HW;xc9Po7PE8knJh%&cim@+Nq|d$Wi+EI%g!gkqHEEa8Mch@5;u2kd4caFqWf6Zp z38vaFOp*?0&pGnZ4#B%04E(C|{zmfS|F>a>AXN~yol z!m4Uv_$h{Pek{~S1q-YgreX?hvKoIiS;&z#*i)6Y@kv$q2k(q8uE4$1h<3h$mttIz zOv+q*jAyjBvIO+GVkqr@Sxut8`qgG&f6rBaipKo#i_sh-lIHl)D6NL8wCEB?!ofDI z#8jOoWd=;f$ZdW!1^e^YbvT7@T$>;2_SEL096BfcMhlDcMg}m5V%%N^yp45lTXg9V z@&K;$P5NEE(5?j&j^4zwsH zwVSnA4p0eWxBTzYws^pPw!ixYI@1Alx0|#V~MN0P&R1}+>zC_tGljusTcXbsh?-M%IE$pxK(n`)pD!w z-2o%C``H111WUzejFVW^d;yUt7cfXg8LT$C^wLo<68bU!tUUyA6CQ({=Y z$2p9m(d%S1X)57c&Nm>QshpnZcw%Lh{pC)j21=&T>cv=s4byS8y!pQn#Ld{DERag% zPnUe6PZMV}-s4ZEh!5`oPG`~y*bfL+ZkD^pFqT-8{Q`4n_8oOO6j%dfyJ#eG5_PA5 zA8_%1pZWw?R_1f^jQ=WqHl}oSnvLpg<$8ws`(1cFiqaUmQ#Vmli!_CE%aDgxK9Y%_ zPJ-jT3~f1`Dg>cA$YMhz@FB&syWu9)16-7iDfp4m0e@bD>X$1??< z9(uh_o4*-9kS3NB)K?lIBx?VJLFss0-nIJU2lc^HqP_Po{ss-_%vb zcah1T_1F8gxtBjVT$q*4d8gkhU_xhq)uv@ySxz^Y?He-+Sa?x=KiUpt0> zQ!Kmmh2kkI2S4#XowreZev!jg5B%sj0-Qx3dz&&QXk{a&{Cc&?3c6xovt=XdjXLUo z>o5$|+Y=qYjWFTD$mgI;j2yJmrcl%uy;YeU-ctIN6}{yKR()Xa3S3N|GXAg^RS?aL#HUR$bXuS3-+;utTSdr<+Th!}W z0=vrhvh%|zw2}dUqAc4OoBcjvC)QT3k?E|7W=6032K|30c-R00Mk?sw&H}u`$YwI2FT2Yq7~>fN+dH(~nZlWhh|I z*E+SS;RR+!j0%>^?~eo`2#N8m-CiYWUABG}n5 zD6Bmq*gtr;y?^><=Wtuxm&f+z>*Jk+{ZsgN{1)Dht5}w?{OzANx3-N4aj&GLe>*Gc zMIlGy>;hYmWgeCf*yL^4Vcdv`u}K8<6+-zKr7pJgZr_)1&cA*uB^A zjD>^G%R|5zlJB$ zz$3;d;&;ygg)_Ovr>hF|h#`vj-7`kbF3{Q|7ijH)3p69@u6>cHJH(RQIqV*!XK_9| z;3C==>cy?Qq4vJfqdr1^ec0Z72hrl~!S2>miBT@2b#325TC~-7XH_oZRo$c zlcDdxi7=FpH*{VFF^>QBd9rv2G{$7O*`2NZ7$%z!dcE29E)llnrlcQOp9F={ulO}|h0 zI6Qte+dKeid5)6&c&Cya%8NA<@#i$ihDjKtcP`CV1RRq|G>6G+)Okww>pPW9v!L>< zEm$6Myv=@mS@5}ka&Zi1(T9&gf|)+-X4%GrHks-Q%9B%un(oIs$R>R~&IoAMec*4^ zu??G>b1cVBsIKLmYzsDZG>fNfYI=jPs(u+qSFHACmHx_TmL3Ok7T?4=zH(Eq7PNIr zS#@S_IUN#m^P1gfMeCD$q*2Xg*`-0DRmmwBe_i~fr~}`BqEXSBHW~&b*4vX@^QRegn^fH!Pz!EL+}Ckz;wrMDDWQeNiPy=ZgsPANG#4w{ar+x&LC6 z6>0)*Xm`0q5v5I`(9)&Ja;QQpZ{oHVX&hpQrJ&`v^NzWm$4;CyOSvlT#-4fCy!YnK zcuu|Fzj6?NXqiM$UW-HvK980O^v(taTBRGiSgLn7D3#v?HemhU23c3MS=e#TW1yx;vvw5BlFOobd+Ujb2tpfgLdu~jB@Ld3WmM630aeUqW@ZAVdDu_PC z<>v?R{0kJ#Deag{5+NVS#&r|C7N>+(VcJJ;>^>Q_qVf)6Cm=HFa3?{QBAXX@YQ7UK z+S?5aOFzHZJ^SUZj&p_z6`1Mvnn}N^r4JTGwzbsX>wxjr`H12!)}k&bH@>tJOsS=i zj~hdOK4}d3PGd+L;<-?6je~#_gQ5gV+aU~W0I*fcR(i$$A+OEK@ydn%`~?DlD;}C< z{B5&@%OrI3bdJ$R`?gN-ymgSsdsnfK`@b zmf)VylOnkl<)|n@9c?2>aCh#GI)9O8ILq>8E5`V5fDK;N{NfZ&$PUmR`Dl zqG3F|$+A2-nOw!RN2{#{$(R)Qbe3GDztUa1kxe{{e=VKdP0QU{ouKuUbYaNEEc>gV ze~25za8-CkUL^+59VNeF00upEXQ1Wmwv9V5YKa5yr6Shy;m_^beCiR@vu5o2d`5Q~ zHvFX0z0n(+aSZr&7gdmZnq^a7T;cM6ba`rvVgMxoNwiG@yu3-riDbb`_XR=?i%a71 zqpn9{q2#3mx3y_G%D+9kF_L@>_3zNyR4Q zJ+&hRs;Spp9Yw|GmyS2iSyqtSy=Kc+Sq*K0si3vBY31s)w3ZmL8i1})p;mOgRiN1w z7FH?eCiRuddJ01~hyzrw8of5}?Temg`*xBi6lfOV$|`)OvkZ;4bs=+-8=lg-tCTcU^TL+HcO z-&8x$Z4NU!A&3j-2XHB=)h#2ki-QnTtPQf~>PQJAyW|H)8+GV)iP-4wnngg1 zog)E;${R-PJK|BLD!Od{_vg*Wt2!4fH3Uj|IC5egh8e*JQQK1YQj&C(g9k?cR#vj*I56YB8 zUOgfQb^Xp`$t5Z435TdPg4@wvpS|1X1KuWxmv;bR8zQ~Vdo%60pv-D4wPT1STir*T zqTuq~NLZi~Q0z{aWWXkbG;36;2x0a(F3kJ`yqaD{07v^}`w3ouYnzP3W$sUBdNm(*mf2$p$A_}I=lpm5T~eJ?%9pR zCM33CZ0SXYQ4+_u)QW#5kgksT`|2q8htjXb?;bqy4>Y$f*L!m2!&b3JZax9lu#^86 z&x=ggi2IUa4`P3RTgQF;KR)IH>)JgDt?!c?v>5)4v3Z^r^f`jvh{KzBa-EFM;>jHE zyx))w@Xy6e*@Ez*{tYnji^4Hy!$eU(o9bzd+CP5{;f7@&WD1BXD^sIFERgWC@jThQh)DI`GD4LT#|_EWVvWWJ zV>tPLDNvrYEu^gM9l2;;4j&*iO)2_JYS*lZl^l#?Lybk`*4Et9t)xJ*i0=vBZ$><`v zitrb4=wXmn$3kCeg3L#njL`+ZffAM?Ay13NuT9WMLPpcCj7DNs>mf+x0qIJN{IUX? zr`Q`qcUd2-iso3X5TlFcc&rhv48U`zQwwnI1vcVWW%|cu=EIw0G#@7>ug(6`*U2+~ z+$Z-cqSNGNSnrT|yMv0|jo{ycPZegIJ%uir?}z+OokmQ9&j=6%Tzu)ecaL7JL&}L9 z2Gzszyt~XxLMAjO@6t|2zZwDMMW;5+ULF##;CT+4z#-EWmbfi0k)&lxCR3?|-1s}% z*v3mR*Wgn+x9x#+l*)oRf|O|S8;MMRC{o^Vj*h8me9A8S1SLwR5DVV=n3cxQTrDK(uszdGY|Tvc2XXOH{j+}>BYu!=|=#uGX^yv@+A zv)A71l%3VbUs%xduN2myJ{@SPHSMm{LBXI>xm8FkEb9hWo)|Vu`Dmm#SIO;vw7Bak zY8Y|2Aubfp@eB4_%sE_(Td7aNlIxEsG#DavcpM5$!NN$+_`0buZG|Ya^J;mCihJaz z2BxsWveWS^XruwERVF19etl`^jXO%HBO<{l$WzP~IPT%jDsmb49Ovp6phn9CV9Mbj zoU6av=+RKBCgst);0R`i;2YF`5|p9r?xaexcM}S(Rs@~COOIH2yAu5^!Qjq}^PdJd zU44B)xw&tK?8>!L*_TiyDjvaRSSLq-B3-H}L$)3JMl%f4NHCgtYlf>2l_ohWmN(K* z-Jp_;>a5yETL=Z>N87U3M49LFLM(KU4tlvw1=#*kH(v|eDdV#XWl$`Cec17_iwR|q ztGu4pm)$t=ZYdponUigBr($5Q&%U@mUsxmkyLBx>SN6l)n^#vkF2w+r@V@6B2DAGjA$wW$<#uxA{kK4yV zT=Puiyq@h7?t2JfWbNdCT4G?Dc|DTh>PK9b!lS!00yA|(5SDQmCgca5zjZvwAYH}^Jy~ENocOyEH6|>9bv;wjgqT$l8orW;uM_r z{Jh`uL^vtb4fqj+y^ma?Qg0I1Vdl1elDDOkn`D;K3J&Bmg#9cdTP}f$6#*S9qr3Hz zVUgp)Tu3pSs8#ZRYciY@WfqO3K054o$Jw>I!k%awd=ko+$G?F5*I+6v#lF#BP(~CL6(9rW2-rv+Q~XA{#Zu6&lR0AbFU~ zkdW4Q*J#IGTAC-42P(jrG#TM7)k!?OVI>$xn-rJ}`XP~-=s^yiH@t}$oY|=%G>%B+ zYL?xq5g>ulm%0w$X(%_&b7K@ivsk zoePwjcLRC@L(d+-163g%8c7^Yq(zLT>~`uGzGWSYG+W4`XIaGTKSbdk9Ml2Q8779# z7@DQ=%lIx=FSNIfN(Mx-C6m$D>i|D{N9YuV%^AW5Ro)ph{1H zehO)KaK@<4yZ^!{QB|{1uF!lpBT<*HD_n$C@<^ z(7=sA(>WjyZ!t^szkIn`0{Eh+vu*lGGaU#E7rO9~2`Pi2wlnFeDUSKzXJvkys_~8}Z zWpHG`*Q6;&91>cXL5s)@9lK7n_e)}~mB)8F#n8^YiXzd0QfR@TT*v1ZX9sxlst_1| z_t71wA^uz$RFKgEYe5l^WW?W=(o7v=>Hv6s+HBT^RCh;zkxlU*>i`u3-o`JrvNPe4h%VIl1TxWor>#bwQ4!ZAtHP(irSfi*$syrEAaVme0axxZ&I6}YC z_QqvLSJRr~7%o1#I5#-xe?`l3I$pDXqZD~0@l*TU>(SAmO^FeuF`gn!Wl`Y=IHuP? z8#k`#yF?*?j^~N#_lu7SgGrRTi1gVkMHSPDocNAidZN~C31AwI2}e>TOpp4G3Ao@j zz)~%nqZcqM!g+q^hs5Jza|^V!9S(QYzC$Cq<}CR)B2@0(~2|* z;ZREV`SXpQh!jH+ z$Y&|E3*PCllqU|m5!DmF$4o1K!e(Ia)GeB5qU!3AOJ!!7Hoq_`eJmN;RfJfZ29w`> zR7WrM+uUwgi5bkfgQ#?6>#g7+48WT=rIXa-I4(*BSp2}_QA}LUt}b=ETE9bEJLmCR z8kxe=VqF@c6rQMk_oG2uZEMY$XiLB>gh!{N)^-3!K)Js-z?!Adqmt*#LbFG*=fA!4dn@4=O zCL|#4V4xeiXAS&__&uUtOIgK~g+AhW3HNV~PWn#|28UntF03g2*9VL5B(jc^8_#Lb zk}NVlGhmgqeN+3o)D}mMlyGvSoy42b@xbj|4!w5!^kqN*Hc=XfzmaXT?vd(#L30c< z0D)!|nvGaHt4=rF+FHA^e;SX{{59*5IfRPjzyPl-J|FQ|Rf2o#7y4B;t=jilzxA4; zHl9W~2>mb{CAs-VRxQ&Z?|*SVXhkyZi<2N}aPU>{{P?(>dfS?~1Z>(9#>N4z4yTf@4WNDZuANuri|!v-`$13cQ6xE5FBa3WUX1s3rTqA8?!lGx205;B*p z!MBXzMTSP7pJ=={BxRHdBi{J#Ha*G7zNQ#JmuF?vRyvUtYs2& zc%%_gACdLye-{mSJi)R9R3ypE31&# zp7^T(x?LWX_viShNH)juc*e@zgzXC5zN*hJrdPJ3Q37S^Au(q#*|EB0Bc!7rBPM2T zmtGNbJ4hCG3(4n}bqg^e-h9MAS}W3%HzHtlJfLn)L(|{`z8@IT?GN3ET@GVK=_ZrM93_oy4^Z*1A^qv z%|Egh35)p-t_#Ok;4NgTy?M~sn+;l^aJRb+DHnBWn4j1T&{6e=DUHLheHr#;R4@z4g^hS1T4nD2{RQ>$k=!4#!D6d)V?dE13C)SIT*~TfGKEs8BlX zG`m)@ULVxXCgVGm-()W*v>rkyr@6`|9j^sG!}SoHXH_)MA#&OkD`E+l8?^M-AuVqy ze;?_k0jCTut>M-`v>AY=j^w%s&M>v&qh4FJ#QHC~0LNfEMHx+Ddv6zwn8h6p#D0-w z;3^Yk*J41&gl3Fui3S}xgW7gPI@(eFH6AwC!79;C}}vSC^Z ze#t-1PN5mJGT9Ccj!!Mn?m`RIt=Xl`Dg`YAD}rT*m|($qwO)gc{lV;deoH;)e*^WX zpeRUPxjRM6h=MwP+;%9DI!a#5uTP+-YRn5f3+AOy$TAz=SaDFqdfd-V1%=kLMcl*v|Bd2x6MrD zGD5j3?h1UGPLg`tb%*>r2B;8ETVj`Uq=qn0uu~q21S>NU8dA!Bz?EmLTW`EKYQw+I z+i&dUAHDH-H-BUI-BI_Ay!}SrX{pFBTV%O|>0v5CNmcpp_-$-77L}K)e`J#c3H6g% z8jsW860ZhR4e59Wrk~}3$SfTGI|QW1qC6;eeMMhTYisIkeKq88Ci-rl?5oG64$P8( z8I|~Ty!NND8J_$d%<$xIWrinzl^I@_KA#Wn)6j1H-_G8@o!#2Pe+$}J%&u!;-MG{8 z=2Z{vJXFKFwY5&O%2;8ee=1c%IgU~D26c<-A7icFnl5Td2TNPhd$gZhOPfy$7&>t8 z;W2I#irbSr7`vF6Eg64J%pUx$LiS!cWIrF=KV~;D!s7=v!r#3AvI#3JwZW4Iw!z=L z^Rg)$(6Fhu@s!t2)Am!h?^JI@eOQb10)uR=VUMj9%>fPm;`V-de{B{3UHm*x3lJpE?{F`~ zJoop!@(xyu)P*fof3H5mvElhtFVr?Cvhd_?PG{Jp1w{gMF*9nMjKbaXvLL7ryDP-# zwQ*rM5amTSohBm^WtNaI@W!%KZ2_(?DW7QsWo=(1I~{sK60W%2g;;$Mqy!&sm+hOp z#d~IV!qUp!oi2yd_~eb8W}x+2TnkaT_tfUf50t55XCui)4Du=B}U(R z0YnSkrkvsJn!NmnbjuEa9+{(mb=Aq0ig~M}%C2zg5A&w8?3Z+uj3N~~<(l@1G0EWB z9OwKE`B`!W?NhMd!PG1#@3Bp>E1?Y#?-Zh{nv8fJF=m-HU^aw^nRhEt-BzP`2n{P2 z*VPBFlB5-~f7p=L4K=+0TAiEy_OVIgjdWaDbgYSU6a?2_IdxJI9G2OiDUf2t{D0?i z>_z;GZ7Z%cdeyC(@ucd}Plg$|r}YVt3c1~8^9hSV`7En7?8}%>Qc1vn62E3aZ6=rD zx*k#0F9HJ~2pg_au8U-v#73|aJedXDt|VZpli|ULe@IS1nbH%9RfQDQyy>9N^f$h5 zGsep1agNo@&sSFr@FFQ*Cct}_%DV@~v2diF>Jru1B%3xhNlkfO=#|^&!a!l|VKZo# zZaH2=p<71_JUtSQ6;&5Ls?v1i6`y*MEAQ4;luBdFzyD2&K`V=lWZiNo-Y-iTLV7*a zAk9M8f0qN$>N73Ahz0wi=;o`ZS_9>EBh^6r)yM&!otxza0uAWy1~7I534c^M@k2|M zg|7nHuR=5eF2&s~N#VOjnY*90?*od@Lusy=GZmzn`WUgbCi;&WwtFc0K zVNpaqt*#cP1YEH2lzGN_?v9zKgo<nJxXcCgyrx{LNS6AQ2@JJO zg~?Vyn;~=DtKgths}@}ZTcG7JOtf7^3^LJJ?$uQ~Oridi#+C3>dYI(7{g}w`h%j>? zr#Y97@12YErnkH+Mlh(FHXFSl+1y?hH+sQ2{<&0-C`E7AU>?wpP-5lq1?5zof1UNp zJ8q1C4$qHz{r`9D{=Z}QVRr1=+Q3d-UmK1N1_yqPNJrkA+vw^i^6nHrg=?&rg1ggT zmlkepsZPZT73R>{&o#+q4A?iLX;r6I!!rk&T*ra;+=eODaE^1J{k%r~F7$Zh%xH<( zwdr?j8HYv$?l*v7UzmU6lO4j|e|Uv>go;;1w#{BSIg4rY)xIArFE#Lwvg7Z-`DqCyehAjNFNZC$U>z+*E18-%z@|#v+qZG6hU{Hs=_kzzU&t%h+w= zmap6G>>S-j9Z=Wa72NG}RAxGC*ZY8~mp6n(6b46q*6s-1(xfI*fVZY9BZ z2ezYK?MN%TQWG!n+aA}``D+8%-^G(4aAEn|fi|L*eXC4iqYkFqf7PD9&)hYlGF>*9 zrOeB+nB2ZLfNSdBwFK62e81VIlUMH5Zc`uq(dQTE&z`aXl<=22{$|{LiEp#2)@hU* zx4{TNVTq-}tT3$joa5)rSq< z)<>F#?t71-{bwRKYHFQ$+9+@h~QU zTG0~!#juS=UL%?|h}y3$W-s@TX5N9*^#A)v10Q*sjBrUoua&%qvdg z$?I$1H`=6T0G9hNR_ia) zb?Vzg*6IzpMro(rN{;exbAqSi_%50CCPe}^dWh;?GR8(NOj{-Yw=i1xG>Lyn9@N5Q zj0P62*!m~09u#s0TiV<$Wj%LGnRi+RuK)Enik06T1$l@;ui_@SUU;3`VO%8F+3c>} zQTyh0f2poX>{96+S*0ns4XkRvOjJU8J68!*Vxs_**Y4CX;20fZx=Z0|`I*h?EqAR% z2!v`0Q-iDOlv>CnOb_KFZ?O+T9^OgpScQ2grbt-BbVho&Ls#t!niYV~b}lWnT`dPv zK{YOA)uD#=b6Rm=&Vnv=sRe5ph3QgCYsCfzf936N6&2?@&e-?iDnVE#k%Z#leVskjQ6tW2mZwSPBPv$zD{6x`jpvAT~G7jgCFpN^2-xyY)jtm$Y>N6~Dcm+bhSrgB=42e8kg)qER3m8%!{mO~8r@mrl<%ubnLB~`Olc#ZU!*?s%Bz+J- z%Lkf)UL2@9(8BdMNE$lXz!Hhd$b3>ae+Yaqo5hps1drm?XNl(a#OuSGbUbQwdIF#j za90*YxpY?=^Jw#ea>)dM(>*K%XG{AA!IMH@V!zTZE>D_=SUlon4O43+FJGT-lil7z z{Xr7OiMhDtTytWUZz^XcOE)wY7arfEDsE8~lVv6~R;_WPt@O%ctNx&5dsupaf8#){ z$<5*9johb+i`F^TZJOtx1+9Y|Pvp?g_0(3=qvly{=!#T}QEmK+)MZZHfA(3WLvwn) zGedr@BkR0Y*%2Xqu@kCB(c<6eSN-`51Xx6^-jaOJJIU;Bu7#9&&gVD}Daq9&Gc=GB zl`4;KP0@;%=@4X_)A(d+4yTF5%@pkUIiu*dn9AgiN-IF23{QuP)4Nq|f7c!|hE8yJ zdIH_nKJ5W7H{Z`WvsAf6UTp>QU@9w_myZ=qE)mIj#D`0mLLa1NZAdVlb4W&d#B@m< zPN5>{N03(GDC$a4%s#e|Vo92{1f(LFBsQt(Nz@7_O@C zX7ilbLYJ5?@N;b*cjSYprkB-4@kXzjfmhsE?|g+z*@zGc>dvC9S15mXN0$C2`Dk~T z!6!)3mJ03sSoRI)0BrP7UNYw*nsiO^+b#I9v{=VZB=aEj8MJn@f8;j%B{_kh1T!5} zHvP%I(3zrYHtrN5?fT8y+0{AMw#iju0dFD8%2pQG&SWy=K$*%>C3kucvMvQtBcs*d zR^9x;1=&jL?tl&c}NgYDc= znErS6q1Q%sVyC&|e-6q3jiuFUwYyraq?NR~bUp;G+h_1T)eWz{XH{r^g@uny_D%+! z=`aGU!h56#l3(E^SD1Ek#DbGcL<}F?XhkrlmVwu+mzWnFcz}r!=Uy@En9WF=3f3bra!*p>}Eo{5PD&g84 z*D{@Dg_<%aU#JJ$!*kv0vJzP1GS1j7YVxcntHl1Otxo-}Z}=4?T~+e#mBuB7ac-aS zab&xSq#Mlwj71VzofxE>Yu#@lWVZ#St$z4!^ZtFf;jg+|{Ys4xJv^(s`p-So`oHRF zE7i@{HoyDVe|`6LRi(PQ<+dfgR$#F}uLW56cl*$d2@D%M;+ySpcW>~O>CpEs-*a&J zPRC!L;Clp-wtq>Bvo*{@KFNs`3VbV>N3#c<$ojjC+M+o&#+ zTJHc}j+INVL>Opx^_ID>X z$i+;l1&<_#7vn)SFHA~*rNc5^hk@2FYPlv38rZOLAxqNrZ!AD5wXYQ@+lNNoY|2jE z^Hp4pdU1T|z>mh2sjWlmMg_m~Fxqn#RbEO>`S6brh~b(Di<)GuW0?J?$V z9c*9Xe>IoQEOx{-Lv?lt`puL!yAH3i`|vXP0^J7v9+K>QR-bhy8Nwrda zXVoa+K0Zbl2P18@m)?-|vzdG8`JKnqe{tw+7&zaykx3@N6(-$vn&s@T(50n3aI%r4 z|GhUSDEA7GQFs}J&S{m_2n;Bm zWL!Bj-_oE4=yQk^3ZSco{N%#yCQq-kDTTcuBsz0ZJ2_~rTBgr(AaSs&$iX7@zBn8I z_^nawp_lVS_B{PQOE^I|96VS=^w2t!vauI||7V7uBcn16>=S^rBwu4&nz%=7QV|N`%7Fha8)}GqN zqU!QSwQ6_)0I9>ZVu$*KxwJ1Q04yjg$yfeayT5Ft*WaD-~sDax~vOb za~jiv#X+00C%LN@lDq=5xUd8@+YNJWhBP%N1%Ys1Dgjp^08R*cd~%*pHuy{YNxgtm z44aN&7>L@AofSF0TrRRHf3X}?B*Th>Gr}wUHf~q>M zYluZBeZT!k4M5X|iqll;Jf`-7-=s@E2D?_+EqkPH2pC+hvc(KC68}_cqV%X9O@|xn zfRl6U=m|Hbw-o%mf4IJcnp~+PjouO24?Y2EeU)XAff(W2Dpfw)jPiVyKTB`g5nEg( z!L{HzzP?P$-$MewDV_$3O_oOepr`MvGb9icD$VRgL^D0lavp?9!>Pk*!f4mHHdZ?+ zCa~^Nq2G?xvrQQ)&g7aMfLZ`@JwtA#u1mFHuclDKwTM4~f4G7TZdT&^S=tcTqK%Ko zhrh-esoqkS%8BV8WC<$Iv3Ka;XsQ4K@uMhb=It&_q5~m3T?jg*8t7bK-x#qoo*}T8 zwX?mUkF!#bYZQ!NASN@TemFjS-)Pn(gYEoIvUb7eri0moTU5#g2|Mzo|<-;H4Po$Mi}d#gLoO0ZAZc23z$ zGv0b^MgAqcx_)?iHaUhWF`XDthuxIsLRT8bxnfzPu#0?gvjOwC{;9|{<2Oh>MI<;V zgCGY#!EEr?^YPKi_ZMxJ>9oAe>cgy@E<8p`+mRzwf4_ACu){5&RK1$%?e&jqG!&8w ziO$QbwHoWv`%G_OXd)l9Bq#N#%{h!jq6upX=ghxZ`iPItZPyrW8)gXaWj6B+%=i*!q&tc ze=FXHf6oIiYHy5}GQFyWIRAnIgi?5C?+=AP6FFxh7d>>CGWB(LZahJD7N0@6O6OHk zR>N)nP@79*C?n_L$MNBX_Zy(ElSRj9FPZhWx`sOe{{Sk4OrpEaW~%i2{ik70kfS{-DN`W zcsaAT1di>;ID`LfRRIF*7gYnWCW<1=$f##}vB1AP06904!8$c`!k}?ey~eoSiTjD$ zkp6hy!zHu@*~8e~t61n-`V?11QE8RhMl^dADSh3Qjp!ONEAQwUH8*0bUvx+ECuHfj ze{@GP9yD~v#;zrd*2AGXqs0X7nz7-MQ`)I6>ogN^yvoM?0~rJPi=y-<=u%&$PqSiG zlJRLa#6QyN>TEn^pUIC-B10i4Af;(iYWI3tY&+y$79lE1kSHJ-HZyTyfzqp1RNzRh zQ#Q4UV0_(`Bb?6b>pY!oL+PMGoIX|3f5~4dty&3!8U*?Q_%fFu1F>REE`+ss=5p~s zzF)`;yTl8BAw|~?O}JzNx^+>224vT|qGhRPX%~%te3uN z&ixG|YWHPqRm6Cz&!^eeiDf%benM|msmsb8{Ns5Biw9F#^vyT@;@p)Pc&#IAe?Tk0 z!tEP)p=(2gT{mlEg#kM%E=Ux>j-x{HZ(GBtwbTU+#?z}G(;GVvJJTf&%;=|57KrhN zTqcRjFzf@%uv5~3Zu}DL5(SZ4Q`qO?;nQ0R;|FmeTzp%Yl_lP;iM0L$Tp2rG0TdKu zYmYm>Z5(78&QFi|%Bjbt*0-C$e@>S=$7$;A1{l)8tx(5L)0t)+!+nwVs(jj($VoqIKV*c zmo1CM4QvW6VXub#P*YPyy%MllcS&5O7CeKSt^il59xt*dSG94)!iY{{QWU^RsV(=c zaWbs^EN04H)_6ewcb|wEKbU`veH4_lhYkF;H(V>oeaaG#E;I+ElGm_-LO-PqQA0EUcM_4ar!8bozHI% zR#WHeaWW&$;LR|UJ!zGSO3Z0JcL{--N z1v5ARNCFUVM6%Rp9QVi%NIm z?!jeIEOg2!+9`|~eNv4vV<1gh%*!Sj5SSEIJJW^6npy!xe7SOPgYe|xK*A40@rkU> zB4hy`@#S_xe|zl$2MD2<;{rWq&?>7L+riJ`s2-NujB!}$fq)8CrWxHeXEXVN+fd~8 z{yeOQbKSN5CK_y-)_k?SL}JhSbm?qsk~OV;5t7Au(g|#%|CtcyT^u;FAo;h5+^2ZPUJjS=i)te@Cc`hL|oM#xdR5)Vb@^(dK!~ zCr3?2&%o|cY8`r`tyGN3f)>#wWg*!oWnLeai|{dY>2~A29fuDEsz>Tew~e0Q(mbp$ z<~kv~`HVCxQ5RR)a+6Ge^?S6Fo8=PLNzS_MEI&(~8o~1F89YpUj3N6EY{MQTZQwrW zfC_l7f3z3jrCS0I*wqey@#V=GK_fpc*zNw6PN<#W*Utj>m)ClY?sa&+Z8seZ57Tk% z*!q#WiKqmVsHUwxkwg2U^pH|rtx{H!8YwJUOqvLp`C4Ba0V-JE!7`ij2j=f6o2f~F zmhPp+7?5(!TL+rfT>8w%dvmaEDV;1SImG{>f9<+y)1znz9=tcip9UZjpC~Pb=d=2o z_q$v5XyV_@?EPBmPP}fN(@NHQV98gP-pP?|oP`Cd+l{CB>iSZb#8Y3in;kkidco{H zITFle3M6YSpk%B~?aNkt>P9ZMaBz%a8a<;yKgFpKx_EnW1FCAL5$gv-5`+_TKTpg^ ze|1`E5F|JeVyYKkOg_gancDPBSU19TKxHP4g`1Rs4M{*o^d^;5iX;TR-K&ZqVzUTB z#PbrA(3hB4wWdEF%g8>GB0=5{K%|oS^uB6lwd9pjE?fI1l|mrWDgvAYrP>yIULJLV zj6kEdsF746QPyU9j_jl-Hqf@p{%RXOe@}QrX5T~U>iqHc~`MLBiLv+;B?Xv~XL5j(C{Pb=_es_U}l{7mB z4DheW*VY}2+2zF27DZ#Bi|mfFkNk+r4yM(1(RLFKUr{!R@VAcB)r*vdF?5xbe}bn& z4&1yK*>NF}3W(K1O8NPK{=D_xFTw+8T{4t|ekEnjX|MHOHQ1j}9j3Oi@}(5%`WRTn z<6kGvB42?#q``$~a>%UT2kpdBT!(Sx5B$%FslP&XKKn)Tl~R4xg1wR^$>XSCgVhQe z+*Oy$Op8-`6p_gX@O;!TEHO@le|LbdisE;k9LYdd7oLa(av8_NE~-4C{Ly-l!Yx$B z5%W}tDst7*VP6-T`wSrjTLv5~H6LnNFk(&nA(lu<~2I2Nz>48ek? z7rD0zz!o00p@I_@{%x%Ae_TQzb+q&jJWC`ylBj8k8jVKlQ@`%T{Y;Rr1kUnGm-S$+ z8~kj4{W7A!e`;PuzpJ$>h?E}1e-@>Gu^kS3+fLkolP7A}-aRGbyH;aCE@)NNf7^Sw zs%Scmh}V)hj@>$MKIP{F_mlmx2UNrwKr>p3SRoR*dSHjkn4VFte?C?3y3un}ZL)22 z@AE*^ou~(pD(`BKYXqp|ff`czAyCGz;@-J(g}D4+Y*}m7BsyR-2!{Q&(*!0<$(DHH ztV=Ll6F;P~c!kHtWQd_4lsggZM+7r;R?e8qah{BdQ%yQImO3zROcFBKbRuP%=434E z!ah0}xDxVE@6=&xe;SFYSX`BTI5BZUI#m++Dq?uHqZ$koyN*-#gQ6epr5S}CCc`$4 znsH?m{y@0WYut8$dO_5DLDMtHw&zIAWBH(VA=X~z+DKIz4kkd}HSYj?kMv28)O$k3 zO-K|m+>s|w8o9G-BmaC9w3Bb8KdS!o+fTBB@D|H6^<-Dx8Ou*c&9vB*fr+fh{%dB%0kSW=9H3sa~lPBO$ zu|EQTxHQ2H8fG|RY>KnjngMxaGU)uP426AwZTlXqB+ToW zEHCGGab~wEe>F27pJBhqp2!Ou+?vCVix*ZZJK>MTg*dA0$sXezI*H4Y-Yzarm=u>R zFU2MD`UgCi<$oTZ26Si6Q$4MVa@fe>_^!!lV+IwcIv`Ak20MOm6?YLE*)~MgLvEDp z3OeaIuE%&i(`8vtxW)O zL$Y;fP+%uVO$*~rrZT!#F0-pgz9cZf?f5fXHm5p)VkcBXFhL3}p$feD^z$OC9UQkV zR@}`Wf3HEr=&)Dr;e_0)rW|-g@IR~=Le$OLAT&m(!@kcnzG}Jwv)cc@V%*72WO5;$ zkEbeVo(m(lyXq1y4X#vEbikW~!HK}){**}aetLziB(AVT=ie_>7^4>~#u$v?|BzJZTuraIfUnq8@nvK+lC>5i(V`a|#3 z=!p9vy_UGNRKzg9zXubpQeCHiX4k80SfK*8W%Z3*_jZ@&lYGsL!{^gRoOL{LE6m&v z9Ah0ka+hbC`}9#;3%hwUPb-`d4KbC8fA1Mo`ptTUb7W29niqinV4$9#_63yyhIj9( zbXeLW_m~|PEFxPKgHMVYz8-;a>Z?(DSq)sy=ufEUt)`5dwv4|}A%or^EBQn)Ky(br z8d+{r*IdsFrJOe#f_(TdKxP!vW3ft8ke*nKE zm`K^TGb;Ua|BOoi?8K-m$lepD(my+LD*bair}(Z=%eAv&xda>LI5x3&Pxjn`q;9`y z(-kT*EB{!<^Rrtba1;?VMzX2^?xSU~^fZZ`+b$gxACW;0A`0t1KoHwXKOZ)lCu>}M zO0Z@AuksY(U0{Q|D3xC4suGpee;ht%F3(O)#D=O1>}TT2Ec&QG;TLILlp}SaYYve> zwZ#If+&l!vMf^igkfZ-x@>S#Pxm6=3%UlA?0TRyu{q#!X{b}L}(<%r=6j8p#(#10R zrA&ueXwtfL{1}tXouC|l83ACcGn{!_s(iGXM?JEr6ZLnHoVbc^ll9v{f7Dx2HRzv< z!!M7IzW@68oUZK>m|80H6-ab)n`0{%++esb7#gtJ~yCxjY1 z^+C_Qy`09o?~?tyi5 zzKjAr!2d!1rZTNDOF{-&2;Gf2P zO9{Z(pN(*WVgMH3jU}c5aqf2`B(<3V@nX&Kn~cT^ZTf9N|)lpT&-cfK8e zdk?aTXg@@;i1hUYhVG%)rV)Pdi%>=y+YTA4qO657<79vPQ-;6a@Hq(gM#6c-0&!DR zO>yOp9-CZA^^eF5?rXY@lp`WeYDb(Os>crRJ9JlwF_yL|l^Pplu-6_!-S*W0pmX4` zw#m9`7A+U2bdeGXe-sn9%Mub?h24Y%Xr+8aRw$YsUh&u}8UuY`{su|?gdopD1ZWao zoQtI5A)4hPF;aeG&YGMah|C9xb&oKDd}fxbO`;i5A2ER@FrgPYRpcy%RRRM=}sqB?01=Zn+hHt*kWw@v`pBtwGJm~w5 zU@KG}%gT$|zKh1kxUO}YW3pOg*St+>&_en2iP-J*;nw35dU$BW6duDo9Qvd92nasH zy04+eN?jFjx_dRfvQ_YrFMbz2t@vSBokBkIWh421e{uYs-~gF@eoQkNPzN>YS*~VT zH3hY3JN(5``mVkSNaq)tJps%jUZ+nNund&uHSY^rg8ArJMsJb5 z|G52-jyHm(Be7a$jvx za&9Z8e{z+pVuc$aL_v$%`~@pL^_4oxN}k|LHK`zZroj6tHNJIWfykbOe5ng2!@dmd z2pVzUddGefY0P(&8yBb?K3~O1o#HE0tFp3DrKM(d!{H%#`7kc3W-HCa>9WLAbx#Bd zLMhE#UcPWMn~pN`&cJwKUQ>Fjbu%dTVuDMPp!_M0xpGBpkKtv&W#Fk-$*#mxlsaKv96!Y+ye{{UmoN>bHoDx z4`V?#4}n-#L!N3HvIA(ZE={<+#X5E~e=yUL8lfQD*m_ZgVO|Rk2?V*;4vK8S_9hg! z=GU#5v_$mVOX{<^&kQCjaRKViVunGeok}!dc6lDLOWKOp^f7sF!QU-96e*C@o&ell zD2t_HE%N;V^Q9U^nzN=hzDu~=SZyN4#;_rf&5d{HuJFGYNYGQod`+36sJmG$x@c*7C+`F)Ma$zMCSreG5kb{qj8rY@5 zGi3adcc@y|tExuL=Qr+W>hcCVs8g^?1_Y`v(@N?2Tu+f@iyNamL>4y9KYd=4-kugkIm>dgdBxnd*7fu6$9>G)Je;e&jOTtdKP@k_ zT3oTIXTXapLvq&B(?w<$vt}!F07Rw@LZkymA_soyu7N}Ao`9N!WBygKpfQUmY#WCB zGUp`NLh4@p0?DPa75$pivpaObC}DsPiKKI&3(9~PehBt#p~s|Wf5r+0i}_4JH>(mA zle3K_=%6n1^&Wd#W|#FD=Oqjq8wHvCew5Dai5JFOmd(SC`ZbK@e1Ho87Vv=q;hbRD zp@xxayFyW5Z`|35%W+rt{BW#5NXv@R;mP^o*T+;WvI(5(n~m(=yw0oM3TT#5drm^! z0-#1TAP)4j;PM~Yf4I7t2VAn-KRdCiGj{$bX6?>cgeZ2#(nWOr@!s|*cH4>eYCU+} z*<9>q=4Tf~JCJHXI;KPK>^J&|+Zfrd$}2=^mLfdMw!x{}i~XQxRNkUe+fS$VGRfL%hQo7XjGp+NWFxYX4fTyrD$-G3lYpAf~ZLRm;efM2u9=lMd zrnZ?~nONcSe+o|7q1-fuFZZy^F&O2dq!$_UH)>U_mdm27gDTxCtJ4$!tNXR8mvXJ@ ze&h6hQ zjkEF+M%@Fzhc^$~Z~NDqy?gKE-aEPXPVT*v|Fw4_e`2-<)=1vXW!U1G?5C2zFA;5M z@JdAfHlKtCniD99bk0Ec^vUf1;hYFQZE;Pk5N#CE|HVN$*YlNL0GGU3%5_@OB2AkA z&hNCE;j8n#>pS;eM@`4&GN?0XLEKYZUSlsoRq7X-=J3VZv}egEe<%BpHZ^FBszsF6 zLA^wuM(OOFejpn(N<-g^q(Mp5R@lXg$=#*@)G6;@zbW_IVxqOm?T zf1S#rVKz}-WJ!}~0l zCH_8(C+BD8c0cKL3Miv%Flr+NcBv3t$Y-2vdaF8R6lGShj@ z6C$4CVX<}`qr0-R$ryZ{R<*e31Xo4UfAI2|n2b}TzSIDv<9dw{+ewVu|r_`{iY?uUEoSgViEp>^R-H~WRgow?I&+%@Ih8~1yZ$)8wfx`1D^n{YXiOPfE)8$wS2 zylg6?LZ+}>RmotF_eLM8Hj$XG-cCqGne$y}Hd;OipO6ld}D#lL8JZq6YZ) zmAFmzEx-&)`b`o;%Si2K*yPUBW7td@#FvDv+~2smy{cf~<%YxqFQ>me1Fz4IwMxWE zJFwa}7y!~n9ZK%U^XEODH_I#5Py~|u@eg~)w%s@leCC0F5ZwpTB{j<~@UXyv&}JcA+MYJR0S@$d z6J={i<6=84fx{Q`6U;>yPh>Yv>tul~2WYIzXf!h#jik{Cf5|%-6K;7$tgw@KoXm5o znbA+4VEwDQV|_VI7nH;hf7?2@LCW-K-7Y*z7^Br1ET|zaRFr^Mgiuthg}Jb+EFaWa6# zD-H!P`Q}rz^$!LRX2`4-NFRn5{q*Prb`pD_V~nc7Fh8enbI?(7e}wRsvOF7_Q&~F4 z&b`U}Hd&0Zde+AhiM+ENW+WS-@?ke}6 zGFCX-Y}>;|-RNR-f1r^>yqoEMOV0_P%$Qbt72r#F(_|)G3VPU=+;l~aO$q$YL59nM zlguz^GPmK~A-v;-4a@a>ft`=%)1ob#8aRK}ENWnh4qe;b1|9(Gfh*~#CCn<+)l!LS z&DGFyt~%`Zxnqy4IPjMe!BLoWs4RjS2K>#C}Zug&i+hj?71J|IzM!liWQK#z^#=Rq^^9f+5Cv@D&2!ADPN#& zn(6T!7wObsvsJiM%*R;*<%D=0`^;ZPLh@W$6psEi0?MZS9+Hp&3%Owq0EiXMj9 z<2MvDS96zie|0%rR?N>t@y-;Zc@0IVX-At&4koY1biJt+o!6h8U>C6tFNc_%c}G>Q z+PjWGD>dDU`eoH7T2>z|>ot+RLaU*>B(_|(u+^IDabMms%qhV;Sbm}#Ra&dQ1FM&% zR77IzN!@}ns?jrXt)@}92}YOE_VV-iQjc+E*y!%&e|i_l2&!tdSfxKrDsEfL?7hNj zCRmT(R^K!RRHt|bGjh5J?W&4WZ?1E{!>5zbF?M%SP|Y;dofH)JbDeDkXt<)2{G*Wy z+q@2|)L?u@;#a=oRP(xu*NdT#e37~{6n0AYYZRz={Q;UYzs&Q3wLu;fwz?sN9Oqz; zPN(>nf6j0Gl9h`!vfo;H4CFtlq3$oV++S$9ztHlEUTC?0&*c6+lYe_K=vGbWaD&nt zx$ECBYUhEI4YV)fot1j7Dh}w%*>B!IcGCJ|Cl$+$?yL0@3QO2lHlACFI{lw|38ix7 z*Ph44CSFOwwEG3r{Q~NK0d>EC`j0Q5?rr-!f7$l;VHLt9%JO?JcUmB{^zzGQFsN9i z)V%@2x%Y3th!VBO8FzajhG~8OLd=G3YhhiBnFk&7KuO`O@?CHLlyvGOOQ7a-L6px` zhYDV1;1lr1ZAkN(t!3{7P@; zf31oCQNi1n!KWc1vks%UMg^xhqit3()Q#~<^~GY7xWXQ|%oDbn^T1pCGhaq^`rqwk z@i@+QmjF#bvcE@h|GSg_@E8W{*AWaTULh5b+O|jl$gRqQy@iTKZIy7SJ9>vtbs>Di zdHu1{HGK8)_bcl#{{Pxe+VURKz0Z3S<%oXO>wlgswd@3M8)@hcFHVC(MeU3H2mIk7 zvwjV9`5J!a26K7yH)t9LUc`oP9S)8whq&|+TRhjO3Clv+w}|~zdEd@8 z7DQ9)E+Mi~_*c}A>|;mB{FPGa#L@u?g;V`*{huQrXkg*eaPC?i5Rn&L&(h2_M4%<^ z+|9uO?a|f7VDx!O&hFwe0%COmif`J+G=D306BvIUD#HxSb9^s{;@ z0PC!1bdTvlfeSW;ZQEz0dWzC)v>+3bOSD)o5h3S2-4fHv z@VlUfZcTllyeBmRw3IGV6Q~RaH;m^Q-y?N{`T2r+((Dcd)815YWKSms<|U=CNoumq zEIBtqV?vI8F@knXR$U#cPWpfIYT{se6 z0x~c(LZ}Syb~Ji+5mzf282r=q;?=S-or+kkm5(dROt1awpF-q=?RV6!j3FDwu6+jj zgJxJr_bCyoKnBcuQ06XV?n34ky!zf5&NI{?oU7l+BSXH+oa0So? zkPzf`p6m9rJ4vFHcPHpRB*@TZPhh5=R!rHWct)=J^u9y#huwhe@$_u78E!IDzh1n3 zZcA{YJ6;uKn+&s+&wp~5lZmwYT=>MItPW@`n`6ZS>S9$s|1f=oU%Bg{-_e4y)N&I$ zMU?pzpM!*`QD66lgQG+B%u;}gdwS$W#t|9o?U&N4AHF}vSm}DeLSb($FVkb` zdh=(M0kmoz*362jwqs!AX_FlqFpnRpw;^Qp`*wD!v=4kb(SMfmZ1H5`IaAWIib^(m zCWRkLxv5%E!RZ5GxKMdXRByg;rl;s?bHw$}%bD+AXsh^QqEoW0WQynvH^#CZG!)o7 zwQYo)m5r=rfYh2Gbwv?C=i?Bj7FaOcQ|#Y_7IUf0Yx2X>HjQEJ<*cbT=VIMcw%3ZWHZ<> zHs=9NP5`+Xw|#uB-P~+o1*C(4S>6klI#_P?OZ&9m<~lp*4SV>CaAaG}8A$%41o)FH zpmv!Y^~8WWcccVE3b%&+j&4XAH;cV2!bEJ(Gm5oTa(~pZhg;aKd2Y`LKKT>fW$1lp zi@{%NG>!9S`{Bk|_*B10X!b8}gwr91HD(}d1RW(e2aYchQF&-tR!Va9sOE`?anM2) zaG(N##tIH5m4RMai)c?3U!^v1Br1y4X=+UsWI9`O;#eNKPh3osn9fPsi-mb9xzHK6(iIco+hE(pMEV$5 zb@cof_)r_|T-g+76b89PqU%z=P4Wbc5SsuGjo_w>`~Gs4Uc=FY_%`lxqRw%emp{MN z(5~}YQ+4}IQ4$cRvRv2Gtm_5Qmx!o7Ie*=JJ2?HO_tmOW@T%}&e^nuP-?VqKs?gx% zbl6=5=)09*4!#;3erd|c9jcegyA|uIBf1XYmR0*Pn+0sDou|_=Kg?#ltMiW=8O6rJ z2?i23c5>9mmnQIq5Wt)I-|#(*I}9b(^IUw8_Yx3Em1g#vFPMp>)AIy?x!R7KY=4Z2 zsnX}MFWYLe?oX;}-l2yQ_hBx&O%4fR85$=e#C4XZ5yT-V& zexIH6TbFo#`>AzSlpen#g^LjN2jK%aHqi zZy#M{&fwqS=kPVG8U|sh=p#D#% zg1#9al7#I|3zCRiBHn*#h<_aSPEQBl_RkLb&-#b^txp~_Og6D!GVCMdm%mKf#K15^ zgGtx&b_mn$|GgBt?O5o4+dJrQWYwTcytK2%6*}1?alrj4)$^;YwTa_f1NoI08MV}G z(Z;d_-3}rDOGD<u12d4EI;W^o|Q%S#<+iaddQR-EZL3JX6+R~{dfX=M5#93Wjlee!+g z91bYN5t(wp6UE0j*X&}@Hl(gvvW97II(?bqg=KFP^QVO3Y7do4IbnxBJ@&Hliiyhi zZHmf?9{<}#1yH<;s63y}^(!kYt*Vtzr}LLOZ8Z@V#PPP$Vt=iQdl^|RBOb&)(d@zg zSA+iH(0ozl5&ultg)q}2om>H44TX&XRoW$-^{)~;i>*hkUI0n_I7H$_I-dJzM7b)= zgI48x1@ymncH#bkdjsn)&hIMVCIHMKk1iV0odhcXQS*PCu!jwB2*>LTB|qaN94F@> zw}5qF;$uNA%YWtksYe<7a!==UUWS&PD@n$FWJ~mC0Bodbpm276sYl5q8Bsa%SmpsI z002)42jg=>hk48;{7T3b`Z}K32cO|SdR*uokZA$e6fOP#oe0QI?8x*)XBrW`(8YN= z&MAMd@*m8?3vm37l_U_70(K~UptNj0BQK*18`vqP27fKhZLLl+V|U117yWXCXAAO% z>e(lMx|=CnlRM?YagHehT7iXGL9vI^MBEYT@Ldd_!k19;T@C>^Ud-Z)1ohcMQOTLU z4#WVpqRP!xhfetp&FOLPyF(*hyJeCOh3Kn?5A7@9JUWP4v{Ko9_|R~ntFoAG@g{|h ze2*2MK7UJQ<5Dq_*-V2{)Eq_9VClI^2r!mXs59}6tDMr9?9pRRScEF3>R0evRSCZ- z#C_q0knq%#9n+Pas<9JEI#}e1;U3khns`rX2DmXlk^*svUn(15?;{n;Ej((IT`F2p{RT2*u+s@R?WmL&dI&43O(DuvpTtfW!gc zs^EXRKw)X672vEO+2HHrqmyCpaQIZ=h4|CYkG=sn$ix1({S$TCJA{koKlBlFZYX>7 z>3O6P5%?z_CI|?bui?zV`wlOh~c~C*(Z9uiwIG16s9`;XLu@=HEV-;uE#uI z;Tg?zVHMZcM@Mi+Xh{(0R@p@APzFXjL0P8r%an~HmPVuJ_*wnuI60*hV-rfull&au zqUu78(kwXs-xcDVE|wdgIjsV)kgS!K#t(fm2h zQ>bv66!DaTCaBZ23nLb25yQnE-Ic?TD}pRR3QfoOKa4P8^bDo|8e@`t zaqgt?Gh0YBWLYCj%RbQD{w(8i>-`w9XN%S4%I(<$?h~#xL!zr?! z=>dnz5geHAVa5~4U|NT5f_Y=Z_JVyQnj=BBaj`p(56Fizh6;oxl(xA~RDb6QrBDI)w(HPYztK3G`?>Ctjyn^7pLpk+=QZYTRDlMfuI= zQ-Ce$VmW6iz_b_m39i4ltA;ve+0ysLs;!J&?MopBoML8UOvP|cko9sg2 z7;WgTqEt4T;F~860x58QpMP=2;f_M~JHD2(SXb*BBT`6bp>rmvl@3*ILB%hyLP0@u za?B#j)taXz6dyczfN0{v=Lamy?K6BEG{?Q$>@Qi9oFVXs54-fvN+Ae7m?5yg*sWM* zfl{E{GU+2Qtrvu=2^2)l>oHyRem4arD~S{N({2#B?Ey}nBzihlC5^w2Dq8uUqL`mhxfuWCVwlGvK3>~LEYQ~Y zXa`ewx|kLh`bCPEj;)(1-qtKj9@%fS$FLV}7T$zZn3;>wJs|!JfDStvUdUYYnGR1g?uP(=V zC6tNbt58NmWhKg3XeG*2C`6eoznXHCXA6QkSyK#ie7|1%%M2tT_hJx5l_P@tUP{1T zmOlyYasrdoH0Q_}HitPaG)LqRDco~Rfyysnl5%F$YsQC#wv$wh+c|^_=~7f|;S2qk z9qc-n*DLm;oPQq#PjM;Y^xSPhmUf2m^C_dPvknyrE}j!Uz;%TDbT9*@n-m>N>{1$U z9f>_-35k;FeH0Sf zw;-v_TWA)%B($fH&42pB1`Ls> zi-z)RPE9;wLu=*0*V?q>{h#G-woV?|FrQ~&sWK-_5;SDD5)5)I@F9lD#MTL1M*P5b zp)}lp>UY!*RYLC&37Z^4XjgH9=)VCjA}eo(=KjpqSX%)n1s}qPO80Gj4#@Dpp8@B| znE8u8EPr&LEuF>yJ-MZolr~6t$-}FGNT~{r5Eh}!en|WZj&W(p)_NX!(ejOoK`L+& zA?;)(8P`GP8O{?Djd(Z*({*u64w~8z%-<-XxK<7*FmF~QFu`SQvy9+xmtoYTV3$n{ zndK`;R+V#BGDp_aDnESdc7NIV*8K7SFMrL#R+?#6}Ym+UY(ZOUq^dxuVq z%LRA4>_z@0Lx40juvs?0RosxNa$#8lPW@2G`Kn4Ad_Q`8!gr zO3Wbv-KNxVi&AnpO-fIx@GXa`;nqYYOb$NlLxK^Du9Lj6=~4;~hScV7GYf3MUVkL; z+hhtgD0sq2k|ny2(wg*@?IseAV9hFnD4Xy0uE^%tfi0XSFSfg$Hf>6# z*uF}>hzf=^4Oh!0)|~5jTAWAfz&;HQNwG~M=CE5o*v|G)7A&lew9o% zZnKnFL+uH+P>N)UE4V&8480QglYhihL$^B+-T>M#10HRg1CK%$Jd!-{Mb~2jJ^@e5 zg7^YAHc+oj=6b3+w5k3mdZdaJ2g7b)Y9s~zDRediM2mR#YaSV|#|)t1f8#OkX+buD z8 zrmPU=e(&NUZI#LhaGO-d_5_tFMN-)nT%XGJ?n$0z`K<_i%5__%v4OcwGMgp^rEQ`l zcDZ;HdaFZz&k{9|Vs%v7Ue%eQKAsCxabn3+P;0jJ5}Aik$V7lvlnibrF{k!UcLV-j zr>xwTZfZP3A6Cu*ojFcMaeu*nPceG7#*mlJc%#LeC>b`?$#?k?hR9v|(4%xVwy^TD z!#&sMifShn=XP@sd%|kf<+|HXC+@YT(xi_av{6`J9 z+S`@}7mCbQmz~t$(X8t~n0#WaafTdeH`cBldfk=dPuwsVo$JxB(0>Ky1+$%2tJmkr z=-jeb7o%utcrm}mI;XdZ(C78Q{iaKPkar1KAV4lVGVVi7rB~=#1kSdlXtw3kFl=R; zvVrXhIiM7I2nIN~qC!4g@@-D2n;cLF(G)$EPt{bp8?x|UDXV`%=9Gry_(9ZC$h;w9T;epIj26?la%J{Hy^yY zhZ_LI90w$~H{Zy2RNQ-$9=s(8pmyB6OEmz0+hzxyq;@U%;9Qm(1G>RR_-y3%UE>*V z8@TUG+h)b3LGDpJ;RTLHgcNm2-9madFSy6V91`0*Yopg{gn#xmFSFcS@FtUJ(LKo& zJhAke5N3vDa+n;Y^wnl#Aj%|HLQP zr;=`36jg+<$$zXS@^-VdJy|JjPc|iOPe^W_ybNi3(vq|()t0zoei3W>2LYR9^zxoOD?Hyo5+3H!UUH+BO8GWLvp*>jXvGR-%fut;$)q zIJ|IVyE1PxG1=ESmY0Kk8BnX-G7m^?)zQzk84PQQjeq2ptR^`YWH;fO8svV-8!$4P zYwsu{Z$X*MRev>bsFs(oP|`%*I#p)n8XFR`|C$;6!|tN;Q37qJ7dS(7EO`_&>>p#7K5nUebP zx1k&BynnzI(1B=kBWEz{C0pI%qXx^KfA}5fHdj(AHJ`ppo2hUTil;?V%*VIhk8zWb zeS=U9S3_-sM|hNET9KS;nKjjRB_#t8xQZ;MVZj%<{#e}19d*N?F}MF`aBn!p&xa2K zGcc~cZ0lB;Yx8$Gr*|DE1%4982#t#9OA;<$;(x^o7CXT70#n7h~gSr|oOd$6&FZSOV;%V73x zn| zLEalK9U`1g`EvR445HkP=$Pt7IpM$+tAEB%w+yYT9;w~xE?ndF<90hjH<~*w^q}q< z{7wB?&}Hp*JH!{jH`F5rep8oT;0^M2dqkJgH`F15eN%rjJ#M!*Cwjc0z5wK~BXrMy zT|}u;hw3&S;!w5*R|%&cIYrD^2gRn6QIA_~P>Gu{1yZkrXEUC!hb6$g8AsAS>wjR` zR28m=CqcatQw}1r7OGUEeOw9b&B$VWi?vXN^6euEKqZ=L;DR*We1VYfs^F4;$s=SS zi^b}k0P!a#Yn~>K2s`UAArthCiwSSyN)>YNvghaZC8ib1wi4dWDLfrvuI(1FKRkxbP z6b83ir=rIOaS=T&AtSe>e7cdc6|tmoAC7$vblz17hefH6lf^y-&Ocg1wONs1s9$s( z1kln`>O7{1Vtf-kh4$k@gj`h*OOdtAVp=Y4sk(ZOJ~wfe=sa>2kNJ{$seh0@kFSz+ zo?!sZ3r;j~hB4gSsEc;!)U2f`gF-7}Fwn^3*z8vvmde`PCXYs)>7 zFw=2Hb!NDe0nmURZlj?={eO|hiq&PKsKkJN3`FB%xs*=@`~|tA%CrQfc+)-}IB6=4 z=<&i-a18yXnCQxpJrwY##DDkAElX(VYr`)NP0h_TAres~aB#mJd~<5S`;>A6e8pIH z&qeFQp4$Dc>NZNi8EUr#*3sdnrTf<=ns1;_FsWU#FF8N4P z(Tg;@gfZ?kp2sVhg|a1wJmmYl$e&F-Ho*>`mJETi9E932S_Se+HAo^%Ej;^3K>3A% zpiiwnGvMADXlV?FJ%4z-TQw-dKKLTH??|aXZ4UZ>*gMwd#%bVZ{)Gv{G%aa(Gfa65 zy*5CBYfD?6<))J+ZZV{Bv6DLrbNqJpq1AdVJ9d(m*KiDXu^y|{?rOD?R;#d6Z<PWQ+rvs8HGluN>rcQV3}TACY!}2- z{@V_BEsiLdWNFEKVQ!(Wg^XVhY%qW@csNOVmY-qyADm^p`b( zbTMTh*<~qZ_#lM}Z*z_4h8B#Z_kH3AJ|FYyLmX}|IZ+w1@dyqGXB|iV)QBSB8(8d; zV202I?_NZgnq3bZF;2cVO#BGfqz(^i0~lX)U|5b%zLP-71JmhQ_uE<$AaT7wb`p=0B@x*M2az)$~iKx5mm#5t;`{*a;)LKFdxsJw?$R z?l(?6wbNF?Hvq=^!iIR5bLqZIlLK=}F1XJt1mnAm#qLEl)baoL=-}||;_JcQn>G%5 zs53&)5`PDPanGY}ddoovHmQ~d1YlFl`-~*nXtE-IE0t5vAyBKNj1uRTMqUk~7Tq44=Y!=a=qcYjN6V5Jes zzY0>47&QN8^~w0HIKHT-JihR!9bY|ZH1KTIvRdZ(J&d|2`hVO#;J7ocHHLdF2B7h_ zDt}JlORWj&JyWYe*2t~)-iW4M8rst+b?)Pufni?Avr}+9Tc^kOU=6KHty51eX|*NQ z%7)B6P}7T08ym8v5CukQ8={nT&kObBpiJ9qUlluUOgNhj8CI0m>v^+XK8>Gw=q)6w zO}#pqQt~MdO_IfWc#$=X`3=;z+dQ^Foqw?LEW9SY{rLMd#*IKC+>iW|V{pJf%wL$Z zB#_*4Vq(XE0A zliDi|&tCLfX%2iINQ5>T3WMf}Ap9pc{}`i{xBrUV#%irN4rq3}#=_Y)l`+LRlYbW( z7?ipLc0)1vD`Kzmz@7;n>p(gc-I4$E+n0>Xzh?teXg-WG81Ctf7v@#yUN=RxfL&`V zQq8LAzIwI~moP81){U;@ke3;3!87JvFy3`d@*WgzUO6xrs%QZPqXywMFC&(N=M5jP zcLQ^WQf+9Ddq0M?Diu&Jn&ad#1h`v~LUkHkC7J^&xj&><+;ZLZkmHJi}z zp~rD{hgZ+x>UVc5w{^q8(Bfpy2B%?QArVcVVU#M# zcz8*!vlf(joMma&jXIc2k*lbHKC5J3Z0~m%p1FC#b3n`2(&{&gS?$qxpMR7x={=Kz zim%7tPSDz(N;)u@wqP^s{*UuXniXL2(8E_G%kC2<1J2HUCBz_q}g6QwNOs3N`roKwuha9Eiqb{ zGve@6Pez7;b%j{yvObNooNb{i407v{f!@0(+$)Wt=@g71;-cwlFn>~f&YDWK&?l-v z--I@$X*XLLe^s=|e;nRgRcbpBYE#V%)SqCuj3%u+E4FGfY{H(AFs0_cY}B`r?P!+#eZyPLJz~<;I5WOWJ^f# zs-m-50SS5>_O1%jcLAi@1HEs14tD)9y5A;akxBSxfj1yoTC{u`3W$se;%41Mdi z(;2ug73>~|NPlj^aOt+wC3v(@*^Wn+cbom^$VK8BnUQ49A39j3(}SYV&9S)@3d`s~ z8@0Rbxc9}u;LvRe^h-Be_9hAFiI=!Y=$fxfl$E^lsSY>6TWjF=p2rZ|2*KuCTP+MW zyiG}0;3zZyIhnwSnE8ssJi55x7A`KLG=ndGJ@Mj#yMKC^&SC~KD&TQ=bjI-9t|8&m z!=yW(KaKGjU$7n~cN`MPo7y#WqnpS+ND?Q_Qb2w>o)G%wr-bu0dS~CM_y!uyE1MwF zGUR9yKaJ5GrBen5gh06geW+r7dz)r6yk(@&c8?EoUt%!*5mz+?nzH?EL@MX6S28+m z%3%&R-GBEe!$6U@Nq>Sd%1l7ni$`FoGRdO^p-~QNYVInf$RgY-TLoEso#ZZBc#=i= zd^C#nR+bxaeHe2rGEn|1&Ts`RH{q$o_M$&j;(y~bBkM#uLgE8B7g-$ewigYhT^qwI z>dF#zldr~K#=MlZWAfso-{mp>=O+3W>6`@Zr>T!QatV}}(xtWZ%4{8Xp8?BF3N)SR z1ziWxDlFZ{)#&hit-}$n7iB}b3zy9F3GSVblj+zOL7t(`%#xT#n(Koyftu#q&UO%G z=6@SkU8?7C1{|^QFH|4J;oji%#i)CO_w|**!5|?K*zAWl+kaTe zw7=W7Z8>f)wMnwwxDz`Bk~!O5kT^PgbhLZ2e|oS#a49bw0tsk&haX=IKE|T2)5pod zC!gZi8}#*Pckgrfc#}RpJ~<+oZ{f`fOflEwxXBKtb6+_F>7i-#Ub@)qntYZGr#Vij zVb&uM-z#A4>5u8NX)*iaaXg*pw11aEpSXXcpO1OsqlAcWg6M%ENms7o6-pJ0lNl`4 zu_9S~>rX`rq&T!MTsRAFYpd0!T)zsqrBHMRg1~B(-}AY2s^Jm~gmVom!J(T7Q61q9 z5W7<`=<<57D0FiqFa1R80H;ItXyb}JrOPUfyMo+vX2R*-r-S{kz8IYJcYnuYm)ngt zPUi4y7dGXQLNw9KobKWcO_R)N(T_=lLjav&&J^EG<0EMbO}{$5Ecl z$TIQ|=R3P3m1g?b3L~``wkTld1@Cwx5 z3ZUyAL=j$B;yD)goVnfbT_I{ZDEBcP3V)zF0s#x|9+o|mH&y+rx0t%~v8ij$-;3pp zFP0wcJMH6NpTh0C9X{!|P@(Rc>W|^^+^RO-E(PM1OA{Js1*~b+JAX4&OrznHUPMiv zqSl$@>Hm7PtsZ^hzotfCSWb(+u!6E^t3+3U-CBpP0=%sXT?O_U8dTuvKg zzPX_j%srgmHxr|NNPm7Md2D4i^xr7&&Tns15z5@dmoiUBKgPH`%AjPH&S#*!^M39U zKXw%9GT@7fYCU&f0X@fN$xWQ0kK9>;^Ed9>_oBC5x9XeqN|bg?n1Tx%gr)>=;dw|# zW3$2k%&S_SsCXAdCkhVKsKxsFGmmmu0l_SqT{q2~cA5z#%YVZ(elkVJp>S2kEUrIQ zE(|cdm64n2KUG_U=SsV$Ih2`n1&hEp%C7~JsbM2RIW_6gF>|qLC7@KZ+F;t%=k;v{ z5Yi?D<-)~oV~`ar9M~s9@TEkhh6>n#Cxi95DC>(}ZEsjFtE*~lK~?+pMN}R|8x|Bym56##Siq<^*aXTM)n%^XhER_sK_8R*97oVHYUzc_pH%K4)wH~^j|F)_)-~jZJmbgdg#3fZq5ek8Qa`=)nW?9R!4q!THZ2sBIJ>>q9o>~yK2==vdmzWK`3}F zDSV~c-7>gnu}~V(GgXZ^7{W`rHuN_|nE|47mSKeY0Dt81EN?r4TP>65bgA9?C_3}y zZ|1o>cpK{DD)MfzU)qE$qYhZpLT`V_&wgS5t`zq8C?wA4w*EL^|;0O%ulNZ$)*zn!hcg!k2@b`K-l8ns2gOMm8oZ}fuzK&j-h4{!@*!9-l3?yGwp zVqRtaE;IY{3ZUK~=vDQURdv1WMu7dX##bd?qmmQXcCHsLL!2pP$WHNcHP%Pt(Bnl!p(=(ZwJW%WkxGEV z`+tf4Jd^YY+Y$_1PsVkavS&_mmBe(ZdmIlZa_MFS)h9HYUCwED4S|BIz}x*dTj_g2 zfxUABSx4O_MT#Q+CVn6wt1kD4v!Qt3;(C*}M#8Cpw`r2ALN!uQ`ni+j13W!;(oN;v z{l5Sl+m}1hH8#sz3NLnC8)jF6AX7350DtG}(KCH}2HK9fXOZxq`hM9Pn|mp!Uz)5P zReq01aCkE`KZ(bXHj+XJ)#Y>xsd+Mv`zM3_XtQT(|t3UeUD~zL$7e`@sP`nPt zJ^er&QF?BN34kagzezrT{=qErDl=7gI%QaVHxpYVszGD)Z(Td48Pg8e;wJdFLVrgQ z;xrZ@`3S{F_09IS+m|RY&nXi#dz*KzpgCc!ngD*?Dn}%KsBi@V#pwo?_OfFD(oR?) zS`0A+sXes>P*h5^h!{`^39B6JLn%;y6<{RW^uhGvFwJg;6ZW@)@fVh9KXN1c$JJ9@ z5B7mhA?~(KTLs$-D`BdsX7mLW^M9GF9QcDYh~|*1;IrsiOinZGUXrI1_7^IvX0&ij zRlE%Zb|RG>1Jxx|w|}L?-`iufoPv$IwlgGy7_)%;zz!GOkY&`P`8DDZaw?SXvltfT z!&zM1tL{r;-lrDNOI&@@H&rbLAs55O`qz|8#I9xLDk#Zb?b1?-+`D9|34dqNL!K!p zBHJiHBtNKuM1b_`1=$?udPWBrymZ^#H>;4XT&k`kMaqDR^?TudfPi$SjDVJZGETxQBpYXP z)v9-5*_b@qKic61qTYF66@PND&qnDdF>%Uu0vcs~mUGKX-%5G*$6&{p#dc+@wH@td6E%Pk?xE_rqtdlzVEUrLF-7h!9PHsi=u3OMC!ZWW z7q@r2vCZweLkpR}hkuAB--xmYxY&o5F+xTZ;ok{4Q`UR%j^?{WRmjo7kkq*c4 z_+Uy@E)MS(v^j0L-{;?bZqu6qIFNS86e;FoD(8Pgk>$|Y!GA*FbSm@1v}5co?jWM9 zh+xM(f<0S<`nP+Prp&8Uq|?I{{`PS)Nda9Z=jm)Xo9B@8=4%>y zUrmgt3-?nFqIq@=;3jv4mC)0KHW-ticu{UlTB6|Bbo|bk11)H>3_Kj`;+b9DfU0;&FcgiU(uToQz^J#y1nM z?i`NVjcM`o%XvJH`_Y-Ei14JquV)#$<4F!*ZS&XowABSD$t#o6?U8)*tn1~YOQcO^ zlX!Cx6%WvN5T+dgm-ug`;$=L07RTI6CYx_9RJ`OvVka-55U9a$sHj?SKYC>b_mnQZ zG8KA3KYz>%1@{C~-ZCiqMxa^{HnJL2ogS<)imE)QjUJ=xw9z{Q=4JiU%fVM7$ z!f?4qQw!l@@96R4-NXG#NYT-BqZjs|SFO0jfvd+>#Pfw{TwOKdp=dzqmGIz$B1XjS z2MF=4N;T&w%%Wf-gE3-z+@cAs3C+Kt zDUV-u9Q4?E#@DS%XwkrWqQ1~hGTluw)e8i+%qqOW--gE@e$ZG>I*WdnulYvXk|+vj zRDVgLHk_*!O3yZ?^tv=zk|=pwfm@bzZKdnJNEhss!e0&16;99KdgWeqbcIuTg83yb z@-WdAxCy?zzO}_)QS0yur5FhY+Hi7{=Ci6W372z9zQb$Z8{$SKH!3EviAiQiuvDM~ zt||AY>*5`RC2Ip2aIyMO2Cl%uU?^QEx9r*go`+wtQeMaqX zysYoYwbb2wM!NZKzLBhcsnesn+xfQkJ>Ab|VC`<`bNBB3hCcWD-frkKmi0IEIlt!i zJZCO@d!C87&i#3Ack%ssF4O-0JY&`N{`|Hbc=q}#9?2&=DBDE03vp`7m_%;q z2xIfzQY>HIIYZs>_~;1m8;;?m6C}f}FmC7BZJNhq&Y!oPgSK(}8-tXk*Lf4pzaXJ z{v>GuX62r^~44>R-KU^~gv*Ji%JH|5{to#8WiE{cJk7TSb zzwZRp;jsJ(Xl0y#tD5OAYJql38k(SCy+#{+@UgHFRtxJkL0+?q+J9jMvvzB=tI)(4 z(qikdhFfXdr{x+nM&-U6er?Ull8Nbo2L`5OSQ8VUv3!Y>eN7usovlpC4rB+<7AYAX2KodvF3Bghy$l;E(Yn8G)%EXBDMC9ei=HcXWI4jkV_rn&F?r~)OYdboNvGFx4P3qU^PU_mCNciTr+fJ)4j_DYmPWBRN^Udw@hh!L z?cFV}JpvCE&8i5svQKc!y>V79Zv*W=;!m1hb+<+rtJI~5iz@FO)BS+0wx|YJP?lUL zXRMgCtq(jhyniXA7Q4w%Kf%bY8C={JEYNCgp^(&ezZiTC<7@xm^mz9S!XljP98Di3 z+3ZJ&z%al|b}p^www7z^?Z?Bhsm4i1*2`XU}ajYC*A*TV8kxeHnDc`52{hJTr?ly}+duCfHF`RXiI-<4U6 zq06dXMA|(MY~MWDq5+~BN2%SHkdKTo=RC%Ye_7~-h(*HNxRmNP8JI6LZJkTu zC)!^r8u-ucj+=TNg?2|h6~aF3j=2jm7x&~x@bHyP*5`!+sLtIdOO*D~mMZTo*hXxh z_hXD#Ab;H^En|AP3j4#3b1T&MrMry#wT!f76AQYRi z4}5~M%^6Wa*tx@3pFv2ORdgAN0Su^VOSY%u2!Mih-uv(XrOJ(Ib1>Ga6(b% zwA`Ys*xt0vbyckPDOOk*xzAFAHU0|J;EDk?On>yPr<9@SzWeb5}m%iiw@Vc^cJUlqbkk3L>?ksNt}WhlT#=?c=|>RDkh zPfV#O(08pQP@S#&$+x60xccNKqCRxmjLdGUk&#db|49opSwP&a+f<% zrhlWR5T&WO*cQU6jm=xzVK(0GX=-C&YD)DSczXgPvlQ_|k3u#>CrWH`BoELweXbzE7E7khMD zgAv{7G?U)YN9X5ugmeYND<}taDlki2pnp>qbltME>tbGr^A0oY>)()Cuyn?vp#d^KRGL#ZAiQ>wmsEmptVP!f?| zK+<3+^va~O67^=KKx*)gq0Fuehkslsc?CH;VcBR!%W_f+!rFv3G!B_=<%K#N%=tB= zQ*9uvYj4HT*yORgF_7`Q_;)_-s$k!Vh) zZl_aaksN0ngPZ3iI?46#F6BDmM!r!)LAwvW+|)&ISDd;+J!HZ4BBO$eTEUM@v%Ij? z-5FRseToh&Uk@kqct06|C(GyYU6)FlQD@(X#u&V#81KySIa(0KG-RM{+_JuX6>My| zDo$LC`6Yc3Yt_%8(?Xq zbqBFcg77o~I#kf_N?gFLRo<5nxO%a^YN*gHdj?TFUureuV8L+02?UwbI)!534S%r?I%d?A;0>UT#x1Ep*0?2A$+iK$8jw03tO~7~8*9KT@udxJ z2m1uc=%9mfCB3X$^-}7!QGtYyFAuuffbLb-EUP^6J_f^+`sN!74@kl#Qb=9?3i#B3 zg_DQ}LBhdq!~q%qKq!bzEwL^{FDC0ZlbDNbjVrHb+=kR`sR* z8AiGeJ)znUEjC*{S7guS;Rl)V6Kfu8RJ>}GQAX_`qg)zZE$iL?=#n#50N{T&j4&NH zzDC1Pkzy?W{(sXB7gxzjv+yJ03LQmKe~Bnt0KxHdP-WA1MQP!bjr>$f7^Iz0cv2D= z(_^l`@Qutxz5R+uZQ#sSH)@;R--0pgH%3D=SP1Mb;GGE2@kC%80*GD(G``u=ZuoyC z!HvmQmhi@D=Je5DrVYGLs4jiOhxEeb??ThV2~Uj#Fn>&v0sa*LK0v|0o;KHc*tAf; z6o<~=6jFpKf3^(;#<7Gl5e$5R_Vm3V*5e8SeRU?%0^Gny6Gt$Y^Q zmHV`W0~SWT1A$>+f*Ef<6i-XY-V0yDbyrY2Tz}cMSG_}*wi7O!f@Z=c)C!!W%P*Fb zBXmovV`W?K)fIU~==>viwIrX6J77Dekn^2fRksN?@_}9%r`zgW!(6|`;v9d3@0jy7 zafxxlR!@KPeRF6f40qDnUrzAxefroXpntNx%FY+~E@Kyg*9Q>IIBfOQUXErIHO|D6 z*0#ID+zs&R;lpe_bl0&`hRKn2IZ*WX(i46bnMFnNt1vz&yfT?BAgyX4ggFw2Qr9 zSr)t_7`$mUN&zJW&VebqO3_-HyXWqVDa%FJ{iuiDhz2%%&tWt}3IjFnl!Z!aS^9C$ zxz#V!aReHyXofY{q~x%gB@9m5j9fIu&_T0=or9r2>22j{fqi<>Wh;>yU(S{S{8095 z{nvk9dtLvDHk)_TR@6wOX|}d#ByVluv>)gtR>A*3#e>KOYR5n$e;oFE8(}cAXehnW z4y>rC9GohB1;$#vs^Zi}b!UuHtov7RpRU7O?o--7kM)Sv(yYfyYxDiVnNIgk>o|VD z{3b`*62m$1pT}`RYiX8Kt+jbh>*)t&I$wWndf0K!c3PR;oJs*A{z*({w3g(z?a!(v zD6a}0l-+K@^4HDl)x0l03dAM;Ng_bFuO8wTmN!dAUv110q<279$qsPZ;G}IP+EUEB=3J3 zoQl_rAQsrI#saf3P<+z%_9Ki|6}jbm-XCAGQ!hz}g%cdn@iyov9bSyh`5e0X%F(Sq z?&Dn-zhv(kD7bpx$l~!v1n|S0%gH?6ptl|K5KFqw{f^urRp z0$7pc(kK(qRj(&ti{6|&WT0CrKJd>3geZ=0@ye@j2jp@U$mbi#w+(DTAoWp&V6fWL zSw_sj68u5{K$uP9=rWl_H)$4A8{6@(7>W+Z;$43=6exd#nMW;BLh+jO>FIv}#ql5H;-*MJeu*K^Oi?qTV$d$*?j+k(p}{+Hw4jrsS3!4(QBLTC2Sc+8@ZfVzgWb1IjMh?$MMS3Y)O!~ z9lB#=@0h3%RbXwTDI}={6kfknlZL2Qky$w|bVvZu>tQn8ru)>ab)JIC9CL4~@v09j zP**;(X!jNrv~E=AMkg66ON${+ zH0z+2%OKw~22rzAt6Zkltx5U6rU%XjXB_QEf)mS20OiNd;@L}3_5zhp#am}SK=?{; zoqZrt`YRif07s1QD9vImBah7(>UQMG*t`RE-G9OV;R}5cx8Zy; zL)^G4f*~MCB7c7cpWyHyv=d12xDp1Q%2$HmgL8Q%xBQ+OUXe*N@xJ4xIHrTJp!sFB z(i>~1DPZz*d{>r_VOAEZKD7QEM`bzvgwT0Tn^lbnM((W*_9`?Td}Gta=$5ix*eb~` zQMIe+*9Ej8(Na=s)?ixYgJQ7$?!<7~@iagMPB>5U+LvM~2gQew~>q&~Jh zasA~@w=|=z`z+%p$~6Z?RPj$UkG`dmA?%w4nGt^{{e_MB@w`T3Zq3(C z;>OlcSF~(wo>n%75L&f$ObVw}Q`E2As4WSQY4w&Tr+;FMpW_Tf2j5i%5E4?d&^7uuFW{hWtu7K(8tvA`D5|g=CdBa_3{8HSjLiVX2py)U zAj?6QT{GkODe&wTy_QMzyE!o~kKv2W#=Cf?Ph4%b=1PNhpZH2b3=c!cl^Dr)UdBo#vgRhRj~2blO{2?_h1t5hxP^tJt0)qd!wT3 zja~~3G(J1AeLkP-q?fzibsY>4>&1@a#Lf>Vc5<4+<%SD4xt-5Ifn34oK1s!&wJU#5 zI~Y$gd;sUFD5zJ`*ZW$ocrpazF*%nWQO!4Q*yy~9j?u-#RPR-~=(uifB?rxhK9YZ|m26Y{ozX~2UFfbr{gnfZERRN&2tqUL#VO+$OB&J10QI~hOjZ0bbXi`}p z7>72g4&;xi4cRWS^3-g{Dd!*+Uy0_`b6VgG~ zWR;o-I>-mB$v8?0S4#=2V11zg?bye5T`>~F2s%*&5oee1jI<+FPgm^m=(c8Bqk?fAzlEm9u9WI9q##of32W(ST zYqUNt_#*eSbdxK6kCv`N^WKZ;d)@vKa&sR1BT3&)!Mj*?;5_2RIj$0mI@r(k$ zdHfyFvay%aWwET|Jka4mvtk?@Hwc*#m$o=)~OZr6pW@F9e zaGWIb1iNJ_mtGflUdw}H%)EY`6A)Kl|CF+h3uf@Hp?wJx)c}8f1CDP+#s^p?v-fG= zaYfTX8HcgZZPfWIPuM*X2+E~L(1eZ!EG5U|>yCsa9Tht)3OO#yD}|~40A76T^yg4M z`?LUEIu|~HkOyeMH(5UdJyQ9tI#M1`$l+C9*#nUL~lb6eIoh^ zSnUfj{Umgrt{;C&PZsYm**ptQso^J~y{!T2X8ofFyy%xYAaf&{;~dY)pBuIpL8Z9} z9&Afq(wA_(4SF(G%{gH9sad^E=vtP(ln#;25@V{u#Ue;A{@|e;;U-d)Mwe`*)q})R>`G~M&xCcF%sC%=C!-ROB&TocfnD35p?ZILl@ z4M&umX8PXaXs(>hh5RH7`K4Q4c_`AX<_*AJ>B2Dh%#$NGaZ4A^*}7=fh+Jk|-KA%k zR<+syzSOI()P3F716`f{@Mx^_1qNnCZSCzhq;LK;KN}f5B}(K)rCLR|%}*uUqjdGV z8aB+8k$Qg))7Kav@Y#8GKD(MO#|h=_GYtvLvM+i_w|=(Ah01l`k|R8>g6Yda0NBK4_8w&&~h~*bU*5mgv#fK)^&de=@1^E>Jq_6h{&+q;fIJ04mN!( z;NYO)V?+lBb)F+SIH>s`(ZNBjCy4}I-EmC~i0%ANE~8hhg7)MobJ=#J3I?MUtH?}p;t)fhR#e(rsJLdEeRKwu_wcU_=+XSe-0;6b zmG)29Q|+fFEX`T${VW~YZUhs+SQptyP&;pSEQMO zx{UFv=YCYYJ;4g#+fj;eb&>Zdm{6CGQa~APUk_P#$KyryGZTXzr^&CA`SlX&ovCSi z*WRF*ye}A*x!l6~{3M01dIb+~Q3ySTAfz^U?4npQlwTU#h@zuc_bm;(ZS}u74{vbEl{fFM+{oQv`$@gL zQF-~UBW}iN-UX<01uqqs&+9}aw2=UR+SZI#Zf<`tO(EVMPFE`L@^4E^%Bx195muA- zRE74t%{AVbTI(9`$EGCc2-A+5R9=7W-jlI8 z#s=$?v(#KPhc@^0T38aHUDTYf{Vt}<>=!bl*~6+R3LRsxg-9FVToh%{2YnwWKQFHx z-BFg#vi(Zqf*2?c#!q_qL!2JT|A&WBxv$MO0J7Xy)%AE_yaICI|Fjo>R;Yj0_nMCS za!nwg@a2r&y<#!Mi#xQF5szBXQCBC1vfL8^m7yg$NmLGgmlLeF7(m+&ypQjoIxm_fMCKHa29iDpRXilRI zsDv%4Yh(7cv$v~qs6aMjRr83 zm4H939uTBL6$r^74~t)sf_MLFe_N8C_I9Kspjth^>b_pEQpRhJ z1owrak}4$|A6rINF1CVdyxAxO#7tH0mrPI81aHzToBTYLB{F{@@U^nA3K`%^1N4R0 z6Lnip7C3H+F{4xDbiO2C^u}*QZec>RiQH&w- zxA67)L>OUpQY84xDic9am-wfs5~ZxuB!<7kU#LfvsZxz%6^R<3Y%bQOlj$^kTdSO5 zb0*$)D_mDQ#Rxz#mq*2mrc8zeKe-4{25fm+$BYC>Q;T(k)-4K((lAi$?+iu>Hi=U1|T- z00OCksfOQgQ3CE3DZMP!!yWwG)2RP5_=xV~Mtj*+ZAr2bzp`^C2p64#j_~eS3xfL1pt-csiL)+{=91mUnHD zp2nn&?n?n$QEIQ(c#q7Y|8Z93=Oe~|s6rh2ac*X_e?4+!5m!(0$s|i?#>P* zsi1$=3#2O#BoRw$&|v;AU6$7Av%+xdRO5~5P32zuGO*_Nv{ma%ai<3UqR|K>i=X+$ zK#L?>0O@o-{2!>=>fLYsQp*fFR>S<{=fEQ$8n1;F!u0L})9*4GS6S7C(X`*>-G_-N|fJitgh7XyxmM!>UrKqPL}1N_GOx82`1E@ZH#}d&{BUB ziUx>pf~4kjdK9_E`8o@KBu7aG>NQ8-+Qmc_XpX||r5FVYc&iE*&%R0)1*pHD zOHw>Fy@%+yg|*7reR*1oCj&jV2KMoBn0Y-*`kI=Brl&;t;S;k>LzX4g=T1OMQGMiX zl!DKml}?0CsI5lW(!v_SRIEZU#H)V~_M{snBV5I3gC$ZZLp-w41qQEC1xD#c6LR84 z5h_orjUFJ5RReprY?Z*46xM;9hE)LsKubzFR;*V98BWH0SS^CF)Yi%cF}f0qIz8tR zJL;5I%Y{*_SV};5c~SXOL=!A9EFMAt>Cmai5U#83tH$Nahg6}1-e*0Xq9uRVgq&A& zg42oQh_n)15u0uE?u!Xyp=wV-UZ&Gw76qUp$^vn`K^6?e7z>OcB!_?&LN46>>QO-$ zQ0RX#1_SC98-fA2aS<4R85Mv5h!OD@fVOe?1(d%dH#Gw*#+O4tF`*ZLw^8H;b|Vvb z!K6*x1p~SbyMPiRqb>kdf-ZlMH{*)WfOR1k&<+tE_&_Go0Uw)5KOouXlC0moK&;O_ z!$SV{3>RN}PO*OW3~{R*{;5|voLU`b!B_)q6&++j(55jK<%d5Th!u+d5FtdbBiRyh zC0Z<#4IH zFtec~CyF3p6gY`kagzQ5uwT$p;)7IsOF1M;0ELtq7e4`$O_$*lP_OMqPe_Tjg`Z+4 zx{RFwUD{sg1jzG2BPU`M?I~`edE7+BfW-@3et*$GpHR1dk6n_N`aW|C`6Z$ zG$4&F2GT?*#Zwqf8(}owQN(KDMw&p<=A7?uF!yio}ZvtsNfat8D_K5&0Vu#b^V6*i;MYDUdK zmgt}vMjpfvtgEJvE@Wm0RI{ycndX93PDRXDv`>+KbG**W;+3OxXHG;|&dOu+l^#U; zddJ$cygcx}Ye6!=Uw!Z2?Y@^^sU^GR0sOEE_DDlxWZM>gRr~)kmUjQe2m51`CZrV+P9R+}qX*v`Al2l#*XNj%Ave5W$1iH55Iu@F78S%AM*!sfg8JgODa@a5&&#y*?-;6Lb*L3I&$H1CMSf zE~0}E1e-Q$ng<|Yb{&GiX+Se#2-bsvu%jfa6-I&)D1B&!&U()qUP4z1nbK`o0w$Zl z1WbR83{Aj^t<&HHtmT%&6I7YD&7VRPIt@`ko!VlM0?PDZ!xUl_?kQBE?N9|7z<6;@ zNnM63piH+Cun?(NPeBW@s?lNC0!n0?feVq!@f5t!M({#toCyRl5U`UF1{CfFK@7-Q zR2V~~g4GCR(7R=#6c%as!x@mxtpzkh>hrmNo2|Ecac9qIqn ziu-7%b!#A(Gn#FoQD}I?WuE- zGY)?hmxQs7#rYp=ntmVTw!M(`!CHx`E3~jMlvD2ucaBWhm&wg7SQ^-%`dG5U#o3hB zj(>C49?rIrboc6cL?@k1I+OY-4TXR0^c)UhT%(SqntKCFS88n)S0_L+wJ%6rqZJPyN!ppH?NhK)Mpb}L4M&Ez8cC1vc|}Vj~l`=@;QHux9Bp? zg{iX4Xh8t)U{M+?xS@ic=&Pj+LeA!1|MW@^b!h*v_qwT~)geLHu*(yPy@8_Hyu(v& zrBAF)ai=6or5MAfQ3w~Gc=auM6)seiE8a7HWeq5WigUb5TGfZzgXrlW%zH1UP`7{6)Q#uqRQh6~RCFckML;_0rRZst?3!vi?v*v}?M?b?a+*$E zx$-lF{9-zq=g9Drkp;sWOe0_lrjc?aGUTgyl8|9HxxRK2Mpobq5i}sQi)8Faa)2D= z`(GxD#E*oa9PRadG`kMqA&e2foGt@s04YU+V3SnU>%GINtQUVERn|+8RK0#k!12(J zM=%w;AX(IQyCqG&?2QM z9u9XA4)P!#y&o)Kvjyi)K+*j9@NANgAb(;<{!@m);z0Mi7_j}DuhLOy*(@{NsCNZQ8Lbw`Lc}2K zYa)dAOK7Ij0vfE;nA?Geh7nSyA+5iHJ5WW~CcqXDzNmi}RX49BOYykX`>++ofb{&380%pm4&#vx{nV$n?^jTv-#o3ZCI z3Ue}nwLUngS_av?8u?13SVOMgy!WX`8jX6}ZnQFWZGZFH zRF;fZ9KAy1TrurLi=;=iw;L^moVL_ZNUK&mHJgHwl*`%@+m4cD z+G}JV8Y5dk+Q_zxTftm!5g+b}85XuX4%gcqhmU{B?ocMeddlCp@%`%r5Fy%Lx`|T# zd?RS`zVPkM-FFh+a1HG%F`Iu56!*j459tzjdT4X$uIGL_NzX@|59!lB6jn#bR@yy> zO2;{|WcTPwYa2*Fy<;qK=-iVj0p{Cxdw=fzh~|v@d51swFu^sCCM>(#ifZ}e6P2U9 zvmAeAm3gc>p$9DZ)tGzYmrphE%&6)2gPuU|V4qUznpYw5Enz{tHZX3`L*HqvHZoy1(C@oPU2g za)aVk4sGY(e0XtlLo(<2Vw|{j!F)t+UlaG=&8=g4G=sTl?xv5kboLQU63Z*MAX^N1 zm^yRWcu_9<^3r(S&o6q%1kZQ89AOF{F~#tx zIL>=GUqD2`dcgS7l}T|HZdP^v^8bIbcdX5g)UeOT4F6#XbJK*Tp*_(-Yy>&^)53@@B8F#fJH29!I|r23_o zor$E_(2zn8u7_iKm&hnC1ceX51P;LBh-TQOjZmsOhWrHNk2+va#fd7BapB})N_|p0 zBtl`ABwl!`XeaEx?CO7u(4<0AW0`Yav$2StKyLIEhW_6fi=_9RaalY=ZWO?22$Pk9 z0n@s#{Brv2#tAPJv;Z%N#$FDCxf<*qPbSF(hhmZgOW^u8g{zU|U^?i;Bzvi< z%#=0E{Y&!S>=3wnJbnxlh$eIOj3(TibUfLg^wX<0*Sb}KOfY{-V}CZB8eB?Y92E)W z=gWj1ZthO9g+?dMlI1i+Q{>xu_9@*OlNl~S$MXS9{*N}8w&*=(t)z%EVDa&nhrlLE zm8HyZ)szb~)$NUa1D7jJzxcvWT7Y>Qz+Gz69}JV|8n8RjKE+GWd6hKH$KF$d*!n2? zbZ2`(zc25VzGr_Z$J#ddiH-8*Ctn;KeaTI-k@dihLK}8RBSKFzg#F_$zUUr3o?z|4r%62QjfoAwPxR ziF(=LCm6b543HCKqWgG$s6>nvYTC4ilN%Lajk0Uaa9G1Bfu`$e1f09lE-=01kdZsJ zSEZtlCCh30`%_zOgNrkSKxDjHwH5uLY~h@(H?ZHxpr#Z`!dl7Y75>JqL0dnNMCq+v zl%au`8iapY-M%wq#kr*SB+CuSRfU=|^+E`6^l(`iI;_vcJrogEgcsfDTj*3(IUVZ&wQgXcBovs)8o`WwW7KI%TN3%KPevmAW zB$MJsDPBdc=x1eiF1zxAb=vE5IT*i^VMp47IP!lULW_`NW$uy!n#gc&WE$B)Du_0z z1LI@?Rl!&|N^?L=&;u&P5}_zRyCzFU=g5i5;+V%HeJ{$0mLxT8xC?@_tJDaBBA`IMzI2qzSC8<4i z0G*-O<&@Wsq&j$&l7;6~53jB65H!nUiD-X3lH@p?0L3-@{NN}oR9?bY)paKhOoO&f zbG1E-oTQ(Q1xhi8(u`!kM!ycI68r7YLH4m8s}>dakC`~dM2BCom0@XBk~G_M13Z9T&dDx%NDUlsI3*#)FSPriyB1u=f;s`5bzJybM$DGYNI6Lb;ImrBIOf=ePz$&vaUgB3{ zBO98ax4)PSL0T~05uBeg5Pa0+Y-N9hlUtNrs}EOIh6&OgWWX+`??zile;JaFtwtw` zxZ|BC)Bb38mN4gSm8e+T5JD%>?s)<}jb=+TiY_DYt2WI9rSW<1@bKBm!BO|{{M!bc zt7}JFJCELLmkmxKzTtz_U$b;Ht zzNJj7Z3|9G9#9t$IbOa-cd&mVNK0AMEqM{CXWg&nbyZ?iRn^Jrj8!XBk}f<@EM~3y zR7lfFe)0(All&gOt%O^SJeeP+vSEG!VFcOapV8^YPxu-QU&OS3FPnLMcNbuhsv!t1 z5IWlRE1A(5b2SjIS;7F(B!xj{F$)>6uGT^?lCeupeojTH%&p2(CC`8L55dEl%|S#< zu&~Zhc9tC0MxU{j3xv+sFAE_vb6y8FSNS?fU-u_tw0n%A3lLoxR+GSr+hxeYQk|jj zt`nI?F$bZf{$yI7ov>zz_7;O|M(=HhQ_MLDAg!=8H(F+9#F0h=-8$mEd;<2)qp(K( zA)DbORb(7=agNbw3QvECU84dJ&*LGF#8Fa`|KZg z4}0gmt0(+GDW~pSJef4@oKJwhv{4)7Y(%f9#llyaCXV24=1w2JmqDv%)hBs<;ree zzR9E&qtvUGaTyGP5V>ZgQ4wvSz*ds-XLjEgKOV z@`9%eizV=Q8jG!m)5fIusw{<&Wo(YzxsfNeAmD#G1fyXB%V{{A z3}MSU5A_uy3oHp+kpRn4ZY@^ZoiEv+pJyiOIH&1vj}p|WYk_A)Ei+sdb-a#FhwHW1 z?Zqnz90_3^QAfdjs9NQ#HWV|=A!&b4L>d%VClY^6oWB}&rRhG@OtMUXn$M^}(q$j?M4@3kch=vpNxci^KF7Z^a0{|9T9cs;7g?0m9<<5U@IWPe4Lr z_nbOo!koB0tKR}&9ka*L*cw-ttr_SY$4_oA1;fk)V%?vRhr3dkt`X716p>MCrCKWDc5rgZpEHi)MjpeWIaQ7Yl8NUZuC zf(|vUa*vQ@;)nGG)=Jo9con5;vQFe=-JyS+TTgB7!XCY^YSmU-Fr+x#M3N?k__M4A z97`-WM$8K_T^wM_4w;4gm4;}BH$-*3CRcSuZf2raSLM!;LvGhcPPa+dNHcS{u9+%v z3V>@Sn=z||tsck>xX@0^hKo8@12#u1z_4%LLnB0sjYBZ0`{58k*T^J*25$pnG2VY6 zGMuhII(413tBzM)TQP=vA5XWqEQa0+QvBsNpDn>Qj9|U69<>@Z#EajP~Cr|slZu_|G_rI zFT?gq*C^wt+shXyvSPurQ+~hLJF$Q5g$m7VWs$mgOX zr51xhbXs1LY1SbbfYY+w@5c?zb()A4G0ilt=Hrgfs)BNjDp>4R#bHYqsH=ZVi|SR1 z&jKptx!P3KnI2iy8S_%!{Eacrp4x~_M~QMP1%k7|<+gv$YXfOd{Ui04S%lEzLBqjH zgUC;d!D$9b+ev;EQL-eDA&uuimA2lRBXuZ$BZ?wfMslewR1>i4TcWM zEN|%)ds$P36xMC4m@EBla3pa}=8DTQUmjD-a~e2L3!Mc+MPHi@!xDcCR9P=@Y0ivs z-ToPttcvNEVau@GWsMo(vNdxw>zcEC3cF7yAGke-v06B1THNUeti`siL}(E~U?swd zwm>#b_%A!J(Q35I4wla28YLF2Wsb~Z0asLKS(z)}LMhXLutMu8g@mLbryfeO{c^zu z+3N6UVhH7<+UN^?YwLe)(e`t*NYsSs8GK<*e|t<$H)y_H%2KI~D}wkwh-}jbT0*T} zfw6LZ6WAry3rQP=!UW2b%5bLP%XrqRTBKE>cFq@JzI~@xci_WxBlD-R5#SFr3EDSW z57S1w#A%U%+8%B)+cSBlVm{u{g*TgOwBdM1TR3M*X+yncfgXP#Mt|i5dgTQAr#pdO zd4Ph}MXx+SD=ew*(*yMV7@;4cnm!z`7+`?;0EU(pJ}9*9Q0O_qy6&i8U3le<`hR(&z8~MKKPtK}cNCA4P5d7Z zch)5ZZl8aNQ)-@D>MVv6=Y#Y-*@sT{Q!~xJTk2jKa}wH7$<0o$XpXhaTU-3F1x8VQ zz)4v`V|#m-{%ugY4x{7GlG{n@CM}JJ+mAXgppoI@s`Gzhlq8d;l=}8N?{9CnT3G?( zFNWiq`0sCnjGA2XTkiuYp@k6jXaS*&4l;#b#12ulEx=%%PGh&x=^&K+rb5dOT_1z* zOrIu_r}&~Ny$FV_&N(%oAIlyQ0&=yU4nt=6+R8bc6kjqk4~RvF@f32*duK}Ld3-q> z(;Gaq%DjKf%VV<$yU03*F#4Y2yM+R4JDF4GE0xr2e*Xhrf#&G(@Qi;YX=eaaOPqOryY=uI z4cf!cwjO@5_3#WDf&e=g=`ZTiV_HB2pD1nfS3G|~9)?LLfmUh~Phfw3-2@8mkdPvq z8tX%A2l)3cKC^`gNKrLnIA*SGbxmAnIitG--GoqMdF8FqZk*nZ&xiDj|H||r%jHq& z?nX1j8H|cy5@m935*=zrwGef?#0ll!E_5k=4m9OQ%;^c(PKQ|#2K+-}{&E&EsWgR@c;0$OR20a+;;7_2mS`Fy zP4NdKF+bHfBz;2aUnjTYDWHkPmFFm{k-LA4axTTNCR7A>ZSePWDlsjA`^xbkhmFpr@1_f?m-YOAsn+jrwFvYm}kaf4TH}o{*hMxSuxNR#kh&BmVXd4^uGH(IO_gavXPsqL0oS`74&6HPm zBH0VYKw%?#5MZEu+tgoc@WZU{By9h+;=+R;{ItPWrTYF}h6vqGF1h?6uzXa((xTm# zamhsuT7nzkXT^+qqFJtWZMLtvYqILl85DtTDQL3R0+rE4oo3v(y0kZ@UU2qmxf zJ~Mz0GVW;9s1Y@$;@b?1AFxm%Nw*qAPy@{z4|atz4|atz50JJPH25* zbSDkb9ZD?DODG4&!pc5D5tvac;Pf9%0aBV9wd(f13&cb;?-$zdo<2E__DB6RjZ>bg z@xq965KR6N6nQDRKS65&lq0$oCyfU5BK)BEgtGWp4+g_&!k5p`P0W;;;ww05Jk1ed z`PN|SjVPIji-jFGILCydF0_B}dF35XE&zNw;d$1l6Oi|>a8FXy{Nngik_Of8OkRYL zglFF!A01%g>#seaHbF(%YiM4hjX9u4$#=;(&h28J`dN~Sf@#iK?+F})&&WPF|MuiS zem^+-;`np=ih7TuJ=~%@KltVxH#O4hV=?>!fI z2_bkI4~pa_@gOJmHJtq|RPCJ*a$mzvb6h0&D<ZeS2_tc>J|ee7}++37IK=8>2I$Nb`US& zLls8U;dn5_i88(M&sWuE1>FoUegYez^sliSa}g(#5c-5{@e&JPfD_Spg3=s{|MKzkQYzn0UYVOyyQb|y12r;KASdWg#5~f zSVMXMpUq1OsTWt+c;hlowH-|{Qg-7C5*oa67O`L}>=GLN?=5*mo?BWQ>Ly8t)BH`I zer6qs^P8JVg8qM;@nsI)$%s9UZ(sz#9Kh5MBiW+NK}6q&9(ltyTv2RhMN*yH8@y#{2Mk<3apevqdzp5KDj*-X`t#(k_~bW~)%RtlD9` zD=Y9c=4OWHK(dmu)qVjnk6XkL_92WvzsHdwBNKn}mOy;z})OnryI|8Pi)Fb8)%Xvc%qrX8i!H4zwf4VECQYk;G` zH?1zI7N81-5O88KkO^v?9W0wPp%m+kY%lN3sw=XppOR`x^RcX4g$M!xH1=SwDET-H zQAvN#6JEPCvlUWiWZ4<4VrBtzd$JYHYJ>S!H$)W_%&35&VP7HSMDNiV7yYdLaW+SZ7=p~X8XLt6DvE~!Sk;VMet}!UK<4mWkIRlrbo%RpfUKz za*JQ)wAvQ!@)irlDp%#{WlzmQ*4H$iQTl&Rm#u~#kR%4QNv4xqY7tQ>{@ZF8yVs;0 zwIVZ(ew1WQ+5M$I9O3b!PD3b>I9Qo>Gn8hr;%&IiKaW-GyA;S)D;_Qfc^ zF*~@j+$#vF!`_Gvx*N!KYwMGMc{$s3CAW)3@!Hg^URxP86}$8s%wVft zmtS;)EasPpeF}?%CAjAJXyx21tnYvH4|I?+`h^qET&kjCM$(a=OSf>s2tXx^yiH0Q z!3cXruqgS6CWk4MiUAz!Qh`zpu=QEgkl2b<;$M&S=Zd~2yCU`~sap&0=Lv!YsdMKG zgdCh zC7Z7~rUz8L{*)j5pD(@Y;I(}TH7B>~%a=R3gkOf_$(8=nt52H%_gwoq77s1*`s$D4 zK+XE2#d{gjhkpOk>;7{3J?Z^RulwJj_hq%`U7D9(ecoZZ=lWMVxoFW=+ta1q%V=fS z)lO>_Clwc6%T;B{!gMK0Q%ZkIDtAX!%sRuJQ!D~?fV+jc5c0nAoGy{GJL3Gh8f7$S zd;7e5{^gl$X&>X+IB;e*DaUaLG&E2TSyar*cbjyr?}yD3mShj!Ep5ymMOfP zhqK^mw-ZNo4v3P!?C2|hLWG`UkcgQ!89T_vyT%%oi}srb`Dz>MK+l% zQYBZ6AW;A`K+C_n2%%rP*HUoT1#htM-ikO%olUe9s%Z4mqqsj&Z|h;7HZ@U&tNg8q zkgr3PRZ7PME~&Jv!=#VYb0@EVEkO;LI4}i4ySeLaOsdlDyoj54&>PobCLY`eFJF$4 zwn#yupmop9aAtJ|QJJm4v32)&{7KTE3_@fcMIv=P&oxx{17*zC8*=%FAn_;KVa+3h zs*jV)6Xu3{Dr*7zaZm+vP6W$VK?;=I%0i3csS=0kh=K+SrI%)vIE{aQz8y}0gegU6 z5bxDA&d_m+ERTH)*EVODl#j!#@J}$%f0q zE_Z{V^#zI9jgJwt10$H|@GNYpYV&L%e8b#m(EZi@;Bn2WQ|Qp&QFAe6Yg9g&ECFcX z#Jjk67BbnBa!a(nx}O?Qq@5b6bsr+(V3 zre&rbCK@UKO~vqr^;3nC7XUFOcoxbs^7C137)g}su@nelW;@w`%-j4fxLpj(LYV$` z!4KLJW(BOPU;W%2rU!TjSaCgSxTBHRZf?hrvT(ku42$Js1V5J+9{H2_Q{yb}>jv=0 ze=pNa52&5$H&h8He%Wpt%+JZI8jJz7+1#X`!+?&GU$eVVU*u1o?rR_@`Wm7pq(dsyN2Y6P0ubP#oVmNMbrr&8uKuM-THDtN~Ktur>@9W)UjqoNp8UlmTC= zY%46n^1`Rex&o>u<(4)ueGQ+#o9JC)GQPDh2}15Kk= z-AeVwh&M~8O@o5tUc~NI!bnk{vG$Ar(ej~hmft^umw-G7uHcZd;Xs~cR>b-vAZ3|h z5E3A^DNZ|oz4W9%nI69&kly$dMxzz#7*0M%R=1PLI2mniY;Bs&~;iEN3V`-0nvL&f#{ z#gIm4u~>bemXT`4mmPb;C&AG3WH^cjF_60Wsf{IpS}8R-3{n8%lOTgha^u0$xZmpN zF=AIQ>ah_iA3|kqN^O_s&umkcM$qLg{u@BhnM_IP{Kkv=-*M?=GJcO*mWWkBC1ukM zL7$C(WR*eY`sthe_vQ|)64a2OpvHsF^V{KQ@byVE=d2BDJm|9&Kgq-_pBYggma~{A z33qqGo#xyrV-)(Y7Qs9@$x-YkGul7w9UPr^j*mV$?w&qA>pec8wZ4S1SCcJ8Jv{jI zT#K5C)IW!)k2DXB&WP;-)#vyF^$yYVuzlBm_KhN4PS=5YaS50Pu16&k;O>mz}B&A+)s^Kbq~oBxyU{^zT-KH^t3J{kj;G)MOt z!KeObb^p`Typ9s`y{>>$t|G%pHIAW~Q`ujlew0qcCu|B00(Q#}cN2gT8C5^6s zrE^9dvA4Ezeo{Qs-bK%P0z5r>wA-NsB&d<<+M4bLOB(e4PuwsCc-suz(ogbrZ>* zoR_TLSIq$2t}dp!n~ur~;G6{oL~h%E*oSc`$O2(6x5SJ--JFJaLlfjFfqE_H}H|nt*#|X#P*l_3vcaVLEma$^HsEE2y`ZZ0o3|e%O<}oz+}a|? zy9rr?!R7)Y)*vGRWxBi?-PwL3b@08V)PXK$(xZwai}M{Fs!R^#8q}Y%4&7uo2d~w; z>5A~@uf^TD>W~1+ylclS;M9PQlMYj&USA=DEN`i zi=Sj$D}*@fN9%Vf>lWjJ?qchIckV0Ip}+KWxegmy8ML#McIX_a_deq=C9{u(9VU0n z&YPR;+=o*-6T~aGbSMTE(1rIXgFV@>XBBS2EgmV~LNqK~<~EK5v6s5AcEq8aW`#do zvB@o|6{JGEx0kBD22bz3_<4b~+Urp7*{tvb%ct%wkOPa_PU%!R-cKTG=vUn zzFAx5oAqVB`M;C-gStXT_w%wc&t2DHo>T7Tb^NB)-JCIe^8d1%*Ah5-yqE6fgj_@9 zo3%y0SzqM;zg}Kb;6#efb0PUO z$e0Lby+N!q|5S{B1~e*zc$D9y@|~N^T**V!Z$8|9XV4IR)0UYfD}xokKE+Lex1gK- zk7P25FQ%hAjF4B}ZR2qTG-0K)J=HoIe9D!^mN0^H$s>Acr@go;||DM8oNiaq9SA;p#9 zzL2JI06gvyKR^5ce=SiiLrCeqd}!$6w;q=XtkIUt^s0XoKN|yi&h9_o zdbIQC*@cC|%l8ZDJDT$wCaZqt>31gmE>FLPp%}B=1s*v>&P%B#w6#`a%0f`IMVfOJ z)AlH3Y;)=#`SdP-lCaYs42mk)j7scx+qNoC6Y;ixmwNk!xiMVJj$vVQEUd`hxKPY$ zWpi>tCc$@IJ0qg_9F6bSD-6LWkkaN1maV{&TZ@ZZ?_PEm%T|{)m|4@>^8RHBqt6=T zxz2@E-j;vI(rVR6ty;^Uzt}s{=GKYWXPDtXm;loRQuF#a2PjZzAC#kowp_zCY2wmA z8h7G@nY_>?m+D5zZ&QGrL5cTzS@H~SQZA|1=Cc1#EqPV^@FJTgXSkXUh8YH? zm7Gj%0nmC8pbew);Ep^Fp>T+;>@IMne*N9Mu2`Lb791bv!#eP9~DKJ>wXG9PKO58;(VoA*54`9iO5YQc^&F!8jWY zqT_iYGOkBi=ejLX$vTVz7lWnYd;%p!`so&<+&2@xo5Zdn)ysIshLdbc1A{$N;R!h@ zK2w?uFp^gfgFm!N;kpfl&kBwyC=d}&zz&H6MWiTm%Wza=Ah+Vune<3#5RM7|>_OH! zGjf+!m4~mGwFK%h=M7JWd5}ndim=%#w*e2`*0e#LhHPnvEZ*GM#)CzT?LcaJB4IXK zU6wY$m94LaV}}GY#71prBQCI9Pqj@>xYJgH8Qm0qU^8m#2%1u{{6<6(6Hfu+<8=Hq zA3g94z<_e*V^pBPagj_s+0)P_px1SSj@qJ`Xy3F>vNVsf3nfZ|lBE}aohQI$(+e1v zeh-8huBvO0fk8+~`X$gHCQc&cof&$zwYrSWXIz!gaD(npc^`xYNR`=$BumznmVQPt zdWvtt<^l4hw>-R+&>t=bJ@1S*5W?@MvTk68VzgTpjNP)tYGz!od%twawl0JF@n4}{ zHBMcbVJ7ij9w&IHv^FJw@fYDhXE+qY=_rAtFZP0S)qw+C+FuwAsT@t$ts1 zXEk0evGY{#q3Y#kTLF2XF5y-p*Ux3uG9x75%s|Q9B5GE4Am%BUTQSl!YZCQ^HyAj7 z)Ly}B1^KzWTD3%!#m7p?VZ=8dhik2gKjw>F~{-C2Ul z>Wca`)|E6XqIqq9x9$zRpoQJ-ipxhPKiaIX=`OTXEMeu<M}<;62;wwpyLi zCp)sgs28c-G6s#hKuut>M9`1Y341Kq9&}fPTel7&u~sj)T%q{HAV!fManvp<(NZfz zPgaG7ivp_71`8!m%<{^yR$HxhTxiB#lHf?SL(y?Rak@``qgKX9F?K>lvTCg8YKUnE zbdtd-N=)79T#5J(pic$hII1Q78>M~R;c1udYFjvm$Y7Kj(EZ(Fbbkh{gpXqDD4uho z0F)7a0y*!dzjl9fYQlZ_dsIGn_ib6K!|-DF4BE+rfG1d)zzWeW@;LcE*V0BZy*)PDjao+>7p0y*(x-fre`2O z@$*7|lrcjhG7yuve#Xn_wiPXC`w^YDKGxGC!9# zcapR?uxD2pwh*=7-x5zGPRXERCnhBDl+VyI*i>x7c5m84aOXWhHlOPf^>?B{O3(-# zcNGE2PYc3>kGY(ILR2+tXbLnNbgkshDyY}4}eZ#_H%PhyHnqQR} z^O|moiyfEBskVrN5S;9MlAK`Swrx%GqZj7m5v{wEA(;Z#%v<1K!o%*7=YT~PU;PoV zU4ENmjFd0l9!mB|LkTQe`3_Jhy}F!N~Tz^` zij~<>BMliW7UbT`bz-fh(8zH@&PwtkzRfl_+MDL}Lw2*zTXn;PN@mmSkgcMZ@5LlG%#1M!WtfqgYC}r<*a8 z_o|nZhD6?IJ>i+t!nG%tC2}oD#cVQvHSCW~LfY2lrUMLA9uM|)Wtg?xSJbKEz<(VN z8aj4EU^r1}JN$X8eA$RGJ!d+cYnMpkRdcnkN^4D`AM-XopCz-z`wlzzV%`FYDhLHR z@L|j_Ews&wjmv}h6`r%)U@$G5hEdx@AI`1Ak1xZ7Pj?RwclY-$QB56*$T&QI0ChOYyai(#cJM_7v_SJd4Cv1##NVcT3t;4^zZ{L0xofwvBz&U9PNGz715FKk_tUK zz~S9{{~Ib=#KVsE_ui*+U9jJOeYUf81i#le@;dk*w#Q&;4!A}7nMZG4Tcf0}dP5>z zgvAX`;7V#T?q5iX5OQ&YH%tt6iyNsg z)~T`w_*Qm)OZu~E(iVE@23Jn9Ul3sBO`!&1dlf#tx-qAPy1E3oHy62oD5}53REb_r ztnVG{?mVjUEvF2+KxpapJ#f@LQG#XKdxC07F4ZEMqfh8_PH7KZhR9Te#PhFxSNxij z0M_v|p#E%z6WBp(ZI0nHCkkWVRJ7dLO+Gu%S zpgD8NQ9*H_VDUtKpt?)2_-l?QdK*U_-$;nR0jrSr)ph- zwkK1|=d!+NwyrMpt!!?R7cw~^aVJb(fya_Ouo|Wsp3v_Y|0ffFF61F>mamy@Uy@@K z7A#kUuYQqr0D2MX>{v5+TZTi`w{F^bKdEHpVG z?}E#QUgJmmSvjdp)InBeK7_bMM{HRKmg*x zb`i6ULKR1W;yG1XUShj{MIJSGmiXaA-Y!@3uiXjqRbzfW)B0^|4{l>y=m)Ne1>+{f z3B#dTNPYbOH21v2(bQhG^R$?eLXG z?DBn3iIBM(3EdUQZGNe<@(ga6$-Vm#QyURq!CuXH1B&y)IGaoWXqoOe%g@l_^GgIv zUZY*`25kc*y5L-flPn}1%|l49C{>pNlozNc-_8O5y}nIYZh|td-#`(wrwXy zXcAhWN|(q7s^Z{-AZQ7$tUcGW0>`P+-i>Pz3#`S4N&9I!fge48(JMsx_EmS~qo)EN(S_T{gBDh*_aDf@}Q})dDB?n?i%vFU3N5 zju}^i9M$nH%2O_*;i+_oVnJN0amr?B#2woxGn6UJPlHducKBPn<0>G**Hw}{uBLZK zu}q-;wFIcXwU*`ST4y&SA4k!?86LZd$nLIeU*RWtMaRbWH zIm0?mCGNm-BzR7f(XgMM!%;f=Ewt2s@V@i)5rpw#3^Z9gML98`CS&0n`6BmGM9mGK zYa7ox0|FvX-N+Ze)B-`!2ZA4xc+8CgwmWj z)aL36uxA{DT-Y&!LxKKTGKcIR9p;h>Dqx;%A<>_^xw%uhU07y6!5;nMYJ9uKz-9`{G(>|?k?)( zaJ)5~v^$6l!mCjO)HSgwJS1ngTc-qRU>8dsCE3*Jl2|A_7*=}J?w00%zH7&it*`RC zlB06w;WGJ&$=u#M!bO+Z_`xfZr>#RylQyq5M8xNIjD%$ym_3Sxb*JW3UGwV<9t*4; z$$%@8)Y%#g8dy7a?!(zUA+qGL{8LXZ)SID5z0UZ=T$S;ORcVY*+@Qi(ZKPNeBLzuG zeWuRYDI!tuC#vALA8kB;=%9YT=5%#BQlRphr#nP(?*W|rKUQz8_A^pCAicGuw#xg9 zqInQNC39WD6|G{~Zm=p#835)BbaSHt-dbkXCYHDAa}7~1>jMEF+{4u<%GG*at|5n{ zURVQE4F)98`~57PB#|c{00KjN-0S~BuPP(w^9c^WJ+Cax_!-wjp(b;oucR-Do;^#``T0eqRxsB7HZm{$ZF3ukKupB6T&cHbBv=8 z%6#&P*!TQ~KvIONtqvANH>-qQXB3HzD|NNEH=~CYirU*(RMc9#DE^Z(ehqcb$YYyy zmzENaF(6$JuAPm4hG)ZRw%Tdohk<)wLx-C#!;uE11Q1CdmUxPZiFlAOj29{|VPF+q z(u!rStZS-wsEe6mHC*-Tv1;iTd$rDQu1b1VKqa#;`7vN>v0vJzc3V)Vuy8d z#>d&j7Jn>%T$93#`0$JO--pYzP-}sklfd@wOm0h~5|VZ=_gg+Lx526*MupN@V?JSR z==Qc@p?q3m`X6oWezLR8)fO^!a~s4m3q*^o4dXR@&LM$ScGmAhwUZg%ux?cfx2R53 za#>Q`&Ui8bb_TlT5cY~95}znbL>(F$lTS0c=@xH)@9)i#kBe1W?aM3BA|j%EVaU%VcugExEsR zaj#B)CWQoJ&WCO^89km$M%kaBcGPG1$)Jd-miKTjL020A=9>WO3;>_Z-~NA6yZOJf zt-nR%%A0Jq%~;hX{Wm1=3sBWUfexC!I08SXYRMqfQRzs9G{LSzeD0x4 zT0CclPQu9q3t4AY7i+rO5Sk~O(9=t94vP+d=3Ck8R38r(Gf-ojKpv7mzn>!3(n-=A zT<`--`SVd-`Wp@L%~2DHDn=Of9JY|ZR>563qRTArp09+N)G)JHwir(|XBg=OPNkmW zl0`HZg+YCAil||oq}0xW9=XsrzdRd8^_>6xQNd$> zIzd$)xfUERj`-NT%8j_C(&34R4;K1T0+Hk24G;rf4m`0GSBb?2t1ULj)V#FO`Y=s@ z!J({opVi6IZddE)ty;m`TA2*Z2QaP}LH0>q+I3$~-<;jB(p9^Yk9ZUJco#CiK3u-E zqh+-BmXowBd8E=@k7s>`AA<~!ofesu&)0?A0pNC28N#>T>Iv-f}rFt zRH*-KjjD15gE4*xeznG26*}{ZbpD+>3;bB9vfR2;Qv+|Js-)GCV%V4;C_k0Kky{ug3geZhf-5y>+w` zZ}=?^O}6(~w=V1IX|P(ytGjW%Vgt#l+^=rd0qYtrSlrFkyJ20&h3M*zSPhMIS3Yr| zik{~sb5(4AkgR9;kQ?@_PE$Xhq^M2A(Kdz{=PP$!NCevZ(%u8t6Aqkzrt(3S3njXn z_hP#a5#G2T+yAus51>`nS*~&D(@+6%v++Ti4x*3J<2af(FE}6WwB#Cl`zz}VFZrP+ zn5#byDbHX@6H!GZH=3+s2Al2wsfk)6fVTm_9F&z|&e)>Gb%j&7o{L0Cp z$6RWsM+*1}Qm{8QMfqW9qsIve$==8~`6-5X@Gv2@yCmf_d}OG9!bPFtm7%poRvmt+ zqT57U!C6_(G5OXID!B+pkzqhLBg?WN$;UdZfr0$X5WE;RwF%irA;o8>J*P$QkEWVn zGk1v(;9bAZ4!7Y=@q_(uYVY*=f-F6@Vc#)HFQ_+%!{4Daw7bl6s8;-h;N}P+%Fpt` ziFeHK_}heof@^9p^|if!4XwV+9&>)Q_N)}La-5*i)T%d zbdQ$_Q;AbVLBaX!0WebP*S+&AfQ53$ql8M!MS^JxmC!|h0TVkWT#o-&*2ZtYg&`|@ zmAwIUbArN(gXj-WP7;(be32{z@}Ir=RQZAL~5&{wpP>D z&ZqldQrxV6@8R8rzAo7^?@02+Y)KY* z%-zV#^M}^h-=gyB0{6w9q=h%*u(y~7e+7v>*gjzr{uOCkd6Mq>yz#*F_tgistFPEj zN_p+wOAl)29;<#2JVW_ASej04SUW^LRh??K4nV~MGN4 z1Tyq#GNbmz$Y#Pzn8KsX=%C2s7R9C@PGxE1wP}hGj-|M945TdwDSOFxx%)K zqWKI3ppFCRw{?XseZWYWep2A;>iwm`VsqoGB{P@wLJg$cfW8sEojb<6R9qEWlitZpgsv{ zsqLzLmQ4D|nCQvYeXjFnREkUzPGK={K|i&In=SW^+{;x;$}iyltvX9xSR z>o`1AsUO(0T0(cZ5&jL<&veUN0ybRqLUv9t#3`;DZ`WUKPg^!i;gPjZo(^5@_TKet^~@<+RV6EsH3-a3m~(CWbZ8athQAP7arLu!DI5^0}VJH z7$$HOX~r8RSvXN+j`^z?@kB{_%3*OSO^0%vB!hA*hA7^-%Jj=6!=Mt);7_3bjyY}t z<;%_!D^X#zO^rsfNA@dqs2OQbyLE)*iYQH8m#nI&K@1IlbEze3RElSCQ#&xXf+(A` ztEhi^?E^z$IAfm3%-gj*F{z!*`%50GINyeF$z_HUWhE)lKz1xXGVRpYM z#n^>zP24QGA`y1YR-|GQ&kLK=e`_Yy)^?ZEdDfer#^8XGPTJo7Xez$w4U8uLc`%?n z0Dg{Ni8_u1FpqJo-CvGIW@oE2{WzJ3g4t|?Z``7P_}s{w-?We#87hr%*<$OPZWW`J zRBkz0ym(FoH5%XTG}>G+aN3_&VxEdeX18S-sxe4O%@oJo1po(`I9M$L_Jo?@w^ zInI`+XGQ_gZh3?+LraVnv{VH53D7c$f9cVJd&E^7r~0dpo%(YO}0?e;qU0*0Y^?nc+PZB>uONm_y2*R9D z@X<&imUp+A%+P+Na(VuAvYZxx{8!|kzQ*u>0{q7_Y)+`&_$iwmw=w%!^t*3$x(#T@ zu5@#SlA4So8PQkny%QgYe8!B1r z)t@BK*F`}*`thIg;eVZ%yk7KBc(gK$)Bo_K2{1IAD=3FrJ*>BR)vL$Bw_Z+IuY0+F zk%0jeBQ(BBC%;58+;n7;6z+BjIz_8DB27k>B+p|qM*LTv7|FVM0{XYhZ*m{Q554E? ze0;12i*#N%mlO4o5ONB1ZATqC5~g#Amh~zLFMgD3ZIU3EkO$jO`}qz=lx$WmKmuddC@MAX(e^IG;46bMPMkU8o9p7x)OB zQrR2QqIGX8knX}V_12i*DI2i5VzoZ-E=lc2sNtC*-^&chSFFZS4tf87zKx2$M*|F z3;v!bu~@{hM{$hat1-=!O((zD7$&jY*mdcG+>HOHjO$YdxnSQRZO}wkQit9czcQ7e z|M>qza(yB}-}*bG5uCL~Y3Z<*ef{pz{em z_|ieCJN2S&nqr%#mbgk)7j<)*pNi-R>VpY<5c=N1?#?47jxMLryDlb$o_3KG_nu+5 z{01eoD%j~&dHj@TIQ@AiWgEGZzbgggOtjB4cb0;bODDN^Lh)n(aveW>MiYagFyp6} zSo|Omc}69Lx)bw%a>^j#r}s|miz`MTmC@n6EGaVhF|5k0FZOniPz+b+{&=vpy>)Q- zBW2nLT5O|U=y{|xp*gUZ^Dmfj7B};bo9_TJRP2Y(~mC`Sg%G&7Ce_2y-(^v z){5t#gw$4x(F`*AA)Gq24!71{#U>Bn(kX=Sno|2mz40&n0}v=TKLVNaR*uBmW?(*> zfMEPBT#F>dC{qp>_&7;Xt0Hf-I$xt_axKUcz#w=A=(%-BVx@>Ke7VNpTU^iNfftFO z6GzEUq|Xh1$42!dht5d?WJUv;%j;Uq^%P)$0y_Qj5J2Tu1n+)oU)F?zzqSRkME4 zoa0LPA&9CG)9>MrJ72;+?#Jz&t!?oL0vi8SqWt@Xllesa4M_yZG7IChoUo>M8J{5x z;EC@o{?;cFu(eP3_YZgCIV?nVwv*nV&DE{O%4x5h2!vyAluOT{Y*gjpHhNKt2!VHQKZ*3Ehd{^)b;91%PYa^Ea3A2J zKywNm1r!N{RQr{0A@rsU&Vh=cY?i{d{glFg9PJ4x`1}Q9QOp416#8{MoN`cP+)m5T zvZiOGm^goWafPm+KGisd)<{1ek~LNiz!*TryTobrJ{K+?)UoWEwLt*Lf<3h{5HkyZZy|_??ik7Z-6mHT6Z6=RIhEf5p>nw+Kq+6a;ueQ zZ??I(H=>Mg`-?7n0|n@|2X%N|m3_99-dn2rT!umkXT=mg-9>=&|CRsF%KuBE{5vkv zX>0Rty#auMyo2`tB(@;!7&zmz+ftaxx+U3eKDTMuPyxZR+PZfz`h54~!AJXl$MBvt z>wpApsS_qcCdHto&VyN2U9?nMqeQdF<;yZ6bT^eJqRl-^e_9ps&I?Y^LZ8JyjQGFR z(xcm3nc67l1uoxc0_|i1Hc^3;U1F+k8Dw6GAz%BEw#|{dEpEwg?d66^^S)5F3Nn-Y zs|+RyUw6dh{s6CLByvKQCAy)1O3G8XZp>mR;o=-FlHMEutE-6?35AqUM7XpOmjlQt zvPla{QLYW1@A@-rh5Ay`Z_Rt5je0NBCEf7&V;%803`}umfJaw8JjvhL`D2h=D$h0i z?)%r)eF=Zl)RY;-7Yj^Qq-33tRvO}a%djUiGCUTM;j!7aOom_1(M0rMcbpe(ehhY z0k#?jeQOw!;mbGY)>^mHnz4bE_IB&$U6#PGYkJ~aDH8O5zLr%sq=hWSi3c5AWapCy1ID-`fCGP!HZ|E;Y+?Hye0)g8sD3%Ryhpi^E!}wGvSaN(DvVD zjab$B>fYK`k;k-AAxyPmXY1A`&*vh#T=tXNR)#VgE^Bw+RVFo;lUo6)mr-Yxdy#WR zy$rcmY!RbvS@#MD&7DH2n?-w--x{#8dZb^ydF8^wx7sWJzvNqx?epd@UG?z*LYM-N z9pt;^utBoe!zn@y^f9U-VIfh4nA@)#4(6m5Q|A8I=(#NCe z4_@Lp6g#_G3vV>l@R4YJYqDa2>fV&0>I&=Dh(Dw@mG1cDhp7iI*3oK zMU$OV1)y_b`GIHu!Qp|pt(bIth%cmfcX@Fhqw@Z{OWU`=v9(*em5QV5+DDus0fDdV zIqzjR&%LK@T7M1f+bDtAP_i)ISZn4Q*c-rQowIAdmv5o<6MYuVDnM}tYdorIYu+j^ zW-gF_ns?XqhicgEr7aRN#2fSzXHDoQfBJrEhVLikb?v8lOHP0Ie)`gk#2xy%JLcLL zEUfA;AKqn%!(=+cSMdeQQSZC$p2YaEOYODNP)Kla2!CC5%66$g#8W|=Tsx9nB1%wM1mr~Zi z8_`7J+;2gN7cC||@QRd@{F9QipqyIpq9~pe=WQIv$uw9T=GjaK7U?g~o{Lnl{zD8- z)*|z;j)0aTT50*Fe)_crv!V z?v7E9Rb0cXUfo(q1`$y^4ql*3=zX>ESi1T=w2H;XAihnW-KacnK$GvA2Q_?0gW7RS zYXXaD-gi|0l5WRQ?oa2*pf}uvW|)b84Jr?5SVsZ$TVg^l1}DBC=QxGGX@yXZ@(iUE z+w!c#9o(kw-LmV+pv?-fa*;aDFUy~EzfL)Qixwj+0&5ZdZ67tWY%WF|=LF6Ja!gT`b>}s1~A7%1d8MV!pU_ZTB z;XskHtdQ)uhs#9!v;_kWdQI>1PmjKCHtUV^t4Vo{@uk(W$F4%%ta}QZdaP{{T*OKZ zd8RObx7ze1+uQUQGFtH%_k4_h--~IxO>b}6M>gv<8ukp89{mVr5V;)#TCZ2d#g=gt1MuQ={gHouzi(NB*t137&FA*$pog;>rXI){jH6EMh_34h}o!R zx9vIor2Mzrj9kC}wN@k7(|@hqNF%;jQ?V>>!=wnp3w1q_GIJ=FgM^Vor6wne6DlK2 zW}>%1B7)+RC|z;n?isa|oq>NyKtrCN@IwNVm#W&v`nATLY3r6DE!YL74jq&Mn_vT5 za9E4xs1`LecWRIuqaqN0BuZ-&M|U^=Ef-p|El76SHw@NG)>a#I(et0YF)`kzif-Pj zpXcLN^_;U0rbatQB)gbbVtYy#TZr0E)G*iCF2*VjW_E5b)Y;f9W=0r|7`HKm0by1d zEh5ys5o}DajHFjTk40y7;3N`j>#w*YaBg~SPeGtBu-v0ZOfkM_y+U59whpf?5=dVV48r;@oCm1)uLyX!HH(0ycEoM67v~_rd z+{gX|@7y2&4&}kfOT3y@KAv(gTwTajvg0on+8o5`9=iie!7~iL`xxG*vx~ud zzj0*Yn`$WW73holbWaU#zkA2fN^ zpKels%}qZs$T&l8%%UZ9h?lGYsJ>uHI;VgL&!>QY)B9PKKZ~N2lVQezdFT z$q(Vf6yo(lFp!!2^i$G4t%~=|q8PGh^CfBYBLHD*2|2CrlL?+OrFGg4Qvwnq`ngLp z(Pm0U@0Pm#1 zJ(3!K)CYiUL6{0bMh_o6*dLAH_kH~N!S2DQ`?#Ze6@T$NlOOW=JFjYm9rx6X zAqIF!-r=NYc>;{yjkkePZTqu)o}mWXXq*EJ2N8gwy2^2y z?89X@VL4J{il6dO6DJi&fmSK4NwJk0>tV$^hN4J40CocpJdnhtZGC=__HX1ex{KThEhj$x&JT#O+d20cxQ_$EHV~Zf6P10uh2b0HbSuP%P=HSWtZUxT1A4( z_YQYYj_8i>g9o4E-yqUvi*Y^+fn#SgV7v;W$EHUAx699>!U!7l4gc-YM9-n&v;492 zHp~H*IfBrRfEmFZ#Jz`~?jNVHE{5DbsLl)c%Jl33zRL2dN-*3l20}Qx3b%x^3I5b_ ze{(LU5&Fw1Buykzzd5icXz<5pNmbC!vt;{3h;&(i6q06AY=w~m>*_5!^mzu1SI#Sh z6DBS7161JxFq?o{OOjIGE- zAC{aHD%AS1&X_?1_h17_afy`3z({$;ZHH@p`6)0WV$TCZ8;!+uoX_)9po7u6ki~^; z?o3rK$b?$kVnP4@!gh~*#z0tX}K0fHe6eNdbn3FGa6j5}Gyuc24Vlv)SX`2|0Ux?4H<_ms>12W6md6A_6 zHGxg6gi(WLW{mkoarq2f)~lcb4j(Rt*I1HAnR#@Qhetnt%JZwFg4_#0a7jg3gk>bL zD(npF2;QC8$OTT4tP~=z@fBnif1<@~IrH-Ac>x?dWBEeZK7tE`z(5r|5m8RYJ)%+X zqySR)fTvkCxZ+71ChoP9Nh)>_WZYr}z2^?xPU?t&+f?jey{|Era zfh}M!Ph@yM2SovRXnz7hWv4-?%J3p|?cH5QmaeyvBSXWOvK2xd7UGM4e>kc4e$CH+ zE^yWVB&)89At7ENM6H7WM&)@noh;6AaPV1%JB|y@e=BWN2s{~S8YXIH8qsy}aaoR+ zIvmV2u+2}%B$n*{Toz+9R7Qd_T+C;XY4XW(dV?IE7Zc!v3JsE#6Ng;^Kwv?ZziR|9f2`dM>L=(a-Q+bKYJ@R~*$LE7@_| zDLFm)?as~ItauQgGuFDB7!-Q)%Q%{B07jAT)lzN+PP^W#rQ8bKl5hmiCM^L9Nmn_1 z##CEo)jBMtG^JiLvVhi7w4^r@)RVjqmXEnX>9Es|75t0LM_vs8e;$?Pq+wC%c(KwkVSO&!GojEKL7M!1d^?1FavvHgwnh;7&!!5n{Q~>H_H_`TioHR{$M?& zK(@dRu3QGEpRXg+5trVKNJobs9)a0wHGLEj-)?BN8*Q{TxUqN#!dyX_?u7XqN^eXU zvXC57vaCKGoB*qIRV`0A zyZ}y9aL?(f%b0lJZ1v(%6Rct+j1XPs!f3FOaS_>~TxGi11lHkp; zy&Q8c(zC8U{_PGrG#4G7-a*(UmskmzH!slS87$U#ZCOSqR7pMq3-#`Y{2HU!+=%0L z;rHia$@GJ3%)z}x)yUa3uu$G>&tzaM51e7I0%u)=0R8Z)ncXxbs z>5lQVYb&$ke?Yz{5ZzG$!?OLjCq2;|>9LHsl&}Soc9via?WDz7Dx+4(tfft7?k2Av z-xAoM-{L8@i}sYjB6#Kv$K1D@u`oQ5o0){d?hniWHu|B3$ktl4OW7!d)w{_nCV~}K zw%x*h#Rcxwdo7cMrACLQxjaYUVxT(C9=`cW(&gp5e>8-=q96VuuDRk@$!j3c2>m8F znvc(x(P~)8Ez+kCJr2wX(t?KL`2eB}!*cNQTO8lbj;(MWVV4K-h+E8&Ik5 zrh4$ta*s~Bp7aW_!2*Hh%n%En__vT|`@C8_>O<;tyHHQxMvoIoV}npk|7n zSIfx>AS-eFG$c|cD;{-B@sPKI_@ann4lNWF94t1U-@}*~6gg;Fc1kBMuj+Hbl~7$y zB;|IdME>NSopQ7dAuv0l(2Y?xUUh!FM=e^ky>B`$e0uq&r@omV8b$f|Tp(+JL-Rl_tR z&QGhH7vSdt91)f6{$# zj`MLtXQ-(vqq7b?G`p_ANnT#=orm{H;HFB!hX!Z=oMJdV)$f-ze$Or$0kWN;}ECxbfkE=NNrTg zYY*vihEan=m6hxWfi;~pRHe)f5-%dh>*yX*(~)qi=98wUCHe^Qsd#MF+%-|qQe zNxVtgL&UV57OKhWTmC!cza%aO|MKT|oNk0K4n~qWIoZ4o#T_ud5239!Nnp)2ZjL}a zeR+b*unr1qfAdwUE)p01e;d(os-X|`v=RkyPoO!O%e3ZFTt|;Ti9KcD1X9xgn}XWs z+9JXT3Y~SuVbzmy5}~fSLlXitiFw(BdhL<)k`n zDb&&_D@4A4y+%1H&(Y_`Fh0TaY|nS+ z#J?4{vh?z~WA=L-%T90o^hmiyxtMTPf_c4R$RH_ca*~?}&WIfSa3}7dJt)f=X#T9v z^D8|TYGa8+O*E)Le*xm>Og3(h$gUcENafq_E*&8+%d3Ak}*Wx0{&02Jbe{8}b-cI*Ygx&*QbD`n( zQm=L@^_rBj7%~}|U0i@SkA6GnB!e(W3b84Sk0>>w!tBoHpog&e9lY`{(ix~C zQIi;)=eYH>we>y!tt~KY+}XFWt-={5uhP=xmqabi8c%*DZY1wR;b3F( zh=w^Hcj1PNdE=-2I$bfu)rt|W{0PJBq3nG6b6QN#N>FzLqp0;S+0lc{3Jkb%kf~4B zhNH~q8+BxDs^ww-c#OgbBs>V;eoHTeEq7TVhy>lM+m^rq;ge*;EW`d&SOiJ-J+O9jL0X8h*dbiKrhB6JV~Gdd2&H_zBKj&P zEH8<^W@5ssj;|(E+U-q~qxV1Fe{h17G#4-{f7I?56Bcc|pMJ_q&Js%1c!#;Dv>sk^ z+o}@0mkm@7r@%13iZRx4Lzpe*pgG+ zR(3{YNf7YB(~e3U*h5Ol)Rj?v*aTE7-PPxOM#=$v`fJX1KQa$Bm*iGUCJo&;;R#% zBo@1wG&2;~iEEju(w^@$Pj6eCxaNF|`YHv4I|oVI&+%_Iqb#VswZYBCh&n!B`YyuA(> zI}>_Q#vz}vaSRraJgeq(5tOU3jiwNC!`eF1Qv;o#_=AUrkzo;+9*Un`Ng&PaVr3)0f zQ^TahqOtbRd!;7!w2o@huh^Q$e<98C{OUn@bClpL8Eh{vI05VPTzZC2BEAzn%_LB znW~DbuKB1wc{gh=+<*Wq0DI-s$bTur`M8nNRob8k62th5dgnB#p_t2eG}Clfx3yGu zwpFtrla%~aPtxRNX@E;ue}NbmLp-Grej6A>Uz5w>bSRw*y%c3qvI6jV{HMId;5(ae z;8aIpsungvj?xN#TZ%aENdnVM>?Da1_%bWze6FFpOkjWU>l`Q1KQWrzNxN6uS-Wvu z*AtKrcj!yFdfAuwKF9W56M;i9s&T$E9fqhl6;(v zY6pkcA?evOB)DhF>m#o0FD<^1B&x3SxgO08)pr_?`06Kj3ZK99s(^COBiN+DIxwAF zi|e9m4m&?gs**LBf3pP|!Ke`KH>8x>q|?@JVb7mzzt*uquaOUW;d(#=C-ed<^jdkL z$0YkBxq%w6^TW;y1*eOZ=1YH#50{O9EdMkWZCUzoYWz<>Dlb>8ijnzRO>6qdghEpHf$j9VBK!uyE5>*LN zAPFd9k@|6yd1PlvZ6X=e?M3s=c)lCQGq=~c`Ti@f)HGc~+;%CTQvEnbk|5VjgS!C- z<`pyUskj`qe{Ga?v;>&G8cy&kM`5?GQJfj&b=&o3Q7&FWEA-nQ8xpy1DLK-v>sNj6 z5Zgp&aO8hYmb1seS{XzW`yM41{2Zq*G#~cYok|$+le7(-I z*&|%7PRq$8KLz7ps{KJj)EP$dTLSBfB3*W(#eS%De^Eo=@Glo7SZ)IuDmfHO)2QiA z?eK|WOC`;0y>&=mBunCpMaf9jQ2w;^76CD9&M;wz&p#NlTxlr*a< z6BDe2PGiJ8@{fpHtF2H2_Ts2@wtRH0E-K`0d5e&p=6;9TtRkrE<8o5n=6}pRp4CPF zq~&rNX_|L&|Ssb@F?)W4G4PQ|y)b_*xUdkc%_Gq@bPS zf7-iy5ExTjS}}!{#FTwEq9Tv^{PDDaOLY?2kKMy$b;5N6?+#4I*7%(!)OtV(aA>%# zARgEFqSC<@Z>v?PD<#Z@CVmT0IVdr)Wrc3wc=;N;MVghd6*9?Ux(+MC!@ z=>Hk^N6avG+)cu5U0xrY_mzjn?9nm4fAH#=Y(d2w)NMl3eCEaI&T|!7 z9~EP~95K86b7lvQd&lX~u$$wn3Kgz``-cxf>dw_qN#ocPvJ+ED1*z%m}2||tvO6Oh)^&eG&alQ=G)z(jJvfouDucVw3l3y0#Ye=YyrsAdq2 zgsT`{m~xo=Sp|`d?MZ0A_xvlbU>K6V08x+UmyJz18WS>3E7 z+D;6;sWwkl*Q|l1ML0{?e~>r$Rdfbl$pKdxjvdx;;)u)llkg$$D^lB%wj;SUlUfdY z`TgC)hoAHFWfTS;kRelk25EUlcJ0#{%v^+1&glH3APYULBJk1=7y!vz9Rz)eVdBZW zpn0s9pB31+xxIib*vHi#U~>~4+#c&k9fUMzIrQ?QCqN&n`knlHsb$T8>&yzx98>x%{mDSF>?oWpxd zCITMs^7P$Nvr~LlI)+SOGWcGPcIW_Ej}oCNes5uFo-viSb=hR(@N8rkh8(Kn))MNo z6q4)jS6Q`u4hf(te`t#+-{LZJhlaF}A9z28ryi}&N}c5+#en`#fH1HdKTklf&t{7W z`dH$~NPRrJ0YxFFmsZ{o8E1FFLO2)15B|r|<-;H*AXgQx-7RMPHph-|9gD@^k}dk3 zoIC<6TvcohCE=6BJi`RA<>U2~u#YTfG1O402GoI+`dX2JfBTBIX$*(;O1wujrIk&F zwVlRopQcNGYlV43<)SN(Qc~Xd+#)XBvcW#$nJM4;x~DIs2)TTkkwqbItn2(RL ze%Sv4jG}u7qtACwKsXy8T*8|)^AaFG zTFluwy9y`l1xBXO+co(wMTOe>Go9q01T21*{!Hl4BND_KFhibn8#8(~@P@p@Df3Lj zLPCA+1_`+|ZJ1O)gdS6+e%$)d!L!q5by=P~#K&<#e_~^lT(Gjl>DxuM4^-1o%q|?_ zI2WrJqZ(C)hU6)F#H$x&$$(N2yeJ*f^IJeE%`XH7ce7{lkDEV-5ti)mPdY=Bjl zT!25=GP{}$$iFUzFpPhACTK5ec_7ZRdj`Wf$qr$P5`srLsuqr|QNKFcJCft1M+n(a7YUc_wM}8;#TB*J2{sk%wJ=8H^1%XMRn>281v&L# zm50?(osbi#08k8eT)rjLJ#!GxT%2`yQ=xkHf6F|(DyLQs$R22t|2gwN#w7WSTV{c^ zV$OzgeOtlKQ=1n}Oq+qzMN(P?v&pw?AWYEHGFAxJgs$(D(MkFVeX~-aec{9#PL?dg zK2#z-m=-`&uq>Yi1 z*gjOrU}KmkyT>OFKVJosH{%^ZesplMe+mvRZYCdCa`Q$W9Pf@k^5fJAd?&)}?eFe+ z_#0q2f@rC3)TO>cagn3oU!$s12=4IY)+ymY?Ih*t=|Y}QC*1Ne$K8gj1LV#N~xvw!*sH3vTP8Uej{CjIjB``OGWeJa%+(A9bDq9vO}ysW{^k zLf$3w&9DL^5!eRFm)x}nEg9X^*U;UbsaV4%hS7b+`(F?E`7U}ulC;i4;zP8`mh(t; z1|HNH7Cb%0Y^-iDY>llV@BGK0e+A2N^yQ+meEkQ^R1`xUCMsPO0W^ZszjP9v{&@!Y zu1P~`^-JZfvH6t>KJ{tLYJYyi4c9QKnHqy5b<%HcRW*F*;?Ymp^>Aeen|n5tF`{fP z&m);Krc3ZBZJkZF_+RybF0-IGbNnXk19^AgQF|l88W!-` zHF&FQ*rG{p;WgZ0;&S!HHaPlyS*yDOuk;6EnlK%7aFTac!BE_FLmWuEEqh^pa;&i< zjKGHT0V|uyV8E`M5S=H5e>CG8&{^T1g|i%Uaz5XfW1!BH;1~kqImTvshS36D7zT@Z zhSAI?z%T&ik6;)D+sZJ>-8cqX=*ThF8v!ZgO!DlGP*>*VccYox?75!2p}UJ6^S7HW z1+CT@H@InSF*w_lO`vo!&2I<|Q&vJ;+Qc`4?PLCI3gI*G&>x!^e@7}!bWRdSmNDm{ zkm=N&He)z({03@7&FGPovpXvpS(s;pzRWJsEufQsgw|1;kd)R<#pt%JNp{TQ&|#_B zNI42?o6uw*EH(F*J`|bg0N|(OtJTOORqs0vFj8RM}eA86Ivcdun zewn=?e~&(bNVP{_fBx|0?#ceKB$^+`N4tB=?}vw9?ta~aA2-W|hKMZBo7mT{m-AMq zNbLM1x$CBhp9a=*!MuhY3mv_*-BX*9p;67nzAk52JlVLKj*&FLsRgP()mhY>y0^C` z3X;JUGe!REqlQwYzI>Vbei6}HHm|W&SIMo5{oe(XR{SLq$O zMV)^EG~2h|f3OdOH+CTOAWBPFENNYb(RMN2ElgwsM~C_^z=*i zsOmSANq>Qj@ahuRYfJn(aALvZ@s2tYNm*I6%w|OjwU!D29`C>PO7f1|8{Kju@lh0= zPQl3;e|g?duP@74-pHFze%3Tb#gdM%-3>}L{KW?fAeddyC^S(-Gv52=iBgAK1T^z z4YA*Fx+>Q$9_0`byeJnlzH7iBQKoX6d=#e9qqzY4iAsrK!(+TjJ}%IQO&p!kyuh{O zf87Rs-ljK!-_i5W6ji#17*o7<>@Qgp7!p-^p-003CuNscSiAQEoQ3HK%9DWn3@KP@hCRqx9*NGaiF&@{9Xc+I>N$%rDm z6cx7t{HKUh^U8s83z@qDT@d0^P&~@9WR?2x3n5g(!}n#h_({%eHm)%Pp&$g4e@UAq zKM)swK7$GS%MVN789n=#Yj7IvfFPbGa^!toE?~SkTE0Z~x6I8*FmLl=H$NX`Tc<)p z%%{BN2+;eO5r1+|KPn&Nm7*a{5mx~j76QFxm8pqrMeXycFBPCxx#KLgS`gz_*(Sop z&q@@HRGdG7;#d^^(x8Eip3ps`e~@)A;cC6DwL1owqq))fsAJ32I%EdNswAsawoi%YF0t6D6cvX`wMMX} z1AKnM&*20G4^(8qf4nV9m~7A->`m4X2|ieO2!PfW?#YV)7{>*`1~{-+V@7L|9!ASi z;<3s==JX7RSRrZf(|LX|E7LH;=To=DNl#!5RWVXADB~pZ@GpHV%p>@52C;z0Y(&Y< z&+{{UbEMp}J-jO`OM6~-Z3S3+i~;iy51)1aC}kpGB1Z`#e-{U2EY4ec-$@d;xMIa^ zM>INwm0rT$<(QI*!P%`OUswgxK!<81i>apPALUfv`4J`6g`mPma2J&U7K;J`Ut(#6 zh**tm86;WQ7MMzd@Y!*_YHqpmJ(QOOq}H11WEf~U8}SaWE`HjDY)ZohvY$>kY5<0K z0aRJYL$ir)e-K)uiFA8qna-i*z4V7glb`Y`|86XqzYv+Z-R?E?F-=%ef_yW3HHRWi zfw!j6fP>ypzy<8B0gFT6HV9?{LJsMjZ4u!FmZ+R_GCT{Glr?&e^@z}*hyuYgx%l{3C^NDIElMY>K(gZoPv5N}=425UhqND{nlfjw(>`w2 ze=5*W2%TgT+2|tewaUk=rAV$)8w?E*u$wv~b02uw*dgJDNUwA5(3EPo_9{t`P&W-F zHzTFdVG?=iBm1}T8Lk+U=o2V81zaDp9VOY>>QkNpVKPNEEMPv0rxWB#l)>@g?yN}1 zByv1zWSKX4kpbccW_j4a$jOEQQ)0o$f21P`FI0gE!}K;a*(l(n&CyGJsJT5GW29z6 z69;;N61nhRIldVYM(M>spB;@x8+sL>ryA)q zbrwOMt=NxRQEj3-4)O+Jn3^EUBY%M_pT#Aa{;wWn?P%rawylk))V%5%e@bnOL)5Nu zi!#NU6aFdt7jH3oX(86);@qCV^}qtfD2U|SG7sLmp&qH zCcY+?_ABW!eFVW+F1y&S;9CPrIFpt~g6#l|z;#g&TbKo|mZ}!oA7{ZfC&zESeV0p1 zduuf<7*MUF&&Wd5+Rgg_kI|JJ(YShPTGiEAgcJd!qUZ)nY*4J69xp~~(O^L2PwGfX zhAlbdisXZX(pj0)fBlP|9|#I}t37FSy{s&Y5;oGsPPLHiAp z{|f1KQ21XV{qHHHO9LOro&fh82O-~gaR>;Gnd@^QAYkQ|TsFX;vPWkbksJ-y)>Y@b zbc{MP_GlbUe~R;%ibGJwLJnF{p)XAO!>_g*r5{p3X{val{&ge>=k{U(J#{*> zgoyoKOt(nHSsOp=ks^V=+WJr_yuQSxIZ>K7kri1(+&8#g)k@#!0!JOB04TBn+}o&= zWD`GWMvQ^nv2xKP{LZ%ipsU3xsJ1q)J-OiCwNTIEGIDE@jG2a&xUi%=q z3-&*YuR9ne8QNW8Cki|~h3P70)p#y*q0er#e zdLb%+YCaff4l^V)^h`kj zJ|y*`4(@i#l*}ID>1|(9DXrGtUGR*{uj<8C1?Q(L{LL=`ymk!Tg21STHUA*0sL)WI ze^0U>LE_7btO0dyio;eM4<@7aFvN>+K7m8$bW-~{Ek{*{y(Rsr$VV0$7H91EmulBp zT8{IKd{@-dO+ObCb^UA~*ikylXO#@A48JA`Ax3}V4aSa8Ie_#P>9ZO{KK^A6bCixF zgwD+eIg_)AZW=4u%ucEvjn!ed*{xbz!x{Zx!os)F*6uBORBuqq362Lwc!BEW8=(wL8kt-C(M1X&i?8vD3sDd)e|pZVCpB;MSQ8O03;Qv2NhU+Ba7FAFz4$wvurxq> z+^8DFCwCPa=(acgIir)PAX{asuo$DKc?gNK?nOs>E0E8Xy4pKCi5SU(4lX$Y1Xo8 zF~kFlA#X?iAxYTf)8?RFv{h(2KCb)9o#(lhYLGp%DfJ0$L4@J+xl|Zibo1@I$*I~< z!U-;u6C8q}G38HWhB)Sr3QpCOW|6G?u;$*$*2@`~aERs1D8iuE$>JBIH5bk!z|R@*74z zeFX~L`=y@i)TC?lx>lgdmHv8UX|=Dw73=)TbaiT-e*@XJtE{KSH2|7x!H89oYN z!*=WhQ-#L`@|Im}f5`yir@SmCm-2Shsh6bgup2%5>02-Tq*q~(pDjGW+ zB+QO;;6HkE18yIrAkh>Jhiz)-8b;-#)8u%z_3|sp7CyE(2IG403tCjjwrXluuj=z8 zuwpijF4p-4WO9sb`(9CJo!EkVbo$`<6uPyd_T>F-#pt7Qep&tS4xqIaa3cJwO)F_h zP;S4W0+-;&f3I76Uc7EY6KF`{b*K6LX3xuAeeBumDpqUmFjkr}tlFWs8JloD?P`fz z1H)MA>377u7cWVfy!9EWjWUW-M-mx|7z*DGL0Y7~rHQ2mOM1|hMc&fUlZ0`C!uVFH zWk>boiKeXPX~ra7Ni+$@=N?(7WyZ-S`G~={W%4vke{X@Mp{=fm{9uz9W@(g&(EXK9}noSTz21Q}Os zRnd;STnPpZQk^+>Lhq<~CjBJQSu%cR-r5=Ry+bqUU+1$v58jDVdTpe@da7rwu~R#J zjorqEf2N7XUPQy;W$>?YDa9o*MVE}?1b6MU;;r<#Mt1Qw4506po^WU62*!R<>$1i; z4ydNI1#{p>mA!g=hQ7vsVQZV3#OsgT6}SY!p-i<}g)Lef>!H&EjBjN2CKrIL{Dt_W zSb{)D*+rRU6?$|k4x~nt4nx=Vil0gg#eUfxf7j>vX!`J}r?^|=v+{weeh#Ag(0`G@ z0ibG!|6T?+?O*7?Xg!~)MJ@9D5{O$JAb$DOQ=I{Ri2yr^Cea(;BiXu$+@aK{U4ifo zhra~ja(`>T6a4jh$(wgD25b)0o{TmIV28nf;Xki79hu36t`{-NAey^DOy@yNqV;6h ze>#A@eB*)1iP*WB>T;pl;x|O`4}whLOZ&&=R3Ej-qkz{{7>F zPPPgn3P*cNPE6QJ6W`fJanh4De{A;k&`tiR2-N9p-e@tKSzuJL}bF>cfb9`+Oe-cGUi%?CJ zwL=5eEaV})>?Iyj(Z`t6taCuBWJJ%vewY+LgY^QgDCXI;KeQUE$O%IKe}j+~4+FJP z$99yAtu~89V+0Y95TIHWLCc382{Qqu^&>$Ww+u-rxE0fY1mQ}?x2QvlcJU$(0u;LJ zJeRVwa9rtED&UmwIm3 zO>d^1cEzkgLA`;B+O=1wrK+B~rlxvhU9~I97UmM<<^MNWed{d#PP*^vE+wB(cuAw1)Z1Q_<|yQY=~{ z0%z6G1dIIuK+QS4nRMX{`m@O(#T#)~I_sNZNmh8UeCOQwBs>*V_d%++v(a@|wVDow z5;VFDwW&;;(J4Abe`0PT>ql9sUrY2rB=`AG=-x1&%<`!`V8be<_%@R3?O9e*(D&Zn zVV^tJ)IV930k9rjUiOjRf0+CVv@AO7Tu-d`_C;E` znc*<(#8K2862X8q6nag)d&L!)z?tV^aDVZ<>oBGy-)dt7R(0-{ZeDqH(E}0pb^Sd| z%#%=pFg}~XBIZ!9?15kHEUM989~VEfH}OuA5dJSDJvdiy!Hwdp$x8{`Dki(wt8Mim zxJXK~sMU+6e-+>+jou~n#k+3$bHUGaD-D0ImufN|=hzO1gq4qbZs7rrx*oy61~ejn z-DE?W_jJ(>8rGjZo~)?*c#)7?ze+Z2oN?bozN*%wLb&UdbN!mR!+@G!V0vQ=-A7q3 zg-W`Mj4;kmk>7-s@J=x=<-!YD8tAQiwLs!i=Cpt}f9oTEa`a*1`4GPP$SBj%NYfnw z<%aFT%8wcbzY@>lYCSZQq!m$yW!-%CB%vU`Y{MvFKwYB=y2m6ujKvPD3G#I2WZCLe zwI{!TcuwQlh@|qgV(Xl~{*+$iUR1xB=ezGK%Sh;XHAXzH*&sT`c+h!qx-Ow3pFLBi zo=yU_e?^(y^Aa$Xk0uMDgu~YUbsgAF{Wj@X%^=hB;~b#-X=2#V)G^D#Q)$;jG_@Ta z#B(P}avHx%v*nGjZm^>z38Ul%QoBiBqe-Q}@D(a3ngw=kNyrs;`Q~osW_i+n3(FLGlaM zT;DlMB0*sx#mu-&XH)rX9wv*@=kq);t&KCcnDH1{#em5bw2*Gg5MMJri#aor4}tdh zi`{SN?XLt8L4qpD3Z(G3pjT?TFdFsb`+!u*&prukfxq2DZ+*w!{-UlC{NZF`z~__6 ze_G%_xqkv(tbTyc#>n3N5VfeUw+(TUPkrgB4-135{RO$G&6w-Orxh-!cYMMbiA^mh zZ%p2l-eN)r@iYu#q7ANN-(3?dZ|*E}q$w#`@?+WS5XPw&Ik~G|P)h>Jaf4^(ksg3bU?m28g!4B2~(?T)PLF!jS0qqkA zCJ(%okbpjxVaorzy}mZlKgG$yIY^@lsf|H9PiTKM-5xSbDxNH;3c99n-5eDW&^qcy z9F7_RJ+mEZR3IFMM2&|qgWN6uYN|3fRpw1q((#m2F0_1nfN3V`HQ1cwN4aDee_wBZ zTgSL-GdBut$k%~J3|g~pV!rKyZ=ZfMV{kBaZ9ACe8^oVj4HFe%3NOVHO7ahC1z-*u zqd2)eYe_;Iy6}PGX~w3$VM+8?1Dvn9BR3!28@BM36*hK3?&sy%IQz7yV)tl}Z1|>z zSH*;@^b~TtfKB?{k%due@9U0Ie;dju{WPoC*lYr~IUF*?;c%0&*#xzBIm%c8p7O2+ zH}3*&p7d98Xe6qi#3V6zYCt-;eqkO8QfA|1R-(elr5p8H3tz?BOa?xTzs~DlQ*qAU z*auz2frh(mvUI=NKpYOKFw7?v*m0N1YK)@7@R~P)bsSIprBHmC&rrRUf7_ovKG2Nt z>YM^;-hc?tQm!}6SmmQK*&q?5#pzqeVE6{5mftxsCG2rpL*4Y+13&foWIzT2?r+f> zbW&h)bD(r5JNRN)^rz%Rz%+C|Emo+$1VSUoM%wQ&onh!!q;@K^0UI>257QtbDyiyHrkm*DqmPswzj%D** zzU_0Wgo4?nKchCyt(;CRlwQ@`Hxz<*RSh2nXxGpvwb}g7(%5SA0j)a{bG3pK0|i2K zZ8~>N=l=%1=1<*mo2`Cv5@eM7AUAEC_TkV4FTm}HQwfWO%(SAQf8}p}ze^D zr>=wK>qa+!ek-p%e-p;0=kL5c5^2*gzJB~>OhNV4(M3zul|@@9 zSl`AD<0+$_zYofsKE&f^>uW@Si+Kx-R24Akp70e!)ncQxsEl+cz}hd_&286uGtsIq z4y41#fpc$SMN*`p`N#28eU`2t;~FxGL!{PvGy*iW)Ye=5H^o{(R7w($&Y>-<+)+c5Sx zwbEJQ7ix|+e?Q9~r?FJ(sAc(S^-dvXrsN1p-7&TMO;cKLN=`Rh+ke?)*3juTp>7VF ziGuTJr`D;3A7n1QQ)(V+9Z}n=UdgJEn1a5VF4Cn;iXcz&;9H^wGDgMix2(D&l> zw7;g4L(7!7WfeFL5(8PbzfMjQ0WxBae`fy(KEE*XEe9BCz#X<;@iP{VNgoK8(gY!^ z1|)id%}qH~z<;Q7q!c0X@y~J{Pp7MXjkgG|V;ZI&N8l`S_OR#Mg0K6t!xy$Tz!kKb zeMfOgw(gn}iGkPG7hrL@U|>+dvvR>Q!vl$fWNgq!@U4$);SXJ_!v0*S4+!|b?SA%0 z%A!~%~YY4 ztk;YyZ_oaVhoP+IcIsG{?YaxBvEM5+-Sm~uw2GC7T3!>1p4puKX*2=W8KaZ4@%=TD zvGGNj$bU;OD%ITRH3ZMGdY={ON`s3Da8tI8APMJo*g4Ikc(Zvvr<*5&>%0ZRKQg<1 z-@_X9J+DDz==o6M;`5wJqAKy(b#%6;wvOk+W|I1N7T(fsP{#KfH_VTwiZ8)_-WE?{Y%Wu8u7N&AV9Y*8sPWzt9+z zqpX*7Z|mpThEs2kz-}A(JUFfr$K>>(!F)YkHp>R$O$d@NcprdX6y^NzJrT$1XrsOu zMjvTa5)@WVu~{>Jd(>=M>UJKt{fK&-pwa6`w;hcKTu+Sx1OyK4R>&d1{%U#%9@ioW z7=HZOGXkm%18;!DA)W!oXddU zlhB-tE~e?9a6iX3CaMjGvyq22XOi@O@8gdX0+iBwN_|WUAh=1#$TusqKA8jNJKDUF zpIS0~+#*M{L>O=MfxOvx4@LW#DkPi>p~Ry;{fuP zc6e6V{k+`-Obbuc5dL|8QS#VUz)x93#A0B*sxPSlClY=8Lw5;8F z@9^l;kM}+~pn-eLfs6ggL}gZIAAd&!*ZJv98a;G82a_cQ3wY=D-J0}TRkVG_)7pX9X;jOx>i)bv`+87 z?IG=^j%cwkw15Z6>I|>#bu_!|^6ahV1!r5;u)x-E_-;Kf$5041?Xv*l*?)G%i(S8Q z)k5_SwBfW8y||aHmE;N!5?A_JPgkxttN|#1G1>qY1XA*@0`yMalrT<0w?UcroZO2tovZC1c(%KJ+s35xPVqmH z^Y_ZhX7}%|VCUVyiW_*VpMMVxXqgn{tZFh@HhnM4!t46Bt*J(KG=kksbV~JAa?QUj zSwo1ev_Dc>$FI%uA{Aq4eULrhu8Ya-n=aSupZT@@SS$GWHrMD&DQ=6`1~hL5G+!GK zJ%M|G4s#Zw|IVPD&bdZk@uQnH(X?9L!;FG^D8|0(_M%ps@abZ&Zhse3Rx~U%XkRH7dAP?I88xC znkU~>`6T@QCe)mVnt%EQw1;`z@|#2l2Hne;w+szlV37!|dLkT0Ju`8&$L}x3M3Ux! zM0<0Ch0r#MvFHq@8H>(?2&CJ?xIwVRthHiM)G0#(6@{d0!a+%=%$&R^aDdOu2$gD7 z8%2dE=JY-sE##ARHkTl-7M{B^7I+pqNi*r*uc2kDh?*>0NPj@HZH}rq!#@Hh+LK*f zx5Bjy_@<0|`>cCi=4DDL1Fx+kg`H&fZ96YtA7m?AUms-H@76lZ`qnSD5VfP~4%SV5 zcH*rS^=EWG#M)T_nB`|ki$RiBA?fq1;%uH3X0lAjoXgJV2hfM#*LRd&5y`k#h?0Pv z>B9&5GnJ}x}# zYMm(rANS^8-y=wJH2b23Z6Bt6;%YRu(dr7`*NmPLuk-kU{a#iF2WUXN#ZjlzGiQCP zZyegSl2)-5{DQ4_XI$XeEH3fWN7*==a)yrKaHyAiuz%%c6%{9#i)A?Ut5EVj^f2-4 zWU5|6CU5E;@L+vQi}t>&uvEjWK}XP5G99KPz5&q4Cm1kgs&PDmoRPTPFj@FVk{%cg zkQ?LxAsNFlkDVwPzaifRPm2=yvR>x>ZROhh04sL#->i4jmtgt^MALDmn-ix6(^66K zH*V%MQ-6%%PO<^>*-n4~e`4vyc`NT_6^7hCDIk(8T-V%V;-eJ51jKe|${1?Hu&{Vz zu@`J4kk@mNn8Bc>=_M-I3|-a*)~*v_AO-9oH&}qtS018kqqzjEzo^;U?tfRE6}Twa zVl*vA#VxHCO&ua@#)e&O->u>mc72Av6@LEf*nc_VW~Agbn0adpzz7{elBR4FLV)1^ zA_p6Tp0>@;Z9^Q1mI#cG^KXZgC}TU2i23LHug+L9j;I6n$;r z7L-9^LTS!mevXSsQsVMN;m54vIMo9xmW|*84PSc!5)9^!mQ zI<0nX-?$XR0I#tcV~!(IV6=8BI|Nm2yy>pISom412%JZ zm1MU*kCE?$h(7(blUE0ifKt6amER`^yMJNq(YmOLp>w5zd>vx+=WBBA0&rKJWo`;A zOB}1i@Vx5yP$J=27WUsaR0E7Z!hdZ}EG#z<370;<>H12fX~;VpnwALu-2AY^_50Ys z3(b438dSR8eo#FOiJL|tC0Jf28Rh7z5)tc5)-4fqst+08`L#LO*kgKl$RYgQVtna-j0`HLY?#Zlk+tp6;7cY2k_~Q&3>1~)qal-dxQ3052Wr`hPdkqm| z%X|o#up~OgoKkCAzqVaXj!$H8dr1X(%@1IW;Fr)m|3d2b&IA`-e2T(EKA&v z^Gkk$&beu(=_D&=nA7H`jDKF&6z3u#B^))zQX;V%j1hXek?iPsrE;`L^2@6dpmAV{ ztRz=r3|tMcBwHfsWONCH-o|Lv%{h=Vs7)Zos!LL6f;;$68NAyWi^J@v3ULQR`w)h( zu^*irsMv#|ae-sOaX}9Pik-)a;kY4EAV)oMo|S^#fDLt@AHw^fvwt!}k%~b*bJE6G zkxcUm_L*dlva{Kg4KyWsp>a~k{ZCI5+ShRNg70YVAAzP&1kh*WvUww3hGI3Wgfi&tcG7}5kBTKYlf4AXV*{$~gGAd#+Y!q~f%F>YKPoDN}y z$QOL33#_z{-$OXZ4S)HzF?i^vL62ie>btq2 z4QrqlH})eWOzz1mb4`Frz zeR+II>&mSK!P*YfcO#>GSbzMCUfgr;g*s4inIb?PjRODm zv4eh;ons`1iZyK_2L}r(NxVC;bWz}EUfP-lvM5p88}i28mVQ4R#$5*er*K&^hwhC= zWYF*7p=UfA@)`V?AwGEb@aW{jfq@c?^9tc$g8WH9s$Q%jyF{7oNj@oKBn{u>M69r- z5u!o?w12lYEM(uOtV0bPK=UIR0ArtBA+CJuH6%5qB9J9c3#Dfk+jsBqigx|1n>Ljo zb)ryl)lMKa_e`>db~R>AEuT_mMtB={QB0T968fl-vWD5!bSBR?ztfxGitJi+YUbte zb5^R?jv{BCU{?@|dprVOhdZkb_Wp`4ONS_V5Py<+nXQTtD+Q!9#*v)T5$t?9Z1*Yt zY#OAl6k=d2xkK6Gzp?KDVK@Z05EC8BSdM9YqD8UQ$u-lc*ma;9`qP!F1x|aV_k=3J zFb|skijtxEor#|u$t|cnB+TI)+=y)q7gr3QS`?FRmy@t+rLq;>UpMs$M>kIe{6H|2 z=6{Wz0eXhyKX~g_lNhJ#d|0Chr-cyQo4NnzGI0ZPV7cxMpfbYkLI4`k4u#FEFd%yH z9WzwmG^Kpb{yT{T9duX0(6$bB86wQitMKNl=yul7>J>!S`)jNpGJULGE4OF%m1&L4 zzR4c)je)=)CHpd~s8R&qi84*h(rVfDbAK~P>bkD?_T&ONFYysG4g%%Wnc8S4V z7T=}cf#G0^F2X(6aq z9SgN=3sd7j>n5h3WCOD$e)BTD-Y-GxfiB(SHKLp4;7x5H6w(r|%ou6mTf2^kihqRy zX51wSo1D9~6F+zc01N-(A}d2eJPzNmAE5AY!;+4%RKu-Df)vf0A%FvK?_AcrBH?9< zwDR)A3yh{~2!0pJInc@Gm`y5Re2kr#V%~w0^fcf}(#4MV?j=<|&Du?w)-HAo0-g)f z8SGnSEsU(#Nnnl4E=|4OS8nfx z3=a0*t6AW_0@?Jlj{k%h86!XCAkdF)MqW>Mrl+;{%18LKjD$DeaNj9c z1jU4#*RhW*z%)7=o}Z9tu(R&(?|;gR_C1=>tdcMEd&InOG=qVs6Mw`BY*JIuZBpu! zBAjvabUIDXeqf4F$%CWQ2Oz&52;5|siWipFqf-F4^;+`L?7Pi@{*>yW?B3zl-PhQF zDn)zLQ}RJk=9{dTh&a*?Jk4)pKy85bRAe#r-@VyXbQ7&AdbJig?EZFlt+F0&}y|>NxQ4nA|#i{dai!=@Ax7QWbKn7 zj^AecuYMzrIBzPOlgU_Q3cnBvFh~P63y?kppbckKpkw0NiGL2R1BGhCf)vXLmWaq2 z48QvBU6G0wv%I$GS(`N)aUa!VXCt>Da%ET-)-Ie(+3(Wi3Q&@g;S(K82JoE?c^UGI zl3Bd+WNUs=Lu$6fNYQ9?u!~`za=>%ix3@|*xRECRIp|+&O zrPo8X+k?&w(toqrlL(lT!vMbBqThCh*y3 zCoEpj83>mi_%|*a@b87m--)idy2T{Gu>ozi;&(A%jrLZFV`|eBHByx3KWCn!d@;VB zrDfL-WjN}sMP<7|;(WZKR-YCyHNH|#Q(!@gm4DCG1A;Z0q71*+i=2|6W@?4lGT}kB zHWFN~+?woqj0%W^jfL6DWQNi)hxjbYdM? zdo(v#9nY?=CP3qKz)O@ZT1i43zTH(UvU%Nw7oj-ZSO7;SRtBP)RiQ5YhEQ-@-E2Ue zB7bHZ^v|c0(KZ-q{A_)9=b+EO`s}aRhax*)!m{x6_+;l~FLwFhV^l5x@jCbR9xobj z-TEOLFbUn(G0rs8foy;@2uVv+O&p3~PaxNhZ^*kgkO#P|->U2bu9$1GK>+cC;;3!e zhd=f7^lK$8G^TNT@*#b+tPV3CT4E3ViGMbCK5nS@7%SPNPuW*u3j@SX^GQkzRxxmF zQD{K-+=T(9rR!JZm(H)ga-JQxIJ#v{Btm#^fXd{Ef$QQ`Bh{}Vbq}c%fa4H4!c@u8 z-poIu2@mX4Bd>WdgGKM=(NYOR0;Y|`xMP8Fw71(RE;f}GZN$a8@?sNlF>Ws{#(&F& z#rm>hEm6@dDH;VulbpD*m{@DZ)=$`#^Y!kh>$qvQ@?>r2Jb?e#Lk_qAws>Bd&Yg!K zB%`zdKjSH6u%GdejvRQCg?C#1cx~_a)5D{a>(VL0N0mSFfR!uF{&oezCQl|`APB^n%mD^4QJ|$bSVqZjNj9RrdZFR=0+YvZboYdJAz|O2 z8@_M8~wF@2S&mH>ule6Q% zfSg_=*@V2!&=Dq|n1+ro^QW6Ngca+cZ}y4mBh{J%648IitYd%4DDA zBX|=&FETf}w==*yQ{gbYj7p`65_nQw_#WGVyU1ZD0gp0yTw$2y){69ti6;1S)dE0Y zk*kwMW0d_&h{S&YG?FblU8uS1E^l;Q1bo*YcqZIV5+V0;7-Lo{i~mx@n4!qRhytghoQzptB~% z1NN-(gq!fO(tqRES&Asaz_20DXVco-C4X+G*A(VaSVSSg7={rz;kx(k_3IjB)0L*9 z^o6R4-9-Jdwvc2YomD`HC@;s7PoMOugvcRjEs>jp+N^00E0GNtnuKzKR>HJU391Gg z8IV$gD1wf4C*T-)kvx04aM`#aYD@|?R@F#{;$&4KOn=;s6a+@28F<~AqhfSZp|a@o zn3G0O&zCFh1514FHd`BDVU}3$aL=<@#6m2ciUY-nJv$(JLGpxeKXjpD57WHN;oF_M zIQ1PXuYGuxuB@9w8LEjBUrqU1$rg^OA5GF_ z5L2QUjenx*ZzT%)MHP*<878p4VL8pT4mDs(UyL*4EFF8-zFYtfcNt~Di07ujIf);g zN0dK?LA@&! ziO>vtY^7|i1ZZV2Xf%tX1l}^s)7fuSWRiwk!haQ;ksZ>~ae6tAhGnjp)C^*!tURng z%#f%C?0(MX5g#28hFn|QSUOJ91u#m<4O{zCUOSRP7bnWq#%9^DFHjut(6MhBXfLq{ z`gLlAC0f1ZMR+hA!Nxw>{VbW&8zh9gu4~A}g`;-?bRcRn1`7l_3|ffxKhTO4Bw_I9 zaDRN2os+cTeHn4{tdT#wKxC|gYPodCUIAyrERc>XX?a5i;TLeM%52TID2o2dB{>uj zFT^N84|$H&A%2LWU3KH956)WG0e)$5b+1xlTU;9hRL&BxOmL_|`*E+~ede#P(U_vd zPf44;_UV@g;No;0izEV3$1boK0w5g{p?_e9%@HD#c)7`Xq|j|Hz(j@u8H=W*>~fU7 zm2^V{M-^2TzH=9};6+}9EfrC$O0F`s(3a+%hMlP)8}alscdH0Sj#Aj}=-0wTrL{BV zdGvKy3D&_U%~gg^%d|plo5d<}Su0=Nx#kB@{d_IDZPG z1RYe`ZmGp}kQE@@LIqcm?UMT1yi!}IN4#cqeez&+xYvT~$6O@i*$g}& z(s@HqFh)LdI@{cBT4bY=%7nUN>v@ZtrrSzh2gA-a%)*d@C+1NRcC#j87N%+z8i8C7 zKbSo2+VIv6*_YY~2c{pxjA7fOp?^_UnL$TgH@9s`toAc&50SN2t(i*{y4aM=FOgwDE`Q0@6;GQge58rUVS-K+Jv#jI%fs*Ju@_GG>frboC;}-D zDdn2}&s@Og>w;QoNiW<0MI8@n%a)#t-a=wF8ral*ugXkK0#RWpRZc7lRh1&4>gstH*j03L` zObAe}HY+FB&~*fjMMQ=v5pVg$t~+2dsfrA-=GUSiWU^txB?&)7~1k(pi` zyvH;bmvM|s4ax6MWPi~>H{{p6n4*zR|7h2$KGeb&GOVmIpU`JBa9YVoqS6;sDUXh= zAd*i%G~W_}%V>h)yL}?WT?DdQh})g<0A7agN%wfu&0t5{%V5$~*}=YpVlq!l^$UFk zWo1c{F7jSU`xbtX4;!VgeZvg^2%nn(uw(An;1)nLcU1Z1Mt^`s4Y|&%$}G$FJ_~Xk zHk~G_`k{*21U%h6da+}BJLeSJ?~*y`BYjJ!yVX=yROrdKVMD9iTUu@pw`p;gwi_Up z3oRaJV2s_glF-CVOMZ>vO}a6oy`t1Nqb?@<`lAu<`G&eZG$2_ZzY37#bz#`~eRGmF z_yU#6;l3yDY=4j+3=RZ)LTo*tzh|5sc4A}^^Hx-c@Q-6Q$09f{i!0WCBm?Ddr0JbB ziGW8tsR;z4*BjWSA`GZTHj=OMUQCy-{Ws)2T$1Z*r?yps$*6Ul@b9X89=@dyqT+n8js!cs$0 zevlm{ZNn;*y*d2J$T&^eBggOiwP$%{Kxy7sHIk_BMmuSDP{2B%Yo3a8s#aM==~Su^ ztt{J4=zn*#MklVqG>?WaLlpVqn=7zpm^Kd2=AxqLw3XF$et2zp{##o=+1{Uidid2> zJCAo8sZj5##-dopGhRjUSQPVV1s@1Xrz@ghFT{2c1gY|qt=)}uzn|jkO>f#)<{6Vs z+y*8Q2XLH6&?oU5h0Wb_UTZ@g(178jQFAo7yMH)(w2=)9&$SzghtC+LLpkffawHjo zcU?H(7SvU4c+%vPvrISIjnf++oT+Ao_5BQQx2jiJzZOk$20vz+G~tM76f5!2E#`dU zC=Xs+Fk>}vAtcY!X|Dn2g*#3RxF_OPWTYq!7$brWVx(g}F~+9B*8$oP??-^hCxNvK zSbv;E=-2&-T(+Bs2_lCU>XyRx5*=4jALv)aAhA7m0OyxW$BW=+&?iz*(`R|~1`q}` z^H_pYgvtzUhym3EV5|$y4jFB2=qKa(a6|Hw_{^+VHOkbjIjH!h#h*iG|*{eJ-cl|o$0jzmA=&1+bBPWfmJ{FFMn)#_AT zvy~)75q#q6K-x9_%Hr2iYgO5#g9KNrczk|arMM73>*_`Bt3iX4C?-!sEul=gnxsKJ zUyV0hgp9an+cEGgf!zzR0vSM?yr>M)UZ)5oNv1e?i1&ah+%qPIypg&QESyvLA%EV1 zag}Ep9%Q{~r!1W|?~sMl3j6V3H8;zQGyPdou9YoSu23?hd}gB+C796kQS$hCVJFeKW&d4rN78#+{G=LW@WJdTWM{qG?|ZW ztu-mXw$&yT)p~1D=-+C^F>?Qy8Q0#3L+8oz)h4@N&IS+WYvLw0TKS&U|5n=nR@#5n zN^?e&I}-dS&7}rK!Z=#R;qzOc=p0uh&TZLCTMsrgnBI9gET)~?v5Nz-w(uFJwv zI!coQCJNOa5+URI23lYkbIPYU#~}$H_wQ3-O6e1dab&!%p_m{6`vhe?UhPED@-81i zm1yHGgXqu>-&L0ZMS|YkWyC`}ysFD^wPTuY+~sFj`>scsP+U67jDJVlQT{$f_m@q( zJg3^y=R4{$qZlviGUK6rzHXs+H`2Ly#qsuZu8ksPv|T|UD5R9pV;oUgf~H9XB-F}u z!9MI$WD`zO)s7APuiDYwb3@g>-eU13bPK$}dahiFgQ?kt(n^z{&8h_9S~B?pZ4HBf za#NqT%Q3A z?eXe9--c~)$Ky;WE*ob?qy0D^QrxLc`GU1-nNf_J`>beCr&sp*6WBK1oVU-Q zw)FVUcpFiSm+`iup~Eav_!jLV4IQYi$n}xT+!j8E&V@btHGdCLY{WlrM`c5_`As1P zmKCUU6pI)>rG%Iiiu>7I`>7FhC2RwHx=;?-2m``)jD6C|jJnwwO1qIrFcx8(fiMRt zT&f&ia1DdY-lUO!Rrl{D`8sN|vqDh>0?3t{E9Js%jR(tQEB9FHH`x95y4KL>q9=0u zy$$}4H(98ayMKZ)n_lh2Et*mxRgXuLrPQt?hvOUeBOkBXi(`;N=NENFn#FHj(1A7j zI2_)zlf&UZ&`Wx?Db}f|0X~~~l?!Y%*SPBPxh9BEmch3iD?;9+@iFol=4pLRBn@+K zTod$vt8&t^9ED?ensE1F%M@CKQCIm+A+(b76jwqwri1$tAA`lG_LuA$fjs|!U-xsI@&f~pKcH@ zVm+!sg^g$i^9JL~Ontf{Lc#39BtEJrfDiN?a95N+=3w9#4t)`psE<3oz(sgoPdsZvk7I# zP($ldp6YF)VXGn8UksfE-C7buro029cze3mYQ5K^jIpdOVXxr^e>RUf_iK6 z@{-&K!1rw2UM06u$QLi61yQ|x(m7u+LU?>RTBj6YI9hY<_2V`n=P}g_-NhQ8b&)=bm z;-P6u|941JsQuq(UWwv#y}mi+U^LZg!}fwAWv{)dymG zs}h|u>XCfjOgdMhsJ%o2nv&((q;FbswD7j;iwkwED$zo>6ht_MiBpFL4eMBAKrqO% z8POsfb-Vc2?LsoT0bPp*0)M4)nBS^O)xr>?FF4EtkGYs48_AJF z>Y}T{JGUvW$f^7#5>i~2oVt9&l&qx!Eq%F=K@gj4DegG8)MA)I!hbC*3-n<7Pf{N{ ze#_L~g#LA&JTINj-fr-eAR)}X*RHL0e0j-wXI)2p`zBj8q^s$-=6#tuW%|!~(MZ_t zD7rf*8f^pkL@q40u_Ef>BCyryj@k8w@1qsvJ`!SZDXq0 zLw}JPN)dCKrhm!JV&!u?QPg_J0!n&@7FyDNKkVw#^Q}3%;7%vm`BO}IB9Dgxut`d; zp!q~k;pC36OgZ}&q@kXZ7*Zmt*8`O8H36kJOYzIITmd)e5giOWFbcW>ybk>qs9!h? z3%%}unCraxW(Uj&3*x%`sd){C@dGK)Td6vOo>^amGJkzGq|S|LV<=OjK9L62$asm_ z2qi!Vh z==Myjk_KdLakR6j+2)LAlOZ~JX@}@!lOZ~}>3U5t};+Zp8CcC{iBvK5<_8C5IUJJh8N zCCoA}G2h?n7JN72ga#L_YVP&&yI`XXWk|Izc?GUkit@gsxEqt7et!!&B}|>$F_%@ic6L@u>=QIb+yk>k8-eMu zwNjD_3li15haQkE!kv`3P>02ucW_AY$k@u2dI%zw{^ zbfg?Ovl9b^7>dVGH%63V#3#lEV{A`PkF`x6P#N1w-s&-8))6kM<~>}Gt)M;6mk7oo zEkm>)hG<`hD5TCq>fEG0$5cN=w$qFWmh?lkZ-!`JhG>7)5D^t%gaAMcrDLcXBStZz zgJ1ZoIzsn>OOny~Yy?|~8s9V;WPg*C1?g|_cRs07ogBfzZCLx_df#+;eWb{E0W8_i!Dh()eR<8T2T=ceACxUdJIAEMro7}v0Kxel0cYV zE-g z7%sa_pQY)Tqsh>|N|aC#TkHuSsWEP1rlQRg9ncwXkB(Snq#KUF}lPO zV*t$a3k=JX{(dz9`!*fu8%ZE|ihczVJ|i{AWQDX2831IEo%4Aq8Go*hwi?rDIGW>M z$vI@woyu%lFkYorIrN^4I*gTU^JHUo2H{rt4Im2ToJ?SSlFy!8L}QKyb&>oQraVlq z33x?C0F5FCVQ%p(yGo-`I;64_6gvIB8_(HdKzDJjzg=NR7+B7l*JM5CtmiI^2il7a zh@tI;vvyjCdmq47B!8o_9%2os-UHPQ|N8)@kn*7N9v6FViZK%kV8w6>)Oi9LJ7JzL z$c-19j3db^OvKr!SEsRn*+E~?Ji2Zwalj=Gno2;UPy*X_itVd3DP|L88j-N_9<784 zzp99@1UzQHxstIFGk}KsK5H3O_%za-Iyb4$IkjpASbmn_MSm&^OCQsvvS-A_MRqBJ zpG=hlLhdwqnriS#nn|!spTK)usWwBkCLF{H;7YH06?Q?xi=IiUr3K-HgmA>U4{6LV z{dc1t{PQ+}s@gOH0E)h4fa>-0Q07DTl#tYYU~W%aUMSh9Tt2L<+@P7(bpxk%(ALwjxbdZhjZyBuD#|_$XinWPPXqeuVd4 z@!Aq=bCQuPr@y)?qV882Ugf?@CxIiZ%df1eDOzLAjbx5*SoWiL!8oJEI@;a$ZeD^n zyRGZWyLJ`(IH5hBTU>%GKbD|iGtoy&FmUyxFAcSJLw|I-PznL~wSNVWN4|er0$co0 zLHMV>y23Z07dEL1jc1SBex}I5Zfw4hldeEF7Tromd$J)|Y3cCn7wBsAktyEKDYY^| zO$`&4#$>=inuP7F*!w*zU<1Tu^|Qfg^dX!r@gK9zQcDuqaKSVE?MK;o;E-BTms!On zmsv$l^M4oOB5DSCPzbBUzKZ^_RldzA0!Ql_UnT{vs@qri0&GmU7P(%9AT!%nLbM=y z!CK|NO@W5lbiS<4M|DzyK?t$^s4F-J+Ul79hwm1Kk2UJ*nJU38P#3yc=k|JPp;;K7 zH&(!~Cg4&8$u{(Dim9lOqg8GU1A1Nyh<^>z5*V>f!|oD}i|6}h?HDf+hiXgN zQfgC)5>Qfq2uA38PL|7Ut~%}cL!FrZDS#;P;~I7KJ;##8xdEWQ@iVIy*$m`wEI}&p zBzZHK6kEaq#Iy~eh4q$$DCq)K_w#j-+c$H=0fysMH^TnIKOSnA9LFK>uoy}waO}ow z3V)9ZbG@Fb7Le7gD;Vo}eU!w}S=18~J?ZN_iO%#x4)8s4>0k}qG#oD-`11D9?2Mmq zko76EG^I%rgA!+WbKr^~+eAg*<|dD4XIMatW@3qzk(`wgRz`jH&B)+t@39-0doUiP zzw^2HYqcE^+6{84YRJz`5h$ekG7vv3+JF0rMnb@~uJlpcl7Rr-MH}jY+Bp9Vfsr~= z#?P!e=GuiFa$Q+y0k^)8CR`)B?lGtN7VwHClr*wZ+#pn3Ycyo3NcZbYg}ro1Mk}&a zWnq&feUeY+yyj?u%)Y4uNVRPNti{$XU|EIUf|9ISyr_=q2~(Te?>AD0Zvb{XT7Sm% zjmz{XkcQx(+UG`Cb-o!t1?yR2@46;Pu&ic_s^!*pFr4Ljn-=h0Tfr?1*!Gri3t(-n z;bx0?J*&9Y2v*JH7S%vMw4QqlQ;{DpxrKRHeNX<4{=;FX9Px-JBpy&)(xsHAm$yCX zTB7jua`jYPO}QHr3@`&&vt+b3Hh-nfNrA3Ob^0b+C%h_FUD>Tlsdko}uT*Z7xaf;5^D-A-Ryn4TlcbJHinHPPy-RYa=G0!Ka1@ru*B`cB!0aUcRD=` zC8FGKd~=m@Yhm|To>SCEr(W%>ZpLjqAXVE&KaQ3bbgN)|^j&=?n z?;Tx(&rDJjl=)G^A9+!~u{Ju=k>ns3hG+Q%d{{0?Tp}999Qgh+JaLzdQrf%B@hOP8 z;9T(Y{PgTBKRJ^~R&a^A0IfRDXA|-8LVeFZFoXiXLo1g9F_{vs`6fPOxjVauq(6383WG)VU=i%<*7O0^QgalrPk`hUi22bJCSo@N;9%F(_N zN|^#Q*Lc)t=Tq(Z-Z;TU-rG3C@fUCV<>O)YWH#aL@2>)c6PzvSgkLM6oZp~B`K$;V z;dFgoAoKsfLo6mUietrnlBbdYww)kRMw4R@Tkau$-<(@u+z~AZ*K|bbD0$wD?tdJ; zc}RTHeYEwU$A1X{?SM6ebrKAtWRe0y!w_PJWy@YzY`cvAJ$URvjHG+_wy8OC`4j>H zxkq6FFW4!v^`gTuRz1GRpS3DI971s!4qtxhlb#84RmtMX(n65z$+dEf^hAs@>p5XHQZR4YwnW%sUJisACy$3%_Gu0 zifQ3BXMa`yWTKOChy(5GfZAT%2Ha0rUzX7o9ePWE4azr!jex~Ut{<6c*?HdrF28Lo zrdb;7yD^}}?eWxzqrr^ul=+V@@@K)U%P!GCO5cV)j8GI1{~8x-xM47ZigP$rpH0E8 zV3{(>il<=0u!RRO%@qM}On@{()-|O7^2 zs=%hXZ7?gs>sX+{LGmRdEFp01kZ(P>qvjZ}Z||Xx{a!KOkk83J zBPQd=xPvYAQHwuR@Kbya5)cBGe^v$mcX!9y+ei`n3=;og)e4b7SY3HYsDckUTA%{1 zh<_9i0)%qS=2%FRD%%1DmEVpZ<9NN^*`1^*2;g*=orlNc@jUGD*kn+v_T*l`%0ckG z4-Ko30n~{UJr2!Po$cLBafUG=r@zBfge#$+7lR-Hqq8k;r#ETyJCD$kr}8Bnfe{6q zY9v-bMG)X{^(l2W0=1ba)2#Xht1XIOi+_bY1YkYm!56e}9E|XbfnTiv;A(AUr0S;? zUEl%FT$L$nn^qvy&-hT2bb>*89hiE76xXpoLdn9hSFHR}gvX3IpZ61yKka7R*X4!QTW<1=h)X{TI4 z%bs?r4l4(c2IWQv zOsnJp;5PW+nauip4&AmXIus_h;D67G%5vP|JfTHA)unTEIP5*RRk}TpHpdju$({N{ z@c_Tq_!g7WRIgFfIbN;sVNhmO7o0V{g&Dtw*IW1~Gk89iM@p=7wAit-kL!{FlFjCf zd08xGNUFoh=|#{aXD3g2^9Yq8Ds+KQ>z=~YJbXHyoWAn11%;-gl>H<^Wi)WI}PdiW=B*BREElAn5-o zIM&X-IsfvrlLPn+mJr>Ho#-HY_^?ENTGv~ z!))jvp2vf2dzd7gBUq1-1P`%ke^RH+C51UJWMTa8TQGy{Em51#_lz6edoXeiJ(+`@ zLm`EdhQb_hlDf{iBn0lEBzL;etRE1MA8VmfQRLEl#*&66j%FfT*MD@Nd%~}mt*Kxt zZ`T#Adq%K_fO4EnLendB_k`>QFyy>>6vy_Y*a_Q{;?b}@iYyy+a_nBesYu%D%|#!! zU=WP-HIj?>E*4yDA4|o9@QZUf3J8g-M9_xs0WE;kzwu$A)CEEm?t8{9PPQQPq>?Ta z-xK*5TEf{O6ig;#D1W~%QZl%-a|GW(bgu|pCILbZz3^>G2xUcso;Xf&pK&nqu+n=U z$`i2OF=`;1I#ioWlKrFF;Cc@|NXCgY4W;)*RRouEz_7(r$r_69jj#b;(hP_j8Y_Mv zS{sEi*`1_Kh*0a@CrN~mYXOAqfuxf`I|UGfv%UKc^p2jS;dk_8?+AY$JxRkbk%CA2 zC*e^V4c|(n;amHs;aiS|YTH}R9h=rnUYmJp1gchgszou5U(V34W_CS_o2Y z2-Btl={qS}dkNiJk{-4TYQ4pC{<_H z#%Q(x_)d$?+RSevx7vSGbs~+46)aw>`J6p(u|<~A&F26}E~wRLa4NpV z4otl$S=}Ge%H%I^ubvlcWnkkEPki->2_1L3n5A5@UoKWvQNLxkc(GM%w$U>VI9AMb zG0eV!9+CPV8w6dcv11Wj#K#`ylxw-T%fSuU5|AOgH@eh$E)9QN->$C#qbkp=Pisq{ zsMeGhj?KcLh!33`dDQ40pDjTtS>8xMT}&eoL*pD;>8|=$uX?qrR%k(fxjQ6QqgHu}q<)?Y-_~YraA{2MJ!F~Q_--0%g|GyZf?aw>AKWW0N@K=9d>4;HQ}WP*89-e( z=!=dmQA|cq_Zs|CioO&OZD1HOGxeb!8ad=)3SUyp_e6gvp-(Du=)sgqRrtG}6~HJ3 zU#c@on@YKs-Ksitxu&vadd<$;HPBueqFGj`cG+G~^q4n<6b~gX8i)nI-nhi6E#4>o4RXxbr$D zW*_JYx1%-^y{r0i*2N5O{<9Vy+wz53Rrbmk2J*l*Wcb2m#n(LZEqvh$_VY!9`qofm zS9a+H`Y2qqt3}SPOtSyQ!$4L}@Qa7fif(=8yN!QI5*LpKMfb!N4`hRX!#)b7Dq%Z? zQlh2g+o9y9a`3QTY(^o|LkDsdNo44x_p+Rq0rismL`)@};%GrP+VZ9;Tofr|F|F$O z++NQ>2;PptgZ${uNBVjSgv1xHi~mZuJd6m;|&kWOfgsCeLOhnB#SnP#bgF_0ZgB-hE-9ph(P2Aufp*UnVgfy zunJ20!46DIjze0rd(=fHO?kst zNaGADDsWq$=RKhJ&#Q7-K|-}y-3)gaXl)1XiKwAn$C)UPmDCYU$CC(q!>?hY`SLRw zD_V=>Vi6#>crM>)UH>BgXAP0AMHPSC4aHEww`nzckv6@Wu@g#in}lIPo2H)*%69$S zh@%PZs@&fXt*?DP-*iyf34iSn(kQ$++4u626Fp*(68Wiqfb8ewwv%rP#2zf%Q6-9l zJy7+7No*K5qXY&wJ9Y}F-sa^}-M4A4-y;=U7hD*8avw;GqS}2_1*yG7Z;mH4E4%1@-jd+R0qxhd%#ADz(DD&}m-ksvRpRWYIvb@(p4 z0!5-+6r0z~=HYf#F#M9TfB;+V@nn~9$hHgPi!p!4w{5j!7;w>MEO1V|H+zb_0h_FD z*OvvjF=IcTTo&I%hNO4}x#)j4l{DE^{HB;*1M*Tje4=uE2H)lUj-$gT@hje7( z_iA-uyz&|v_#g+StYdb~9Ln;0{Ns2wqn%1kS53V}(Xg*X3y(5fx0yPuH9AlVx9XCu z_go>DEcw=ntuG`@m*RhoHo>a3-L6$Dx7mAU_0+tLhh3Vl)?7Tzw=dqt=q4?p72z7c zz|}db2Z%1PGz044fS(iH_!xDuP=2}@&au{Ir>Sr zPRlQ5;v_cU>8Tt%*CL61EgnVXQS0YcT2f5K#ciWi@^ouqHobq``Z{;M&Rt)fKYSf= zj2n+oQKzw62S@1K=GAw=qb)hG1HuZH!~>yhHy4CL|0W-3eCbBTk!$|G z!8|7ti2Z8{%q=0flNgBtawoA5#p_OEn)_DlzQlw3vH~C!JRg>aC3LreeE!GCCH=0; zhzI83zd@mrVR(NkI-h}&&QBk%)}hd#fvtcp=MIny3!T>ZTiNT}!Ru1DuQqy|6ff3A z(FO$|9K8qcL=+AKu)OSN+pDu|#z5i2wbMHB6r@hQ_~f%@oAq$YZ{bI6-jVx2Ifkh* zZRCh1M>B6z{zla7!C9Mc#wy)B9m`roeWYr1odqVW7n6VNi}9Bim=aPyTdl4)_Jr*5 zD@^g=MWkR~%W@ZqeVi4GqItWJBRn-o$9+?c(p|hUzkSxDjJZR;Ldp53TWvU5BLk`Q z$ykL}1TFbAc-5P!7Z9iL+T_~<3sBnXlpwlKXTG{_1-7a?k#&k4@za`bHF7HJKe<^j zk#kx9*-d}g(mW%pMU=B)%RPQU$Y7XXbM@`_;4F*8 z9oYR)w(G%cx5HU`)PiWZTdTISgr~*r6EUBur(4p87hNjgZ7qSv4N%&npB=D6_Jhof z*fx@Szq}5Y#PG=t8PPpPh8L~E`)=aCsbQlV^9FyzbzC$l@vl|hh`{bBlxhSf|2Z+f zKd4l{NN)stlc-CakN>0c=$f9q#h&+$uff;o%QOj!Y4mmH#_fN~a0_CB~z zJon%Q(>nF@%n%fv7T8MEAm;By_Ti?|<(~uz2tX>>Ivg8qjkQYgV!WP68I8_m2w8ce zFj=I#LKykpi8Ncta{{YFqU)CGwB5bPb`Oy6_8{Z!QO?`5toOf=_v|j{_YS`mTS|Yb z4N@~-b6WIe8F+(DIpOONnlj4c7JIXlA@+6-`+oR(eu=^Lqorob+7$SScEWF0x5wWv z!)oP@9$Uff$jtLP;r%UTz3vVdmVNaOq=!Anvh>HTNkfHI?Kq{46xOrDWVY~11}tgF zI+}>({OiM&4al&gU+m4WR0f5IsXTw&8qjy>qD(~&lN{m@UDLjv-~1-|DlfC@diop1=v&R9bJ@pVo`3bl1kUx>fEy;`ep_>9 zlS^Z3_2@JOQh_|L)fs3p!<-u`I=#ub{sfP93Jx^_QaZ0uFFzU@Qu_!q$5immg#Ubi z8G+m$Tt;(UV402gm)BiE7gm49w;~<145PmPW$^m^{zIP>xcBz2S#eMQ_{meml)-^G z1jk3;JmcTvvuGdyX(bW_K(p~wb1!K3PzWPal?&p#Y4AZt@ozXh(ej1(S^$QaE=U6n z^XL*FzF4ix0)MY=mpA+qX@Spdd2DCJyhM(?Uc-;yvn8O}ctat`c-wzUB~~`B^Dg5| zKGJ9|$Vx$sWXc5LUt;e79wpuG-*G_71wT4xB_6&_V1<=DSQr{a!@vM4G*Au;o=#!0 z3e>~9N{$`-oH#6a?b43r<^_nOg7R5+`ud|w^o!QWP2?Xdrg6;9?yXpx?@I*ET$zKfY`xU zfK6i9je=X(p%a2(5GV$CR~NYibP;)*ejn0)R|6(sj!)!DDqT%|@B1l7EZ2ML#xC6_ zstwcXaBoLuavjsZgJGf?cG!Nx!vFE-uQ}@JAfoT@lP}d8lXNK)lWNrtvlAk^vJa(G%Sc*6?Ov(O0RVid3X|N_H3d4m z1XH_{7S%lio9qFT@gX9Uc-1Nc9rOW{@gWqGxz#uWy88i>^wly0K!O63Db_LrornUH rUe-k<6`KM8cVTj6Xm53MWphwV1qJ{B000aC3;<69001eT0ssI2@td%` delta 641 zcmV-{0)G9D!wSc(1F*;+e}X;BNG^acbK(I20AmFJ02TlM0BkWZZZAYdMnP3fR4+|$ zZ*yfXY;|F!R84E+Fc3W_kpD2~QY&PY4@wsdIg}(@0-JQ%WDm=>6vdVkgDe$E-b?9! zuOz#P(z+#~7vs^qnfGR-87BUdTx2qWi*C0Ii`(1P45ojV*NgcCf9A`{&p*={tk&1R z*WmmYfT7b4f)-M01~*JFMNKXRtn-3tLyN~4MuXwi;A%L07<|9HtRg#YE)&XOLv7R; z9&X&xTqL|qo&EG2*yI;AJA0UwB5|oB+-U+!mMUQ$ zte7d4aOk+8CfP+Oejc~kmzv%7`^-v#SS6v#a_>prKs({+z&n>)_ zXCS135U>9oq3*%#n6S{+F(|;?TZ+JR*h805?THZ(62hE`AXBmc@7i}x$*rP=ZyU0GGR<0x|=6w*Z&$paL=i*1eax bhyom!K%oLE15VHYmu;Z}8wO(2000007X&9^ diff --git a/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.miz b/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.miz index 1d4464f7b9f983b01076a7b425523dff4e2dae6e..3c2b204417dd7d7294999623457d857caa6d54ef 100644 GIT binary patch delta 118988 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 F001!Qp}qhB delta 649 zcmV;40(SkC+X&9Z0kF0he}X;BNG^acbK(I20AmFJ02TlM0BkWZZZAYdMnP3fR4+|$ zZ*yfXY;|F!R84E+Fc3W_kpD2~QY&PY4@wsdIg}(@0-JQ%WDm=>6vdVkgDe$E-b?9! zuOz#P(z+#~7vs^qnfGR-87BUdTx2qWi*C0Ii`(1P45ojV*NgcCf9A`{&p*={tk&1R z*WmmYfT7b4f)-M01~*JFMNKXRtn-3tLyN~4MuXwi;A%L07<|9HtRg#YE)&XOLv7R; z9&X&xTqL|qo&EG2*yI;AJA0UwB5|oB+-U+!mMUQ$ zte7d4aOk+8CfP+Oejc~kmzv%7`^-v#SS6v#a_>prKs({+z&n>)_ zXCS135U>9oq3*%#n6S{+F(|;?TZ+JR*h805?THZ(62hE`AXBmc@7i}x$*rP=Zy8O8}QFEdoU(7hM1V jcVTj6Xm53MWphwV1qJ{B000XB3jhZL006OH00000G6x{l diff --git a/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz b/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz index 629470dc493427682b63c38d9f3995601eb85f3a..67b00dcdc6499d9400f3b380a1be9affaff303b5 100644 GIT binary patch delta 119067 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�l9 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 delta 676 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�l9 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 Cm!gRP delta 651 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�l9 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 C-<|OQ delta 643 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�l9 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 delta 662 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�l9?agkr`KC4j)_J4vCcEj?m7e2h>o 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

}Eo{5P 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 delta 635 zcmV->0)+kQxd@}A0k9?+5`sO;NG^acbK(I20AmFJ02Tn3&>8|5f2CASYvV8wJtvU= zFz8Y%WR(v}7YsR+BwGTTblGGN%eEB7mJ@?46-nMp>3^>zyNS}eC7~DN(Y%@WW~3P= z{*zo}GJ=b4w+oBg+tm!Ff0x&b`2^<6$ID8mJ8do#%3(uo)EFLa+|gVlyiA?_^c>ja7d1P3 zn3W=NsUzHJ13;BP8)aQ7+mu_fWyY%+^#H99CR&y%VIHiQDV1>OxS%H4MJOWOK1Mj! zoQWV)vHzR)x)32hpr#7#z$KQ6--rVoY z*>W0e%NMu#8|1 zmrNT1KLf-Z0GEy%0x|;$F#wmt8v-%|W;Xzr_!|O31J*bImpvQ;MFLJsmoXLs7?+$J V0xAR8O8}S290D5#eog=Y0073W9kc)d diff --git a/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.miz b/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.miz index 5537226f67946f584c91cf87e1379ebebc1bc0d9..0ddb42abd10b3569565589d42c56b636d769370b 100644 GIT binary patch delta 119021 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 delta 650 zcmV;50(JfDxCo`A0kAn4e}X;BNG^acbK(I20AmFJ02TlM0BkWZZZAYdMnP3fR4+|$ zZ*yfXY;|F!R84E+Fc3W_kpD2~QY&PY4@wsdIg}(@0-JQ%WDm=>6vdVkgDe$E-b?9! zuOz#P(z+#~7vs^qnfGR-87BUdTx2qWi*C0Ii`(1P45ojV*NgcCf9A`{&p*={tk&1R z*WmmYfT7b4f)-M01~*JFMNKXRtn-3tLyN~4MuXwi;A%L07<|9HtRg#YE)&XOLv7R; z9&X&xTqL|qo&EG2*yI;AJA0UwB5|oB+-U+!mMUQ$ zte7d4aOk+8CfP+Oejc~kmzv%7`^-v#SS6v#a_>prKs({+z&n>)_ zXCS135U>9oq3*%#n6S{+F(|;?TZ+JR*h805?THZ(62hE`AXBmc@7i}x$*rP=ZyK@y&3{g1KS(`mk=8QG6Rh;0GCA@0x|;XHkZu-0vVT*8v-f= kS~vigzZ(KY1JX(Wmj@gIK?7V%0GCS~0viSbP5=M^02q88p#T5?