Version 0.98

messenger module
bottled messages demo
frog men training demo
This commit is contained in:
Christian Franz 2022-02-17 17:49:24 +01:00
parent eeeb4c0567
commit d69ce05d80
11 changed files with 275 additions and 124 deletions

Binary file not shown.

View File

@ -1,5 +1,5 @@
cfxOwnedZones = {} cfxOwnedZones = {}
cfxOwnedZones.version = "1.1.1" cfxOwnedZones.version = "1.1.2"
cfxOwnedZones.verbose = false cfxOwnedZones.verbose = false
cfxOwnedZones.announcer = true cfxOwnedZones.announcer = true
--[[-- VERSION HISTORY --[[-- VERSION HISTORY
@ -40,6 +40,7 @@ cfxOwnedZones.announcer = true
shocked state shocked state
- announcer - announcer
1.1.1 - conq+1 flag 1.1.1 - conq+1 flag
1.1.2 - corrected type bug in zoneConquered
--]]-- --]]--
cfxOwnedZones.requiredLibs = { cfxOwnedZones.requiredLibs = {
@ -497,7 +498,7 @@ function cfxOwnedZones.zoneConquered(aZone, theSide, formerOwner) -- 0 = neutral
-- increase conq flag -- increase conq flag
if aZone.conqueredFlag then if aZone.conqueredFlag then
local lastVal = trigger.misc.getUserFlag(aZone.conqueredFlag) local lastVal = trigger.misc.getUserFlag(aZone.conqueredFlag)
trigger.action.setUserFlag)aZone.conqueredFlag, lastVal + 1) trigger.action.setUserFlag(aZone.conqueredFlag, lastVal + 1)
end end
-- invoke callbacks now -- invoke callbacks now
cfxOwnedZones.invokeConqueredCallbacks(aZone, theSide, formerOwner) cfxOwnedZones.invokeConqueredCallbacks(aZone, theSide, formerOwner)

View File

@ -35,6 +35,7 @@ Version History
and interator and interator
- reUseAfter option for single-use - reUseAfter option for single-use
- dcsCommon, cfxZones import - dcsCommon, cfxZones import
2.0.1 - stricter verbosity: moved more comments to verbose only
WHAT IT IS WHAT IT IS
SSB Client is a small script that forms the client-side counterpart to SSB Client is a small script that forms the client-side counterpart to
@ -124,37 +125,7 @@ function cfxSSBClient.bindGroupToAirfield(groupName, airfieldName)
if not airfieldName then airfieldName = "<NIL>" end if not airfieldName then airfieldName = "<NIL>" end
trigger.action.outText("+++SSB: Binding Group " .. groupName .. " to " .. airfieldName .. " failed.", 30) trigger.action.outText("+++SSB: Binding Group " .. groupName .. " to " .. airfieldName .. " failed.", 30)
end end
--[[--
function cfxSSBClient.dist(point1, point2) -- returns distance between two points
local x = point1.x - point2.x
local y = point1.y - point2.y
local z = point1.z - point2.z
return (x*x + y*y + z*z)^0.5
end
--]]--
-- see if instring conatins what, defaults to case insensitive
--[[--
function cfxSSBClient.containsString(inString, what, caseSensitive)
if (not caseSensitive) then
inString = string.upper(inString)
what = string.upper(what)
end
return string.find(inString, what)
end
--]]--
--[[--
function cfxSSBClient.arrayContainsString(theArray, theString)
-- warning: case sensitive!
if not theArray then return false end
if not theString then return false end
for i = 1, #theArray do
if theArray[i] == theString then return true end
end
return false
end
--]]--
function cfxSSBClient.getClosestAirbaseTo(thePoint) function cfxSSBClient.getClosestAirbaseTo(thePoint)
local delta = math.huge local delta = math.huge
@ -256,7 +227,9 @@ function cfxSSBClient.openSlotForCrashedGroupNamed(gName)
if not pGroup then return end if not pGroup then return end
cfxSSBClient.crashedGroups[gName] = nil -- set to nil to forget this happened cfxSSBClient.crashedGroups[gName] = nil -- set to nil to forget this happened
cfxSSBClient.setSlotAccessForGroup(pGroup) -- set by current occupation status cfxSSBClient.setSlotAccessForGroup(pGroup) -- set by current occupation status
trigger.action.outText("+++SSBC:SU: re-opened slot for group <" .. gName .. ">", 30) if cfxSSBClient.verbose then
trigger.action.outText("+++SSBC:SU: re-opened slot for group <" .. gName .. ">", 30)
end
end end
function cfxSSBClient:onEvent(event) function cfxSSBClient:onEvent(event)
@ -282,7 +255,9 @@ function cfxSSBClient:onEvent(event)
-- remember this unit as player controlled plane -- remember this unit as player controlled plane
-- because player and plane can easily disconnect -- because player and plane can easily disconnect
cfxSSBClient.playerPlanes[uName] = playerName cfxSSBClient.playerPlanes[uName] = playerName
trigger.action.outText("+++SSBC:SU: noted " .. playerName .. " piloting player unit " .. uName, 30) if cfxSSBClient.verbose then
trigger.action.outText("+++SSBC:SU: noted " .. playerName .. " piloting player unit " .. uName, 30)
end
return return
end end
@ -298,7 +273,9 @@ function cfxSSBClient:onEvent(event)
local thePilot = cfxSSBClient.playerPlanes[uName] local thePilot = cfxSSBClient.playerPlanes[uName]
if not thePilot then if not thePilot then
-- ignore. not a player plane -- ignore. not a player plane
trigger.action.outText("+++SSBC:SU: ignored crash for NPC unit <" .. uName .. ">", 30) if cfxSSBClient.verbose then
trigger.action.outText("+++SSBC:SU: ignored crash for NPC unit <" .. uName .. ">", 30)
end
return return
end end
-- if we get here, a player-owned plane has crashed -- if we get here, a player-owned plane has crashed

