diff --git a/mods/common/lua/actor.lua b/mods/common/lua/actor.lua index 328b62bafc..f2a6b92612 100644 --- a/mods/common/lua/actor.lua +++ b/mods/common/lua/actor.lua @@ -28,7 +28,19 @@ Actor.MoveNear = function(actor, location, nearEnough) end Actor.ScriptedMove = function(actor, location) - actor:QueueActivity(OpenRA.New("Move", { location })) + if Actor.HasTrait(actor, "Helicopter") then + actor:QueueActivity(OpenRA.New("HeliFly", { location.CenterPosition })) + else + actor:QueueActivity(OpenRA.New("Move", { location })) + end +end + +Actor.AfterMove = function(actor) + local heli = Actor.TraitOrDefault(actor, "Helicopter") + if heli ~= nil then + Actor.Turn(actor, heli.Info.InitialFacing) + Actor.HeliLand(actor, true) + end end Actor.Teleport = function(actor, location) @@ -173,4 +185,12 @@ end Actor.TraitInfo = function(actorType, className) return Internal.TraitInfo(actorType, className) +end + +Actor.InitialAltitude = function(actorName) + if Actor.HasTraitInfo("AircraftInfo") then + return Actor.TraitInfo(actorName, "AircraftInfo").CruiseAltitude + end + + return 0 end \ No newline at end of file diff --git a/mods/common/lua/reinforcements.lua b/mods/common/lua/reinforcements.lua index b5f42f0b94..0f20402fb8 100644 --- a/mods/common/lua/reinforcements.lua +++ b/mods/common/lua/reinforcements.lua @@ -1,62 +1,43 @@ Reinforcements = { } -Reinforcements.PerformHelicopterInsertion = function(owner, helicopterName, passengerNames, enterPosition, unloadPosition, exitPosition) - local facing = { Map.GetFacing(WPos.op_Subtraction(unloadPosition, enterPosition), 0), "Int32" } - local altitude = { Actor.TraitInfo(helicopterName, "AircraftInfo").CruiseAltitude, "Int32" } - local heli = Actor.Create(helicopterName, { Owner = owner, CenterPosition = enterPosition, Facing = facing, Altitude = altitude }) - local cargo = Actor.Trait(heli, "Cargo") +Reinforcements.Insert = function(owner, transportName, passengerNames, enterPath, exitPath) + local facing = { Map.GetFacing(CPos.op_Subtraction(enterPath[2], enterPath[1]), 0), "Int32" } + local altitude = Actor.InitialAltitude(transportName) + local transport = Actor.Create(transportName, { Owner = owner, Location = enterPath[1], Facing = facing, Altitude = { altitude, "Int32" } }) + local cargo = Actor.Trait(transport, "Cargo") local passengers = { } + for i, passengerName in ipairs(passengerNames) do local passenger = Actor.Create(passengerName, { AddToWorld = false, Owner = owner }) - cargo:Load(heli, passenger) passengers[i] = passenger + cargo:Load(transport, passenger) end - Actor.HeliFly(heli, unloadPosition) - Actor.Turn(heli, 0) - Actor.HeliLand(heli, true) - Actor.UnloadCargo(heli, true) - Actor.Wait(heli, 125) - Actor.HeliFly(heli, exitPosition) - Actor.RemoveSelf(heli) - return heli, passengers + + Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(transport, l) end) + Actor.AfterMove(transport) + Actor.UnloadCargo(transport, true) + Actor.Wait(transport, 25) + Utils.Do(exitPath, function(l) Actor.ScriptedMove(transport, l) end) + Actor.RemoveSelf(transport) + return transport, passengers end -Reinforcements.PerformHelicopterExtraction = function(owner, helicopterName, passengers, enterPosition, loadPosition, exitPosition) - local facing = { Map.GetFacing(WPos.op_Subtraction(loadPosition, enterPosition), 0), "Int32" } - local altitude = { Actor.TraitInfo(helicopterName, "AircraftInfo").CruiseAltitude, "Int32" } - local heli = Actor.Create(helicopterName, { Owner = owner, CenterPosition = enterPosition, Facing = facing, Altitude = altitude }) - local cargo = Actor.Trait(heli, "Cargo") - Actor.HeliFly(heli, loadPosition) - Actor.Turn(heli, 0) - Actor.HeliLand(heli, true) - Actor.WaitFor(heli, function() - return Utils.All(passengers, function(passenger) return cargo.Passengers:Contains(passenger) end) +Reinforcements.Extract = function(owner, transportName, passengerNames, enterPath, exitPath) + local facing = { Map.GetFacing(CPos.op_Subtraction(enterPath[2], enterPath[1]), 0), "Int32" } + local altitude = Actor.InitialAltitude(transportName) + local transport = Actor.Create(transportName, { Owner = owner, Location = enterPath[1], Facing = facing, Altitude = { altitude, "Int32" } }) + local cargo = Actor.Trait(transport, "Cargo") + + Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(transport, l) end) + Actor.AfterMove(transport) + Actor.WaitFor(transport, function() + return Utils.All(passengerNames, function(passenger) return cargo.Passengers:Contains(passenger) end) end) - Actor.Wait(heli, 125) - Actor.HeliFly(heli, exitPosition) - Actor.RemoveSelf(heli) - return heli -end -Reinforcements.PerformInsertion = function(owner, vehicleName, passengerNames, enterPath, exitPath) - local facing = { 0, "Int32" } - if #enterPath > 1 then - facing = { Map.GetFacing(CPos.op_Subtraction(enterPath[2], enterPath[1]), 0), "Int32" } - end - local vehicle = Actor.Create(vehicleName, { Owner = owner, Location = enterPath[1], Facing = facing }) - local cargo = Actor.Trait(vehicle, "Cargo") - local passengers = { } - for i, passengerName in ipairs(passengerNames) do - local passenger = Actor.Create(passengerName, { AddToWorld = false, Owner = owner }) - passengers[i] = passenger - cargo:Load(vehicle, passenger) - end - Utils.Do(Utils.Skip(enterPath, 1), function(l) Actor.ScriptedMove(vehicle, l) end) - Actor.UnloadCargo(vehicle, true) - Actor.Wait(vehicle, 25) - Utils.Do(exitPath, function(l) Actor.ScriptedMove(vehicle, l) end) - Actor.RemoveSelf(vehicle) - return vehicle, passengers + Actor.Wait(transport, 125) + Utils.Do(exitPath, function(l) Actor.ScriptedMove(transport, l) end) + Actor.RemoveSelf(transport) + return transport end Reinforcements.Reinforce = function(owner, reinforcementNames, enterLocation, rallyPointLocation, interval, onCreateFunc) diff --git a/mods/ra/maps/allies-01-classic/mission.lua b/mods/ra/maps/allies-01-classic/mission.lua index 2b4aeff727..df16280cdc 100644 --- a/mods/ra/maps/allies-01-classic/mission.lua +++ b/mods/ra/maps/allies-01-classic/mission.lua @@ -13,8 +13,8 @@ CivilianWait = 150 BaseAlertDelay = 300 SendInsertionHelicopter = function() - local heli, passengers = Reinforcements.PerformHelicopterInsertion(player, InsertionHelicopterType, { TanyaType }, - InsertionEntry.CenterPosition, InsertionLZ.CenterPosition, InsertionEntry.CenterPosition) + local heli, passengers = Reinforcements.Insert(player, InsertionHelicopterType, { TanyaType }, + { InsertionEntry.Location, InsertionLZ.Location }, { InsertionEntry.Location }) tanya = passengers[1] Actor.OnKilled(tanya, TanyaKilled) end @@ -59,8 +59,8 @@ LabGuardsKilled = function() end SendExtractionHelicopter = function() - local heli = Reinforcements.PerformHelicopterExtraction(player, ExtractionHelicopterType, { einstein }, - SouthReinforcementsPoint.CenterPosition, ExtractionLZ.CenterPosition, ExtractionExitPoint.CenterPosition) + local heli = Reinforcements.Extract(player, ExtractionHelicopterType, { einstein }, + { SouthReinforcementsPoint.Location, ExtractionLZ.Location }, { ExtractionExitPoint.Location }) Actor.OnKilled(heli, HelicopterDestroyed) Actor.OnRemovedFromWorld(heli, HelicopterExtractionCompleted) end