mirror of
https://github.com/weyne85/DML.git
synced 2025-10-29 16:57:49 +00:00
158 lines
4.2 KiB
Lua
158 lines
4.2 KiB
Lua
playerZone = {}
|
|
playerZone.version = "1.0.0"
|
|
playerZone.requiredLibs = {
|
|
"dcsCommon", -- always
|
|
"cfxZones", -- Zones, of course
|
|
}
|
|
playerZone.playerZones = {}
|
|
--[[--
|
|
Version History
|
|
1.0.0 - Initial version
|
|
|
|
--]]--
|
|
|
|
function playerZone.createPlayerZone(theZone)
|
|
-- start val - a range
|
|
theZone.pzCoalition = cfxZones.getCoalitionFromZoneProperty(theZone, "playerZone", 0)
|
|
|
|
|
|
-- Method for outputs
|
|
theZone.pzMethod = cfxZones.getStringFromZoneProperty(theZone, "method", "inc")
|
|
if cfxZones.hasProperty(theZone, "pzMethod") then
|
|
theZone.pzMethod = cfxZones.getStringFromZoneProperty(theZone, "pwMethod", "inc")
|
|
end
|
|
|
|
if cfxZones.hasProperty(theZone, "pNum") then
|
|
theZone.pNum = cfxZones.getStringFromZoneProperty(theZone, "pNum", "none")
|
|
end
|
|
|
|
if cfxZones.hasProperty(theZone, "added!") then
|
|
theZone.pAdd = cfxZones.getStringFromZoneProperty(theZone, "added!", "none")
|
|
end
|
|
|
|
if cfxZones.hasProperty(theZone, "gone!") then
|
|
theZone.pRemove = cfxZones.getStringFromZoneProperty(theZone, "gone!", "none")
|
|
end
|
|
|
|
theZone.playersInZone = {} -- indexed by unit name
|
|
end
|
|
|
|
|
|
function playerZone.collectPlayersForZone(theZone)
|
|
local factions = {0, 1, 2}
|
|
local zonePlayers = {}
|
|
for idx, f in pairs (factions) do
|
|
if theZone.pzCoalition == 0 or f == theZone.pzCoalition then
|
|
local allPlayers = coalition.getPlayers(f)
|
|
for idy, theUnit in pairs (allPlayers) do
|
|
local loc = theUnit:getPoint()
|
|
if cfxZones.pointInZone(loc, theZone) then
|
|
zonePlayers[theUnit:getName()] = theUnit
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return zonePlayers
|
|
end
|
|
|
|
function playerZone.processZone(theZone)
|
|
local nowInZone = playerZone.collectPlayersForZone(theZone)
|
|
-- find new players in zone
|
|
local hasNew = false
|
|
local newCount = 0
|
|
for name, theUnit in pairs(nowInZone) do
|
|
if not theZone.playersInZone[name] then
|
|
-- this unit was not here last time
|
|
hasNew = true
|
|
if playerZone.verbose or theZone.verbose then
|
|
trigger.action.outText("+++pZone: new player unit <" .. name .. "> in zone <" .. theZone.name .. ">", 30)
|
|
end
|
|
end
|
|
newCount = newCount + 1
|
|
end
|
|
-- find if players have left the zone
|
|
local hasGone = false
|
|
for name, theUnit in pairs(theZone.playersInZone) do
|
|
if not nowInZone[name] then
|
|
hasGone = true
|
|
if playerZone.verbose or theZone.verbose then
|
|
trigger.action.outText("+++pZone: player unit <" .. name .. "> disappeared from <" .. theZone.name .. ">", 30)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- flag handling and banging
|
|
if theZone.pNum then
|
|
cfxZones.setFlagValueMult(theZone.pNum, newCount, theZone)
|
|
end
|
|
|
|
if theZone.pAdd and hasNew then
|
|
if theZone.verbose or playerZone.verbose then
|
|
trigger.action.outText("+++pZone: banging <" .. theZone.name .. ">'s 'added!' flags <" .. theZone.pAdd .. ">", 30)
|
|
end
|
|
cfxZones.pollFlag(theZone.pAdd, theZone.pzMethod, theZone)
|
|
end
|
|
|
|
if theZone.pRemove and hasGone then
|
|
if theZone.verbose or playerZone.verbose then
|
|
trigger.action.outText("+++pZone: banging <" .. theZone.name .. ">'s 'gone' flags <" .. theZone.pRemove .. ">", 30)
|
|
end
|
|
cfxZones.pollFlag(theZone.pAdd, theZone.pzMethod, theZone)
|
|
end
|
|
end
|
|
|
|
--
|
|
-- Update
|
|
--
|
|
function playerZone.update()
|
|
-- re-invoke in 1 second
|
|
timer.scheduleFunction(playerZone.update, {}, timer.getTime() + 1)
|
|
|
|
-- iterate all zones and check them
|
|
for idx, theZone in pairs(playerZone.playerZones) do
|
|
playerZone.processZone(theZone)
|
|
end
|
|
end
|
|
|
|
--
|
|
-- Read Config Zone
|
|
--
|
|
function playerZone.readConfigZone(theZone)
|
|
-- currently nothing to do
|
|
end
|
|
|
|
--
|
|
-- Start
|
|
--
|
|
function playerZone.start()
|
|
if not dcsCommon.libCheck("cfx Player Zone",
|
|
playerZone.requiredLibs)
|
|
then return false end
|
|
|
|
local theZone = cfxZones.getZoneByName("playerZoneConfig")
|
|
if not theZone then
|
|
theZone = cfxZones.createSimpleZone("playerZoneConfig")
|
|
end
|
|
playerZone.readConfigZone(theZone)
|
|
|
|
local pZones = cfxZones.zonesWithProperty("playerZone")
|
|
for k, aZone in pairs(pZones) do
|
|
playerZone.createPlayerZone(aZone)
|
|
playerZone.playerZones[aZone.name] = aZone
|
|
end
|
|
|
|
-- start update cycle
|
|
playerZone.update()
|
|
return true
|
|
end
|
|
|
|
if not playerZone.start() then
|
|
trigger.action.outText("+++ aborted playerZone v" .. playerZone.version .. " -- start failed", 30)
|
|
playerZone = nil
|
|
end
|
|
|
|
--[[--
|
|
additional features:
|
|
- filter by type
|
|
- filter by cat
|
|
--]]-- |