View File

@ -1,5 +1,5 @@
cloneZones = {} cloneZones = {}
cloneZones.version = "1.1.0" cloneZones.version = "1.1.1"
cloneZones.verbose = false cloneZones.verbose = false
cloneZones.requiredLibs = { cloneZones.requiredLibs = {
"dcsCommon", -- always "dcsCommon", -- always
@ -17,6 +17,7 @@ cloneZones.cloners = {}
1.0.1 - preWipe attribute 1.0.1 - preWipe attribute
1.1.0 - support for static objects 1.1.0 - support for static objects
- despawn? attribute - despawn? attribute
1.1.1 - despawnAll: isExist guard
--]]-- --]]--
@ -100,6 +101,11 @@ function cloneZones.createClonerWithZone(theZone) -- has "Cloner"
theZone.lastSpawnValue = trigger.misc.getUserFlag(theZone.spawnFlag) -- save last value theZone.lastSpawnValue = trigger.misc.getUserFlag(theZone.spawnFlag) -- save last value
end end
if cfxZones.hasProperty(theZone, "in?") then
theZone.spawnFlag = cfxZones.getStringFromZoneProperty(theZone, "in?", "none")
theZone.lastSpawnValue = trigger.misc.getUserFlag(theZone.spawnFlag) -- save last value
end
if cfxZones.hasProperty(theZone, "spawn?") then if cfxZones.hasProperty(theZone, "spawn?") then
theZone.spawnFlag = cfxZones.getStringFromZoneProperty(theZone, "spawn?", "none") theZone.spawnFlag = cfxZones.getStringFromZoneProperty(theZone, "spawn?", "none")
theZone.lastSpawnValue = trigger.misc.getUserFlag(theZone.spawnFlag) -- save last value theZone.lastSpawnValue = trigger.misc.getUserFlag(theZone.spawnFlag) -- save last value
@ -142,13 +148,17 @@ function cloneZones.despawnAll(theZone)
trigger.action.outText("wiping <" .. theZone.name .. ">", 30) trigger.action.outText("wiping <" .. theZone.name .. ">", 30)
end end
for idx, aGroup in pairs(theZone.mySpawns) do for idx, aGroup in pairs(theZone.mySpawns) do
Group.destroy(aGroup) if aGroup:isExist() then
Group.destroy(aGroup)
end
end end
for idx, aStatic in pairs(theZone.myStatics) do for idx, aStatic in pairs(theZone.myStatics) do
-- warning! may be mismatch because we are looking at groups -- warning! may be mismatch because we are looking at groups
-- not objects. let's see -- not objects. let's see
trigger.action.outText("Destroying static <" .. aStatic:getName() .. ">", 30) if aStatic:isExist() then
Object.destroy(aStatic) -- we don't aStatio:destroy() to find out what it is trigger.action.outText("Destroying static <" .. aStatic:getName() .. ">", 30)
Object.destroy(aStatic) -- we don't aStatio:destroy() to find out what it is
end
end end
theZone.mySpawns = {} theZone.mySpawns = {}
theZone.myStatics = {} theZone.myStatics = {}

