From 84452da00b8b3dfd4275483aacefe8d7c765d7ea Mon Sep 17 00:00:00 2001 From: Ciaran Fisher Date: Tue, 19 Apr 2016 21:25:33 +0100 Subject: [PATCH] Added Waypoint zones Needs further testing --- CTLD.lua | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++--- README.md | 49 ++++++++++++++- 2 files changed, 217 insertions(+), 9 deletions(-) diff --git a/CTLD.lua b/CTLD.lua index 9418c6d..4d0c080 100644 --- a/CTLD.lua +++ b/CTLD.lua @@ -13,10 +13,9 @@ Contributors: - Steggles - https://github.com/Bob7heBuilder - Version: 1.60 - 20/03/2015 - - Added ability to disable hover pickup and instead load crates with F10 - - Added new function - ctld.removeExtractZone to stop an extract zone after a while - - Added ability to limit the number of AA systems that can be built and active at one time + Version: 1.61 - 19/04/2015 + - Added ability to add Waypoint zones + -- Troops dropped in a waypoint zone will automatically head to the center of the zone ]] @@ -124,7 +123,7 @@ ctld.JTAC_location = true -- shows location of target in JTAC message ctld.JTAC_lock = "all" -- "vehicle" OR "troop" OR "all" forces JTAC to only lock vehicles or troops or all ground units --- ***************** Pickup and dropoff zones ***************** +-- ***************** Pickup, dropoff and waypoint zones ***************** -- Available colors (anything else like "none" disables smoke): "green", "red", "white", "orange", "blue", "none", @@ -185,6 +184,21 @@ ctld.dropOffZones = { } +--wpZones = { "Zone name", "smoke color", "ACTIVE (yes/no)", "side (0 = Both sides / 1 = Red / 2 = Blue )", } +ctld.wpZones = { + { "wpzone1", "green","yes", 2 }, + { "wpzone2", "blue","yes", 2 }, + { "wpzone3", "orange","yes", 2 }, + { "wpzone4", "none","yes", 2 }, + { "wpzone5", "none","yes", 1 }, + { "wpzone6", "none","yes", 1 }, + { "wpzone7", "none","yes", 1 }, + { "wpzone8", "none","yes", 1 }, + { "wpzone9", "none","yes", 1 }, + { "wpzone10", "none","no", 1 }, +} + + -- ******************** Transports names ********************** -- Use any of the predefined names or set your own ones @@ -943,7 +957,6 @@ function ctld.deactivatePickupZone(_zoneName) end end - -- Change the remaining groups currently available for pickup at a zone -- e.g. ctld.changeRemainingGroupsForPickupZone("pickup1", 5) -- adds 5 groups -- ctld.changeRemainingGroupsForPickupZone("pickup1", -3) -- remove 3 groups @@ -976,6 +989,77 @@ function ctld.changeRemainingGroupsForPickupZone(_zoneName, _amount) end +-- Activates a Waypoint zone +-- Activates a Waypoint zone when called from a trigger +-- EG: ctld.activateWaypointZone("pickzone3") +-- This means that troops dropped within the radius of the zone will head to the center +-- of the zone instead of searching for troops +function ctld.activateWaypointZone(_zoneName) + local _triggerZone = trigger.misc.getZone(_zoneName) -- trigger to use as reference position + + + if _triggerZone == nil then + trigger.action.outText("CTLD.lua ERROR: Cant find zone called " .. _zoneName, 10) + + return + end + + for _, _zoneDetails in pairs(ctld.wpZones) do + + if _zoneName == _zoneDetails[1] then + + --smoke could get messy if designer keeps calling this on an active zone, check its not active first + if _zoneDetails[3] == 1 then + -- they might have a continuous trigger so i've hidden the warning + --trigger.action.outText("CTLD.lua ERROR: Pickup Zone already active: " .. _zoneName, 10) + return + end + + _zoneDetails[3] = 1 --activate zone + + if ctld.disableAllSmoke == true then --smoke disabled + return + end + + if _zoneDetails[2] >= 0 then + + -- Trigger smoke marker + -- This will cause an overlapping smoke marker on next refreshsmoke call + -- but will only happen once + local _pos2 = { x = _triggerZone.point.x, y = _triggerZone.point.z } + local _alt = land.getHeight(_pos2) + local _pos3 = { x = _pos2.x, y = _alt, z = _pos2.y } + + trigger.action.smoke(_pos3, _zoneDetails[2]) + end + end + end +end + + +-- Deactivates a Waypoint zone +-- Deactivates a Waypoint zone when called from a trigger +-- EG: ctld.deactivateWaypointZone("wpzone3") +-- This disables wpzone3 so that troops dropped in this zone will search for troops as normal +-- These functions can be called by triggers +function ctld.deactivateWaypointZone(_zoneName) + + local _triggerZone = trigger.misc.getZone(_zoneName) + + if _triggerZone == nil then + trigger.action.outText("CTLD.lua ERROR: Cant find zone called " .. _zoneName, 10) + return + end + + for _, _zoneDetails in pairs(ctld.pickupZones) do + + if _zoneName == _zoneDetails[1] then + + _zoneDetails[3] = 0 --deactivate zone + end + end +end + -- Continuous Trigger Function -- Causes an AI unit with the specified name to unload troops / vehicles when -- an enemy is detected within a specified distance @@ -3786,10 +3870,17 @@ function ctld.spawnDroppedGroup(_point, _details, _spawnBehind, _maxSearch) _maxSearch = ctld.maximumSearchDistance end - local _enemyPos = ctld.findNearestEnemy(_details.side, _point, _maxSearch) + local _wpZone = ctld.inWaypointZone(_point,_spawnedGroup:getCoalition()) - ctld.orderGroupToMoveToPoint(_spawnedGroup:getUnit(1), _enemyPos) + if _wpZone.inZone then + ctld.orderGroupToMoveToPoint(_spawnedGroup:getUnit(1), _wpZone.point) + env.info("Heading to waypoint - In Zone ".._wpZone.name) + else + local _enemyPos = ctld.findNearestEnemy(_details.side, _point, _maxSearch) + ctld.orderGroupToMoveToPoint(_spawnedGroup:getUnit(1), _enemyPos) + end + return _spawnedGroup end @@ -4090,6 +4181,29 @@ function ctld.inDropoffZone(_heli) return false end +-- are we in a waypoint zone +function ctld.inWaypointZone(_point,_coalition) + + for _, _zoneDetails in pairs(ctld.wpZones) do + + local _triggerZone = trigger.misc.getZone(_zoneDetails[1]) + + --right coalition and active? + if _triggerZone ~= nil and (_zoneDetails[4] == _coalition or _zoneDetails[4]== 0) and _zoneDetails[3] == 1 then + + --get distance to center + + local _dist = ctld.getDistance(_point, _triggerZone.point) + + if _dist <= _triggerZone.radius then + return {inZone = true, point = _triggerZone.point, name = _zoneDetails[1]} + end + end + end + + return {inZone = false} +end + -- are we near friendly logistics zone function ctld.inLogisticsZone(_heli) @@ -4155,6 +4269,25 @@ function ctld.refreshSmoke() end end + --waypoint zones + for _, _zoneDetails in pairs(ctld.wpZones) do + + local _triggerZone = trigger.misc.getZone(_zoneDetails[1]) + + --only trigger if smoke is on AND zone is active + if _triggerZone ~= nil and _zoneDetails[2] >= 0 and _zoneDetails[3] == 1 then + + -- Trigger smoke markers + + local _pos2 = { x = _triggerZone.point.x, y = _triggerZone.point.z } + local _alt = land.getHeight(_pos2) + local _pos3 = { x = _pos2.x, y = _alt, z = _pos2.y } + + trigger.action.smoke(_pos3, _zoneDetails[2]) + end + end + + --refresh in 5 minutes timer.scheduleFunction(ctld.refreshSmoke, nil, timer.getTime() + 300) end @@ -5527,6 +5660,34 @@ for _, _zone in pairs(ctld.dropOffZones) do _zone[4] = 1 end +--sort out waypoint zones +for _, _zone in pairs(ctld.wpZones) do + + local _zoneColor = _zone[2] + + if _zoneColor == "green" then + _zone[2] = trigger.smokeColor.Green + elseif _zoneColor == "red" then + _zone[2] = trigger.smokeColor.Red + elseif _zoneColor == "white" then + _zone[2] = trigger.smokeColor.White + elseif _zoneColor == "orange" then + _zone[2] = trigger.smokeColor.Orange + elseif _zoneColor == "blue" then + _zone[2] = trigger.smokeColor.Blue + else + _zone[2] = -1 -- no smoke colour + end + + --mark as active for refresh smoke logic to work + -- change active to 1 / 0 + if _zone[3] == "yes" then + _zone[3] = 1 + else + _zone[3] = 0 + end +end + -- Sort out extractable groups for _, _groupName in pairs(ctld.extractableGroups) do diff --git a/README.md b/README.md index 9159a65..4b26ddd 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ The script supports: * Count Crates in Zone * Works for both crates added by the Mission Editor and Crates spawned by Transports * Count soldiers extracted to a zone (the soldiers disappear) +* Waypoint triggers to force dropped groups to head to a location * Advanced Scripting Callback system A complete test mission is included. @@ -306,7 +307,7 @@ ctld.spawnGroupAtPoint("blue", {mg=1,at=2,aa=3,inf=4,mortar=5}, {x=1,y=2,z=3}, 2 ``` ### Activate / Deactivate Pickup Zone -You can activate and deactive a pickup zone as shown below. When a zone is active, troops can be loaded from it as long as there are troops remaining and you are the same side as the pickup zone. +You can activate and deactivate a pickup zone as shown below. When a zone is active, troops can be loaded from it as long as there are troops remaining and you are the same side as the pickup zone. ```lua ctld.activatePickupZone("pickzone3") @@ -329,12 +330,23 @@ ctld.changeRemainingGroupsForPickupZone("pickup1", -3) -- remove 3 groups for zo ``` +### Activate / Deactivate Waypoint Zone +You can activate and deactivate a waypoint zone as shown below. When a waypoint zone is active, and the right coalition of troops is dropped inside, the troops will attempt to head to the center of the zone. + +```lua +ctld.activateWaypointZone("wpzone1") +``` +or +```lua +ctld.deactivateWaypointZone("wpzone1") +``` ### Unload Transport You can force a unit to unload its units (as long as its on the ground) by calling this function. ```lua ctld.unloadTransport("helicargo1") +``` ###Load Transport You can force a unit to load its units (as long as its on the ground) by calling this function. @@ -607,6 +619,41 @@ Available colours are: Smoke can be disabled for all zones regardless of the settings above using the option ```ctld.disableAllSmoke = true``` in the User Configuration part of the script. +### Waypoint Zones Setup + +Waypoint zones can be used to make dropped or spawned troops automatically head to the center of a zone. The troops will head to the center of the zone if the coalition matches (or the coalition is set to 0) and if the zone is currently active. + +If your Waypoint zone isn't working, make sure the 3rd parameter, the coalition side, is set correctly and the zone is set to active. + +```lua + +--wpZones = { "Zone name", "smoke color", "ACTIVE (yes/no)", "side (0 = Both sides / 1 = Red / 2 = Blue )", } +ctld.wpZones = { + { "wpzone1", "green","yes", 2 }, + { "wpzone2", "blue","yes", 2 }, + { "wpzone3", "orange","yes", 2 }, + { "wpzone4", "none","yes", 2 }, + { "wpzone5", "none","yes", 1 }, + { "wpzone6", "none","yes", 1 }, + { "wpzone7", "none","yes", 1 }, + { "wpzone8", "none","yes", 1 }, + { "wpzone9", "none","yes", 1 }, + { "wpzone10", "none","no", 1 }, +} +``` + +Smoke can be enabled or disabled individually for waypoiny zones exactly the same as Pickup and Dropoff zones by editing the second column in the list. + +The available colours are: +* ```"green"``` +* ```"red"``` +* ```"white"``` +* ```"orange"``` +* ```"blue"``` +* ```"none"``` + +Smoke can be disabled for all zones regardless of the settings above using the option ```ctld.disableAllSmoke = true``` in the User Configuration part of the script. + ### Transport Unit Setup Any unit that you want to be able to transport troops needs to have the **"Pilot Name"** in the ```ctld.transportPilotNames``` list. **Player controlled transport units should be in a group of their own and be the only unit in the group, otherwise other players may have radio commands they shouldn't**. The group name isn't important and can be set to whatever you like. A snippet of the list is shown below.