mirror of
https://github.com/weyne85/DML.git
synced 2025-10-29 16:57:49 +00:00
Version 0.9987
Limited Airframes cloneZones randomizer, cargo
This commit is contained in:
parent
6d95355000
commit
cc46e5fb10
Binary file not shown.
Binary file not shown.
@ -1,5 +1,5 @@
|
|||||||
rndFlags = {}
|
rndFlags = {}
|
||||||
rndFlags.version = "1.2.0"
|
rndFlags.version = "1.3.0"
|
||||||
rndFlags.verbose = false
|
rndFlags.verbose = false
|
||||||
rndFlags.requiredLibs = {
|
rndFlags.requiredLibs = {
|
||||||
"dcsCommon", -- always
|
"dcsCommon", -- always
|
||||||
@ -23,6 +23,9 @@ rndFlags.requiredLibs = {
|
|||||||
some code clean-up
|
some code clean-up
|
||||||
rndMethod synonym
|
rndMethod synonym
|
||||||
1.2.0 - Watchflag integration
|
1.2.0 - Watchflag integration
|
||||||
|
1.3.0 - DML simplification: RND!
|
||||||
|
zone-local verbosity
|
||||||
|
|
||||||
--]]
|
--]]
|
||||||
rndFlags.rndGen = {}
|
rndFlags.rndGen = {}
|
||||||
|
|
||||||
@ -87,18 +90,28 @@ end
|
|||||||
-- create rnd gen from zone
|
-- create rnd gen from zone
|
||||||
--
|
--
|
||||||
function rndFlags.createRNDWithZone(theZone)
|
function rndFlags.createRNDWithZone(theZone)
|
||||||
local flags = cfxZones.getStringFromZoneProperty(theZone, "flags!", "")
|
local flags = ""
|
||||||
if flags == "" then
|
if cfxZones.hasProperty(theZone, "RND!") then
|
||||||
-- let's try alternate spelling without "!"
|
flags = cfxZones.getStringFromZoneProperty(theZone, "RND!", "")
|
||||||
|
elseif cfxZones.hasProperty(theZone, "flags!") then
|
||||||
|
trigger.action.outText("+++RND: warning - zone <" .. theZone.name .. ">: deprecated 'flags!' usage, use 'RND!' instead.", 30)
|
||||||
|
flags = cfxZones.getStringFromZoneProperty(theZone, "flags!", "")
|
||||||
|
elseif cfxZones.hasProperty(theZone, "flags") then
|
||||||
|
trigger.action.outText("+++RND: warning - zone <" .. theZone.name .. ">: deprecated 'flags' (no bang) usage, use 'RND!' instead.", 30)
|
||||||
flags = cfxZones.getStringFromZoneProperty(theZone, "flags", "")
|
flags = cfxZones.getStringFromZoneProperty(theZone, "flags", "")
|
||||||
|
else
|
||||||
|
trigger.action.outText("+++RND: warning - zone <" .. theZone.name .. ">: no flags defined!", 30)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- now build the flag array from strings
|
-- now build the flag array from strings
|
||||||
local theFlags = rndFlags.flagArrayFromString(flags)
|
local theFlags = rndFlags.flagArrayFromString(flags)
|
||||||
theZone.myFlags = theFlags
|
theZone.myFlags = theFlags
|
||||||
|
if rndFlags.verbose or theZone.verbose then
|
||||||
|
trigger.action.outText("+++RND: output set for <" .. theZone.name .. "> is <" .. flags .. ">",30)
|
||||||
|
end
|
||||||
|
|
||||||
theZone.pollSizeMin, theZone.pollSize = cfxZones.getPositiveRangeFromZoneProperty(theZone, "pollSize", 1)
|
theZone.pollSizeMin, theZone.pollSize = cfxZones.getPositiveRangeFromZoneProperty(theZone, "pollSize", 1)
|
||||||
if rndFlags.verbose then
|
if rndFlags.verbose or theZone.verbose then
|
||||||
trigger.action.outText("+++RND: pollSize is <" .. theZone.pollSizeMin .. ", " .. theZone.pollSize .. ">", 30)
|
trigger.action.outText("+++RND: pollSize is <" .. theZone.pollSizeMin .. ", " .. theZone.pollSize .. ">", 30)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -179,8 +192,8 @@ function rndFlags.fire(theZone)
|
|||||||
|
|
||||||
|
|
||||||
if #availableFlags < 1 then
|
if #availableFlags < 1 then
|
||||||
if rndFlags.verbose then
|
if rndFlags.verbose or theZone.verbose then
|
||||||
trigger.action.outText("+++RND: RND " .. theZone.name .. " ran out of flags. aborting fire", 30)
|
trigger.action.outText("+++RND: RND " .. theZone.name .. " ran out of flags. Will fire 'done' instead ", 30)
|
||||||
end
|
end
|
||||||
|
|
||||||
if theZone.doneFlag then
|
if theZone.doneFlag then
|
||||||
@ -190,7 +203,7 @@ function rndFlags.fire(theZone)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if rndFlags.verbose then
|
if rndFlags.verbose or theZone.verbose then
|
||||||
trigger.action.outText("+++RND: firing RND " .. theZone.name .. " with pollsize " .. pollSize .. " on " .. #availableFlags .. " set size", 30)
|
trigger.action.outText("+++RND: firing RND " .. theZone.name .. " with pollsize " .. pollSize .. " on " .. #availableFlags .. " set size", 30)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -212,7 +225,7 @@ function rndFlags.fire(theZone)
|
|||||||
local theFlag = table.remove(availableFlags,theFlagIndex)
|
local theFlag = table.remove(availableFlags,theFlagIndex)
|
||||||
|
|
||||||
--rndFlags.pollFlag(theFlag, theZone.rndMethod)
|
--rndFlags.pollFlag(theFlag, theZone.rndMethod)
|
||||||
if rndFlags.verbose then
|
if rndFlags.verbose or theZone.verbose then
|
||||||
trigger.action.outText("+++RND: polling " .. theFlag .. " with " .. theZone.rndMethod, 30)
|
trigger.action.outText("+++RND: polling " .. theFlag .. " with " .. theZone.rndMethod, 30)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -234,25 +247,12 @@ function rndFlags.update()
|
|||||||
|
|
||||||
for idx, aZone in pairs(rndFlags.rndGen) do
|
for idx, aZone in pairs(rndFlags.rndGen) do
|
||||||
if cfxZones.testZoneFlag(aZone, aZone.triggerFlag, aZone.rndTriggerMethod, "lastTriggerValue") then
|
if cfxZones.testZoneFlag(aZone, aZone.triggerFlag, aZone.rndTriggerMethod, "lastTriggerValue") then
|
||||||
if rndFlags.verbose then
|
if rndFlags.verbose or aZone.verbose then
|
||||||
trigger.action.outText("+++RND: triggering " .. aZone.name, 30)
|
trigger.action.outText("+++RND: triggering " .. aZone.name, 30)
|
||||||
end
|
end
|
||||||
rndFlags.fire(aZone)
|
rndFlags.fire(aZone)
|
||||||
end
|
end
|
||||||
--[[-- old code pre watchflag
|
|
||||||
if aZone.triggerFlag then
|
|
||||||
local currTriggerVal = cfxZones.getFlagValue(aZone.triggerFlag, aZone) -- trigger.misc.getUserFlag(aZone.triggerFlag)
|
|
||||||
if currTriggerVal ~= aZone.lastTriggerValue
|
|
||||||
then
|
|
||||||
if rndFlags.verbose then
|
|
||||||
trigger.action.outText("+++RND: triggering " .. aZone.name, 30)
|
|
||||||
end
|
|
||||||
rndFlags.fire(aZone)
|
|
||||||
aZone.lastTriggerValue = currTriggerVal
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
--]]--
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -306,7 +306,9 @@ function rndFlags.start()
|
|||||||
rndFlags.readConfigZone()
|
rndFlags.readConfigZone()
|
||||||
|
|
||||||
-- process RND Zones
|
-- process RND Zones
|
||||||
local attrZones = cfxZones.getZonesWithAttributeNamed("RND")
|
local attrZones = cfxZones.getZonesWithAttributeNamed("RND!")
|
||||||
|
a = dcsCommon.getSizeOfTable(attrZones)
|
||||||
|
trigger.action.outText("RND! zones: " .. a, 30)
|
||||||
|
|
||||||
-- now create an rnd gen for each one and add them
|
-- now create an rnd gen for each one and add them
|
||||||
-- to our watchlist
|
-- to our watchlist
|
||||||
@ -315,6 +317,15 @@ function rndFlags.start()
|
|||||||
rndFlags.addRNDZone(aZone) -- remember it so we can smoke it
|
rndFlags.addRNDZone(aZone) -- remember it so we can smoke it
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- obsolete here
|
||||||
|
attrZones = cfxZones.getZonesWithAttributeNamed("RND")
|
||||||
|
-- now create an rnd gen for each one and add them
|
||||||
|
-- to our watchlist
|
||||||
|
for k, aZone in pairs(attrZones) do
|
||||||
|
rndFlags.createRNDWithZone(aZone) -- process attribute and add to zone
|
||||||
|
rndFlags.addRNDZone(aZone) -- remember it so we can smoke it
|
||||||
|
end
|
||||||
|
|
||||||
-- start cycle
|
-- start cycle
|
||||||
timer.scheduleFunction(rndFlags.startCycle, {}, timer.getTime() + 0.25)
|
timer.scheduleFunction(rndFlags.startCycle, {}, timer.getTime() + 0.25)
|
||||||
|
|
||||||
|
|||||||
@ -4,9 +4,8 @@
|
|||||||
--
|
--
|
||||||
-- Copyright (c) 2021, 2022 by Christian Franz and cf/x AG
|
-- Copyright (c) 2021, 2022 by Christian Franz and cf/x AG
|
||||||
--
|
--
|
||||||
|
|
||||||
cfxZones = {}
|
cfxZones = {}
|
||||||
cfxZones.version = "2.7.6"
|
cfxZones.version = "2.7.7"
|
||||||
--[[-- VERSION HISTORY
|
--[[-- VERSION HISTORY
|
||||||
- 2.2.4 - getCoalitionFromZoneProperty
|
- 2.2.4 - getCoalitionFromZoneProperty
|
||||||
- getStringFromZoneProperty
|
- getStringFromZoneProperty
|
||||||
@ -65,12 +64,14 @@ cfxZones.version = "2.7.6"
|
|||||||
- hasProperty now offers active information when looking for '*?' and '*!'
|
- hasProperty now offers active information when looking for '*?' and '*!'
|
||||||
- 2.7.0 - doPollFlag - fully support multiple flags per bang!
|
- 2.7.0 - doPollFlag - fully support multiple flags per bang!
|
||||||
- 2.7.1 - setFlagValueMult()
|
- 2.7.1 - setFlagValueMult()
|
||||||
- 2.7.2 - '161 repair'
|
- 2.7.2 - '261 repair'
|
||||||
- 2.7.3 - testZoneFlag returns mathodResult, lastVal
|
- 2.7.3 - testZoneFlag returns mathodResult, lastVal
|
||||||
- evalFlagMethodImmediate()
|
- evalFlagMethodImmediate()
|
||||||
- 2.7.4 - doPollFlag supports immediate number setting
|
- 2.7.4 - doPollFlag supports immediate number setting
|
||||||
- 2.7.5 - more QoL checks when mixing up ? and ! for attributes
|
- 2.7.5 - more QoL checks when mixing up ? and ! for attributes
|
||||||
- 2.7.6 - trim for getBoolFromZoneProperty and getStringFromZoneProperty
|
- 2.7.6 - trim for getBoolFromZoneProperty and getStringFromZoneProperty
|
||||||
|
- 2.7.7 - randomInRange()
|
||||||
|
- show number of zones
|
||||||
|
|
||||||
--]]--
|
--]]--
|
||||||
cfxZones.verbose = false
|
cfxZones.verbose = false
|
||||||
@ -558,6 +559,7 @@ end
|
|||||||
|
|
||||||
function cfxZones.getZonesWithAttributeNamed(attributeName, testZones)
|
function cfxZones.getZonesWithAttributeNamed(attributeName, testZones)
|
||||||
if not testZones then testZones = cfxZones.zones end
|
if not testZones then testZones = cfxZones.zones end
|
||||||
|
|
||||||
local attributZones = {}
|
local attributZones = {}
|
||||||
for aName,aZone in pairs(testZones) do
|
for aName,aZone in pairs(testZones) do
|
||||||
local attr = cfxZones.getZoneProperty(aZone, attributeName)
|
local attr = cfxZones.getZoneProperty(aZone, attributeName)
|
||||||
@ -1416,6 +1418,7 @@ function cfxZones.testFlagByMethodForZone(currVal, lastVal, theMethod, theZone)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function cfxZones.testZoneFlag(theZone, theFlagName, theMethod, latchName)
|
function cfxZones.testZoneFlag(theZone, theFlagName, theMethod, latchName)
|
||||||
-- returns two values: true/false method result, and curr value
|
-- returns two values: true/false method result, and curr value
|
||||||
-- returns true if method constraints are met for flag theFlagName
|
-- returns true if method constraints are met for flag theFlagName
|
||||||
@ -1603,6 +1606,15 @@ function cfxZones.getMinMaxFromZoneProperty(theZone, theProperty)
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function cfxZones.randomInRange(minVal, maxVal)
|
||||||
|
if maxVal < minVal then
|
||||||
|
local t = minVal
|
||||||
|
minVal = maxVal
|
||||||
|
maxVal = t
|
||||||
|
end
|
||||||
|
return cfxZones.randomDelayFromPositiveRange(minVal, maxVal)
|
||||||
|
end
|
||||||
|
|
||||||
function cfxZones.randomDelayFromPositiveRange(minVal, maxVal)
|
function cfxZones.randomDelayFromPositiveRange(minVal, maxVal)
|
||||||
if not maxVal then return minVal end
|
if not maxVal then return minVal end
|
||||||
if not minVal then return maxVal end
|
if not minVal then return maxVal end
|
||||||
@ -1697,7 +1709,6 @@ function cfxZones.hasProperty(theZone, theProperty)
|
|||||||
-- return foundIt ~= nil
|
-- return foundIt ~= nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function cfxZones.getBoolFromZoneProperty(theZone, theProperty, defaultVal)
|
function cfxZones.getBoolFromZoneProperty(theZone, theProperty, defaultVal)
|
||||||
if not defaultVal then defaultVal = false end
|
if not defaultVal then defaultVal = false end
|
||||||
if type(defaultVal) ~= "boolean" then
|
if type(defaultVal) ~= "boolean" then
|
||||||
@ -1920,7 +1931,8 @@ function cfxZones.init()
|
|||||||
cfxZones.startMovingZones()
|
cfxZones.startMovingZones()
|
||||||
cfxZones.updateMovingZones() -- will auto-repeat
|
cfxZones.updateMovingZones() -- will auto-repeat
|
||||||
|
|
||||||
trigger.action.outText("cf/x Zones v".. cfxZones.version .. ": loaded", 10)
|
trigger.action.outText("cf/x Zones v".. cfxZones.version .. ": loaded, zones:" .. dcsCommon.getSizeOfTable(cfxZones.zones), 30)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- get everything rolling
|
-- get everything rolling
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
cloneZones = {}
|
cloneZones = {}
|
||||||
cloneZones.version = "1.4.4"
|
cloneZones.version = "1.4.5"
|
||||||
cloneZones.verbose = false
|
cloneZones.verbose = false
|
||||||
cloneZones.requiredLibs = {
|
cloneZones.requiredLibs = {
|
||||||
"dcsCommon", -- always
|
"dcsCommon", -- always
|
||||||
"cfxZones", -- Zones, of course
|
"cfxZones", -- Zones, of course
|
||||||
"cfxMX",
|
"cfxMX",
|
||||||
}
|
}
|
||||||
-- groupTracker is OPTIONAL! and required only with trackWith attribute
|
-- groupTracker is OPTIONAL! and required only with trackWith attribute
|
||||||
|
|
||||||
cloneZones.cloners = {}
|
cloneZones.cloners = {}
|
||||||
cloneZones.callbacks = {}
|
cloneZones.callbacks = {}
|
||||||
cloneZones.unitXlate = {}
|
cloneZones.unitXlate = {}
|
||||||
cloneZones.groupXlate = {} -- used to translate original groupID to cloned. only holds last spawned group id
|
cloneZones.groupXlate = {} -- used to translate original groupID to cloned. only holds last spawned group id
|
||||||
cloneZones.uniqueCounter = 9200000 -- we start group numbering here
|
cloneZones.uniqueCounter = 9200000 -- we start group numbering here
|
||||||
--[[--
|
--[[--
|
||||||
Clones Groups from ME mission data
|
Clones Groups from ME mission data
|
||||||
Copyright (c) 2022 by Christian Franz and cf/x AG
|
Copyright (c) 2022 by Christian Franz and cf/x AG
|
||||||
|
|
||||||
@ -42,18 +42,20 @@ cloneZones.uniqueCounter = 9200000 -- we start group numbering here
|
|||||||
- turn bug for statics (bug in dcsCommon, resolved)
|
- turn bug for statics (bug in dcsCommon, resolved)
|
||||||
1.4.3 - embark/disembark now works with cloners
|
1.4.3 - embark/disembark now works with cloners
|
||||||
1.4.4 - removed some debugging verbosity
|
1.4.4 - removed some debugging verbosity
|
||||||
|
1.4.5 - randomizeLoc, rndLoc keyword
|
||||||
|
- cargo manager integration - pass cargo objects when present
|
||||||
|
|
||||||
|
|
||||||
--]]--
|
--]]--
|
||||||
|
|
||||||
--
|
--
|
||||||
-- adding / removing from list
|
-- adding / removing from list
|
||||||
--
|
--
|
||||||
function cloneZones.addCloneZone(theZone)
|
function cloneZones.addCloneZone(theZone)
|
||||||
table.insert(cloneZones.cloners, theZone)
|
table.insert(cloneZones.cloners, theZone)
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.getCloneZoneByName(aName)
|
function cloneZones.getCloneZoneByName(aName)
|
||||||
for idx, aZone in pairs(cloneZones.cloners) do
|
for idx, aZone in pairs(cloneZones.cloners) do
|
||||||
if aName == aZone.name then return aZone end
|
if aName == aZone.name then return aZone end
|
||||||
end
|
end
|
||||||
@ -62,28 +64,28 @@ function cloneZones.getCloneZoneByName(aName)
|
|||||||
end
|
end
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
--
|
--
|
||||||
-- callbacks
|
-- callbacks
|
||||||
--
|
--
|
||||||
|
|
||||||
function cloneZones.addCallback(theCallback)
|
function cloneZones.addCallback(theCallback)
|
||||||
if not theCallback then return end
|
if not theCallback then return end
|
||||||
table.insert(cloneZones.callbacks, theCallback)
|
table.insert(cloneZones.callbacks, theCallback)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- reasons for callback
|
-- reasons for callback
|
||||||
-- "will despawn group" - args is the group about to be despawned
|
-- "will despawn group" - args is the group about to be despawned
|
||||||
-- "did spawn group" -- args is group that was spawned
|
-- "did spawn group" -- args is group that was spawned
|
||||||
-- "will despawn static"
|
-- "will despawn static"
|
||||||
-- "did spawn static"
|
-- "did spawn static"
|
||||||
-- "spawned" -- completed spawn cycle. args contains .groups and .statics spawned
|
-- "spawned" -- completed spawn cycle. args contains .groups and .statics spawned
|
||||||
-- "empty" -- all spawns have been killed, args is empty
|
-- "empty" -- all spawns have been killed, args is empty
|
||||||
-- "wiped" -- preWipe executed
|
-- "wiped" -- preWipe executed
|
||||||
-- "<none" -- something went wrong
|
-- "<none" -- something went wrong
|
||||||
|
|
||||||
function cloneZones.invokeCallbacks(theZone, reason, args)
|
function cloneZones.invokeCallbacks(theZone, reason, args)
|
||||||
if not theZone then return end
|
if not theZone then return end
|
||||||
if not reason then reason = "<none>" end
|
if not reason then reason = "<none>" end
|
||||||
if not args then args = {} end
|
if not args then args = {} end
|
||||||
@ -93,14 +95,14 @@ function cloneZones.invokeCallbacks(theZone, reason, args)
|
|||||||
for idx, cb in pairs(cloneZones.callbacks) do
|
for idx, cb in pairs(cloneZones.callbacks) do
|
||||||
cb(theZone, reason, args)
|
cb(theZone, reason, args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- group translation orig id
|
-- group translation orig id
|
||||||
|
|
||||||
--
|
--
|
||||||
-- reading zones
|
-- reading zones
|
||||||
--
|
--
|
||||||
function cloneZones.partOfGroupDataInZone(theZone, theUnits)
|
function cloneZones.partOfGroupDataInZone(theZone, theUnits)
|
||||||
local zP = cfxZones.getPoint(theZone)
|
local zP = cfxZones.getPoint(theZone)
|
||||||
zP.y = 0
|
zP.y = 0
|
||||||
|
|
||||||
@ -113,9 +115,9 @@ function cloneZones.partOfGroupDataInZone(theZone, theUnits)
|
|||||||
if dist <= theZone.radius then return true end
|
if dist <= theZone.radius then return true end
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.allGroupsInZoneByData(theZone)
|
function cloneZones.allGroupsInZoneByData(theZone)
|
||||||
local theGroupsInZone = {}
|
local theGroupsInZone = {}
|
||||||
local radius = theZone.radius
|
local radius = theZone.radius
|
||||||
for groupName, groupData in pairs(cfxMX.groupDataByName) do
|
for groupName, groupData in pairs(cfxMX.groupDataByName) do
|
||||||
@ -127,9 +129,9 @@ function cloneZones.allGroupsInZoneByData(theZone)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
return theGroupsInZone
|
return theGroupsInZone
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.createClonerWithZone(theZone) -- has "Cloner"
|
function cloneZones.createClonerWithZone(theZone) -- has "Cloner"
|
||||||
if cloneZones.verbose then
|
if cloneZones.verbose then
|
||||||
trigger.action.outText("+++clnZ: new cloner " .. theZone.name, 30)
|
trigger.action.outText("+++clnZ: new cloner " .. theZone.name, 30)
|
||||||
end
|
end
|
||||||
@ -165,8 +167,8 @@ function cloneZones.createClonerWithZone(theZone) -- has "Cloner"
|
|||||||
-- resolving internal references
|
-- resolving internal references
|
||||||
local rawData, cat, ctry = cfxMX.getGroupFromDCSbyName(gName)
|
local rawData, cat, ctry = cfxMX.getGroupFromDCSbyName(gName)
|
||||||
local origID = rawData.groupId
|
local origID = rawData.groupId
|
||||||
-- cloneZones.templateGroups[gName] = origID
|
-- cloneZones.templateGroups[gName] = origID
|
||||||
-- cloneZones.templateGroupsReverse[origID] = gName
|
-- cloneZones.templateGroupsReverse[origID] = gName
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -262,14 +264,23 @@ function cloneZones.createClonerWithZone(theZone) -- has "Cloner"
|
|||||||
theZone.trackWith = cfxZones.getStringFromZoneProperty(theZone, "trackWith:", "<None>")
|
theZone.trackWith = cfxZones.getStringFromZoneProperty(theZone, "trackWith:", "<None>")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- randomized locations on spawn
|
||||||
|
theZone.rndLoc = cfxZones.getBoolFromZoneProperty(theZone, "randomizedLoc", false)
|
||||||
|
if cfxZones.hasProperty(theZone, "rndLoc") then
|
||||||
|
theZone.rndLoc = cfxZones.getBoolFromZoneProperty(theZone, "rndLoc", false)
|
||||||
|
end
|
||||||
|
if theZone.rndLoc and theZone.verbose then
|
||||||
|
trigger.action.outText("+++ rndloc on for " .. theZone.name, 30)
|
||||||
|
end
|
||||||
|
|
||||||
-- we end with clear plate
|
-- we end with clear plate
|
||||||
end
|
end
|
||||||
|
|
||||||
--
|
--
|
||||||
-- spawning, despawning
|
-- spawning, despawning
|
||||||
--
|
--
|
||||||
|
|
||||||
function cloneZones.despawnAll(theZone)
|
function cloneZones.despawnAll(theZone)
|
||||||
if cloneZones.verbose then
|
if cloneZones.verbose then
|
||||||
trigger.action.outText("wiping <" .. theZone.name .. ">", 30)
|
trigger.action.outText("wiping <" .. theZone.name .. ">", 30)
|
||||||
end
|
end
|
||||||
@ -294,9 +305,9 @@ function cloneZones.despawnAll(theZone)
|
|||||||
end
|
end
|
||||||
theZone.mySpawns = {}
|
theZone.mySpawns = {}
|
||||||
theZone.myStatics = {}
|
theZone.myStatics = {}
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.updateLocationsInGroupData(theData, zoneDelta, adjustAllWaypoints)
|
function cloneZones.updateLocationsInGroupData(theData, zoneDelta, adjustAllWaypoints)
|
||||||
|
|
||||||
-- remember that zoneDelta's [z] modifies theData's y!!
|
-- remember that zoneDelta's [z] modifies theData's y!!
|
||||||
theData.x = theData.x + zoneDelta.x
|
theData.x = theData.x + zoneDelta.x
|
||||||
@ -356,26 +367,26 @@ function cloneZones.updateLocationsInGroupData(theData, zoneDelta, adjustAllWayp
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function cloneZones.uniqueID()
|
function cloneZones.uniqueID()
|
||||||
local uid = cloneZones.uniqueCounter
|
local uid = cloneZones.uniqueCounter
|
||||||
cloneZones.uniqueCounter = cloneZones.uniqueCounter + 1
|
cloneZones.uniqueCounter = cloneZones.uniqueCounter + 1
|
||||||
return uid
|
return uid
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.uniqueNameGroupData(theData)
|
function cloneZones.uniqueNameGroupData(theData)
|
||||||
theData.name = dcsCommon.uuid(theData.name)
|
theData.name = dcsCommon.uuid(theData.name)
|
||||||
local units = theData.units
|
local units = theData.units
|
||||||
for idx, aUnit in pairs(units) do
|
for idx, aUnit in pairs(units) do
|
||||||
aUnit.name = dcsCommon.uuid(aUnit.name)
|
aUnit.name = dcsCommon.uuid(aUnit.name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.uniqueIDGroupData(theData)
|
function cloneZones.uniqueIDGroupData(theData)
|
||||||
theData.groupId = cloneZones.uniqueID()
|
theData.groupId = cloneZones.uniqueID()
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.uniqueIDUnitData(theData)
|
function cloneZones.uniqueIDUnitData(theData)
|
||||||
if not theData then return end
|
if not theData then return end
|
||||||
if not theData.units then return end
|
if not theData.units then return end
|
||||||
local units = theData.units
|
local units = theData.units
|
||||||
@ -385,9 +396,9 @@ function cloneZones.uniqueIDUnitData(theData)
|
|||||||
aUnit.CZTargetID = aUnit.unitId
|
aUnit.CZTargetID = aUnit.unitId
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.resolveOwnership(spawnZone, ctry)
|
function cloneZones.resolveOwnership(spawnZone, ctry)
|
||||||
if not spawnZone.masterOwner then return ctry end
|
if not spawnZone.masterOwner then return ctry end
|
||||||
|
|
||||||
local masterZone = cfxZones.getZoneByName(spawnZone.masterOwner)
|
local masterZone = cfxZones.getZoneByName(spawnZone.masterOwner)
|
||||||
@ -402,13 +413,13 @@ function cloneZones.resolveOwnership(spawnZone, ctry)
|
|||||||
|
|
||||||
ctry = dcsCommon.getACountryForCoalition(masterZone.owner)
|
ctry = dcsCommon.getACountryForCoalition(masterZone.owner)
|
||||||
return ctry
|
return ctry
|
||||||
end
|
end
|
||||||
|
|
||||||
--
|
--
|
||||||
-- resolve external group references
|
-- resolve external group references
|
||||||
--
|
--
|
||||||
|
|
||||||
function cloneZones.resolveGroupID(gID, rawData, dataTable, reason)
|
function cloneZones.resolveGroupID(gID, rawData, dataTable, reason)
|
||||||
if not reason then reason = "<default>" end
|
if not reason then reason = "<default>" end
|
||||||
|
|
||||||
local resolvedID = gID
|
local resolvedID = gID
|
||||||
@ -439,10 +450,10 @@ function cloneZones.resolveGroupID(gID, rawData, dataTable, reason)
|
|||||||
-- if we get here, reference is not to a cloned item
|
-- if we get here, reference is not to a cloned item
|
||||||
--trigger.action.outText("resolved " .. gID .. " to " .. resolvedID, 30)
|
--trigger.action.outText("resolved " .. gID .. " to " .. resolvedID, 30)
|
||||||
return resolvedID
|
return resolvedID
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.resolveUnitID(uID, rawData, dataTable, reason)
|
function cloneZones.resolveUnitID(uID, rawData, dataTable, reason)
|
||||||
-- also resolves statics as they share ID with units
|
-- also resolves statics as they share ID with units
|
||||||
local resolvedID = uID
|
local resolvedID = uID
|
||||||
--trigger.action.outText("Resolve reference to unitId <" .. uID .. "> for <" .. reason.. "> task", 30)
|
--trigger.action.outText("Resolve reference to unitId <" .. uID .. "> for <" .. reason.. "> task", 30)
|
||||||
|
|
||||||
@ -471,9 +482,9 @@ function cloneZones.resolveUnitID(uID, rawData, dataTable, reason)
|
|||||||
-- if we get here, reference is not to a cloned item
|
-- if we get here, reference is not to a cloned item
|
||||||
--trigger.action.outText("resolved G-" .. uID .. " to " .. resolvedID, 30)
|
--trigger.action.outText("resolved G-" .. uID .. " to " .. resolvedID, 30)
|
||||||
return resolvedID
|
return resolvedID
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.resolveStaticLinkUnit(uID)
|
function cloneZones.resolveStaticLinkUnit(uID)
|
||||||
local resolvedID = uID
|
local resolvedID = uID
|
||||||
local lastClone = cloneZones.unitXlate[uID]
|
local lastClone = cloneZones.unitXlate[uID]
|
||||||
if lastClone then
|
if lastClone then
|
||||||
@ -482,11 +493,11 @@ function cloneZones.resolveStaticLinkUnit(uID)
|
|||||||
return resolvedID
|
return resolvedID
|
||||||
end
|
end
|
||||||
return resolvedID
|
return resolvedID
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.resolveWPReferences(rawData, theZone, dataTable)
|
function cloneZones.resolveWPReferences(rawData, theZone, dataTable)
|
||||||
-- check to see if we really need data table, as we have theZone
|
-- check to see if we really need data table, as we have theZone
|
||||||
-- perform a check of route for group or unit references
|
-- perform a check of route for group or unit references
|
||||||
if not rawData then return end
|
if not rawData then return end
|
||||||
local myOName = rawData.CZorigName
|
local myOName = rawData.CZorigName
|
||||||
|
|
||||||
@ -584,9 +595,9 @@ function cloneZones.resolveWPReferences(rawData, theZone, dataTable)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.resolveReferences(theZone, dataTable)
|
function cloneZones.resolveReferences(theZone, dataTable)
|
||||||
-- when an action refers to another group, we check if
|
-- when an action refers to another group, we check if
|
||||||
-- the group referred to is also a clone, and update
|
-- the group referred to is also a clone, and update
|
||||||
-- the reference to the newest incardnation
|
-- the reference to the newest incardnation
|
||||||
@ -595,10 +606,10 @@ function cloneZones.resolveReferences(theZone, dataTable)
|
|||||||
-- resolve references in waypoints
|
-- resolve references in waypoints
|
||||||
cloneZones.resolveWPReferences(rawData, theZone, dataTable)
|
cloneZones.resolveWPReferences(rawData, theZone, dataTable)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function cloneZones.handoffTracking(theGroup, theZone)
|
function cloneZones.handoffTracking(theGroup, theZone)
|
||||||
if not groupTracker then
|
if not groupTracker then
|
||||||
trigger.action.outText("+++clne: <" .. theZone.name .. "> trackWith requires groupTracker module", 30)
|
trigger.action.outText("+++clne: <" .. theZone.name .. "> trackWith requires groupTracker module", 30)
|
||||||
return
|
return
|
||||||
@ -629,9 +640,9 @@ function cloneZones.handoffTracking(theGroup, theZone)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.spawnWithTemplateForZone(theZone, spawnZone)
|
function cloneZones.spawnWithTemplateForZone(theZone, spawnZone)
|
||||||
-- theZone is the cloner with the template
|
-- theZone is the cloner with the template
|
||||||
-- spawnZone is the spawner with settings
|
-- spawnZone is the spawner with settings
|
||||||
--if not spawnZone then spawnZone = theZone end
|
--if not spawnZone then spawnZone = theZone end
|
||||||
@ -662,6 +673,19 @@ function cloneZones.spawnWithTemplateForZone(theZone, spawnZone)
|
|||||||
-- update their position if not spawning to exact same location
|
-- update their position if not spawning to exact same location
|
||||||
cloneZones.updateLocationsInGroupData(rawData, zoneDelta, spawnZone.moveRoute)
|
cloneZones.updateLocationsInGroupData(rawData, zoneDelta, spawnZone.moveRoute)
|
||||||
|
|
||||||
|
-- apply randomizer if selected
|
||||||
|
if spawnZone.rndLoc then
|
||||||
|
local units = rawData.units
|
||||||
|
for idx, aUnit in pairs(units) do
|
||||||
|
local r = math.random() * spawnZone.radius
|
||||||
|
local phi = 6.2831 * math.random() -- that's 2Pi, folx
|
||||||
|
local dx = r * math.cos(phi)
|
||||||
|
local dy = r * math.sin(phi)
|
||||||
|
aUnit.x = aUnit.x + dx
|
||||||
|
aUnit.y = aUnit.y + dy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- apply turning
|
-- apply turning
|
||||||
dcsCommon.rotateGroupData(rawData, spawnZone.turn, newCenter.x, newCenter.z)
|
dcsCommon.rotateGroupData(rawData, spawnZone.turn, newCenter.x, newCenter.z)
|
||||||
|
|
||||||
@ -747,6 +771,16 @@ function cloneZones.spawnWithTemplateForZone(theZone, spawnZone)
|
|||||||
rawData.x = rawData.x + zoneDelta.x
|
rawData.x = rawData.x + zoneDelta.x
|
||||||
rawData.y = rawData.y + zoneDelta.z -- !!!
|
rawData.y = rawData.y + zoneDelta.z -- !!!
|
||||||
|
|
||||||
|
-- randomize if enabled
|
||||||
|
if spawnZone.rndLoc then
|
||||||
|
local r = math.random() * spawnZone.radius
|
||||||
|
local phi = 6.2831 * math.random() -- that's 2Pi, folx
|
||||||
|
local dx = r * math.cos(phi)
|
||||||
|
local dy = r * math.sin(phi)
|
||||||
|
rawData.x = rawData.x + dx
|
||||||
|
rawData.y = rawData.y + dy
|
||||||
|
end
|
||||||
|
|
||||||
-- apply turning
|
-- apply turning
|
||||||
dcsCommon.rotateUnitData(rawData, spawnZone.turn, newCenter.x, newCenter.z)
|
dcsCommon.rotateUnitData(rawData, spawnZone.turn, newCenter.x, newCenter.z)
|
||||||
|
|
||||||
@ -775,16 +809,17 @@ function cloneZones.spawnWithTemplateForZone(theZone, spawnZone)
|
|||||||
rawData.offsets.x = rawData.offsets.x - zoneDelta.x
|
rawData.offsets.x = rawData.offsets.x - zoneDelta.x
|
||||||
rawData.offsets.angle = rawData.offsets.angle + spawnZone.turn
|
rawData.offsets.angle = rawData.offsets.angle + spawnZone.turn
|
||||||
rawData.linkOffset = true
|
rawData.linkOffset = true
|
||||||
-- trigger.action.outText("zone deltas are " .. zoneDelta.x .. ", " .. zoneDelta.y, 30)
|
-- trigger.action.outText("zone deltas are " .. zoneDelta.x .. ", " .. zoneDelta.y, 30)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local isCargo = rawData.canCargo
|
||||||
local theStatic = coalition.addStaticObject(ctry, rawData)
|
local theStatic = coalition.addStaticObject(ctry, rawData)
|
||||||
local newStaticID = tonumber(theStatic:getID())
|
local newStaticID = tonumber(theStatic:getID())
|
||||||
table.insert(spawnedStatics, theStatic)
|
table.insert(spawnedStatics, theStatic)
|
||||||
-- we don't mix groups with units, so no lookup tables for
|
-- we don't mix groups with units, so no lookup tables for
|
||||||
-- statics
|
-- statics
|
||||||
if newStaticID == rawData.CZTargetID then
|
if newStaticID == rawData.CZTargetID then
|
||||||
-- trigger.action.outText("Static ID OK: " .. newStaticID .. " for " .. rawData.name, 30)
|
-- trigger.action.outText("Static ID OK: " .. newStaticID .. " for " .. rawData.name, 30)
|
||||||
else
|
else
|
||||||
trigger.action.outText("Static ID mismatch: " .. newStaticID .. " vs (target) " .. rawData.CZTargetID .. " for " .. rawData.name, 30)
|
trigger.action.outText("Static ID mismatch: " .. newStaticID .. " vs (target) " .. rawData.CZTargetID .. " for " .. rawData.name, 30)
|
||||||
end
|
end
|
||||||
@ -792,18 +827,31 @@ function cloneZones.spawnWithTemplateForZone(theZone, spawnZone)
|
|||||||
|
|
||||||
cloneZones.invokeCallbacks(theZone, "did spawn static", theStatic)
|
cloneZones.invokeCallbacks(theZone, "did spawn static", theStatic)
|
||||||
--]]--
|
--]]--
|
||||||
if cloneZones.verbose then
|
if cloneZones.verbose or spawnZone.verbose then
|
||||||
trigger.action.outText("Static spawn: spawned " .. aStaticName, 30)
|
trigger.action.outText("Static spawn: spawned " .. aStaticName, 30)
|
||||||
end
|
end
|
||||||
|
-- processing for cargoManager
|
||||||
|
if isCargo then
|
||||||
|
if cfxCargoManager then
|
||||||
|
cfxCargoManager.addCargo(theStatic)
|
||||||
|
if cloneZones.verbose or spawnZone.verbose then
|
||||||
|
trigger.action.outText("+++clne: added CARGO " .. theStatic:getName() .. " to cargo manager ", 30)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if cloneZones.verbose or spawnZone.verbose then
|
||||||
|
trigger.action.outText("+++clne: CARGO " .. theStatic:getName() .. " detected, not managerd", 30)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
local args = {}
|
local args = {}
|
||||||
args.groups = spawnedGroups
|
args.groups = spawnedGroups
|
||||||
args.statics = spawnedStatics
|
args.statics = spawnedStatics
|
||||||
cloneZones.invokeCallbacks(theZone, "spawned", args)
|
cloneZones.invokeCallbacks(theZone, "spawned", args)
|
||||||
return spawnedGroups, spawnedStatics
|
return spawnedGroups, spawnedStatics
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.spawnWithCloner(theZone)
|
function cloneZones.spawnWithCloner(theZone)
|
||||||
if not theZone then
|
if not theZone then
|
||||||
trigger.action.outText("+++clnZ: nil zone on spawnWithCloner", 30)
|
trigger.action.outText("+++clnZ: nil zone on spawnWithCloner", 30)
|
||||||
return
|
return
|
||||||
@ -868,9 +916,9 @@ function cloneZones.spawnWithCloner(theZone)
|
|||||||
theZone.mySpawns = {}
|
theZone.mySpawns = {}
|
||||||
theZone.myStatics = {}
|
theZone.myStatics = {}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.countLiveUnits(theZone)
|
function cloneZones.countLiveUnits(theZone)
|
||||||
if not theZone then return 0 end
|
if not theZone then return 0 end
|
||||||
local count = 0
|
local count = 0
|
||||||
-- count units
|
-- count units
|
||||||
@ -896,9 +944,9 @@ function cloneZones.countLiveUnits(theZone)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
return count
|
return count
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.hasLiveUnits(theZone)
|
function cloneZones.hasLiveUnits(theZone)
|
||||||
if not theZone then return 0 end
|
if not theZone then return 0 end
|
||||||
if theZone.mySpawns then
|
if theZone.mySpawns then
|
||||||
for idx, aGroup in pairs(theZone.mySpawns) do
|
for idx, aGroup in pairs(theZone.mySpawns) do
|
||||||
@ -922,12 +970,12 @@ function cloneZones.hasLiveUnits(theZone)
|
|||||||
end
|
end
|
||||||
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
--
|
--
|
||||||
-- UPDATE
|
-- UPDATE
|
||||||
--
|
--
|
||||||
function cloneZones.update()
|
function cloneZones.update()
|
||||||
timer.scheduleFunction(cloneZones.update, {}, timer.getTime() + 1)
|
timer.scheduleFunction(cloneZones.update, {}, timer.getTime() + 1)
|
||||||
|
|
||||||
for idx, aZone in pairs(cloneZones.cloners) do
|
for idx, aZone in pairs(cloneZones.cloners) do
|
||||||
@ -974,9 +1022,9 @@ function cloneZones.update()
|
|||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.onStart()
|
function cloneZones.onStart()
|
||||||
--trigger.action.outText("+++clnZ: Enter atStart", 30)
|
--trigger.action.outText("+++clnZ: Enter atStart", 30)
|
||||||
for idx, theZone in pairs(cloneZones.cloners) do
|
for idx, theZone in pairs(cloneZones.cloners) do
|
||||||
if theZone.onStart then
|
if theZone.onStart then
|
||||||
@ -987,12 +1035,12 @@ function cloneZones.onStart()
|
|||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--
|
--
|
||||||
-- START
|
-- START
|
||||||
--
|
--
|
||||||
function cloneZones.readConfigZone()
|
function cloneZones.readConfigZone()
|
||||||
local theZone = cfxZones.getZoneByName("cloneZonesConfig")
|
local theZone = cfxZones.getZoneByName("cloneZonesConfig")
|
||||||
if not theZone then
|
if not theZone then
|
||||||
if cloneZones.verbose then
|
if cloneZones.verbose then
|
||||||
@ -1006,9 +1054,9 @@ function cloneZones.readConfigZone()
|
|||||||
if cloneZones.verbose then
|
if cloneZones.verbose then
|
||||||
trigger.action.outText("+++clnZ: read config", 30)
|
trigger.action.outText("+++clnZ: read config", 30)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function cloneZones.start()
|
function cloneZones.start()
|
||||||
-- lib check
|
-- lib check
|
||||||
if not dcsCommon.libCheck then
|
if not dcsCommon.libCheck then
|
||||||
trigger.action.outText("cfx Clone Zones requires dcsCommon", 30)
|
trigger.action.outText("cfx Clone Zones requires dcsCommon", 30)
|
||||||
@ -1044,21 +1092,21 @@ function cloneZones.start()
|
|||||||
|
|
||||||
trigger.action.outText("cfx Clone Zones v" .. cloneZones.version .. " started.", 30)
|
trigger.action.outText("cfx Clone Zones v" .. cloneZones.version .. " started.", 30)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- let's go!
|
-- let's go!
|
||||||
if not cloneZones.start() then
|
if not cloneZones.start() then
|
||||||
trigger.action.outText("cf/x Clone Zones aborted: missing libraries", 30)
|
trigger.action.outText("cf/x Clone Zones aborted: missing libraries", 30)
|
||||||
cloneZones = nil
|
cloneZones = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--[[--
|
--[[--
|
||||||
to resolve tasks
|
to resolve tasks
|
||||||
|
|
||||||
- AFAC
|
- AFAC
|
||||||
- FAC Assign group
|
- FAC Assign group
|
||||||
- set freq for unit
|
- set freq for unit
|
||||||
- embark / disembark
|
- embark / disembark
|
||||||
--]]--
|
--]]--
|
||||||
@ -1,5 +1,5 @@
|
|||||||
csarManager = {}
|
csarManager = {}
|
||||||
csarManager.version = "2.1.0"
|
csarManager.version = "2.1.1"
|
||||||
csarManager.verbose = false
|
csarManager.verbose = false
|
||||||
csarManager.ups = 1
|
csarManager.ups = 1
|
||||||
|
|
||||||
@ -35,6 +35,7 @@ csarManager.ups = 1
|
|||||||
- csarBlueDelivered
|
- csarBlueDelivered
|
||||||
- finally fixed smoke performance bug
|
- finally fixed smoke performance bug
|
||||||
- csarManager.vectoring optional
|
- csarManager.vectoring optional
|
||||||
|
- 2.1.1 - zone-local verbosity
|
||||||
|
|
||||||
--]]--
|
--]]--
|
||||||
-- modules that need to be loaded BEFORE I run
|
-- modules that need to be loaded BEFORE I run
|
||||||
@ -178,7 +179,7 @@ function csarManager.createDownedPilot(theMission)
|
|||||||
theBoyGroup)
|
theBoyGroup)
|
||||||
|
|
||||||
if theBoyGroup then
|
if theBoyGroup then
|
||||||
-- trigger.action.outText("+++csar: created csar!", 30)
|
|
||||||
else
|
else
|
||||||
trigger.action.outText("+++csar: FAILED to create csar!", 30)
|
trigger.action.outText("+++csar: FAILED to create csar!", 30)
|
||||||
end
|
end
|
||||||
@ -343,7 +344,6 @@ function csarManager.somethingHappened(event)
|
|||||||
local ID = event.id
|
local ID = event.id
|
||||||
|
|
||||||
local myType = theUnit:getTypeName()
|
local myType = theUnit:getTypeName()
|
||||||
-- trigger.action.outText("+++csar: event " .. ID .. " for player unit " .. theUnit:getName() .. " of type " .. myType, 30)
|
|
||||||
|
|
||||||
if ID == 4 then -- landed
|
if ID == 4 then -- landed
|
||||||
csarManager.heloLanded(theUnit)
|
csarManager.heloLanded(theUnit)
|
||||||
@ -375,9 +375,7 @@ function csarManager.successMission(who, where, theMission)
|
|||||||
-- callback has format callback(coalition, success true/false, numberSaved, descriptionText)
|
-- callback has format callback(coalition, success true/false, numberSaved, descriptionText)
|
||||||
|
|
||||||
csarManager.invokeCallbacks(theMission.side, true, 1, "success")
|
csarManager.invokeCallbacks(theMission.side, true, 1, "success")
|
||||||
-- for idx, callback in pairs(csarManager.csarCompleteCB) do
|
|
||||||
-- callback(theMission.side, true, 1, "test")
|
|
||||||
-- end
|
|
||||||
trigger.action.outSoundForCoalition(theMission.side, "Quest Snare 3.wav")
|
trigger.action.outSoundForCoalition(theMission.side, "Quest Snare 3.wav")
|
||||||
|
|
||||||
if csarManager.csarRedDelivered and theMission.side == 1 then
|
if csarManager.csarRedDelivered and theMission.side == 1 then
|
||||||
@ -420,13 +418,10 @@ function csarManager.heloLanded(theUnit)
|
|||||||
local currentBaseSide = base.side
|
local currentBaseSide = base.side
|
||||||
|
|
||||||
if base.zone.owner then
|
if base.zone.owner then
|
||||||
-- this zone is shared with capturable
|
-- this zone is shared with capturable (owned)
|
||||||
-- zone extensions like owned zone, FARP etc.
|
-- zone extensions like owned zone, FARP etc.
|
||||||
-- use current owner
|
-- use current owner
|
||||||
currentBaseSide = base.zone.owner
|
currentBaseSide = base.zone.owner
|
||||||
-- trigger.action.outText("+++csar: overriding base.side with zone owner = " .. currentBaseSide .. " for csarB " .. base.name .. ", requiring " .. mySide .. " or 0 to land", 30)
|
|
||||||
else
|
|
||||||
-- trigger.action.outText("+++csar: base " .. base.name .. " has no owner - proceeding with side = " .. base.side .. " looking for " .. mySide, 30)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if currentBaseSide == mySide or
|
if currentBaseSide == mySide or
|
||||||
@ -551,21 +546,7 @@ function csarManager.heloCrashed(theUnit)
|
|||||||
local theGroup = theUnit:getGroup()
|
local theGroup = theUnit:getGroup()
|
||||||
conf.id = theGroup:getID()
|
conf.id = theGroup:getID()
|
||||||
conf.currentState = -1 -- (we don't know)
|
conf.currentState = -1 -- (we don't know)
|
||||||
--[[--
|
|
||||||
if #conf.troopsOnBoard > 0 then
|
|
||||||
-- this is where we can create a new CSAR mission
|
|
||||||
trigger.action.outSoundForCoalition(conf.id, theUnit:getName() .. " crashed while evacuating " .. #conf.troopsOnBoard .. " pilots. Survivors possible.", 30)
|
|
||||||
trigger.action.outSoundForCoalition(conf.id, "Quest Snare 3.wav")
|
|
||||||
for i=1, #conf.troopsOnBoard do
|
|
||||||
local msn = conf.troopsOnBoard[i] -- picked up unit(s)
|
|
||||||
local theRescuedPilot = msn.name
|
|
||||||
-- create x new missions in 50m radius
|
|
||||||
-- except for pilot, that will be called
|
|
||||||
-- from limitedAirframes
|
|
||||||
csarManager.createCSARforUnit(theUnit, theRescuedPilot, 50, true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
--]]--
|
|
||||||
conf.troopsOnBoard = {}
|
conf.troopsOnBoard = {}
|
||||||
local myName = conf.name
|
local myName = conf.name
|
||||||
cargoSuper.removeAllMassForCargo(myName, "Evacuees") -- will allocate new empty table
|
cargoSuper.removeAllMassForCargo(myName, "Evacuees") -- will allocate new empty table
|
||||||
@ -876,7 +857,10 @@ function csarManager.addCSARBase(aZone)
|
|||||||
csarBase.side = cfxZones.getCoalitionFromZoneProperty(aZone, "coalition", 0)
|
csarBase.side = cfxZones.getCoalitionFromZoneProperty(aZone, "coalition", 0)
|
||||||
|
|
||||||
table.insert(csarManager.csarBases, csarBase)
|
table.insert(csarManager.csarBases, csarBase)
|
||||||
-- trigger.action.outText("+++csar: found base " .. csarBase.name .. " for side " .. csarBase.side, 30)
|
|
||||||
|
if csarManager.verbose or aZone.verbose then
|
||||||
|
trigger.action.outText("+++csar: zone <" .. csarBase.name .. "> safe for side " .. csarBase.side, 30)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function csarManager.getCSARBaseforZone(aZone)
|
function csarManager.getCSARBaseforZone(aZone)
|
||||||
@ -895,7 +879,6 @@ end
|
|||||||
--
|
--
|
||||||
--
|
--
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- updateCSARMissions: make sure evacuees are still alive
|
-- updateCSARMissions: make sure evacuees are still alive
|
||||||
--
|
--
|
||||||
@ -1191,28 +1174,6 @@ function csarManager.processCSARZones()
|
|||||||
for k, aZone in pairs(csarBases) do
|
for k, aZone in pairs(csarBases) do
|
||||||
|
|
||||||
csarManager.readCSARZone(aZone)
|
csarManager.readCSARZone(aZone)
|
||||||
--[[--
|
|
||||||
-- gather data, and then create a mission from this
|
|
||||||
local theSide = cfxZones.getCoalitionFromZoneProperty(aZone, "coalition", 0)
|
|
||||||
aZone.csarSide = theSide
|
|
||||||
local name = cfxZones.getZoneProperty(aZone, "name")
|
|
||||||
aZone.
|
|
||||||
local freq = cfxZones.getNumberFromZoneProperty(aZone, "freq", 0)
|
|
||||||
if freq == 0 then freq = nil end
|
|
||||||
local numCrew = 1
|
|
||||||
local mapMarker = nil
|
|
||||||
local timeLimit = cfxZones.getNumberFromZoneProperty(aZone, "timeLimit", 0)
|
|
||||||
if timeLimit == 0 then timeLimit = nil else timeLimit = timeLimit * 60 end
|
|
||||||
|
|
||||||
local theMission = csarManager.createCSARMissionData(aZone.point,
|
|
||||||
theSide,
|
|
||||||
freq,
|
|
||||||
name,
|
|
||||||
numCrew,
|
|
||||||
timeLimit,
|
|
||||||
mapMarker)
|
|
||||||
csarManager.addMission(theMission)
|
|
||||||
--]]--
|
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,19 +1,24 @@
|
|||||||
limitedAirframes = {}
|
limitedAirframes = {}
|
||||||
limitedAirframes.version = "1.3.0"
|
limitedAirframes.version = "1.4.0"
|
||||||
|
limitedAirframes.verbose = false
|
||||||
limitedAirframes.enabled = true -- can be turned off
|
limitedAirframes.enabled = true -- can be turned off
|
||||||
limitedAirframes.userCanToggle = true -- F-10 menu?
|
limitedAirframes.userCanToggle = true -- F10 menu?
|
||||||
|
limitedAirframes.onlyOwnSide = true -- F10 query only shows own side count, for later expansion
|
||||||
limitedAirframes.maxRed = -1 -- -1 == infinite
|
limitedAirframes.maxRed = -1 -- -1 == infinite
|
||||||
limitedAirframes.maxBlue = 6 -- -1 = infinite
|
limitedAirframes.maxBlue = -1 -- = infinite
|
||||||
limitedAirframes.redWinsFlag = "999"
|
limitedAirframes.redWinsFlag = "999"
|
||||||
limitedAirframes.blueWinsFlag = "998"
|
limitedAirframes.blueWinsFlag = "998"
|
||||||
|
limitedAirframes.method = "inc"
|
||||||
|
limitedAirframes.warningSound = "Quest Snare 3.wav"
|
||||||
|
limitedAirframes.loseSound = "Death PIANO.wav"
|
||||||
|
limitedAirframes.winSound = "Triumphant Victory.wav"
|
||||||
|
|
||||||
limitedAirframes.requiredLibs = {
|
limitedAirframes.requiredLibs = {
|
||||||
"dcsCommon", -- common is of course needed for everything
|
"dcsCommon", -- common is of course needed for everything
|
||||||
-- pretty stupid to check for this since we
|
-- pretty stupid to check for this since we
|
||||||
-- need common to invoke the check, but anyway
|
-- need common to invoke the check, but anyway
|
||||||
"cfxZones", -- Zones, of course for safe landings
|
"cfxZones", -- Zones, of course for safe landings
|
||||||
"cfxPlayer", -- callbacks
|
"cfxPlayer",
|
||||||
-- "cfxGroundTroops", -- generic data module for weight
|
|
||||||
}
|
}
|
||||||
|
|
||||||
--[[-- VERSION HISTORY
|
--[[-- VERSION HISTORY
|
||||||
@ -40,6 +45,10 @@ limitedAirframes.requiredLibs = {
|
|||||||
- hand change in pilotsafe zones that can be landed in
|
- hand change in pilotsafe zones that can be landed in
|
||||||
- 1.2.0 - limitedAirframesConfig zone
|
- 1.2.0 - limitedAirframesConfig zone
|
||||||
- 1.3.0 - added network dead override logic via unitFlownByPlayer
|
- 1.3.0 - added network dead override logic via unitFlownByPlayer
|
||||||
|
- 1.4.0 - DML integration, verbosity, clean-up, QoL improvements
|
||||||
|
redSafe, blueSafe with attribute, backward compatible
|
||||||
|
currRed
|
||||||
|
|
||||||
|
|
||||||
--]]--
|
--]]--
|
||||||
|
|
||||||
@ -52,6 +61,7 @@ limitedAirframes.requiredLibs = {
|
|||||||
-- *** EXTENDS ZONES ***
|
-- *** EXTENDS ZONES ***
|
||||||
-- safe zones must have a property "pilotSafe"
|
-- safe zones must have a property "pilotSafe"
|
||||||
-- - pilotSafe - this is a zone to safely change airframes in
|
-- - pilotSafe - this is a zone to safely change airframes in
|
||||||
|
-- - can also carry 'red' or 'blue' to enable
|
||||||
-- - redSafe (optional, defaults to true)
|
-- - redSafe (optional, defaults to true)
|
||||||
-- - blueSafe (optional, defaults to true)
|
-- - blueSafe (optional, defaults to true)
|
||||||
-- set to "false" or "no" to disallow that side to change
|
-- set to "false" or "no" to disallow that side to change
|
||||||
@ -80,7 +90,7 @@ limitedAirframes.lastEvents = {}
|
|||||||
-- update the side's airframe credit
|
-- update the side's airframe credit
|
||||||
|
|
||||||
limitedAirframes.currRed = 0
|
limitedAirframes.currRed = 0
|
||||||
limitedAirframes.currRed = 0
|
limitedAirframes.currBlue = 0
|
||||||
|
|
||||||
-- we record all unit names that contain a player
|
-- we record all unit names that contain a player
|
||||||
-- so that we can check against these when we receive
|
-- so that we can check against these when we receive
|
||||||
@ -106,11 +116,19 @@ function limitedAirframes.readConfigZone()
|
|||||||
-- note: must match exactly!!!!
|
-- note: must match exactly!!!!
|
||||||
local theZone = cfxZones.getZoneByName("limitedAirframesConfig")
|
local theZone = cfxZones.getZoneByName("limitedAirframesConfig")
|
||||||
if not theZone then
|
if not theZone then
|
||||||
trigger.action.outText("***LimA: NO config zone!", 30)
|
if limitedAirframes.verbose then
|
||||||
return
|
trigger.action.outText("+++limA: NO config zone!", 30)
|
||||||
end
|
end
|
||||||
|
theZone = cfxZones.createSimpleZone("limitedAirframesConfig")
|
||||||
|
end
|
||||||
|
-- remember me
|
||||||
|
limitedAirframes.config = theZone
|
||||||
|
|
||||||
trigger.action.outText("LimA: found config zone!", 30)
|
limitedAirframes.verbose = cfxZones.getBoolFromZoneProperty(theZone, "verbose", false)
|
||||||
|
|
||||||
|
if limitedAirframes.verbose then
|
||||||
|
trigger.action.outText("+++limA: found config zone!", 30)
|
||||||
|
end
|
||||||
|
|
||||||
-- ok, for each property, load it if it exists
|
-- ok, for each property, load it if it exists
|
||||||
if cfxZones.hasProperty(theZone, "enabled") then
|
if cfxZones.hasProperty(theZone, "enabled") then
|
||||||
@ -130,13 +148,33 @@ function limitedAirframes.readConfigZone()
|
|||||||
limitedAirframes.maxBlue = cfxZones.getNumberFromZoneProperty(theZone, "maxBlue", -1)
|
limitedAirframes.maxBlue = cfxZones.getNumberFromZoneProperty(theZone, "maxBlue", -1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
limitedAirframes.numRed = cfxZones.getStringFromZoneProperty(theZone, "#red", "*none")
|
||||||
|
limitedAirframes.numBlue = cfxZones.getStringFromZoneProperty(theZone, "#blue", "*none")
|
||||||
|
|
||||||
if cfxZones.hasProperty(theZone, "redWinsFlag") then
|
|
||||||
limitedAirframes.redWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "redWinsFlag", "999")
|
limitedAirframes.redWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "redWins!", "*none")
|
||||||
|
|
||||||
|
if cfxZones.hasProperty(theZone, "redWinsFlag!") then
|
||||||
|
limitedAirframes.redWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "redWinsFlag!", "*none")
|
||||||
end
|
end
|
||||||
|
|
||||||
if cfxZones.hasProperty(theZone, "blueWinsFlag") then
|
limitedAirframes.blueWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "blueWins!", "*none")
|
||||||
limitedAirframes.blueWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "blueWinsFlag", "998")
|
if cfxZones.hasProperty(theZone, "blueWinsFlag!") then
|
||||||
|
limitedAirframes.blueWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "blueWinsFlag!", "*none")
|
||||||
|
end
|
||||||
|
|
||||||
|
limitedAirframes.method = cfxZones.getStringFromZoneProperty(theZone, "method", "inc")
|
||||||
|
|
||||||
|
if cfxZones.hasProperty(theZone, "warningSound") then
|
||||||
|
limitedAirframes.warningSound = cfxZones.getStringFromZoneProperty(theZone, "warningSound", "none")
|
||||||
|
end
|
||||||
|
|
||||||
|
if cfxZones.hasProperty(theZone, "winSound") then
|
||||||
|
limitedAirframes.winSound = cfxZones.getStringFromZoneProperty(theZone, "winSound", "none")
|
||||||
|
end
|
||||||
|
|
||||||
|
if cfxZones.hasProperty(theZone, "loseSound") then
|
||||||
|
limitedAirframes.loseSound = cfxZones.getStringFromZoneProperty(theZone, "loseSound", "none")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -206,17 +244,17 @@ end
|
|||||||
|
|
||||||
function limitedAirframes.updatePlayer(pName, status)
|
function limitedAirframes.updatePlayer(pName, status)
|
||||||
if not pName then
|
if not pName then
|
||||||
trigger.action.outText("+++lim: WARNING - NIL pName in updatePlayer for status " .. status, 30)
|
trigger.action.outText("+++limA: WARNING - NIL pName in updatePlayer for status " .. status, 30)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local desc = ""
|
local desc = ""
|
||||||
if not limitedAirframes.players[pName] then
|
if not limitedAirframes.players[pName] then
|
||||||
desc = "+++lim: NEW player " .. pName .. ": " .. status
|
desc = "+++limA: NEW player " .. pName .. ": " .. status
|
||||||
else
|
else
|
||||||
if limitedAirframes.players[pName] ~= status then
|
if limitedAirframes.players[pName] ~= status then
|
||||||
desc = "+++lim: CHANGE player " .. pName .. " " .. limitedAirframes.players[pName] .. " -> " .. status
|
desc = "+++limA: CHANGE player " .. pName .. " " .. limitedAirframes.players[pName] .. " -> " .. status
|
||||||
else
|
else
|
||||||
desc = "+++: player " .. pName .. " no change (" .. status .. ")"
|
desc = "+++limA: player " .. pName .. " no change (" .. status .. ")"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -267,16 +305,13 @@ function limitedAirframes.preProcessor(event)
|
|||||||
|
|
||||||
if event.id == 6 then -- Eject, plane already divorced from player
|
if event.id == 6 then -- Eject, plane already divorced from player
|
||||||
if limitedAirframes.isKnownUnitName(uName) then
|
if limitedAirframes.isKnownUnitName(uName) then
|
||||||
--trigger.action.outText("limAir: detected EJECT for player unit " .. uName .. " player " .. limitedAirframes.getKnownUnitPilotByUnitName(uName), 30)
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
return false -- no longer of interest
|
return false -- no longer of interest
|
||||||
end
|
end
|
||||||
|
|
||||||
if event.id == 5 then -- crash, plane no longer attached to player
|
if event.id == 5 then -- crash, plane no longer attached to player
|
||||||
|
|
||||||
if limitedAirframes.isKnownUnitName(uName) then
|
if limitedAirframes.isKnownUnitName(uName) then
|
||||||
--trigger.action.outText("limAir: detected CRASH for player unit " .. uName .. " player " .. limitedAirframes.getKnownUnitPilotByUnitName(uName), 30)
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
return false -- no longer of interest
|
return false -- no longer of interest
|
||||||
@ -329,19 +364,10 @@ function limitedAirframes.somethingHappened(event)
|
|||||||
local ID = event.id
|
local ID = event.id
|
||||||
local myType = theUnit:getTypeName()
|
local myType = theUnit:getTypeName()
|
||||||
|
|
||||||
-- "20" event (player enter): always processed
|
|
||||||
--[[-- if ID == 20 or ID == 15 then -- player entered unit
|
|
||||||
limitedAirframes.addPlayerUnit(theUnit) -- will also update player and player status to 'alive'
|
|
||||||
-- now procc a 'cheater' since we entered a new airframe/pilot
|
|
||||||
limitedAirframes.checkPlayerFrameAvailability(event)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
--]]--
|
|
||||||
|
|
||||||
if ID == 20 then -- 20 ENTER UNIT
|
if ID == 20 then -- 20 ENTER UNIT
|
||||||
local pName = limitedAirframes.getKnownUnitPilotByUnit(theUnit)
|
local pName = limitedAirframes.getKnownUnitPilotByUnit(theUnit)
|
||||||
if not pName then pName = "***UNKNOWN***" end
|
if not pName then pName = "***UNKNOWN***" end
|
||||||
--trigger.action.outText("limAir: Received ENTER UNIT (20) for " .. pName .. " in " .. unitName , 30)
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -354,7 +380,9 @@ function limitedAirframes.somethingHappened(event)
|
|||||||
limitedAirframes.unitFlownByPlayer[unitName] = playerName
|
limitedAirframes.unitFlownByPlayer[unitName] = playerName
|
||||||
-- TODO: make sure this is the ONLY plane the player
|
-- TODO: make sure this is the ONLY plane the player
|
||||||
-- is registered under, and mark mismatches
|
-- is registered under, and mark mismatches
|
||||||
|
if limitedAirframes.verbose then
|
||||||
trigger.action.outText("limAir: 15 -- player " .. playerName .. " now in " .. unitName, 30)
|
trigger.action.outText("limAir: 15 -- player " .. playerName .. " now in " .. unitName, 30)
|
||||||
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -391,7 +419,9 @@ function limitedAirframes.somethingHappened(event)
|
|||||||
limitedAirframes.pilotDied(theUnit)
|
limitedAirframes.pilotDied(theUnit)
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
|
if limitedAirframes.verbose then
|
||||||
trigger.action.outText("limAir: Crash of airframe detected - but player status wasn't alive (" .. pStatus .. ")", 30)
|
trigger.action.outText("limAir: Crash of airframe detected - but player status wasn't alive (" .. pStatus .. ")", 30)
|
||||||
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -402,8 +432,9 @@ function limitedAirframes.somethingHappened(event)
|
|||||||
-- remove pilot name from unit name
|
-- remove pilot name from unit name
|
||||||
limitedAirframes.unitFlownByPlayer[unitName] = nil
|
limitedAirframes.unitFlownByPlayer[unitName] = nil
|
||||||
--trigger.action.outText("limAir: 21 -- unit " .. unitName .. " unoccupied", 30)
|
--trigger.action.outText("limAir: 21 -- unit " .. unitName .. " unoccupied", 30)
|
||||||
|
if limitedAirframes.verbose then
|
||||||
trigger.action.outText("limAir: 21 (player left) for unit " .. unitName , 30)
|
trigger.action.outText("limAir: 21 (player left) for unit " .. unitName , 30)
|
||||||
|
end
|
||||||
-- player left unit. Happens twice
|
-- player left unit. Happens twice
|
||||||
-- check if player alive, else we have a ditch.
|
-- check if player alive, else we have a ditch.
|
||||||
limitedAirframes.handlePlayerLeftUnit(event)
|
limitedAirframes.handlePlayerLeftUnit(event)
|
||||||
@ -415,7 +446,9 @@ function limitedAirframes.somethingHappened(event)
|
|||||||
--trigger.action.outText("limAir: 9 (PILOT DEAD) for unit " .. unitName , 30)
|
--trigger.action.outText("limAir: 9 (PILOT DEAD) for unit " .. unitName , 30)
|
||||||
local thePilot = limitedAirframes.unitFlownByPlayer[unitName]
|
local thePilot = limitedAirframes.unitFlownByPlayer[unitName]
|
||||||
if not thePilot then
|
if not thePilot then
|
||||||
|
if limitedAirframes.verbose then
|
||||||
trigger.action.outText("+++limAir: 9 O'RIDE -- unit " .. unitName .. " was legally vacated before!", 30)
|
trigger.action.outText("+++limAir: 9 O'RIDE -- unit " .. unitName .. " was legally vacated before!", 30)
|
||||||
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
limitedAirframes.pilotDied(theUnit)
|
limitedAirframes.pilotDied(theUnit)
|
||||||
@ -426,8 +459,6 @@ function limitedAirframes.somethingHappened(event)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
trigger.action.outText("limAir: WARNING unhandled: " .. ID .. " for player unit " .. theUnit:getName() .. " of type " .. myType, 30)
|
trigger.action.outText("limAir: WARNING unhandled: " .. ID .. " for player unit " .. theUnit:getName() .. " of type " .. myType, 30)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -474,9 +505,11 @@ function limitedAirframes.handlePlayerLeftUnit(event)
|
|||||||
if theSafeZone.owner then
|
if theSafeZone.owner then
|
||||||
-- owned zone. olny allow in neutral or owned by same side
|
-- owned zone. olny allow in neutral or owned by same side
|
||||||
isSafe = isSafe and (mySide == theSafeZone.owner or theSafeZone.owner == 0)
|
isSafe = isSafe and (mySide == theSafeZone.owner or theSafeZone.owner == 0)
|
||||||
trigger.action.outText("+++: Lim - " .. theSafeZone.name .. " ownership: myside = " .. mySide .. " zone owner is " .. theSafeZone.owner, 30)
|
if limitedAirframes.verbose then
|
||||||
|
trigger.action.outText("+++limA: " .. theSafeZone.name .. " ownership: myside = " .. mySide .. " zone owner is " .. theSafeZone.owner, 30)
|
||||||
|
end
|
||||||
else
|
else
|
||||||
-- trigger.action.outText("+++: Zone " .. theSafeZone.name .. " has no ownership, skipping check", 30)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- check we are at rest below 10m height. agl may give
|
-- check we are at rest below 10m height. agl may give
|
||||||
@ -492,7 +525,9 @@ function limitedAirframes.handlePlayerLeftUnit(event)
|
|||||||
if isInAir then isSafe = false end
|
if isInAir then isSafe = false end
|
||||||
|
|
||||||
if isSafe then
|
if isSafe then
|
||||||
trigger.action.outTextForCoalition(mySide, "limAir: Pilot " .. theUnit:getPlayerName() .. " left unit " .. theUnit:getName() .. " legally in zone " .. theSafeZone.name, 30)
|
-- if limitedAirframes.verbose then
|
||||||
|
trigger.action.outTextForCoalition(mySide, "Pilot " .. theUnit:getPlayerName() .. " left unit " .. theUnit:getName() .. " legally in zone " .. theSafeZone.name, 30)
|
||||||
|
-- end
|
||||||
-- remove from known player planes
|
-- remove from known player planes
|
||||||
-- no more limitedAirframes.removePlayerUnit(theUnit)
|
-- no more limitedAirframes.removePlayerUnit(theUnit)
|
||||||
return;
|
return;
|
||||||
@ -500,7 +535,10 @@ function limitedAirframes.handlePlayerLeftUnit(event)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- ditched outside safe harbour
|
-- ditched outside safe harbour
|
||||||
trigger.action.outTextForCoalition(mySide, "Pilot " .. theUnit:getPlayerName() .. " DITCHED unit " .. theUnit:getName() .. " -- PILOT LOSS (MIA)", 30)
|
-- if limitedAirframes.verbose then
|
||||||
|
trigger.action.outTextForCoalition(mySide, "Pilot " .. theUnit:getPlayerName() .. " DITCHED unit " .. theUnit:getName() .. " -- PILOT is considered MIA", 30)
|
||||||
|
-- end
|
||||||
|
|
||||||
limitedAirframes.pilotLost(theUnit)
|
limitedAirframes.pilotLost(theUnit)
|
||||||
if csarManager and csarManager.airframeDitched then
|
if csarManager and csarManager.airframeDitched then
|
||||||
csarManager.airframeDitched(theUnit)
|
csarManager.airframeDitched(theUnit)
|
||||||
@ -560,19 +598,22 @@ function limitedAirframes.pilotLost(theUnit)
|
|||||||
if limitedAirframes.maxRed < 0 then return false end -- disabled/infinite
|
if limitedAirframes.maxRed < 0 then return false end -- disabled/infinite
|
||||||
|
|
||||||
limitedAirframes.currRed = limitedAirframes.currRed - 1
|
limitedAirframes.currRed = limitedAirframes.currRed - 1
|
||||||
|
-- pass it along
|
||||||
|
cfxZones.setFlagValueMult(limitedAirframes.numRed, limitedAirframes.currRed, limitedAirframes.config)
|
||||||
|
|
||||||
if limitedAirframes.currRed == 0 then
|
if limitedAirframes.currRed == 0 then
|
||||||
trigger.action.outTextForCoalition(theSide, "\nYou have lost almost all of your pilots.\n\nWARNING: Losing any more pilots WILL FAIL THE MISSION\n", 30)
|
trigger.action.outTextForCoalition(theSide, "\nYou have lost almost all of your pilots.\n\nWARNING: Losing any more pilots WILL FAIL THE MISSION\n", 30)
|
||||||
trigger.action.outSoundForCoalition(theSide, "Quest Snare 3.wav")
|
trigger.action.outSoundForCoalition(theSide, limitedAirframes.warningSound)--"Quest Snare 3.wav")
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
if limitedAirframes.currRed < 0 then
|
if limitedAirframes.currRed < 0 then
|
||||||
-- red have lost all airframes
|
-- red have lost all airframes
|
||||||
trigger.action.outText("\nREDFORCE has lost all of their pilots.\n\nBLUEFORCE WINS!\n", 30)
|
trigger.action.outText("\nREDFORCE has lost all of their pilots.\n\nBLUEFORCE WINS!\n", 30)
|
||||||
trigger.action.outSoundForCoalition(theSide, "Death PIANO.wav")
|
trigger.action.outSoundForCoalition(theSide, limitedAirframes.loseSound) --"Death PIANO.wav")
|
||||||
trigger.action.outSoundForCoalition(theOtherSide, "Triumphant Victory.wav")
|
trigger.action.outSoundForCoalition(theOtherSide, limitedAirframes.winSound)--"Triumphant Victory.wav")
|
||||||
trigger.action.setUserFlag(limitedAirframes.blueWinsFlag, 1 )
|
-- trigger.action.setUserFlag(limitedAirframes.blueWinsFlag, 1 )
|
||||||
|
cfxZones.pollFlag(limitedAirframes.blueWinsFlag, limitedAirframes.method, limitedAirframes.config)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -581,20 +622,24 @@ function limitedAirframes.pilotLost(theUnit)
|
|||||||
theOtherSide = 1
|
theOtherSide = 1
|
||||||
if limitedAirframes.maxBlue < 0 then return false end -- disabled/infinite
|
if limitedAirframes.maxBlue < 0 then return false end -- disabled/infinite
|
||||||
limitedAirframes.currBlue = limitedAirframes.currBlue - 1
|
limitedAirframes.currBlue = limitedAirframes.currBlue - 1
|
||||||
|
-- pass it along
|
||||||
|
cfxZones.setFlagValueMult(limitedAirframes.numBlue, limitedAirframes.currBlue, limitedAirframes.config)
|
||||||
|
|
||||||
if limitedAirframes.currBlue == 0 then
|
if limitedAirframes.currBlue == 0 then
|
||||||
trigger.action.outTextForCoalition(theSide, "\nYou have lost almost all of your pilots.\n\nWARNING: Losing any more pilots WILL FAIL THE MISSION\n", 30)
|
trigger.action.outTextForCoalition(theSide, "\nYou have lost almost all of your pilots.\n\nWARNING: Losing any more pilots WILL FAIL THE MISSION\n", 30)
|
||||||
trigger.action.outSoundForCoalition(theSide, "Quest Snare 3.wav")
|
trigger.action.outSoundForCoalition(theSide, limitedAirframes.warningSound)--"Quest Snare 3.wav")
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
if limitedAirframes.currBlue < 0 then
|
if limitedAirframes.currBlue < 0 then
|
||||||
-- red have lost all airframes
|
-- red have lost all airframes
|
||||||
trigger.action.outText("\nBLUEFORCE has lost all of their pilots.\n\nREDFORCE WINS!\n", 30)
|
trigger.action.outText("\nBLUEFORCE has lost all of their pilots.\n\nREDFORCE WINS!\n", 30)
|
||||||
trigger.action.setUserFlag(limitedAirframes.redWinsFlag, 1 )
|
-- trigger.action.setUserFlag(limitedAirframes.redWinsFlag, 1 )
|
||||||
trigger.action.outSoundForCoalition(theSide, "Death PIANO.wav")
|
cfxZones.pollFlag(limitedAirframes.redWinsFlag, limitedAirframes.method, limitedAirframes.config)
|
||||||
trigger.action.outSoundForCoalition(theOtherSide, "Triumphant Victory.wav")
|
trigger.action.outSoundForCoalition(theSide, limitedAirframes.loseSound)--"Death PIANO.wav")
|
||||||
|
trigger.action.outSoundForCoalition(theOtherSide, limitedAirframes.winSound)--"Triumphant Victory.wav")
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
trigger.action.outSoundForCoalition(theSide, "Quest Snare 3.wav")
|
trigger.action.outSoundForCoalition(theSide, limitedAirframes.warningSound)--"Quest Snare 3.wav")
|
||||||
trigger.action.outTextForCoalition(theSide, "You have lost a pilot! Remaining: " .. limitedAirframes.currBlue, 30)
|
trigger.action.outTextForCoalition(theSide, "You have lost a pilot! Remaining: " .. limitedAirframes.currBlue, 30)
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
@ -643,12 +688,31 @@ function limitedAirframes.addSafeZone(aZone)
|
|||||||
|
|
||||||
-- add zone to my list
|
-- add zone to my list
|
||||||
limitedAirframes.safeZones[aZone] = aZone
|
limitedAirframes.safeZones[aZone] = aZone
|
||||||
aZone.redSafe = true
|
|
||||||
aZone.redSafe = cfxZones.getBoolFromZoneProperty(aZone, "redSafe", true)
|
|
||||||
aZone.blueSafe = true
|
|
||||||
aZone.blueSafe = cfxZones.getBoolFromZoneProperty(aZone, "blueSafe", true)
|
|
||||||
|
|
||||||
trigger.action.outText("limAir: added safeZone " .. aZone.name, 30)
|
-- deprecated old code. new code contains 'red, blue' in value for pilotsafe
|
||||||
|
local safeSides = cfxZones.getStringFromZoneProperty(aZone, "pilotsafe", "")
|
||||||
|
safeSides = safeSides:lower()
|
||||||
|
if dcsCommon.containsString(safeSides, "red") or dcsCommon.containsString(safeSides, "blue") then
|
||||||
|
aZone.redSafe = dcsCommon.containsString(safeSides, "red")
|
||||||
|
aZone.blueSafe = dcsCommon.containsString(safeSides, "blue")
|
||||||
|
else
|
||||||
|
--aZone.redSafe = true
|
||||||
|
aZone.redSafe = cfxZones.getBoolFromZoneProperty(aZone, "redSafe", true)
|
||||||
|
--aZone.blueSafe = true
|
||||||
|
aZone.blueSafe = cfxZones.getBoolFromZoneProperty(aZone, "blueSafe", true)
|
||||||
|
end
|
||||||
|
|
||||||
|
if limitedAirframes.verbose or aZone.verbose then
|
||||||
|
if aZone.redSafe then
|
||||||
|
trigger.action.outText("+++limA: <" .. aZone.name .. "> is safe for RED pilots", 30)
|
||||||
|
end
|
||||||
|
if aZone.blueSafe then
|
||||||
|
trigger.action.outText("+++limA: <" .. aZone.name .. "> is safe for BLUE pilots", 30)
|
||||||
|
end
|
||||||
|
|
||||||
|
trigger.action.outText("+++limA: added safeZone " .. aZone.name, 30)
|
||||||
|
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -704,7 +768,7 @@ function limitedAirframes.doAirframeScore(args)
|
|||||||
|
|
||||||
local msg = "\nRED has " .. redRemaining .. " pilots left,\nBLUE has " .. blueRemaining .. " pilots left\n"
|
local msg = "\nRED has " .. redRemaining .. " pilots left,\nBLUE has " .. blueRemaining .. " pilots left\n"
|
||||||
trigger.action.outText(msg, 30, true)
|
trigger.action.outText(msg, 30, true)
|
||||||
trigger.action.outSound("Quest Snare 3.wav")
|
trigger.action.outSound(limitedAirframes.warningSound)--"Quest Snare 3.wav")
|
||||||
end
|
end
|
||||||
|
|
||||||
function limitedAirframes.redirectToggleAirFrames(args)
|
function limitedAirframes.redirectToggleAirFrames(args)
|
||||||
@ -717,23 +781,26 @@ function limitedAirframes.doToggleAirFrames(args)
|
|||||||
local desc = "\n\nPilot Count rule NOW IN EFFECT\n\n"
|
local desc = "\n\nPilot Count rule NOW IN EFFECT\n\n"
|
||||||
|
|
||||||
if limitedAirframes.enabled then
|
if limitedAirframes.enabled then
|
||||||
trigger.action.outSound("Quest Snare 3.wav")
|
trigger.action.outSound(limitedAirframes.warningSound)--"Quest Snare 3.wav")
|
||||||
else
|
else
|
||||||
desc = "\n\nYou cowardly disabled Pilot Count\n\n"
|
desc = "\n\nYou cowardly disabled Pilot Count\n\n"
|
||||||
trigger.action.outSound("Death PIANO.wav")
|
trigger.action.outSound(limitedAirframes.loseSound)--"Death PIANO.wav")
|
||||||
end
|
end
|
||||||
trigger.action.outText(desc, 30)
|
trigger.action.outText(desc, 30)
|
||||||
limitedAirframes.setCommsMenu()
|
limitedAirframes.setCommsMenu()
|
||||||
end
|
end
|
||||||
|
|
||||||
--
|
--
|
||||||
-- CSAR CALLBACK
|
-- CSAR CALLBACK (called by CSAR Manager)
|
||||||
--
|
--
|
||||||
|
|
||||||
function limitedAirframes.pilotsRescued(theCoalition, success, numRescued, notes)
|
function limitedAirframes.pilotsRescued(theCoalition, success, numRescued, notes)
|
||||||
local availablePilots = 0
|
local availablePilots = 0
|
||||||
if theCoalition == 1 then -- red
|
if theCoalition == 1 then -- red
|
||||||
limitedAirframes.currRed = limitedAirframes.currRed + numRescued
|
limitedAirframes.currRed = limitedAirframes.currRed + numRescued
|
||||||
|
-- pass it along
|
||||||
|
cfxZones.setFlagValueMult(limitedAirframes.numRed, limitedAirframes.currRed, limitedAirframes.config)
|
||||||
|
|
||||||
if limitedAirframes.currRed > limitedAirframes.maxRed then
|
if limitedAirframes.currRed > limitedAirframes.maxRed then
|
||||||
limitedAirframes.currRed = limitedAirframes.maxRed
|
limitedAirframes.currRed = limitedAirframes.maxRed
|
||||||
end
|
end
|
||||||
@ -745,6 +812,10 @@ function limitedAirframes.pilotsRescued(theCoalition, success, numRescued, notes
|
|||||||
|
|
||||||
if theCoalition == 2 then -- blue
|
if theCoalition == 2 then -- blue
|
||||||
limitedAirframes.currBlue = limitedAirframes.currBlue + numRescued
|
limitedAirframes.currBlue = limitedAirframes.currBlue + numRescued
|
||||||
|
-- pass it along
|
||||||
|
cfxZones.setFlagValueMult(limitedAirframes.numBlue, limitedAirframes.currBlue, limitedAirframes.config)
|
||||||
|
|
||||||
|
|
||||||
if limitedAirframes.currBlue > limitedAirframes.maxBlue then
|
if limitedAirframes.currBlue > limitedAirframes.maxBlue then
|
||||||
limitedAirframes.currBlue = limitedAirframes.maxBlue
|
limitedAirframes.currBlue = limitedAirframes.maxBlue
|
||||||
end
|
end
|
||||||
@ -754,7 +825,7 @@ function limitedAirframes.pilotsRescued(theCoalition, success, numRescued, notes
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
trigger.action.outTextForCoalition(theCoalition, "\nPilots returned to flight line, you now have " .. availablePilots..".\n", 30)
|
trigger.action.outTextForCoalition(theCoalition, "\nPilots returned to flight line, you now have " .. availablePilots..".\n", 30)
|
||||||
trigger.action.outSoundForCoalition(theCoalition, "Quest Snare 3.wav")
|
trigger.action.outSoundForCoalition(theCoalition, limitedAirframes.warningSound)--"Quest Snare 3.wav")
|
||||||
end
|
end
|
||||||
|
|
||||||
--
|
--
|
||||||
@ -770,6 +841,10 @@ function limitedAirframes.start()
|
|||||||
-- override config settings if defined as zone
|
-- override config settings if defined as zone
|
||||||
limitedAirframes.readConfigZone()
|
limitedAirframes.readConfigZone()
|
||||||
|
|
||||||
|
-- set output flags
|
||||||
|
cfxZones.setFlagValueMult(limitedAirframes.numBlue, limitedAirframes.currBlue, limitedAirframes.config)
|
||||||
|
cfxZones.setFlagValueMult(limitedAirframes.numRed, limitedAirframes.currRed, limitedAirframes.config)
|
||||||
|
|
||||||
-- collect all zones that are airframe safe
|
-- collect all zones that are airframe safe
|
||||||
local afsZones = cfxZones.zonesWithProperty("pilotSafe")
|
local afsZones = cfxZones.zonesWithProperty("pilotSafe")
|
||||||
|
|
||||||
@ -779,6 +854,27 @@ function limitedAirframes.start()
|
|||||||
limitedAirframes.addSafeZone(aZone)
|
limitedAirframes.addSafeZone(aZone)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- check that sides with limited airframes also have at least one
|
||||||
|
-- pilotsafe zone
|
||||||
|
if limitedAirframes.maxRed > 0 then
|
||||||
|
local safeAndSound = false
|
||||||
|
for idx, theZone in pairs(limitedAirframes.safeZones) do
|
||||||
|
if theZone.redSafe then safeAndSound = true end
|
||||||
|
end
|
||||||
|
if not safeAndSound then
|
||||||
|
trigger.action.outText("+++limA: WARNING - RED has no safe zone to change air frames", 30)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if limitedAirframes.maxBlue > 0 then
|
||||||
|
local safeAndSound = false
|
||||||
|
for idx, theZone in pairs(limitedAirframes.safeZones) do
|
||||||
|
if theZone.blueSafe then safeAndSound = true end
|
||||||
|
end
|
||||||
|
if not safeAndSound then
|
||||||
|
trigger.action.outText("+++limA: WARNING - BLUE has no safe zone to change air frames", 30)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- connect player callback
|
-- connect player callback
|
||||||
-- install callbacks for airframe-related events
|
-- install callbacks for airframe-related events
|
||||||
dcsCommon.addEventHandler(limitedAirframes.somethingHappened, limitedAirframes.preProcessor, limitedAirframes.postProcessor)
|
dcsCommon.addEventHandler(limitedAirframes.somethingHappened, limitedAirframes.preProcessor, limitedAirframes.postProcessor)
|
||||||
@ -805,13 +901,13 @@ function limitedAirframes.start()
|
|||||||
-- connect to csarManager if present
|
-- connect to csarManager if present
|
||||||
if csarManager and csarManager.installCallback then
|
if csarManager and csarManager.installCallback then
|
||||||
csarManager.installCallback(limitedAirframes.pilotsRescued)
|
csarManager.installCallback(limitedAirframes.pilotsRescued)
|
||||||
trigger.action.outText("+++lim: connected to csar manager", 30)
|
trigger.action.outText("+++limA: connected to csar manager", 30)
|
||||||
else
|
else
|
||||||
trigger.action.outText("+++lim: NO CSAR integration", 30)
|
trigger.action.outText("+++limA: NO CSAR integration", 30)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- say hi
|
-- say hi
|
||||||
trigger.action.outText("limitedAirframes v" .. limitedAirframes.version .. " started: R:".. limitedAirframes.maxRed .. "/B:" .. limitedAirframes.maxBlue, 30)
|
trigger.action.outText("cf/x Limited Airframes v" .. limitedAirframes.version .. " started: R:".. limitedAirframes.maxRed .. "/B:" .. limitedAirframes.maxBlue, 30)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -825,4 +921,5 @@ end
|
|||||||
--[[--
|
--[[--
|
||||||
safe ditch: check airspeed and altitude. ditch only counts if less than 10m and 2 kts
|
safe ditch: check airspeed and altitude. ditch only counts if less than 10m and 2 kts
|
||||||
report number of airframes left via second instance in switch off menu
|
report number of airframes left via second instance in switch off menu
|
||||||
|
so it can report only one side
|
||||||
--]]--
|
--]]--
|
||||||
@ -1,5 +1,5 @@
|
|||||||
pulseFlags = {}
|
pulseFlags = {}
|
||||||
pulseFlags.version = "1.2.0"
|
pulseFlags.version = "1.2.1"
|
||||||
pulseFlags.verbose = false
|
pulseFlags.verbose = false
|
||||||
pulseFlags.requiredLibs = {
|
pulseFlags.requiredLibs = {
|
||||||
"dcsCommon", -- always
|
"dcsCommon", -- always
|
||||||
@ -29,6 +29,9 @@ pulseFlags.requiredLibs = {
|
|||||||
pulseStopped synonym
|
pulseStopped synonym
|
||||||
- 1.2.0 DML Watchflag integration
|
- 1.2.0 DML Watchflag integration
|
||||||
corrected bug in loading last pulse value for paused
|
corrected bug in loading last pulse value for paused
|
||||||
|
- 1.2.1 pulseInterval synonym for time
|
||||||
|
pulses now supports range
|
||||||
|
zone-local verbosity
|
||||||
|
|
||||||
--]]--
|
--]]--
|
||||||
|
|
||||||
@ -53,11 +56,30 @@ function pulseFlags.createPulseWithZone(theZone)
|
|||||||
|
|
||||||
-- time can be number, or number-number range
|
-- time can be number, or number-number range
|
||||||
theZone.minTime, theZone.time = cfxZones.getPositiveRangeFromZoneProperty(theZone, "time", 1)
|
theZone.minTime, theZone.time = cfxZones.getPositiveRangeFromZoneProperty(theZone, "time", 1)
|
||||||
if pulseFlags.verbose then
|
if cfxZones.hasProperty(theZone, "pulseInterval") then
|
||||||
trigger.action.outText("***PulF: zone <" .. theZone.name .. "> time is <".. theZone.minTime ..", " .. theZone.time .. "!", 30)
|
theZone.minTime, theZone.time = cfxZones.getPositiveRangeFromZoneProperty(theZone, "pulseInterval", 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
if pulseFlags.verbose or theZone.verbose then
|
||||||
|
trigger.action.outText("+++pulF: zone <" .. theZone.name .. "> time is <".. theZone.minTime ..", " .. theZone.time .. "!", 30)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
theZone.pulses = -1 -- set to infinite
|
||||||
|
if cfxZones.hasProperty(theZone, "pulses") then
|
||||||
|
local minP
|
||||||
|
local maxP
|
||||||
|
minP, maxP = cfxZones.getPositiveRangeFromZoneProperty(theZone, "pulses", 1)
|
||||||
|
if minP == maxP then theZone.pulses = minP
|
||||||
|
else
|
||||||
|
theZone.pulses = cfxZones.randomInRange(minP, maxP)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if pulseFlags.verbose or theZone.verbose then
|
||||||
|
trigger.action.outText("+++pulF: zone <" .. theZone.name .. "> set to <" .. theZone.pulses .. "> pulses", 30)
|
||||||
end
|
end
|
||||||
|
|
||||||
theZone.pulses = cfxZones.getNumberFromZoneProperty(theZone, "pulses", -1)
|
|
||||||
theZone.pulsesLeft = 0 -- will start new cycle
|
theZone.pulsesLeft = 0 -- will start new cycle
|
||||||
|
|
||||||
-- watchflag:
|
-- watchflag:
|
||||||
@ -133,7 +155,7 @@ function pulseFlags.doPulse(args)
|
|||||||
-- do a poll on flags
|
-- do a poll on flags
|
||||||
-- first, we only do an initial pulse if zeroPulse is set
|
-- first, we only do an initial pulse if zeroPulse is set
|
||||||
if theZone.hasPulsed or theZone.zeroPulse then
|
if theZone.hasPulsed or theZone.zeroPulse then
|
||||||
if pulseFlags.verbose then
|
if pulseFlags.verbose or theZone.verbose then
|
||||||
trigger.action.outText("+++pulF: will bang " .. theZone.pulseFlag, 30);
|
trigger.action.outText("+++pulF: will bang " .. theZone.pulseFlag, 30);
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -151,8 +173,8 @@ function pulseFlags.doPulse(args)
|
|||||||
--local currVal = cfxZones.getFlagValue(theZone.pulseDoneFlag, theZone)-- trigger.misc.getUserFlag(theZone.pulseDoneFlag)
|
--local currVal = cfxZones.getFlagValue(theZone.pulseDoneFlag, theZone)-- trigger.misc.getUserFlag(theZone.pulseDoneFlag)
|
||||||
cfxZones.pollFlag(theZone.pulseDoneFlag, "inc", theZone) -- trigger.action.setUserFlag(theZone.pulseDoneFlag, currVal + 1)
|
cfxZones.pollFlag(theZone.pulseDoneFlag, "inc", theZone) -- trigger.action.setUserFlag(theZone.pulseDoneFlag, currVal + 1)
|
||||||
end
|
end
|
||||||
if pulseFlags.verbose then
|
if pulseFlags.verbose or theZone.verbose then
|
||||||
trigger.action.outText("***PulF: pulse <" .. theZone.name .. "> ended!", 30)
|
trigger.action.outText("+++pulF: pulse <" .. theZone.name .. "> ended!", 30)
|
||||||
end
|
end
|
||||||
theZone.pulsing = false
|
theZone.pulsing = false
|
||||||
theZone.pulsePaused = true
|
theZone.pulsePaused = true
|
||||||
@ -160,8 +182,8 @@ function pulseFlags.doPulse(args)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if pulseFlags.verbose then
|
if pulseFlags.verbose or theZone.verbose then
|
||||||
trigger.action.outText("***PulF: pulse <" .. theZone.name .. "> delaying zero pulse!", 30)
|
trigger.action.outText("+++pulF: pulse <" .. theZone.name .. "> delaying zero pulse!", 30)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -173,8 +195,8 @@ function pulseFlags.doPulse(args)
|
|||||||
|
|
||||||
-- schedule in delay time
|
-- schedule in delay time
|
||||||
theZone.timerID = timer.scheduleFunction(pulseFlags.doPulse, args, timer.getTime() + delay)
|
theZone.timerID = timer.scheduleFunction(pulseFlags.doPulse, args, timer.getTime() + delay)
|
||||||
if pulseFlags.verbose then
|
if pulseFlags.verbose or theZone.verbose then
|
||||||
trigger.action.outText("+++PulF: pulse <" .. theZone.name .. "> rescheduled in " .. delay, 30)
|
trigger.action.outText("+++pulF: pulse <" .. theZone.name .. "> rescheduled in " .. delay, 30)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -184,8 +206,8 @@ function pulseFlags.startNewPulse(theZone)
|
|||||||
theZone.pulsesLeft = theZone.pulses
|
theZone.pulsesLeft = theZone.pulses
|
||||||
local args = {theZone}
|
local args = {theZone}
|
||||||
theZone.pulsing = true
|
theZone.pulsing = true
|
||||||
if pulseFlags.verbose then
|
if pulseFlags.verbose or theZone.verbose then
|
||||||
trigger.action.outText("+++PulF: starting pulse <" .. theZone.name .. ">", 30)
|
trigger.action.outText("+++pulF: starting pulse <" .. theZone.name .. ">", 30)
|
||||||
end
|
end
|
||||||
pulseFlags.doPulse(args)
|
pulseFlags.doPulse(args)
|
||||||
end
|
end
|
||||||
@ -214,30 +236,16 @@ function pulseFlags.update()
|
|||||||
-- see if we got a pause or activate command
|
-- see if we got a pause or activate command
|
||||||
-- activatePulseFlag
|
-- activatePulseFlag
|
||||||
if cfxZones.testZoneFlag(aZone, aZone.activatePulseFlag, aZone.pulseTriggerMethod, "lastActivateValue") then
|
if cfxZones.testZoneFlag(aZone, aZone.activatePulseFlag, aZone.pulseTriggerMethod, "lastActivateValue") then
|
||||||
if pulseFlags.verbose then
|
if pulseFlags.verbose or aZone.verbose then
|
||||||
trigger.action.outText("+++PulF: activating <" .. aZone.name .. ">", 30)
|
trigger.action.outText("+++pulF: activating <" .. aZone.name .. ">", 30)
|
||||||
end
|
end
|
||||||
aZone.pulsePaused = false -- will start anew
|
aZone.pulsePaused = false -- will start anew
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[-- -- old code
|
|
||||||
if aZone.activatePulseFlag then
|
|
||||||
local currTriggerVal = cfxZones.getFlagValue(aZone.activatePulseFlag, aZone) -- trigger.misc.getUserFlag(aZone.activatePulseFlag)
|
|
||||||
if currTriggerVal ~= aZone.lastActivateValue
|
|
||||||
then
|
|
||||||
if pulseFlags.verbose then
|
|
||||||
trigger.action.outText("+++PulF: activating <" .. aZone.name .. ">", 30)
|
|
||||||
end
|
|
||||||
aZone.lastActivateValue = currTriggerVal
|
|
||||||
aZone.pulsePaused = false -- will start anew
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
--]]--
|
|
||||||
-- pausePulseFlag
|
-- pausePulseFlag
|
||||||
if cfxZones.testZoneFlag(aZone, aZone.pausePulseFlag, aZone.pulseTriggerMethod, "lastPauseValue") then
|
if cfxZones.testZoneFlag(aZone, aZone.pausePulseFlag, aZone.pulseTriggerMethod, "lastPauseValue") then
|
||||||
if pulseFlags.verbose then
|
if pulseFlags.verbose or aZone.verbose then
|
||||||
trigger.action.outText("+++PulF: pausing <" .. aZone.name .. ">", 30)
|
trigger.action.outText("+++pulF: pausing <" .. aZone.name .. ">", 30)
|
||||||
end
|
end
|
||||||
aZone.pulsePaused = true -- prevents new start
|
aZone.pulsePaused = true -- prevents new start
|
||||||
if aZone.timerID then
|
if aZone.timerID then
|
||||||
@ -245,24 +253,7 @@ function pulseFlags.update()
|
|||||||
aZone.timerID = nil
|
aZone.timerID = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
--[[--
|
|
||||||
-- old colde
|
|
||||||
if aZone.pausePulseFlag then
|
|
||||||
local currTriggerVal = cfxZones.getFlagValue(aZone.pausePulseFlag, aZone)-- trigger.misc.getUserFlag(aZone.pausePulseFlag)
|
|
||||||
if currTriggerVal ~= aZone.lastPauseValue
|
|
||||||
then
|
|
||||||
if pulseFlags.verbose then
|
|
||||||
trigger.action.outText("+++PulF: pausing <" .. aZone.name .. ">", 30)
|
|
||||||
end
|
|
||||||
aZone.lastPauseValue = currTriggerVal
|
|
||||||
aZone.pulsePaused = true -- prevents new start
|
|
||||||
if aZone.timerID then
|
|
||||||
timer.removeFunction(aZone.timerID)
|
|
||||||
aZone.timerID = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
--]]--
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -274,7 +265,7 @@ function pulseFlags.readConfigZone()
|
|||||||
local theZone = cfxZones.getZoneByName("pulseFlagsConfig")
|
local theZone = cfxZones.getZoneByName("pulseFlagsConfig")
|
||||||
if not theZone then
|
if not theZone then
|
||||||
if pulseFlags.verbose then
|
if pulseFlags.verbose then
|
||||||
trigger.action.outText("+++PulF: NO config zone!", 30)
|
trigger.action.outText("+++pulF: NO config zone!", 30)
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -282,7 +273,7 @@ function pulseFlags.readConfigZone()
|
|||||||
pulseFlags.verbose = cfxZones.getBoolFromZoneProperty(theZone, "verbose", false)
|
pulseFlags.verbose = cfxZones.getBoolFromZoneProperty(theZone, "verbose", false)
|
||||||
|
|
||||||
if pulseFlags.verbose then
|
if pulseFlags.verbose then
|
||||||
trigger.action.outText("+++PulF: read config", 30)
|
trigger.action.outText("+++pulF: read config", 30)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -302,7 +293,8 @@ function pulseFlags.start()
|
|||||||
|
|
||||||
-- process RND Zones
|
-- process RND Zones
|
||||||
local attrZones = cfxZones.getZonesWithAttributeNamed("pulse")
|
local attrZones = cfxZones.getZonesWithAttributeNamed("pulse")
|
||||||
|
-- local a = dcsCommon.getSizeOfTable(attrZones)
|
||||||
|
-- trigger.action.outText("pulse zones: " .. a, 30)
|
||||||
-- now create a pulse gen for each one and add them
|
-- now create a pulse gen for each one and add them
|
||||||
-- to our watchlist
|
-- to our watchlist
|
||||||
for k, aZone in pairs(attrZones) do
|
for k, aZone in pairs(attrZones) do
|
||||||
@ -310,8 +302,9 @@ function pulseFlags.start()
|
|||||||
pulseFlags.addPulse(aZone) -- remember it so we can pulse it
|
pulseFlags.addPulse(aZone) -- remember it so we can pulse it
|
||||||
end
|
end
|
||||||
|
|
||||||
local attrZones = cfxZones.getZonesWithAttributeNamed("pulse!")
|
attrZones = cfxZones.getZonesWithAttributeNamed("pulse!")
|
||||||
|
a = dcsCommon.getSizeOfTable(attrZones)
|
||||||
|
trigger.action.outText("pulse! zones: " .. a, 30)
|
||||||
-- now create a pulse gen for each one and add them
|
-- now create a pulse gen for each one and add them
|
||||||
-- to our watchlist
|
-- to our watchlist
|
||||||
for k, aZone in pairs(attrZones) do
|
for k, aZone in pairs(attrZones) do
|
||||||
|
|||||||
Binary file not shown.
BIN
tutorial & demo missions/demo - pilots at their limit.miz
Normal file
BIN
tutorial & demo missions/demo - pilots at their limit.miz
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user