View File

@ -1,5 +1,5 @@
countDown = {} countDown = {}
countDown.version = "1.0.0" countDown.version = "1.1.0"
countDown.verbose = true countDown.verbose = true
countDown.requiredLibs = { countDown.requiredLibs = {
"dcsCommon", -- always "dcsCommon", -- always
@ -12,11 +12,14 @@ countDown.requiredLibs = {
Version History Version History
1.0.0 - initial version 1.0.0 - initial version
1.1.0 - Lua interface: callbacks
- corrected verbose (erroneously always suppressed)
- triggerFlag --> triggerCountFlag
--]]-- --]]--
countDown.counters = {} countDown.counters = {}
countDown.callbacks = {}
-- --
-- add/remove zones -- add/remove zones
@ -36,6 +39,27 @@ function countDown.getCountDownZoneByName(aName)
return nil return nil
end end
--
-- callbacks
--
function countDown.addCallback(theCallback)
if not theCallback then return end
table.insert(countDown.callbacks, theCallback)
end
function countDown.invokeCallbacks(theZone, val, tminus, zero, belowZero, looping)
if not val then val = 1 end
if not tminus then tminus = false end
if not zero then zero = false end
if not belowZero then belowZero = false end
-- invoke anyone who wants to know that a group
-- of people was rescued.
for idx, cb in pairs(csarManager.csarCompleteCB) do
cb(theZone, val, tminus, zero, belowZero, looping)
end
end
-- --
-- read attributes -- read attributes
-- --
@ -60,17 +84,17 @@ function countDown.createCountDownWithZone(theZone)
-- trigger flag "count" / "start?" -- trigger flag "count" / "start?"
if cfxZones.hasProperty(theZone, "count?") then if cfxZones.hasProperty(theZone, "count?") then
theZone.triggerFlag = cfxZones.getStringFromZoneProperty(theZone, "count?", "none") theZone.triggerCountFlag = cfxZones.getStringFromZoneProperty(theZone, "count?", "none")
end end
-- can also use in? for counting. we always use triggerflag -- can also use in? for counting. we always use triggerCountFlag
if cfxZones.hasProperty(theZone, "in?") then if cfxZones.hasProperty(theZone, "in?") then
theZone.triggerFlag = cfxZones.getStringFromZoneProperty(theZone, "in?", "none") theZone.triggerCountFlag = cfxZones.getStringFromZoneProperty(theZone, "in?", "none")
end end
if theZone.triggerFlag then if theZone.triggerCountFlag then
theZone.lastTriggerValue = trigger.misc.getUserFlag(theZone.triggerFlag) -- save last value theZone.lastTriggerValue = trigger.misc.getUserFlag(theZone.triggerCountFlag) -- save last value
end end
-- zero! bang -- zero! bang
@ -95,14 +119,19 @@ end
function countDown.isTriggered(theZone) function countDown.isTriggered(theZone)
-- this module has triggered -- this module has triggered
local val = theZone.currVal - 1 -- decrease counter local val = theZone.currVal - 1 -- decrease counter
if theZone.verbose then if countDown.verbose then
trigger.action.outText("+++cntD: enter triggered: val now: " .. val, 30) trigger.action.outText("+++cntD: enter triggered: val now: " .. val, 30)
end end
if val > 0 then local tMinus = false
local zero = false
local belowZero = false
local looping = false
if val > 0 then
tMinus = true
-- see if we need to bang Tminus -- see if we need to bang Tminus
if theZone.tMinusFlag then if theZone.tMinusFlag then
if theZone.verbose then if countDown.verbose then
trigger.action.outText("+++cntD: TMINUTS", 30) trigger.action.outText("+++cntD: TMINUTS", 30)
end end
cfxZones.pollFlag(theZone.tMinusFlag, theZone.method) cfxZones.pollFlag(theZone.tMinusFlag, theZone.method)
@ -110,8 +139,9 @@ function countDown.isTriggered(theZone)
elseif val == 0 then elseif val == 0 then
-- reached zero -- reached zero
zero = true
if theZone.zeroFlag then if theZone.zeroFlag then
if theZone.verbose then if countDown.verbose then
trigger.action.outText("+++cntD: ZERO", 30) trigger.action.outText("+++cntD: ZERO", 30)
end end
cfxZones.pollFlag(theZone.zeroFlag, theZone.method) cfxZones.pollFlag(theZone.zeroFlag, theZone.method)
@ -119,7 +149,8 @@ function countDown.isTriggered(theZone)
if theZone.loop then if theZone.loop then
-- restart time -- restart time
if theZone.verbose then looping = true
if countDown.verbose then
trigger.action.outText("+++cntD: Looping", 30) trigger.action.outText("+++cntD: Looping", 30)
end end
val = dcsCommon.randomBetween(theZone.startMinVal, theZone.startMaxVal) val = dcsCommon.randomBetween(theZone.startMinVal, theZone.startMaxVal)
@ -127,8 +158,9 @@ function countDown.isTriggered(theZone)
else else
-- below zero -- below zero
belowZero = true
if theZone.belowZero and theZone.zeroFlag then if theZone.belowZero and theZone.zeroFlag then
if theZone.verbose then if countDown.verbose then
trigger.action.outText("+++cntD: Below Zero", 30) trigger.action.outText("+++cntD: Below Zero", 30)
end end
cfxZones.pollFlag(theZone.zeroFlag, theZone.method) cfxZones.pollFlag(theZone.zeroFlag, theZone.method)
@ -136,6 +168,10 @@ function countDown.isTriggered(theZone)
end end
-- callbacks
countDown.invokeCallbacks(theZone, val, tMinus, zero, belowZero, looping)
-- update & return
theZone.currVal = val theZone.currVal = val
end end
@ -146,15 +182,15 @@ function countDown.update()
for idx, aZone in pairs(countDown.counters) do for idx, aZone in pairs(countDown.counters) do
-- make sure to re-start before reading time limit -- make sure to re-start before reading time limit
if aZone.triggerFlag then if aZone.triggerCountFlag then
local currTriggerVal = trigger.misc.getUserFlag(aZone.triggerFlag) local currTriggerVal = trigger.misc.getUserFlag(aZone.triggerCountFlag)
if currTriggerVal ~= aZone.lastTriggerValue if currTriggerVal ~= aZone.lastTriggerValue
then then
if aZone.verbose then if countDown.verbose then
trigger.action.outText("+++cntD: triggered on in?", 30) trigger.action.outText("+++cntD: triggered on in?", 30)
end end
countDown.isTriggered(aZone) countDown.isTriggered(aZone)
aZone.lastTriggerValue = trigger.misc.getUserFlag(aZone.triggerFlag) -- save last value aZone.lastTriggerValue = trigger.misc.getUserFlag(aZone.triggerCountFlag) -- save last value
end end
end end
end end

View File

@ -1,5 +1,5 @@
delayFlag = {} delayFlag = {}
delayFlag.version = "1.0.0" delayFlag.version = "1.0.2"
delayFlag.verbose = false delayFlag.verbose = false
delayFlag.requiredLibs = { delayFlag.requiredLibs = {
"dcsCommon", -- always "dcsCommon", -- always
@ -19,6 +19,8 @@ delayFlag.flags = {}
1.0.2 - slight spelling correction 1.0.2 - slight spelling correction
- using cfxZones for polling - using cfxZones for polling
- removed pollFlag - removed pollFlag
1.0.3 - bug fix for config zone name
- removed message attribute, moved to own module
--]]-- --]]--
@ -89,47 +91,6 @@ function delayFlag.createTimerWithZone(theZone)
end end
--
-- do the pulling
--
--[[--
function delayFlag.pollFlag(theFlag, method)
if delayFlag.verbose then
trigger.action.outText("+++dlyF: polling flag " .. theFlag .. " with " .. method, 30)
end
method = method:lower()
local currVal = trigger.misc.getUserFlag(theFlag)
if method == "inc" or method == "f+1" then
trigger.action.setUserFlag(theFlag, currVal + 1)
elseif method == "dec" or method == "f-1" then
trigger.action.setUserFlag(theFlag, currVal - 1)
elseif method == "off" or method == "f=0" then
trigger.action.setUserFlag(theFlag, 0)
elseif method == "flip" or method == "xor" then
if currVal ~= 0 then
trigger.action.setUserFlag(theFlag, 0)
else
trigger.action.setUserFlag(theFlag, 1)
end
else
if method ~= "on" and method ~= "f=1" then
trigger.action.outText("+++dlyF: unknown method <" .. method .. "> - using 'on'", 30)
end
-- default: on.
trigger.action.setUserFlag(theFlag, 1)
end
local newVal = trigger.misc.getUserFlag(theFlag)
if delayFlag.verbose then
trigger.action.outText("+++dlyF flag <" .. theFlag .. "> changed from " .. currVal .. " to " .. newVal, 30)
end
end
--]]--
-- --
-- update -- update
-- --
@ -204,7 +165,7 @@ end
-- START -- START
-- --
function delayFlag.readConfigZone() function delayFlag.readConfigZone()
local theZone = cfxZones.getZoneByName("cloneZonesConfig") local theZone = cfxZones.getZoneByName("delayZonesConfig")
if not theZone then if not theZone then
if delayFlag.verbose then if delayFlag.verbose then
trigger.action.outText("+++dlyF: NO config zone!", 30) trigger.action.outText("+++dlyF: NO config zone!", 30)

