Merge pull request #17 from mrSkortch/development

V4 Release
This commit is contained in:
mrSkortch 2015-10-02 02:36:04 -06:00
commit a8b7e5eb6c
5 changed files with 379 additions and 126 deletions

Binary file not shown.

240
mist.lua
View File

@ -1,4 +1,11 @@
--[[ --[[
Links:
ED Forum Thread: http://forums.eagle.ru/showthread.php?t=98616
Github
Development: https://github.com/mrSkortch/MissionScriptingTools/tree/development
Official Release: https://github.com/mrSkortch/MissionScriptingTools/tree/master
]] ]]
@ -6,11 +13,9 @@
mist = {} mist = {}
-- don't change these -- don't change these
mist.majorVersion = 3 mist.majorVersion = 4
mist.minorVersion = 7 mist.minorVersion = 0
mist.build = 51 mist.build = 55
-------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------
-- the main area -- the main area
@ -21,6 +26,7 @@ do
local mistAddedObjects = {} -- mist.dynAdd unit data added here local mistAddedObjects = {} -- mist.dynAdd unit data added here
local mistAddedGroups = {} -- mist.dynAdd groupdata added here local mistAddedGroups = {} -- mist.dynAdd groupdata added here
local writeGroups = {} local writeGroups = {}
local lastUpdateTime = 0
local function update_alive_units() -- coroutine function local function update_alive_units() -- coroutine function
local lalive_units = mist.DBs.aliveUnits -- local references for faster execution local lalive_units = mist.DBs.aliveUnits -- local references for faster execution
@ -369,6 +375,9 @@ do
coroutine.yield() coroutine.yield()
end end
end end
if timer.getTime() > lastUpdateTime then
lastUpdateTime = timer.getTime()
end
end end
end end
@ -438,6 +447,7 @@ do
local mistUnitId = 7000 local mistUnitId = 7000
local mistDynAddIndex = 1 local mistDynAddIndex = 1
mist.nextGroupId = 1 mist.nextGroupId = 1
mist.nextUnitId = 1 mist.nextUnitId = 1
@ -457,6 +467,10 @@ do
return mist.nextGroupId return mist.nextGroupId
end end
mist.getLastDBUpdateTime = function()
return lastUpdateTime
end
local function groupSpawned(event) local function groupSpawned(event)
if event.id == world.event.S_EVENT_BIRTH and 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.id == world.event.S_EVENT_BIRTH and 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
table.insert(tempSpawnedUnits,(event.initiator)) table.insert(tempSpawnedUnits,(event.initiator))
@ -1871,7 +1885,11 @@ for coa_name, coa_data in pairs(env.mission.coalition) do
if group_data and group_data.units and type(group_data.units) == 'table' then --making sure again- this is a valid group if group_data and group_data.units and type(group_data.units) == 'table' then --making sure again- this is a valid group
mist.DBs.units[coa_name][countryName][category][group_num] = {} mist.DBs.units[coa_name][countryName][category][group_num] = {}
mist.DBs.units[coa_name][countryName][category][group_num]["groupName"] = group_data.name local groupName = group_data.name
if env.mission.version > 7 then
groupName = env.getValueDictByKey(groupName)
end
mist.DBs.units[coa_name][countryName][category][group_num]["groupName"] = groupName
mist.DBs.units[coa_name][countryName][category][group_num]["groupId"] = group_data.groupId mist.DBs.units[coa_name][countryName][category][group_num]["groupId"] = group_data.groupId
mist.DBs.units[coa_name][countryName][category][group_num]["category"] = category mist.DBs.units[coa_name][countryName][category][group_num]["category"] = category
mist.DBs.units[coa_name][countryName][category][group_num]["coalition"] = coa_name mist.DBs.units[coa_name][countryName][category][group_num]["coalition"] = coa_name
@ -1888,13 +1906,15 @@ for coa_name, coa_data in pairs(env.mission.coalition) do
mist.DBs.units[coa_name][countryName][category][group_num]["frequency"] = group_data.frequency mist.DBs.units[coa_name][countryName][category][group_num]["frequency"] = group_data.frequency
mist.DBs.units[coa_name][countryName][category][group_num]["modulation"] = group_data.modulation mist.DBs.units[coa_name][countryName][category][group_num]["modulation"] = group_data.modulation
for unit_num, unit_data in pairs(group_data.units) do for unit_num, unit_data in pairs(group_data.units) do
local units_tbl = mist.DBs.units[coa_name][countryName][category][group_num]["units"] --pointer to the units table for this group local units_tbl = mist.DBs.units[coa_name][countryName][category][group_num]["units"] --pointer to the units table for this group
units_tbl[unit_num] = {} units_tbl[unit_num] = {}
units_tbl[unit_num]["unitName"] = unit_data.name if env.mission.version > 7 then
units_tbl[unit_num]["unitName"] = env.getValueDictByKey(unit_data.name)
else
units_tbl[unit_num]["unitName"] = unit_data.name
end
units_tbl[unit_num]["type"] = unit_data.type units_tbl[unit_num]["type"] = unit_data.type
units_tbl[unit_num]["skill"] = unit_data.skill --will be nil for statics units_tbl[unit_num]["skill"] = unit_data.skill --will be nil for statics
units_tbl[unit_num]["unitId"] = unit_data.unitId units_tbl[unit_num]["unitId"] = unit_data.unitId
@ -1924,7 +1944,7 @@ for coa_name, coa_data in pairs(env.mission.coalition) do
units_tbl[unit_num]["psi"] = unit_data.psi units_tbl[unit_num]["psi"] = unit_data.psi
units_tbl[unit_num]["groupName"] = group_data.name units_tbl[unit_num]["groupName"] = groupName
units_tbl[unit_num]["groupId"] = group_data.groupId units_tbl[unit_num]["groupId"] = group_data.groupId
if unit_data.AddPropAircraft then if unit_data.AddPropAircraft then
@ -1973,6 +1993,7 @@ mist.DBs.humansByName = {}
mist.DBs.humansById = {} mist.DBs.humansById = {}
mist.DBs.dynGroupsAdded = {} -- will be filled by mist.dbUpdate from dynamically spawned groups mist.DBs.dynGroupsAdded = {} -- will be filled by mist.dbUpdate from dynamically spawned groups
mist.DBs.activeHumans = {}
mist.DBs.aliveUnits = {} -- will be filled in by the "update_alive_units" coroutine in mist.main. mist.DBs.aliveUnits = {} -- will be filled in by the "update_alive_units" coroutine in mist.main.
@ -2179,6 +2200,26 @@ do
mist.addEventHandler(addDeadObject) mist.addEventHandler(addDeadObject)
--[[local function addClientsToActive(event)
if event.id == world.event.S_EVENT_PLAYER_ENTER_UNIT then
if not mist.DBs.activeHumans[Unit.getName(event.initiator)] then
local newU = mist.utils.deepCopy(mist.DBs.unitsByName[Unit.getName(event.initiator)])
if Unit.getPlayerName(event.initiator) then
newU.playerName = Unit.getPlayerName(event.initiator)
end
mist.DBs.activeHumans[Unit.getName(event.initiator)] = newU
end
elseif event.id == world.event.S_EVENT_PLAYER_LEAVE_UNIT or event.id == world.event.S_EVENT_DEATH then
if mist.DBs.activeHumans[Unit.getName(event.initiator)] then
mist.DBs.activeHumans[Unit.getName(event.initiator)] = nil
end
elseif event.id == world.event.S_EVENT_BIRTH then -- do client check
end
end
mist.addEventHandler(addClientsToActive)]]
end end
@ -2557,7 +2598,7 @@ Country names to be used in [c] and [-c] short-cuts:
end end
units_tbl['processed'] = true --add the processed flag units_tbl['processed'] = timer.getTime() --add the processed flag
return units_tbl return units_tbl
end end
@ -2637,7 +2678,7 @@ initial_number
end end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
if (#mist.getDeadMapObjsInZones(zones) - initial_number) >= req_num and trigger.misc.getUserFlag(flag) == false then if (#mist.getDeadMapObjsInZones(zones) - initial_number) >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
return return
else else
@ -2680,7 +2721,7 @@ initial_number
end end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
if (#mist.getDeadMapObjsInPolygonZone(zone) - initial_number) >= req_num and trigger.misc.getUserFlag(flag) == false then if (#mist.getDeadMapObjsInPolygonZone(zone) - initial_number) >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
return return
else else
@ -2756,6 +2797,7 @@ maxalt = number or nil,
interval = number or nil, interval = number or nil,
req_num = number or nil req_num = number or nil
toggle = boolean or nil toggle = boolean or nil
unitTableDef = table or nil
]] ]]
-- type_tbl -- type_tbl
local type_tbl = { local type_tbl = {
@ -2767,6 +2809,7 @@ toggle = boolean or nil
interval = {'number', 'nil'}, interval = {'number', 'nil'},
[{'req_num', 'reqnum'}] = {'number', 'nil'}, [{'req_num', 'reqnum'}] = {'number', 'nil'},
toggle = {'boolean', 'nil'}, toggle = {'boolean', 'nil'},
unitTableDef = {'table', 'nil'},
} }
local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_polygon', type_tbl, vars) local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_polygon', type_tbl, vars)
@ -2779,14 +2822,17 @@ toggle = boolean or nil
local maxalt = vars.maxalt or vars.alt local maxalt = vars.maxalt or vars.alt
local req_num = vars.req_num or vars.reqnum or 1 local req_num = vars.req_num or vars.reqnum or 1
local toggle = vars.toggle or nil local toggle = vars.toggle or nil
local unitTableDef = vars.unitTableDef
if not units.processed then
if not units.processed then -- run unit table short cuts unitTableDef = mist.utils.deepCopy(units)
units = mist.makeUnitTable(units)
--mist.debug.writeData(mist.utils.serialize,{'vars', vars}, 'vars.txt')
end end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if (units.processed and units.processed < mist.getLastDBUpdateTime()) or not units.processed then -- run unit table short cuts
units = mist.makeUnitTable(unitTableDef)
end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == 0) then
local num_in_zone = 0 local num_in_zone = 0
for i = 1, #units do for i = 1, #units do
local unit = Unit.getByName(units[i]) local unit = Unit.getByName(units[i])
@ -2794,7 +2840,7 @@ toggle = boolean or nil
local pos = unit:getPosition().p local pos = unit:getPosition().p
if mist.pointInPolygon(pos, zone, maxalt) then if mist.pointInPolygon(pos, zone, maxalt) then
num_in_zone = num_in_zone + 1 num_in_zone = num_in_zone + 1
if num_in_zone >= req_num and trigger.misc.getUserFlag(flag) == false then if num_in_zone >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
break break
end end
@ -2802,13 +2848,11 @@ toggle = boolean or nil
end end
end end
if toggle and (num_in_zone < req_num) and trigger.misc.getUserFlag(flag) > 0 then if toggle and (num_in_zone < req_num) and trigger.misc.getUserFlag(flag) > 0 then
trigger.action.setUserFlag(flag, false) trigger.action.setUserFlag(flag, false)
end end
-- do another check in case stopflag was set true by this function -- do another check in case stopflag was set true by this function
if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == 0) then
mist.scheduleFunction(mist.flagFunc.units_in_polygon, {{units = units, zone = zone, flag = flag, stopflag = stopflag, interval = interval, req_num = req_num, maxalt = maxalt, toggle = toggle, unitTableDef = unitTableDef}}, timer.getTime() + interval)
mist.scheduleFunction(mist.flagFunc.units_in_polygon, {{units = units, zone = zone, flag = flag, stopflag = stopflag, interval = interval, req_num = req_num, maxalt = maxalt, toggle = toggle}}, timer.getTime() + interval)
end end
end end
@ -2894,6 +2938,7 @@ function mist.flagFunc.units_in_zones(vars)
[{'req_num', 'reqnum'}] = {'number', 'nil'}, [{'req_num', 'reqnum'}] = {'number', 'nil'},
interval = {'number', 'nil'}, interval = {'number', 'nil'},
toggle = {'boolean', 'nil'}, toggle = {'boolean', 'nil'},
unitTableDef = {'table', 'nil'},
} }
local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_zones', type_tbl, vars) local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_zones', type_tbl, vars)
@ -2906,22 +2951,28 @@ function mist.flagFunc.units_in_zones(vars)
local req_num = vars.req_num or vars.reqnum or 1 local req_num = vars.req_num or vars.reqnum or 1
local interval = vars.interval or 1 local interval = vars.interval or 1
local toggle = vars.toggle or nil local toggle = vars.toggle or nil
local unitTableDef = vars.unitTableDef
if not units.processed then -- run unit table short cuts if not units.processed then
units = mist.makeUnitTable(units) unitTableDef = mist.utils.deepCopy(units)
end end
if (units.processed and units.processed < mist.getLastDBUpdateTime()) or not units.processed then -- run unit table short cuts
units = mist.makeUnitTable(unitTableDef)
end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
local in_zone_units = mist.getUnitsInZones(units, zones, zone_type) local in_zone_units = mist.getUnitsInZones(units, zones, zone_type)
if #in_zone_units >= req_num and trigger.misc.getUserFlag(flag) == false then if #in_zone_units >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
elseif #in_zone_units < req_num and toggle then elseif #in_zone_units < req_num and toggle then
trigger.action.setUserFlag(flag, false) trigger.action.setUserFlag(flag, false)
end end
-- do another check in case stopflag was set true by this function -- do another check in case stopflag was set true by this function
if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
mist.scheduleFunction(mist.flagFunc.units_in_zones, {{units = units, zones = zones, flag = flag, stopflag = stopflag, zone_type = zone_type, req_num = req_num, interval = interval, toggle = toggle}}, timer.getTime() + interval) mist.scheduleFunction(mist.flagFunc.units_in_zones, {{units = units, zones = zones, flag = flag, stopflag = stopflag, zone_type = zone_type, req_num = req_num, interval = interval, toggle = toggle, unitTableDef = unitTableDef}}, timer.getTime() + interval)
end end
end end
@ -3002,6 +3053,7 @@ function mist.flagFunc.units_in_moving_zones(vars)
[{'req_num', 'reqnum'}] = {'number', 'nil'}, [{'req_num', 'reqnum'}] = {'number', 'nil'},
interval = {'number', 'nil'}, interval = {'number', 'nil'},
toggle = {'boolean', 'nil'}, toggle = {'boolean', 'nil'},
unitTableDef = {'table', 'nil'},
} }
local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_moving_zones', type_tbl, vars) local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_moving_zones', type_tbl, vars)
@ -3015,20 +3067,21 @@ function mist.flagFunc.units_in_moving_zones(vars)
local req_num = vars.req_num or vars.reqnum or 1 local req_num = vars.req_num or vars.reqnum or 1
local interval = vars.interval or 1 local interval = vars.interval or 1
local toggle = vars.toggle or nil local toggle = vars.toggle or nil
local unitTableDef = vars.unitTableDef
if not units.processed then -- run unit table short cuts if not units.processed then
units = mist.makeUnitTable(units) unitTableDef = mist.utils.deepCopy(units)
end end
if not zone_units.processed then -- run unit table short cuts if (units.processed and units.processed < mist.getLastDBUpdateTime()) or not units.processed then -- run unit table short cuts
zone_units = mist.makeUnitTable(zone_units) units = mist.makeUnitTable(unitTableDef)
end end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
local in_zone_units = mist.getUnitsInMovingZones(units, zone_units, radius, zone_type) local in_zone_units = mist.getUnitsInMovingZones(units, zone_units, radius, zone_type)
if #in_zone_units >= req_num and trigger.misc.getUserFlag(flag) == false then if #in_zone_units >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
elseif #in_zone_units < req_num and toggle then elseif #in_zone_units < req_num and toggle then
trigger.action.setUserFlag(flag, false) trigger.action.setUserFlag(flag, false)
@ -3051,7 +3104,7 @@ mist.getUnitsLOS = function(unitset1, altoffset1, unitset2, altoffset2, radius)
-- get the positions all in one step, saves execution time. -- get the positions all in one step, saves execution time.
for unitset1_ind = 1, #unitset1 do for unitset1_ind = 1, #unitset1 do
local unit1 = Unit.getByName(unitset1[unitset1_ind]) local unit1 = Unit.getByName(unitset1[unitset1_ind])
if unit1 then if unit1 and unit1:isActive() == true then
unit_info1[#unit_info1 + 1] = {} unit_info1[#unit_info1 + 1] = {}
unit_info1[#unit_info1]["unit"] = unit1 unit_info1[#unit_info1]["unit"] = unit1
unit_info1[#unit_info1]["pos"] = unit1:getPosition().p unit_info1[#unit_info1]["pos"] = unit1:getPosition().p
@ -3060,7 +3113,7 @@ mist.getUnitsLOS = function(unitset1, altoffset1, unitset2, altoffset2, radius)
for unitset2_ind = 1, #unitset2 do for unitset2_ind = 1, #unitset2 do
local unit2 = Unit.getByName(unitset2[unitset2_ind]) local unit2 = Unit.getByName(unitset2[unitset2_ind])
if unit2 then if unit2 and unit2:isActive() == true then
unit_info2[#unit_info2 + 1] = {} unit_info2[#unit_info2 + 1] = {}
unit_info2[#unit_info2]["unit"] = unit2 unit_info2[#unit_info2]["unit"] = unit2
unit_info2[#unit_info2]["pos"] = unit2:getPosition().p unit_info2[#unit_info2]["pos"] = unit2:getPosition().p
@ -3118,6 +3171,8 @@ toggle = boolean or nil
interval = {'number', 'nil'}, interval = {'number', 'nil'},
radius = {'number', 'nil'}, radius = {'number', 'nil'},
toggle = {'boolean', 'nil'}, toggle = {'boolean', 'nil'},
unitTableDef1 = {'table', 'nil'},
unitTableDef2 = {'table', 'nil'},
} }
local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_LOS', type_tbl, vars) local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_LOS', type_tbl, vars)
@ -3132,28 +3187,38 @@ toggle = boolean or nil
local radius = vars.radius or math.huge local radius = vars.radius or math.huge
local req_num = vars.req_num or vars.reqnum or 1 local req_num = vars.req_num or vars.reqnum or 1
local toggle = vars.toggle or nil local toggle = vars.toggle or nil
local unitTableDef1 = vars.unitTableDef1
local unitTableDef2 = vars.unitTableDef2
if not unitset1.processed then
if not unitset1.processed then -- run unit table short cuts unitTableDef1 = mist.utils.deepCopy(unitset1)
unitset1 = mist.makeUnitTable(unitset1)
end end
if not unitset2.processed then -- run unit table short cuts if not unitset2.processed then
unitset2 = mist.makeUnitTable(unitset2) unitTableDef2 = mist.utils.deepCopy(unitset2)
end end
if (unitset1.processed and unitset1.processed < mist.getLastDBUpdateTime()) or not unitset1.processed then -- run unit table short cuts
units = mist.makeUnitTable(unitTableDef1)
end
if (unitset2.processed and unitset2.processed < mist.getLastDBUpdateTime()) or not unitset2.processed then -- run unit table short cuts
units = mist.makeUnitTable(unitTableDef2)
end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
local unitLOSdata = mist.getUnitsLOS(unitset1, altoffset1, unitset2, altoffset2, radius) local unitLOSdata = mist.getUnitsLOS(unitset1, altoffset1, unitset2, altoffset2, radius)
if #unitLOSdata >= req_num and trigger.misc.getUserFlag(flag) == false then if #unitLOSdata >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
elseif #unitLOSdata < req_num and toggle then elseif #unitLOSdata < req_num and toggle then
trigger.action.setUserFlag(flag, false) trigger.action.setUserFlag(flag, false)
end end
-- do another check in case stopflag was set true by this function -- do another check in case stopflag was set true by this function
if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
mist.scheduleFunction(mist.flagFunc.units_LOS, {{unitset1 = unitset1, altoffset1 = altoffset1, unitset2 = unitset2, altoffset2 = altoffset2, flag = flag, stopflag = stopflag, radius = radius, req_num = req_num, interval = interval, toggle = toggle}}, timer.getTime() + interval) mist.scheduleFunction(mist.flagFunc.units_LOS, {{unitset1 = unitset1, altoffset1 = altoffset1, unitset2 = unitset2, altoffset2 = altoffset2, flag = flag, stopflag = stopflag, radius = radius, req_num = req_num, interval = interval, toggle = toggle, unitTableDef1 = unitTableDef1, unitTableDef2 = unitTableDef2}}, timer.getTime() + interval)
end end
end end
end end
@ -3333,14 +3398,20 @@ end
mist.getAvgPos = function(unitNames) mist.getAvgPos = function(unitNames)
local avgX, avgY, avgZ, totNum = 0, 0, 0, 0 local avgX, avgY, avgZ, totNum = 0, 0, 0, 0
for i = 1, #unitNames do for i = 1, #unitNames do
local unit = Unit.getByName(unitNames[i]) local unit
if Unit.getByName(unitNames[i]) then
unit = Unit.getByName(unitNames[i])
elseif StaticObject.getByName(unitNames[i]) then
unit = StaticObject.getByName(unitNames[i])
end
if unit then if unit then
local pos = unit:getPosition().p local pos = unit:getPosition().p
avgX = avgX + pos.x if pos then -- you never know O.o
avgY = avgY + pos.y avgX = avgX + pos.x
avgZ = avgZ + pos.z avgY = avgY + pos.y
totNum = totNum + 1 avgZ = avgZ + pos.z
totNum = totNum + 1
end
end end
end end
if totNum ~= 0 then if totNum ~= 0 then
@ -3500,10 +3571,13 @@ mist.goRoute = function(group, path)
if type(group) == 'string' then if type(group) == 'string' then
group = Group.getByName(group) group = Group.getByName(group)
end end
local groupCon = group:getController() local groupCon = nil
if groupCon then if group then
groupCon:setTask(misTask) groupCon = group:getController()
return true if groupCon then
groupCon:setTask(misTask)
return true
end
end end
--Controller.setTask(groupCon, misTask) --Controller.setTask(groupCon, misTask)
return false return false
@ -4004,6 +4078,7 @@ do
local displayFuncId = 0 local displayFuncId = 0
local caSlots = false local caSlots = false
local caMSGtoGroup = false
for index, value in pairs(env.mission.groundControl) do for index, value in pairs(env.mission.groundControl) do
if type(value) == 'table' then if type(value) == 'table' then
@ -4023,6 +4098,14 @@ do
end end
end end
local function mistdisplayV5()
--[[thoughts to improve upon
event handler based activeClients table.
display messages only when there is an update
possibly co-routine it.
]]
end
local function mistdisplayV4() local function mistdisplayV4()
local activeClients = {} local activeClients = {}
@ -4032,6 +4115,10 @@ do
end end
end end
--[[if caSlots == true and caMSGtoGroup == true then
end]]
if #messageList > 0 then if #messageList > 0 then
if displayActive == false then if displayActive == false then
@ -4070,7 +4157,7 @@ do
msgTableText[recData] = {} msgTableText[recData] = {}
msgTableText[recData].text = {} msgTableText[recData].text = {}
if recData == 'RED' or recData == 'BLUE' then if recData == 'RED' or recData == 'BLUE' then
msgTableText[recData].text[1] = '---------------- Combined Arms Message: \n' msgTableText[recData].text[1] = '-------Combined Arms Message-------- \n'
end end
msgTableText[recData].text[#msgTableText[recData].text + 1] = messageData.text msgTableText[recData].text[#msgTableText[recData].text + 1] = messageData.text
msgTableText[recData].displayTime = messageData.displayTime - messageData.displayedFor msgTableText[recData].displayTime = messageData.displayTime - messageData.displayedFor
@ -4099,18 +4186,20 @@ do
end end
------- new display ------- new display
if caSlots == true then if caSlots == true and caMSGtoGroup == false then
if msgTableText['RED'] then if msgTableText['RED'] then
trigger.action.outTextForCoalition(coalition.side.RED, table.concat(msgTableText['RED'].text), msgTableText['RED'].displayTime) trigger.action.outTextForCoalition(coalition.side.RED, table.concat(msgTableText['RED'].text), msgTableText['RED'].displayTime, true)
end end
if msgTableText['BLUE'] then if msgTableText['BLUE'] then
trigger.action.outTextForCoalition(coalition.side.BLUE, table.concat(msgTableText['BLUE'].text), msgTableText['BLUE'].displayTime) trigger.action.outTextForCoalition(coalition.side.BLUE, table.concat(msgTableText['BLUE'].text), msgTableText['BLUE'].displayTime, true)
end end
end end
for index, msgData in pairs(msgTableText) do for index, msgData in pairs(msgTableText) do
if type(index) == 'number' then -- its a groupNumber if type(index) == 'number' then -- its a groupNumber
trigger.action.outTextForGroup(index, table.concat(msgData.text), msgData.displayTime) trigger.action.outTextForGroup(index, table.concat(msgData.text), msgData.displayTime, true)
end end
end end
--- new audio --- new audio
@ -4121,6 +4210,7 @@ do
trigger.action.outSoundForCoalition(coalition.side.BLUE, msgTableSound['BLUE']) trigger.action.outSoundForCoalition(coalition.side.BLUE, msgTableSound['BLUE'])
end end
for index, file in pairs(msgTableSound) do for index, file in pairs(msgTableSound) do
if type(index) == 'number' then -- its a groupNumber if type(index) == 'number' then -- its a groupNumber
trigger.action.outSoundForGroup(index, file) trigger.action.outSoundForGroup(index, file)
@ -4133,6 +4223,22 @@ do
end end
local typeBase = {
['Mi-8MT'] = {'Mi-8MTV2', 'Mi-8MTV', 'Mi-8'},
['MiG-21Bis'] = {'Mig-21'},
['MiG-15bis'] = {'Mig-15'},
['FW-190D9'] = {'FW-190'},
['Bf-109K-4'] = {'Bf-109'},
}
--[[mist.setCAGroupMSG = function(val)
if type(val) == 'boolean' then
caMSGtoGroup = val
return true
end
return false
end]]
mist.message = { mist.message = {
@ -4205,8 +4311,16 @@ do
local found = false local found = false
for clientDataEntry, clientDataVal in pairs(clientData) do for clientDataEntry, clientDataVal in pairs(clientData) do
if type(clientDataVal) == 'string' then if type(clientDataVal) == 'string' then
if string.lower(list) == string.lower(clientDataVal) or list == 'all' then if mist.matchString(list, clientDataVal) == true or list == 'all' then
if typeData == clientData.type then local sString = typeData
for rName, pTbl in pairs(typeBase) do -- just a quick check to see if the user may have meant something and got the specific type of the unit wrong
for pIndex, pName in pairs(pTbl) do
if mist.stringMatch(sString, pName) then
sString = rName
end
end
end
if sString == clientData.type then
found = true found = true
newMsgFor = msgSpamFilter(newMsgFor, clientData.groupId) -- sends info oto other function to see if client is already recieving the current message. newMsgFor = msgSpamFilter(newMsgFor, clientData.groupId) -- sends info oto other function to see if client is already recieving the current message.
--table.insert(newMsgFor, clientId) --table.insert(newMsgFor, clientId)
@ -5130,11 +5244,15 @@ mist.teleportToPoint = function(vars) -- main teleport function that all of tele
newGroupData.units[unitNum]["y"] = unitData.y + diff.y newGroupData.units[unitNum]["y"] = unitData.y + diff.y
end end
if point then if point then
if (newGroupData.category == 'plane' or newGroupData.category == 'helicopter') and point.z then if (newGroupData.category == 'plane' or newGroupData.category == 'helicopter') then
if point.y > 0 and point.y > land.getHeight({newGroupData.units[unitNum]["x"], newGroupData.units[unitNum]["y"]}) + 10 then if point.z and point.y > 0 and point.y > land.getHeight({newGroupData.units[unitNum]["x"], newGroupData.units[unitNum]["y"]}) + 10 then
newGroupData.units[unitNum]["alt"] = point.y newGroupData.units[unitNum]["alt"] = point.y
else else
newGroupData.units[unitNum]["alt"] = land.getHeight({newGroupData.units[unitNum]["x"], newGroupData.units[unitNum]["y"]}) + 300 if newGroupData.category == 'plane' then
newGroupData.units[unitNum]["alt"] = land.getHeight({newGroupData.units[unitNum]["x"], newGroupData.units[unitNum]["y"]}) + math.random(300, 9000)
else
newGroupData.units[unitNum]["alt"] = land.getHeight({newGroupData.units[unitNum]["x"], newGroupData.units[unitNum]["y"]}) + math.random(200, 3000)
end
end end
end end
end end

View File

@ -1,4 +1,11 @@
--[[ --[[
Links:
ED Forum Thread: http://forums.eagle.ru/showthread.php?t=98616
Github
Development: https://github.com/mrSkortch/MissionScriptingTools/tree/development
Official Release: https://github.com/mrSkortch/MissionScriptingTools/tree/master
]] ]]
@ -6,11 +13,9 @@
mist = {} mist = {}
-- don't change these -- don't change these
mist.majorVersion = 3 mist.majorVersion = 4
mist.minorVersion = 7 mist.minorVersion = 0
mist.build = 51 mist.build = 55
-------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------
-- the main area -- the main area
@ -21,6 +26,7 @@ do
local mistAddedObjects = {} -- mist.dynAdd unit data added here local mistAddedObjects = {} -- mist.dynAdd unit data added here
local mistAddedGroups = {} -- mist.dynAdd groupdata added here local mistAddedGroups = {} -- mist.dynAdd groupdata added here
local writeGroups = {} local writeGroups = {}
local lastUpdateTime = 0
local function update_alive_units() -- coroutine function local function update_alive_units() -- coroutine function
local lalive_units = mist.DBs.aliveUnits -- local references for faster execution local lalive_units = mist.DBs.aliveUnits -- local references for faster execution
@ -369,6 +375,9 @@ do
coroutine.yield() coroutine.yield()
end end
end end
if timer.getTime() > lastUpdateTime then
lastUpdateTime = timer.getTime()
end
end end
end end
@ -438,6 +447,7 @@ do
local mistUnitId = 7000 local mistUnitId = 7000
local mistDynAddIndex = 1 local mistDynAddIndex = 1
mist.nextGroupId = 1 mist.nextGroupId = 1
mist.nextUnitId = 1 mist.nextUnitId = 1
@ -457,6 +467,10 @@ do
return mist.nextGroupId return mist.nextGroupId
end end
mist.getLastDBUpdateTime = function()
return lastUpdateTime
end
local function groupSpawned(event) local function groupSpawned(event)
if event.id == world.event.S_EVENT_BIRTH and 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.id == world.event.S_EVENT_BIRTH and 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
table.insert(tempSpawnedUnits,(event.initiator)) table.insert(tempSpawnedUnits,(event.initiator))
@ -1871,7 +1885,11 @@ for coa_name, coa_data in pairs(env.mission.coalition) do
if group_data and group_data.units and type(group_data.units) == 'table' then --making sure again- this is a valid group if group_data and group_data.units and type(group_data.units) == 'table' then --making sure again- this is a valid group
mist.DBs.units[coa_name][countryName][category][group_num] = {} mist.DBs.units[coa_name][countryName][category][group_num] = {}
mist.DBs.units[coa_name][countryName][category][group_num]["groupName"] = group_data.name local groupName = group_data.name
if env.mission.version > 7 then
groupName = env.getValueDictByKey(groupName)
end
mist.DBs.units[coa_name][countryName][category][group_num]["groupName"] = groupName
mist.DBs.units[coa_name][countryName][category][group_num]["groupId"] = group_data.groupId mist.DBs.units[coa_name][countryName][category][group_num]["groupId"] = group_data.groupId
mist.DBs.units[coa_name][countryName][category][group_num]["category"] = category mist.DBs.units[coa_name][countryName][category][group_num]["category"] = category
mist.DBs.units[coa_name][countryName][category][group_num]["coalition"] = coa_name mist.DBs.units[coa_name][countryName][category][group_num]["coalition"] = coa_name
@ -1888,13 +1906,15 @@ for coa_name, coa_data in pairs(env.mission.coalition) do
mist.DBs.units[coa_name][countryName][category][group_num]["frequency"] = group_data.frequency mist.DBs.units[coa_name][countryName][category][group_num]["frequency"] = group_data.frequency
mist.DBs.units[coa_name][countryName][category][group_num]["modulation"] = group_data.modulation mist.DBs.units[coa_name][countryName][category][group_num]["modulation"] = group_data.modulation
for unit_num, unit_data in pairs(group_data.units) do for unit_num, unit_data in pairs(group_data.units) do
local units_tbl = mist.DBs.units[coa_name][countryName][category][group_num]["units"] --pointer to the units table for this group local units_tbl = mist.DBs.units[coa_name][countryName][category][group_num]["units"] --pointer to the units table for this group
units_tbl[unit_num] = {} units_tbl[unit_num] = {}
units_tbl[unit_num]["unitName"] = unit_data.name if env.mission.version > 7 then
units_tbl[unit_num]["unitName"] = env.getValueDictByKey(unit_data.name)
else
units_tbl[unit_num]["unitName"] = unit_data.name
end
units_tbl[unit_num]["type"] = unit_data.type units_tbl[unit_num]["type"] = unit_data.type
units_tbl[unit_num]["skill"] = unit_data.skill --will be nil for statics units_tbl[unit_num]["skill"] = unit_data.skill --will be nil for statics
units_tbl[unit_num]["unitId"] = unit_data.unitId units_tbl[unit_num]["unitId"] = unit_data.unitId
@ -1924,7 +1944,7 @@ for coa_name, coa_data in pairs(env.mission.coalition) do
units_tbl[unit_num]["psi"] = unit_data.psi units_tbl[unit_num]["psi"] = unit_data.psi
units_tbl[unit_num]["groupName"] = group_data.name units_tbl[unit_num]["groupName"] = groupName
units_tbl[unit_num]["groupId"] = group_data.groupId units_tbl[unit_num]["groupId"] = group_data.groupId
if unit_data.AddPropAircraft then if unit_data.AddPropAircraft then
@ -1973,6 +1993,7 @@ mist.DBs.humansByName = {}
mist.DBs.humansById = {} mist.DBs.humansById = {}
mist.DBs.dynGroupsAdded = {} -- will be filled by mist.dbUpdate from dynamically spawned groups mist.DBs.dynGroupsAdded = {} -- will be filled by mist.dbUpdate from dynamically spawned groups
mist.DBs.activeHumans = {}
mist.DBs.aliveUnits = {} -- will be filled in by the "update_alive_units" coroutine in mist.main. mist.DBs.aliveUnits = {} -- will be filled in by the "update_alive_units" coroutine in mist.main.
@ -2179,6 +2200,26 @@ do
mist.addEventHandler(addDeadObject) mist.addEventHandler(addDeadObject)
--[[local function addClientsToActive(event)
if event.id == world.event.S_EVENT_PLAYER_ENTER_UNIT then
if not mist.DBs.activeHumans[Unit.getName(event.initiator)] then
local newU = mist.utils.deepCopy(mist.DBs.unitsByName[Unit.getName(event.initiator)])
if Unit.getPlayerName(event.initiator) then
newU.playerName = Unit.getPlayerName(event.initiator)
end
mist.DBs.activeHumans[Unit.getName(event.initiator)] = newU
end
elseif event.id == world.event.S_EVENT_PLAYER_LEAVE_UNIT or event.id == world.event.S_EVENT_DEATH then
if mist.DBs.activeHumans[Unit.getName(event.initiator)] then
mist.DBs.activeHumans[Unit.getName(event.initiator)] = nil
end
elseif event.id == world.event.S_EVENT_BIRTH then -- do client check
end
end
mist.addEventHandler(addClientsToActive)]]
end end
@ -2557,7 +2598,7 @@ Country names to be used in [c] and [-c] short-cuts:
end end
units_tbl['processed'] = true --add the processed flag units_tbl['processed'] = timer.getTime() --add the processed flag
return units_tbl return units_tbl
end end
@ -2637,7 +2678,7 @@ initial_number
end end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
if (#mist.getDeadMapObjsInZones(zones) - initial_number) >= req_num and trigger.misc.getUserFlag(flag) == false then if (#mist.getDeadMapObjsInZones(zones) - initial_number) >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
return return
else else
@ -2680,7 +2721,7 @@ initial_number
end end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
if (#mist.getDeadMapObjsInPolygonZone(zone) - initial_number) >= req_num and trigger.misc.getUserFlag(flag) == false then if (#mist.getDeadMapObjsInPolygonZone(zone) - initial_number) >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
return return
else else
@ -2756,6 +2797,7 @@ maxalt = number or nil,
interval = number or nil, interval = number or nil,
req_num = number or nil req_num = number or nil
toggle = boolean or nil toggle = boolean or nil
unitTableDef = table or nil
]] ]]
-- type_tbl -- type_tbl
local type_tbl = { local type_tbl = {
@ -2767,6 +2809,7 @@ toggle = boolean or nil
interval = {'number', 'nil'}, interval = {'number', 'nil'},
[{'req_num', 'reqnum'}] = {'number', 'nil'}, [{'req_num', 'reqnum'}] = {'number', 'nil'},
toggle = {'boolean', 'nil'}, toggle = {'boolean', 'nil'},
unitTableDef = {'table', 'nil'},
} }
local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_polygon', type_tbl, vars) local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_polygon', type_tbl, vars)
@ -2779,14 +2822,17 @@ toggle = boolean or nil
local maxalt = vars.maxalt or vars.alt local maxalt = vars.maxalt or vars.alt
local req_num = vars.req_num or vars.reqnum or 1 local req_num = vars.req_num or vars.reqnum or 1
local toggle = vars.toggle or nil local toggle = vars.toggle or nil
local unitTableDef = vars.unitTableDef
if not units.processed then
if not units.processed then -- run unit table short cuts unitTableDef = mist.utils.deepCopy(units)
units = mist.makeUnitTable(units)
--mist.debug.writeData(mist.utils.serialize,{'vars', vars}, 'vars.txt')
end end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if (units.processed and units.processed < mist.getLastDBUpdateTime()) or not units.processed then -- run unit table short cuts
units = mist.makeUnitTable(unitTableDef)
end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == 0) then
local num_in_zone = 0 local num_in_zone = 0
for i = 1, #units do for i = 1, #units do
local unit = Unit.getByName(units[i]) local unit = Unit.getByName(units[i])
@ -2794,7 +2840,7 @@ toggle = boolean or nil
local pos = unit:getPosition().p local pos = unit:getPosition().p
if mist.pointInPolygon(pos, zone, maxalt) then if mist.pointInPolygon(pos, zone, maxalt) then
num_in_zone = num_in_zone + 1 num_in_zone = num_in_zone + 1
if num_in_zone >= req_num and trigger.misc.getUserFlag(flag) == false then if num_in_zone >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
break break
end end
@ -2802,13 +2848,11 @@ toggle = boolean or nil
end end
end end
if toggle and (num_in_zone < req_num) and trigger.misc.getUserFlag(flag) > 0 then if toggle and (num_in_zone < req_num) and trigger.misc.getUserFlag(flag) > 0 then
trigger.action.setUserFlag(flag, false) trigger.action.setUserFlag(flag, false)
end end
-- do another check in case stopflag was set true by this function -- do another check in case stopflag was set true by this function
if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == 0) then
mist.scheduleFunction(mist.flagFunc.units_in_polygon, {{units = units, zone = zone, flag = flag, stopflag = stopflag, interval = interval, req_num = req_num, maxalt = maxalt, toggle = toggle, unitTableDef = unitTableDef}}, timer.getTime() + interval)
mist.scheduleFunction(mist.flagFunc.units_in_polygon, {{units = units, zone = zone, flag = flag, stopflag = stopflag, interval = interval, req_num = req_num, maxalt = maxalt, toggle = toggle}}, timer.getTime() + interval)
end end
end end
@ -2894,6 +2938,7 @@ function mist.flagFunc.units_in_zones(vars)
[{'req_num', 'reqnum'}] = {'number', 'nil'}, [{'req_num', 'reqnum'}] = {'number', 'nil'},
interval = {'number', 'nil'}, interval = {'number', 'nil'},
toggle = {'boolean', 'nil'}, toggle = {'boolean', 'nil'},
unitTableDef = {'table', 'nil'},
} }
local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_zones', type_tbl, vars) local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_zones', type_tbl, vars)
@ -2906,22 +2951,28 @@ function mist.flagFunc.units_in_zones(vars)
local req_num = vars.req_num or vars.reqnum or 1 local req_num = vars.req_num or vars.reqnum or 1
local interval = vars.interval or 1 local interval = vars.interval or 1
local toggle = vars.toggle or nil local toggle = vars.toggle or nil
local unitTableDef = vars.unitTableDef
if not units.processed then -- run unit table short cuts if not units.processed then
units = mist.makeUnitTable(units) unitTableDef = mist.utils.deepCopy(units)
end end
if (units.processed and units.processed < mist.getLastDBUpdateTime()) or not units.processed then -- run unit table short cuts
units = mist.makeUnitTable(unitTableDef)
end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
local in_zone_units = mist.getUnitsInZones(units, zones, zone_type) local in_zone_units = mist.getUnitsInZones(units, zones, zone_type)
if #in_zone_units >= req_num and trigger.misc.getUserFlag(flag) == false then if #in_zone_units >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
elseif #in_zone_units < req_num and toggle then elseif #in_zone_units < req_num and toggle then
trigger.action.setUserFlag(flag, false) trigger.action.setUserFlag(flag, false)
end end
-- do another check in case stopflag was set true by this function -- do another check in case stopflag was set true by this function
if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
mist.scheduleFunction(mist.flagFunc.units_in_zones, {{units = units, zones = zones, flag = flag, stopflag = stopflag, zone_type = zone_type, req_num = req_num, interval = interval, toggle = toggle}}, timer.getTime() + interval) mist.scheduleFunction(mist.flagFunc.units_in_zones, {{units = units, zones = zones, flag = flag, stopflag = stopflag, zone_type = zone_type, req_num = req_num, interval = interval, toggle = toggle, unitTableDef = unitTableDef}}, timer.getTime() + interval)
end end
end end
@ -3002,6 +3053,7 @@ function mist.flagFunc.units_in_moving_zones(vars)
[{'req_num', 'reqnum'}] = {'number', 'nil'}, [{'req_num', 'reqnum'}] = {'number', 'nil'},
interval = {'number', 'nil'}, interval = {'number', 'nil'},
toggle = {'boolean', 'nil'}, toggle = {'boolean', 'nil'},
unitTableDef = {'table', 'nil'},
} }
local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_moving_zones', type_tbl, vars) local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_in_moving_zones', type_tbl, vars)
@ -3015,20 +3067,21 @@ function mist.flagFunc.units_in_moving_zones(vars)
local req_num = vars.req_num or vars.reqnum or 1 local req_num = vars.req_num or vars.reqnum or 1
local interval = vars.interval or 1 local interval = vars.interval or 1
local toggle = vars.toggle or nil local toggle = vars.toggle or nil
local unitTableDef = vars.unitTableDef
if not units.processed then -- run unit table short cuts if not units.processed then
units = mist.makeUnitTable(units) unitTableDef = mist.utils.deepCopy(units)
end end
if not zone_units.processed then -- run unit table short cuts if (units.processed and units.processed < mist.getLastDBUpdateTime()) or not units.processed then -- run unit table short cuts
zone_units = mist.makeUnitTable(zone_units) units = mist.makeUnitTable(unitTableDef)
end end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
local in_zone_units = mist.getUnitsInMovingZones(units, zone_units, radius, zone_type) local in_zone_units = mist.getUnitsInMovingZones(units, zone_units, radius, zone_type)
if #in_zone_units >= req_num and trigger.misc.getUserFlag(flag) == false then if #in_zone_units >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
elseif #in_zone_units < req_num and toggle then elseif #in_zone_units < req_num and toggle then
trigger.action.setUserFlag(flag, false) trigger.action.setUserFlag(flag, false)
@ -3051,7 +3104,7 @@ mist.getUnitsLOS = function(unitset1, altoffset1, unitset2, altoffset2, radius)
-- get the positions all in one step, saves execution time. -- get the positions all in one step, saves execution time.
for unitset1_ind = 1, #unitset1 do for unitset1_ind = 1, #unitset1 do
local unit1 = Unit.getByName(unitset1[unitset1_ind]) local unit1 = Unit.getByName(unitset1[unitset1_ind])
if unit1 then if unit1 and unit1:isActive() == true then
unit_info1[#unit_info1 + 1] = {} unit_info1[#unit_info1 + 1] = {}
unit_info1[#unit_info1]["unit"] = unit1 unit_info1[#unit_info1]["unit"] = unit1
unit_info1[#unit_info1]["pos"] = unit1:getPosition().p unit_info1[#unit_info1]["pos"] = unit1:getPosition().p
@ -3060,7 +3113,7 @@ mist.getUnitsLOS = function(unitset1, altoffset1, unitset2, altoffset2, radius)
for unitset2_ind = 1, #unitset2 do for unitset2_ind = 1, #unitset2 do
local unit2 = Unit.getByName(unitset2[unitset2_ind]) local unit2 = Unit.getByName(unitset2[unitset2_ind])
if unit2 then if unit2 and unit2:isActive() == true then
unit_info2[#unit_info2 + 1] = {} unit_info2[#unit_info2 + 1] = {}
unit_info2[#unit_info2]["unit"] = unit2 unit_info2[#unit_info2]["unit"] = unit2
unit_info2[#unit_info2]["pos"] = unit2:getPosition().p unit_info2[#unit_info2]["pos"] = unit2:getPosition().p
@ -3118,6 +3171,8 @@ toggle = boolean or nil
interval = {'number', 'nil'}, interval = {'number', 'nil'},
radius = {'number', 'nil'}, radius = {'number', 'nil'},
toggle = {'boolean', 'nil'}, toggle = {'boolean', 'nil'},
unitTableDef1 = {'table', 'nil'},
unitTableDef2 = {'table', 'nil'},
} }
local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_LOS', type_tbl, vars) local err, errmsg = mist.utils.typeCheck('mist.flagFunc.units_LOS', type_tbl, vars)
@ -3132,28 +3187,38 @@ toggle = boolean or nil
local radius = vars.radius or math.huge local radius = vars.radius or math.huge
local req_num = vars.req_num or vars.reqnum or 1 local req_num = vars.req_num or vars.reqnum or 1
local toggle = vars.toggle or nil local toggle = vars.toggle or nil
local unitTableDef1 = vars.unitTableDef1
local unitTableDef2 = vars.unitTableDef2
if not unitset1.processed then
if not unitset1.processed then -- run unit table short cuts unitTableDef1 = mist.utils.deepCopy(unitset1)
unitset1 = mist.makeUnitTable(unitset1)
end end
if not unitset2.processed then -- run unit table short cuts if not unitset2.processed then
unitset2 = mist.makeUnitTable(unitset2) unitTableDef2 = mist.utils.deepCopy(unitset2)
end end
if (unitset1.processed and unitset1.processed < mist.getLastDBUpdateTime()) or not unitset1.processed then -- run unit table short cuts
units = mist.makeUnitTable(unitTableDef1)
end
if (unitset2.processed and unitset2.processed < mist.getLastDBUpdateTime()) or not unitset2.processed then -- run unit table short cuts
units = mist.makeUnitTable(unitTableDef2)
end
if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if stopflag == -1 or (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
local unitLOSdata = mist.getUnitsLOS(unitset1, altoffset1, unitset2, altoffset2, radius) local unitLOSdata = mist.getUnitsLOS(unitset1, altoffset1, unitset2, altoffset2, radius)
if #unitLOSdata >= req_num and trigger.misc.getUserFlag(flag) == false then if #unitLOSdata >= req_num and trigger.misc.getUserFlag(flag) == 0 then
trigger.action.setUserFlag(flag, true) trigger.action.setUserFlag(flag, true)
elseif #unitLOSdata < req_num and toggle then elseif #unitLOSdata < req_num and toggle then
trigger.action.setUserFlag(flag, false) trigger.action.setUserFlag(flag, false)
end end
-- do another check in case stopflag was set true by this function -- do another check in case stopflag was set true by this function
if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then if (type(trigger.misc.getUserFlag(stopflag)) == 'number' and trigger.misc.getUserFlag(stopflag) == 0) or (type(trigger.misc.getUserFlag(stopflag)) == 'boolean' and trigger.misc.getUserFlag(stopflag) == false) then
mist.scheduleFunction(mist.flagFunc.units_LOS, {{unitset1 = unitset1, altoffset1 = altoffset1, unitset2 = unitset2, altoffset2 = altoffset2, flag = flag, stopflag = stopflag, radius = radius, req_num = req_num, interval = interval, toggle = toggle}}, timer.getTime() + interval) mist.scheduleFunction(mist.flagFunc.units_LOS, {{unitset1 = unitset1, altoffset1 = altoffset1, unitset2 = unitset2, altoffset2 = altoffset2, flag = flag, stopflag = stopflag, radius = radius, req_num = req_num, interval = interval, toggle = toggle, unitTableDef1 = unitTableDef1, unitTableDef2 = unitTableDef2}}, timer.getTime() + interval)
end end
end end
end end
@ -3333,14 +3398,20 @@ end
mist.getAvgPos = function(unitNames) mist.getAvgPos = function(unitNames)
local avgX, avgY, avgZ, totNum = 0, 0, 0, 0 local avgX, avgY, avgZ, totNum = 0, 0, 0, 0
for i = 1, #unitNames do for i = 1, #unitNames do
local unit = Unit.getByName(unitNames[i]) local unit
if Unit.getByName(unitNames[i]) then
unit = Unit.getByName(unitNames[i])
elseif StaticObject.getByName(unitNames[i]) then
unit = StaticObject.getByName(unitNames[i])
end
if unit then if unit then
local pos = unit:getPosition().p local pos = unit:getPosition().p
avgX = avgX + pos.x if pos then -- you never know O.o
avgY = avgY + pos.y avgX = avgX + pos.x
avgZ = avgZ + pos.z avgY = avgY + pos.y
totNum = totNum + 1 avgZ = avgZ + pos.z
totNum = totNum + 1
end
end end
end end
if totNum ~= 0 then if totNum ~= 0 then
@ -3500,10 +3571,13 @@ mist.goRoute = function(group, path)
if type(group) == 'string' then if type(group) == 'string' then
group = Group.getByName(group) group = Group.getByName(group)
end end
local groupCon = group:getController() local groupCon = nil
if groupCon then if group then
groupCon:setTask(misTask) groupCon = group:getController()
return true if groupCon then
groupCon:setTask(misTask)
return true
end
end end
--Controller.setTask(groupCon, misTask) --Controller.setTask(groupCon, misTask)
return false return false
@ -4004,6 +4078,7 @@ do
local displayFuncId = 0 local displayFuncId = 0
local caSlots = false local caSlots = false
local caMSGtoGroup = false
for index, value in pairs(env.mission.groundControl) do for index, value in pairs(env.mission.groundControl) do
if type(value) == 'table' then if type(value) == 'table' then
@ -4023,6 +4098,14 @@ do
end end
end end
local function mistdisplayV5()
--[[thoughts to improve upon
event handler based activeClients table.
display messages only when there is an update
possibly co-routine it.
]]
end
local function mistdisplayV4() local function mistdisplayV4()
local activeClients = {} local activeClients = {}
@ -4032,6 +4115,10 @@ do
end end
end end
--[[if caSlots == true and caMSGtoGroup == true then
end]]
if #messageList > 0 then if #messageList > 0 then
if displayActive == false then if displayActive == false then
@ -4070,7 +4157,7 @@ do
msgTableText[recData] = {} msgTableText[recData] = {}
msgTableText[recData].text = {} msgTableText[recData].text = {}
if recData == 'RED' or recData == 'BLUE' then if recData == 'RED' or recData == 'BLUE' then
msgTableText[recData].text[1] = '---------------- Combined Arms Message: \n' msgTableText[recData].text[1] = '-------Combined Arms Message-------- \n'
end end
msgTableText[recData].text[#msgTableText[recData].text + 1] = messageData.text msgTableText[recData].text[#msgTableText[recData].text + 1] = messageData.text
msgTableText[recData].displayTime = messageData.displayTime - messageData.displayedFor msgTableText[recData].displayTime = messageData.displayTime - messageData.displayedFor
@ -4099,18 +4186,20 @@ do
end end
------- new display ------- new display
if caSlots == true then if caSlots == true and caMSGtoGroup == false then
if msgTableText['RED'] then if msgTableText['RED'] then
trigger.action.outTextForCoalition(coalition.side.RED, table.concat(msgTableText['RED'].text), msgTableText['RED'].displayTime) trigger.action.outTextForCoalition(coalition.side.RED, table.concat(msgTableText['RED'].text), msgTableText['RED'].displayTime, true)
end end
if msgTableText['BLUE'] then if msgTableText['BLUE'] then
trigger.action.outTextForCoalition(coalition.side.BLUE, table.concat(msgTableText['BLUE'].text), msgTableText['BLUE'].displayTime) trigger.action.outTextForCoalition(coalition.side.BLUE, table.concat(msgTableText['BLUE'].text), msgTableText['BLUE'].displayTime, true)
end end
end end
for index, msgData in pairs(msgTableText) do for index, msgData in pairs(msgTableText) do
if type(index) == 'number' then -- its a groupNumber if type(index) == 'number' then -- its a groupNumber
trigger.action.outTextForGroup(index, table.concat(msgData.text), msgData.displayTime) trigger.action.outTextForGroup(index, table.concat(msgData.text), msgData.displayTime, true)
end end
end end
--- new audio --- new audio
@ -4121,6 +4210,7 @@ do
trigger.action.outSoundForCoalition(coalition.side.BLUE, msgTableSound['BLUE']) trigger.action.outSoundForCoalition(coalition.side.BLUE, msgTableSound['BLUE'])
end end
for index, file in pairs(msgTableSound) do for index, file in pairs(msgTableSound) do
if type(index) == 'number' then -- its a groupNumber if type(index) == 'number' then -- its a groupNumber
trigger.action.outSoundForGroup(index, file) trigger.action.outSoundForGroup(index, file)
@ -4133,6 +4223,22 @@ do
end end
local typeBase = {
['Mi-8MT'] = {'Mi-8MTV2', 'Mi-8MTV', 'Mi-8'},
['MiG-21Bis'] = {'Mig-21'},
['MiG-15bis'] = {'Mig-15'},
['FW-190D9'] = {'FW-190'},
['Bf-109K-4'] = {'Bf-109'},
}
--[[mist.setCAGroupMSG = function(val)
if type(val) == 'boolean' then
caMSGtoGroup = val
return true
end
return false
end]]
mist.message = { mist.message = {
@ -4205,8 +4311,16 @@ do
local found = false local found = false
for clientDataEntry, clientDataVal in pairs(clientData) do for clientDataEntry, clientDataVal in pairs(clientData) do
if type(clientDataVal) == 'string' then if type(clientDataVal) == 'string' then
if string.lower(list) == string.lower(clientDataVal) or list == 'all' then if mist.matchString(list, clientDataVal) == true or list == 'all' then
if typeData == clientData.type then local sString = typeData
for rName, pTbl in pairs(typeBase) do -- just a quick check to see if the user may have meant something and got the specific type of the unit wrong
for pIndex, pName in pairs(pTbl) do
if mist.stringMatch(sString, pName) then
sString = rName
end
end
end
if sString == clientData.type then
found = true found = true
newMsgFor = msgSpamFilter(newMsgFor, clientData.groupId) -- sends info oto other function to see if client is already recieving the current message. newMsgFor = msgSpamFilter(newMsgFor, clientData.groupId) -- sends info oto other function to see if client is already recieving the current message.
--table.insert(newMsgFor, clientId) --table.insert(newMsgFor, clientId)
@ -5130,11 +5244,15 @@ mist.teleportToPoint = function(vars) -- main teleport function that all of tele
newGroupData.units[unitNum]["y"] = unitData.y + diff.y newGroupData.units[unitNum]["y"] = unitData.y + diff.y
end end
if point then if point then
if (newGroupData.category == 'plane' or newGroupData.category == 'helicopter') and point.z then if (newGroupData.category == 'plane' or newGroupData.category == 'helicopter') then
if point.y > 0 and point.y > land.getHeight({newGroupData.units[unitNum]["x"], newGroupData.units[unitNum]["y"]}) + 10 then if point.z and point.y > 0 and point.y > land.getHeight({newGroupData.units[unitNum]["x"], newGroupData.units[unitNum]["y"]}) + 10 then
newGroupData.units[unitNum]["alt"] = point.y newGroupData.units[unitNum]["alt"] = point.y
else else
newGroupData.units[unitNum]["alt"] = land.getHeight({newGroupData.units[unitNum]["x"], newGroupData.units[unitNum]["y"]}) + 300 if newGroupData.category == 'plane' then
newGroupData.units[unitNum]["alt"] = land.getHeight({newGroupData.units[unitNum]["x"], newGroupData.units[unitNum]["y"]}) + math.random(300, 9000)
else
newGroupData.units[unitNum]["alt"] = land.getHeight({newGroupData.units[unitNum]["x"], newGroupData.units[unitNum]["y"]}) + math.random(200, 3000)
end
end end
end end
end end

Binary file not shown.

View File

@ -1,3 +1,20 @@
v54
-added a check when adding unitTypes for messages to figure out the correct in-game unit name for a given unit. For example the Mi-8 helicopter is always displayed as 'Mi-8MTV2', however its actual in game name is 'Mi-8MT', this feature allows for you to list 'Mi-8MTV2', 'Mi-8MTV', or 'Mi-8' to get messages sent to the Mi-8. Shortcut also works for the relevant aircraft 'Mig-21', 'Mig-15', 'FW-190', and 'Bf-109'.
v53
-added mist.getAvgPos now accepts static objects in addition to units.
-made DB creation check the mission editor version for no paticular reason
-added mist.getLastDBUpdateTime which returns the most recent time the DB update function has run.
-changed mist.makeUnitTable processed entry to return the time it was processed instead of a boolean value.
-Changed teleport/respawn/clone functions to spawn aircraft at random altitudes instead of constants if the point given is vec2/not specified.
-Fixed FlagFuncs will now recognize units added in dynamically. Note this only applies if you send it unitTableNames identifier and not the table that the function creates.
-Added variable to all flagfuncs. unitTableDef is the original definition used for units.
-Fixed all getUserFlag checks to compare with numerical value instead of boolean
v52
-Fixed check in mist.getUnitsLOS to verify units are active in a mission
-Fixed check in mist.goRoute to verify both the group and controller are valid before assigning the route
v51 v51
-Fixed bug with message system -Fixed bug with message system
-Added a check to the message system so combined arms messages wont be sent if CA slots are not in a mission. -Added a check to the message system so combined arms messages wont be sent if CA slots are not in a mission.