160 lines
4.6 KiB
Lua
160 lines
4.6 KiB
Lua
AutoTrigger = { CPos.New(51, 47), CPos.New(52, 47), CPos.New(53, 47), CPos.New(54, 47) }
|
|
GDIHeliTrigger = { CPos.New(27, 55), CPos.New(27, 56), CPos.New(28, 56), CPos.New(28, 57), CPos.New(28, 58), CPos.New(28, 59)}
|
|
|
|
Nod1Units = { "e1", "e1", "e3", "e3" }
|
|
Auto1Units = { "e1", "e1", "e3" }
|
|
|
|
KillsUntilReinforcements = 12
|
|
HeliDelay = { 83, 137, 211 }
|
|
|
|
GDIReinforcements = { "e2", "e2", "e2", "e2", "e2" }
|
|
GDIReinforcementsWaypoints = { GDIReinforcementsEntry.Location, GDIReinforcementsWP1.Location }
|
|
|
|
NodHelis = {
|
|
{ DateTime.Seconds(HeliDelay[1]), { NodHeliEntry.Location, NodHeliLZ1.Location }, { "e1", "e1", "e3" } },
|
|
{ DateTime.Seconds(HeliDelay[2]), { NodHeliEntry.Location, NodHeliLZ2.Location }, { "e1", "e1", "e1", "e1" } },
|
|
{ DateTime.Seconds(HeliDelay[3]), { NodHeliEntry.Location, NodHeliLZ3.Location }, { "e1", "e1", "e3" } }
|
|
}
|
|
|
|
SendHeli = function(heli)
|
|
units = Reinforcements.ReinforceWithTransport(nod, "tran", heli[3], heli[2], { heli[2][1] })
|
|
Utils.Do(units[2], function(actor)
|
|
actor.Hunt()
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
Trigger.OnKilled(actor, KillCounter)
|
|
end)
|
|
Trigger.AfterDelay(heli[1], function() SendHeli(heli) end)
|
|
end
|
|
|
|
SendGDIReinforcements = function()
|
|
Media.PlaySpeechNotification(gdi, "Reinforce")
|
|
Reinforcements.ReinforceWithTransport(gdi, "apc", GDIReinforcements, GDIReinforcementsWaypoints, nil, function(apc, team)
|
|
table.insert(team, apc)
|
|
Trigger.OnAllKilled(team, function() Trigger.AfterDelay(DateTime.Seconds(5), SendGDIReinforcements) end)
|
|
Utils.Do(team, function(unit) unit.Stance = "Defend" end)
|
|
end)
|
|
end
|
|
|
|
BuildNod1 = function()
|
|
if HandOfNod.IsDead then
|
|
return
|
|
end
|
|
|
|
local func = function(team)
|
|
Utils.Do(team, function(actor)
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
Trigger.OnKilled(actor, KillCounter)
|
|
end)
|
|
Trigger.OnAllKilled(team, BuildNod1)
|
|
end
|
|
|
|
if not HandOfNod.Build(Nod1Units, func) then
|
|
Trigger.AfterDelay(DateTime.Seconds(5), BuildNod1)
|
|
end
|
|
end
|
|
|
|
BuildAuto1 = function()
|
|
if HandOfNod.IsDead then
|
|
return
|
|
end
|
|
|
|
local func = function(team)
|
|
Utils.Do(team, function(actor)
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
Trigger.OnKilled(actor, KillCounter)
|
|
end)
|
|
end
|
|
|
|
if not HandOfNod.IsDead and HandOfNod.Build(Auto1Units, func) then
|
|
Trigger.AfterDelay(DateTime.Seconds(5), BuildAuto1)
|
|
end
|
|
end
|
|
|
|
kills = 0
|
|
KillCounter = function() kills = kills + 1 end
|
|
|
|
ReinforcementsSent = false
|
|
Tick = function()
|
|
nod.Cash = 1000
|
|
|
|
if not ReinforcementsSent and kills >= KillsUntilReinforcements then
|
|
ReinforcementsSent = true
|
|
gdi.MarkCompletedObjective(reinforcementsObjective)
|
|
SendGDIReinforcements()
|
|
end
|
|
|
|
if gdi.HasNoRequiredUnits() then
|
|
Trigger.AfterDelay(DateTime.Seconds(1), function() gdi.MarkFailedObjective(gdiObjective) end)
|
|
end
|
|
end
|
|
|
|
SetupWorld = function()
|
|
Utils.Do(nod.GetGroundAttackers(nod), function(unit)
|
|
Trigger.OnKilled(unit, KillCounter)
|
|
end)
|
|
|
|
Utils.Do(gdi.GetGroundAttackers(), function(unit)
|
|
unit.Stance = "Defend"
|
|
end)
|
|
|
|
Hunter1.Hunt()
|
|
Hunter2.Hunt()
|
|
|
|
Trigger.OnRemovedFromWorld(crate, function() gdi.MarkCompletedObjective(gdiObjective) end)
|
|
end
|
|
|
|
WorldLoaded = function()
|
|
gdi = Player.GetPlayer("GDI")
|
|
nod = Player.GetPlayer("Nod")
|
|
|
|
SetupWorld()
|
|
|
|
Trigger.OnObjectiveAdded(gdi, function(p, id)
|
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
|
|
end)
|
|
Trigger.OnObjectiveCompleted(gdi, function(p, id)
|
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
|
end)
|
|
Trigger.OnObjectiveFailed(gdi, function(p, id)
|
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
|
end)
|
|
|
|
Trigger.OnPlayerWon(gdi, function()
|
|
Media.PlaySpeechNotification(gdi, "Win")
|
|
end)
|
|
|
|
Trigger.OnPlayerLost(gdi, function()
|
|
Media.PlaySpeechNotification(gdi, "Lose")
|
|
end)
|
|
|
|
|
|
gdiObjective = gdi.AddPrimaryObjective("Retrieve the crate with the stolen rods.")
|
|
reinforcementsObjective = gdi.AddSecondaryObjective("Eliminate " .. KillsUntilReinforcements .. " Nod units for reinforcements.")
|
|
nod.AddPrimaryObjective("Defend against the GDI forces.")
|
|
|
|
BuildNod1()
|
|
Utils.Do(NodHelis, function(heli)
|
|
Trigger.AfterDelay(heli[1], function() SendHeli(heli) end)
|
|
end)
|
|
|
|
autoTrigger = false
|
|
Trigger.OnEnteredFootprint(AutoTrigger, function(a, id)
|
|
if not autoTrigger and a.Owner == gdi then
|
|
autoTrigger = true
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
BuildAuto1()
|
|
end
|
|
end)
|
|
|
|
gdiHeliTrigger = false
|
|
Trigger.OnEnteredFootprint(GDIHeliTrigger, function(a, id)
|
|
if not gdiHeliTrigger and a.Owner == gdi then
|
|
gdiHeliTrigger = true
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
Reinforcements.ReinforceWithTransport(gdi, "tran", nil, { GDIHeliEntry.Location, GDIHeliLZ.Location })
|
|
end
|
|
end)
|
|
|
|
Camera.Position = Actor56.CenterPosition
|
|
end
|