156
modules/messenger.lua Normal file
View File

@ -0,0 +1,156 @@
messenger = {}
messenger.version = "1.0.0"
messenger.verbose = false
messenger.requiredLibs = {
"dcsCommon", -- always
"cfxZones", -- Zones, of course
}
messenger.messengers = {}
--[[--
Version History
1.0.0 - initial version
--]]--
function messenger.addMessenger(theZone)
table.insert(messenger.messengers, theZone)
end
function messenger.getMessengerByName(aName)
for idx, aZone in pairs(messenger.messengers) do
if aName == aZone.name then return aZone end
end
if messenger.verbose then
trigger.action.outText("+++msgr: no messenger with name <" .. aName ..">", 30)
end
return nil
end
--
-- read attributes
--
function messenger.createMessengerDownWithZone(theZone)
-- start val - a range
theZone.message = cfxZones.getStringFromZoneProperty(theZone, "message", "")
theZone.spaceBefore = cfxZones.getBoolFromZoneProperty(theZone, "spaceBefore", false)
theZone.spaceAfter = cfxZones.getBoolFromZoneProperty(theZone, "spaceAfter", false)
theZone.soundFile = cfxZones.getStringFromZoneProperty(theZone, "soundFile", "<none>")
-- alternate version: messages: list of messages, need string parser first
theZone.duration = cfxZones.getNumberFromZoneProperty(theZone, "duration", 30)
-- trigger flag "count" / "start?"
if cfxZones.hasProperty(theZone, "f?") then
theZone.triggerMessagerFlag = cfxZones.getStringFromZoneProperty(theZone, "f?", "none")
end
-- can also use in? for counting. we always use triggerMessagerFlag
if cfxZones.hasProperty(theZone, "in?") then
theZone.triggerMessagerFlag = cfxZones.getStringFromZoneProperty(theZone, "in?", "none")
end
if theZone.triggerMessagerFlag then
theZone.lastMessageTriggerValue = trigger.misc.getUserFlag(theZone.triggerMessagerFlag) -- save last value
end
if cfxZones.hasProperty(theZone, "coalition") then
theZone.coalition = cfxZones.getCoalitionFromZoneProperty(theZone, "coalition", 0)
end
end
--
-- Update
--
function messenger.isTriggered(theZone)
-- this module has triggered
local fileName = "l10n/DEFAULT/" .. theZone.soundFile
local msg = theZone.message
if theZone.spaceBefore then msg = "\n"..msg end
if theZone.spaceAfter then msg = msg .. "\n" end
if theZone.coalition then
trigger.action.outTextForCoalition(theZone.coalition, msg, theZone.duration)
trigger.action.outSoundForCoalition(theZone.coalition, fileName)
else
-- out to all
trigger.action.outText(msg, theZone.duration)
trigger.action.outSound(fileName)
end
end
function messenger.update()
-- call me in a second to poll triggers
timer.scheduleFunction(messenger.update, {}, timer.getTime() + 1)
for idx, aZone in pairs(messenger.messengers) do
-- make sure to re-start before reading time limit
if aZone.triggerMessagerFlag then
local currTriggerVal = trigger.misc.getUserFlag(aZone.triggerMessagerFlag)
if currTriggerVal ~= aZone.lastMessageTriggerValue
then
if messenger.verbose then
trigger.action.outText("+++msgr: triggered on in?", 30)
end
messenger.isTriggered(aZone)
aZone.lastMessageTriggerValue = trigger.misc.getUserFlag(aZone.triggerMessagerFlag) -- save last value
end
end
end
end
--
-- Config & Start
--
function messenger.readConfigZone()
local theZone = cfxZones.getZoneByName("messengerConfig")
if not theZone then
if messenger.verbose then
trigger.action.outText("+++msgr: NO config zone!", 30)
end
return
end
messenger.verbose = cfxZones.getBoolFromZoneProperty(theZone, "verbose", false)
if messenger.verbose then
trigger.action.outText("+++msgr: read config", 30)
end
end
function messenger.start()
-- lib check
if not dcsCommon.libCheck then
trigger.action.outText("cfx Count Down requires dcsCommon", 30)
return false
end
if not dcsCommon.libCheck("cfx Count Down", messenger.requiredLibs) then
return false
end
-- read config
messenger.readConfigZone()
-- process cloner Zones
local attrZones = cfxZones.getZonesWithAttributeNamed("messenger")
for k, aZone in pairs(attrZones) do
messenger.createMessengerDownWithZone(aZone) -- process attributes
messenger.addMessenger(aZone) -- add to list
end
-- start update
messenger.update()
trigger.action.outText("cfx Messenger v" .. messenger.version .. " started.", 30)
return true
end
-- let's go!
if not messenger.start() then
trigger.action.outText("cfx Messenger aborted: missing libraries", 30)
messenger = nil
end

