Last active
December 17, 2015 12:49
-
-
Save TDC-bob/5613009 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
groupCounter = 100 | |
unitCounter = 100 | |
PickupZones = { | |
[1] = { | |
ZoneName = "PickupZone", | |
SmokeColor = trigger.smokeColor.Blue, | |
}, | |
} | |
DropoffZones = { | |
[1] = { | |
Name = "Nuclear Plant (Red)", | |
ZoneName = "DropoffZone1", | |
SmokeColor = trigger.smokeColor.Red, | |
DropFunction = DropoffGroupDirect | |
}, | |
[2] = { | |
Name = "Rail Station (Orange)", | |
ZoneName = "DropoffZone2", | |
SmokeColor = trigger.smokeColor.Orange, | |
DropFunction = DropoffGroupDirect | |
}, | |
[3] = { | |
Name = "City Center (Green)", | |
ZoneName = "DropoffZone3", | |
SmokeColor = trigger.smokeColor.Green, | |
DropFunction = DropoffGroupDirect | |
}, | |
[4] = { | |
Name = "Hospitals (Blue)", | |
ZoneName = "DropoffZone4", | |
SmokeColor = trigger.smokeColor.Blue, | |
DropFunction = DropoffGroupDirect | |
}, | |
} | |
function SpawnSmoke(smokeX, smokeY, smokeColor) | |
local pos2 = { x = smokeX, y = smokeY } | |
local alt = land.getHeight(pos2) | |
local pos3 = {x=pos2.x, y=alt, z=pos2.y} | |
trigger.action.smoke(pos3, smokeColor) | |
end | |
function SmokeTimer(arg, time) | |
for i=1,#PickupZones do | |
local zone = trigger.misc.getZone(PickupZones[i].ZoneName) | |
SpawnSmoke(zone.point.x, zone.point.z, PickupZones[i].SmokeColor) | |
end | |
for i=1,#DropoffZones do | |
local zone = trigger.misc.getZone(DropoffZones[i].ZoneName) | |
SpawnSmoke(zone.point.x, zone.point.z, DropoffZones[i].SmokeColor) | |
end | |
return time + 270 | |
end | |
UnitStateTable = {} | |
function UnitRadioCommand(unitName, groupFonction) | |
local unit = Unit.getByName(unitName) | |
if unit == nil then | |
UnitStateTable[unitName] = false | |
return | |
end | |
local unitId = unit:getID() | |
local group = unit:getGroup() | |
local groupName = group:getName() | |
local playerName = unit:getPlayerName() | |
if UnitStateTable[unitName] == nil then | |
UnitStateTable[unitName] = false | |
end | |
local pickupZone = UnitInAnyPickupZone(unit) | |
local dropoffZone = UnitInAnyDropoffZone(unit) | |
if pickupZone ~= nil then | |
UnitStateTable[unitName] = true | |
trigger.action.outText(playerName .. " (" .. groupName .. ") has 11 troops on board.", 10) | |
else | |
if dropoffZone ~= nil then | |
if UnitStateTable[unitName] == true then | |
local unitpos = unit:getPoint() | |
local triggerZone = trigger.misc.getZone(dropoffZone.ZoneName) | |
-- local newGroup = dropoffZone.DropFunction(11, 15, unitpos.x, unitpos.z, triggerZone.point.x, triggerZone.point.z, unitType) | |
local newGroup = groupFonction(15, unitpos.x, unitpos.z, triggerZone.point.x, triggerZone.point.z) | |
coalition.addGroup(country.id.USA, Group.Category.GROUND, newGroup) | |
UnitStateTable[unitName] = false | |
trigger.action.outText(playerName .. " (" .. groupName .. ") just dropped 11 troops.", 10) | |
else | |
trigger.action.outText(playerName .. " (" .. groupName .. ") didn't have any troops to drop.", 10) | |
end | |
else | |
-- landed in nomands | |
trigger.action.outText(playerName .. " (" .. groupName .. ") isn't in a pickup or dropoff zone.", 10) | |
end | |
end | |
end | |
function TankGroup(radius, xCenter, yCenter, xDest, yDest) -- BOB | |
local count = 2 | |
local radius = 30 | |
local bob_unit_types = | |
{ | |
[1] = "Char", | |
[2] = "Char", | |
[3] = "Char", | |
[4] = "Mortier", | |
} | |
local group = { | |
["visible"] = false, | |
["taskSelected"] = true, | |
["groupId"] = groupCounter, | |
["hidden"] = false, | |
["units"] = {}, | |
["y"] = yCenter, | |
["x"] = xCenter, | |
["name"] = "GroupName" .. groupCounter, | |
["start_time"] = 0, | |
["task"] = "Ground Nothing", | |
["route"] = { | |
["points"] = | |
{ | |
[1] = | |
{ | |
["alt"] = 41, | |
["type"] = "Turning Point", | |
["ETA"] = 0, | |
["alt_type"] = "BARO", | |
["formation_template"] = "", | |
["y"] = yCenter, | |
["x"] = xCenter, | |
["ETA_locked"] = true, | |
["speed"] = 5.5555555555556, | |
["action"] = "Diamond", | |
["task"] = | |
{ | |
["id"] = "ComboTask", | |
["params"] = | |
{ | |
["tasks"] = | |
{ | |
}, -- end of ["tasks"] | |
}, -- end of ["params"] | |
}, -- end of ["task"] | |
["speed_locked"] = false, | |
}, -- end of [1] | |
[2] = | |
{ | |
["alt"] = 54, | |
["type"] = "Turning Point", | |
["ETA"] = 52.09716824195, | |
["alt_type"] = "BARO", | |
["formation_template"] = "", | |
["y"] = yDest, | |
["x"] = xDest, | |
["ETA_locked"] = false, | |
["speed"] = 5.5555555555556, | |
["action"] = "Diamond", | |
["task"] = | |
{ | |
["id"] = "ComboTask", | |
["params"] = | |
{ | |
["tasks"] = | |
{ | |
}, -- end of ["tasks"] | |
}, -- end of ["params"] | |
}, -- end of ["task"] | |
["speed_locked"] = false, | |
}, -- end of [2] | |
}, -- end of ["points"] | |
}, -- end of ["route"] | |
} | |
for i = 1,count do | |
local angle = math.pi * 2 * (i-1) / count | |
local xofs = math.cos(angle) * radius | |
local yofs = math.sin(angle) * radius | |
--local unitType = "Soldier M4" | |
--if i < 4 then | |
-- unitType = "Soldier M249" | |
--end | |
group.units[i] = NewUnit(xCenter + xofs, yCenter + yofs, angle, bob_unit_types[i]) -- BOB | |
end | |
groupCounter = groupCounter + 1 | |
return group | |
end | |
function NewUnit(x, y, heading, unitType) | |
local unit = { | |
["y"] = y, | |
["type"] = unitType, | |
["name"] = "Unitname" .. unitCounter, | |
["unitId"] = unitCounter, | |
["heading"] = heading, | |
["playerCanDrive"] = true, | |
["skill"] = "Excellent", | |
["x"] = x, | |
} | |
unitCounter = unitCounter + 1 | |
return unit | |
end | |
RadioCommandTable = {} | |
function UnitRadioCommand_Chars(unitName) -- Bob | |
UnitRadioCommand(unitName, TankGroup) | |
end | |
function UnitRadioCommand_Phoques(unitName) | |
UnitRadioCommand(unitName, "Phoques") | |
end | |
function UnitRadioCommand_Gnous(unitName) | |
UnitRadioCommand(unitName, "Gnous") | |
end | |
function AddRadioCommand(unitName) | |
if RadioCommandTable[unitName] == nil then | |
local unit = Unit.getByName(unitName) | |
if unit == nil then | |
return | |
end | |
local group = unit:getGroup() | |
if group == nil then | |
return | |
end | |
local gid = group:getID() | |
missionCommands.addCommandForGroup(gid, "Load/unload Caribous", nil, UnitRadioCommand_Caribous, unitName) -- Bob | |
missionCommands.addCommandForGroup(gid, "Load/unload Phoques", nil, UnitRadioCommand_Phoques, unitName) -- Bob | |
missionCommands.addCommandForGroup(gid, "Load/unload Gnous", nil, UnitRadioCommand_Gnous, unitName) -- Bob | |
RadioCommandTable[unitName] = true | |
end | |
end | |
function AddRadioCommands(arg, time) | |
AddRadioCommand("HueyPilot1") | |
AddRadioCommand("HueyPilot2") | |
AddRadioCommand("HueyPilot3") | |
AddRadioCommand("HueyPilot4") | |
AddRadioCommand("HueyPilot5") | |
AddRadioCommand("HueyPilot6") | |
AddRadioCommand("HueyPilot7") | |
AddRadioCommand("HueyPilot8") | |
AddRadioCommand("HueyPilot9") | |
return time + 5 | |
end | |
function GetDistance(xUnit, yUnit, xZone, yZone) | |
local xDiff = xUnit - xZone | |
local yDiff = yUnit - yZone | |
return math.sqrt(xDiff * xDiff + yDiff * yDiff) | |
end | |
function FindNearestDropoffZone(unit) | |
local minDist = 5000 | |
local minZone = nil | |
local unitpos = unit:getPoint() | |
for i=1,#DropoffZones do | |
local zone = DropoffZones[i] | |
local triggerZone = trigger.misc.getZone(zone.ZoneName) | |
local dist = GetDistance(unitpos.x, unitpos.z, triggerZone.point.x, triggerZone.point.z) | |
if dist < minDist then | |
minDist = dist | |
minZone = zone | |
end | |
end | |
return minZone | |
end | |
function StatusReport(arg, time) | |
-- array of Group function coalition.getGroups(enum coalition.side coalition, enum Group.Category groupCategory or nil) | |
-- array of Unit function Group.getUnits(Group self) | |
-- enum country.id CoalitionObject.getCountry(CoalitionObject self) | |
local zoneTable = {} | |
for i=1,#DropoffZones do | |
zoneTable[DropoffZones[i].Name] = 0 | |
end | |
local groups = coalition.getGroups(coalition.side.RED, Group.Category.GROUND) | |
env.info("Got groups: " .. #groups, false) | |
for i=1,#groups do | |
local group = groups[i] | |
if group ~= nil then | |
local units = group:getUnits() | |
for j=1,#units do | |
local unit = units[j] | |
if unit ~= nil then | |
local country = unit:getCountry() | |
if country == 17 then -- if INSURGENT | |
local zone = FindNearestDropoffZone(unit) | |
if zone ~= nil then | |
zoneTable[zone.Name] = zoneTable[zone.Name] + 1 | |
end | |
end | |
end | |
end | |
end | |
end | |
local text = "MISSION STATUS - See mission briefing for details\n\n" | |
for k,v in pairs(zoneTable) do | |
env.info("Append status [" .. tostring(k) .. "] [" .. tostring(v) .. "]", false) | |
text = text .. tostring(k) .. ": " .. tostring(v) .. " insurgent units remain.\n" | |
end | |
trigger.action.outText(text, 20) | |
return time + 45 | |
end | |
do | |
timer.scheduleFunction(SmokeTimer, nil, timer.getTime() + 5) | |
timer.scheduleFunction(AddRadioCommands, nil, timer.getTime() + 5) | |
timer.scheduleFunction(StatusReport, nil, timer.getTime() + 45) | |
end | |
function UnitInAnyPickupZone(unit) | |
for i=1,#PickupZones do | |
if UnitInZone(unit, PickupZones[i]) then | |
return PickupZones[i] | |
end | |
end | |
return nil | |
end | |
function UnitInAnyDropoffZone(unit) | |
for i=1,#DropoffZones do | |
if UnitInZone(unit, DropoffZones[i]) then | |
return DropoffZones[i] | |
end | |
end | |
return nil | |
end | |
function UnitInZone(unit, zone) | |
if unit:inAir() then | |
return false | |
end | |
local triggerZone = trigger.misc.getZone(zone.ZoneName) | |
local group = unit:getGroup() | |
local groupid = group:getID() | |
local unitpos = unit:getPoint() | |
local xDiff = unitpos.x - triggerZone.point.x | |
local yDiff = unitpos.z - triggerZone.point.z | |
local dist = math.sqrt(xDiff * xDiff + yDiff * yDiff) | |
if dist > triggerZone.radius then | |
return false | |
end | |
return true | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment