diff --git a/OpenRA.Mods.Common/Scripting/Global/TriggerGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/TriggerGlobal.cs index 195639f7e8..aa034cd795 100644 --- a/OpenRA.Mods.Common/Scripting/Global/TriggerGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/TriggerGlobal.cs @@ -51,6 +51,20 @@ namespace OpenRA.Mods.Common.Scripting Context.World.AddFrameEndTask(w => w.Add(new DelayedAction(delay, doCall))); } + [Desc("Call a function for each passenger when it enters a transport. " + + "The callback function will be called as func(Actor transport, Actor passenger).")] + public void OnPassengerEntered(Actor a, LuaFunction func) + { + GetScriptTriggers(a).RegisterCallback(Trigger.OnPassengerEntered, func, Context); + } + + [Desc("Call a function for each passenger when it exits a transport. " + + "The callback function will be called as func(Actor transport, Actor passenger).")] + public void OnPassengerExited(Actor a, LuaFunction func) + { + GetScriptTriggers(a).RegisterCallback(Trigger.OnPassengerExited, func, Context); + } + [Desc("Call a function each tick that the actor is idle. " + "The callback function will be called as func(Actor self).")] public void OnIdle(Actor a, LuaFunction func) diff --git a/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs b/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs index 271435e7a1..ac820884b5 100644 --- a/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs +++ b/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using Eluant; +using OpenRA.Mods.Common.Traits; using OpenRA.Scripting; using OpenRA.Traits; @@ -21,7 +22,8 @@ namespace OpenRA.Mods.Common.Scripting { OnIdle, OnDamaged, OnKilled, OnProduction, OnOtherProduction, OnPlayerWon, OnPlayerLost, OnObjectiveAdded, OnObjectiveCompleted, OnObjectiveFailed, OnCapture, OnInfiltrated, - OnAddedToWorld, OnRemovedFromWorld, OnDiscovered, OnPlayerDiscovered + OnAddedToWorld, OnRemovedFromWorld, OnDiscovered, OnPlayerDiscovered, + OnPassengerEntered, OnPassengerExited } [Desc("Allows map scripts to attach triggers to this actor via the Triggers global.")] @@ -31,7 +33,8 @@ namespace OpenRA.Mods.Common.Scripting } public sealed class ScriptTriggers : INotifyIdle, INotifyDamage, INotifyKilled, INotifyProduction, INotifyOtherProduction, - INotifyObjectivesUpdated, INotifyCapture, INotifyInfiltrated, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyDiscovered, INotifyActorDisposing + INotifyObjectivesUpdated, INotifyCapture, INotifyInfiltrated, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyDiscovered, INotifyActorDisposing, + INotifyPassengerEntered, INotifyPassengerExited { readonly World world; readonly Actor self; @@ -421,6 +424,48 @@ namespace OpenRA.Mods.Common.Scripting } } + void INotifyPassengerEntered.OnPassengerEntered(Actor self, Actor passenger) + { + if (world.Disposing) + return; + + foreach (var f in Triggerables(Trigger.OnPassengerEntered)) + { + try + { + using (var trans = self.ToLuaValue(f.Context)) + using (var pass = passenger.ToLuaValue(f.Context)) + f.Function.Call(trans, pass).Dispose(); + } + catch (Exception ex) + { + f.Context.FatalError(ex.Message); + return; + } + } + } + + void INotifyPassengerExited.OnPassengerExited(Actor self, Actor passenger) + { + if (world.Disposing) + return; + + foreach (var f in Triggerables(Trigger.OnPassengerExited)) + { + try + { + using (var trans = self.ToLuaValue(f.Context)) + using (var pass = passenger.ToLuaValue(f.Context)) + f.Function.Call(trans, pass).Dispose(); + } + catch (Exception ex) + { + f.Context.FatalError(ex.Message); + return; + } + } + } + public void Clear(Trigger trigger) { world.AddFrameEndTask(w =>