View File

@ -1,5 +1,5 @@
nameStats = {} nameStats = {}
nameStats.version = "1.1.0" nameStats.version = "1.1.1"
--[[-- --[[--
package that allows generic and global access to data, stored by package that allows generic and global access to data, stored by
name and path. Can be used to manage score, cargo, statistics etc. name and path. Can be used to manage score, cargo, statistics etc.

View File

@ -1,5 +1,5 @@
pulseFlags = {} pulseFlags = {}
pulseFlags.version = "1.0.1" pulseFlags.version = "1.0.2"
pulseFlags.verbose = false pulseFlags.verbose = false
pulseFlags.requiredLibs = { pulseFlags.requiredLibs = {
"dcsCommon", -- always "dcsCommon", -- always
@ -13,6 +13,7 @@ pulseFlags.requiredLibs = {
Version History Version History
- 1.0.0 Initial version - 1.0.0 Initial version
- 1.0.1 pause behavior debugged - 1.0.1 pause behavior debugged
- 1.0.2 zero pulse optional initial pulse suppress
--]]-- --]]--
@ -60,7 +61,8 @@ function pulseFlags.createPulseWithZone(theZone)
end end
theZone.pulsing = false -- not running theZone.pulsing = false -- not running
theZone.hasPulsed = false
theZone.zeroPulse = cfxZones.getBoolFromZoneProperty(theZone, "zeroPulse", true)
end end
-- --
@ -114,31 +116,39 @@ function pulseFlags.doPulse(args)
end end
-- do a poll on flags -- do a poll on flags
pulseFlags.pollFlag(theZone.flag, theZone.method) -- first, we only do an initial pulse if zeroPulse is set
if theZone.hasPulsed or theZone.zeroPulse then
pulseFlags.pollFlag(theZone.flag, theZone.method)
-- decrease count -- decrease count
if theZone.pulses > 0 then if theZone.pulses > 0 then
-- only do this if ending -- only do this if ending
theZone.pulsesLeft = theZone.pulsesLeft - 1 theZone.pulsesLeft = theZone.pulsesLeft - 1
-- see if we are done -- see if we are done
if theZone.pulsesLeft < 1 then if theZone.pulsesLeft < 1 then
-- increment done flag if set -- increment done flag if set
if theZone.doneFlag then if theZone.doneFlag then
local currVal = trigger.misc.getUserFlag(theZone.doneFlag) local currVal = trigger.misc.getUserFlag(theZone.doneFlag)
trigger.action.setUserFlag(theZone.doneFlag, currVal + 1) trigger.action.setUserFlag(theZone.doneFlag, currVal + 1)
end
if pulseFlags.verbose then
trigger.action.outText("***PulF: pulse <" .. theZone.name .. "> ended!", 30)
end
theZone.pulsing = false
theZone.paused = true
return
end end
if pulseFlags.verbose then end
trigger.action.outText("***PulF: pulse <" .. theZone.name .. "> ended!", 30) else
end if pulseFlags.verbose then
theZone.pulsing = false trigger.action.outText("***PulF: pulse <" .. theZone.name .. "> delaying zero pulse!", 30)
theZone.paused = true
return
end end
end end
-- if we get here, we'll do another one soon theZone.hasPulsed = true -- we are past initial pulse
-- refresh pulse
-- if we get here, schedule next pulse
local delay = theZone.time local delay = theZone.time
if theZone.minTime > 0 and theZone.minTime < delay then if theZone.minTime > 0 and theZone.minTime < delay then
-- we want a randomized from time from minTime .. delay -- we want a randomized from time from minTime .. delay

Binary file not shown.