Add CargoCondition(s) to Passenger

This commit is contained in:
Mustafa Alperen Seki
2018-04-18 12:25:07 +03:00
committed by Paul Chote
parent 3febae1644
commit 6c5c4a129f
3 changed files with 62 additions and 2 deletions

View File

@@ -281,6 +281,9 @@ namespace OpenRA.Mods.Common.Traits
foreach (var npe in self.TraitsImplementing<INotifyPassengerExited>()) foreach (var npe in self.TraitsImplementing<INotifyPassengerExited>())
npe.OnPassengerExited(self, a); npe.OnPassengerExited(self, a);
foreach (var nec in a.TraitsImplementing<INotifyExitedCargo>())
nec.OnExitedCargo(a, self);
var p = a.Trait<Passenger>(); var p = a.Trait<Passenger>();
p.Transport = null; p.Transport = null;
@@ -347,9 +350,14 @@ namespace OpenRA.Mods.Common.Traits
// If not initialized then this will be notified in the first tick // If not initialized then this will be notified in the first tick
if (initialized) if (initialized)
{
foreach (var npe in self.TraitsImplementing<INotifyPassengerEntered>()) foreach (var npe in self.TraitsImplementing<INotifyPassengerEntered>())
npe.OnPassengerEntered(self, a); npe.OnPassengerEntered(self, a);
foreach (var nec in a.TraitsImplementing<INotifyEnteredCargo>())
nec.OnEnteredCargo(a, self);
}
var p = a.Trait<Passenger>(); var p = a.Trait<Passenger>();
p.Transport = self; p.Transport = self;
@@ -446,6 +454,9 @@ namespace OpenRA.Mods.Common.Traits
foreach (var npe in self.TraitsImplementing<INotifyPassengerEntered>()) foreach (var npe in self.TraitsImplementing<INotifyPassengerEntered>())
npe.OnPassengerEntered(self, c); npe.OnPassengerEntered(self, c);
foreach (var nec in c.TraitsImplementing<INotifyEnteredCargo>())
nec.OnEnteredCargo(c, self);
} }
initialized = true; initialized = true;

View File

@@ -38,14 +38,31 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Range from self for looking for an alternate transport (default: 5.5 cells).")] [Desc("Range from self for looking for an alternate transport (default: 5.5 cells).")]
public readonly WDist AlternateTransportScanRange = WDist.FromCells(11) / 2; public readonly WDist AlternateTransportScanRange = WDist.FromCells(11) / 2;
[GrantedConditionReference]
[Desc("The condition to grant to when this actor is loaded inside any transport.")]
public readonly string CargoCondition = null;
[Desc("Conditions to grant when this actor is loaded inside specified transport.",
"A dictionary of [actor id]: [condition].")]
public readonly Dictionary<string, string> CargoConditions = new Dictionary<string, string>();
[GrantedConditionReference]
public IEnumerable<string> LinterCargoConditions { get { return CargoConditions.Values; } }
[VoiceReference] public readonly string Voice = "Action"; [VoiceReference] public readonly string Voice = "Action";
public object Create(ActorInitializer init) { return new Passenger(this); } public object Create(ActorInitializer init) { return new Passenger(this); }
} }
public class Passenger : IIssueOrder, IResolveOrder, IOrderVoice, INotifyRemovedFromWorld public class Passenger : INotifyCreated, IIssueOrder, IResolveOrder, IOrderVoice, INotifyRemovedFromWorld, INotifyEnteredCargo, INotifyExitedCargo
{ {
public readonly PassengerInfo Info; public readonly PassengerInfo Info;
public Actor Transport;
ConditionManager conditionManager;
int anyCargoToken = ConditionManager.InvalidConditionToken;
int specificCargoToken = ConditionManager.InvalidConditionToken;
public Passenger(PassengerInfo info) public Passenger(PassengerInfo info)
{ {
Info = info; Info = info;
@@ -58,11 +75,15 @@ namespace OpenRA.Mods.Common.Traits
}; };
} }
public Actor Transport;
public Cargo ReservedCargo { get; private set; } public Cargo ReservedCargo { get; private set; }
public IEnumerable<IOrderTargeter> Orders { get; private set; } public IEnumerable<IOrderTargeter> Orders { get; private set; }
void INotifyCreated.Created(Actor self)
{
conditionManager = self.TraitOrDefault<ConditionManager>();
}
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "EnterTransport" || order.OrderID == "EnterTransports") if (order.OrderID == "EnterTransport" || order.OrderID == "EnterTransports")
@@ -94,6 +115,28 @@ namespace OpenRA.Mods.Common.Traits
return Info.Voice; return Info.Voice;
} }
void INotifyEnteredCargo.OnEnteredCargo(Actor self, Actor cargo)
{
string specificCargoCondition;
if (conditionManager != null)
{
if (anyCargoToken == ConditionManager.InvalidConditionToken && !string.IsNullOrEmpty(Info.CargoCondition))
anyCargoToken = conditionManager.GrantCondition(self, Info.CargoCondition);
if (specificCargoToken == ConditionManager.InvalidConditionToken && Info.CargoConditions.TryGetValue(cargo.Info.Name, out specificCargoCondition))
specificCargoToken = conditionManager.GrantCondition(self, specificCargoCondition);
}
}
void INotifyExitedCargo.OnExitedCargo(Actor self, Actor cargo)
{
if (anyCargoToken != ConditionManager.InvalidConditionToken)
anyCargoToken = conditionManager.RevokeCondition(self, anyCargoToken);
if (specificCargoToken != ConditionManager.InvalidConditionToken)
specificCargoToken = conditionManager.RevokeCondition(self, specificCargoToken);
}
public void ResolveOrder(Actor self, Order order) public void ResolveOrder(Actor self, Order order)
{ {
if (order.OrderString == "EnterTransport" || order.OrderString == "EnterTransports") if (order.OrderString == "EnterTransport" || order.OrderString == "EnterTransports")

View File

@@ -150,6 +150,12 @@ namespace OpenRA.Mods.Common.Traits
[RequireExplicitImplementation] [RequireExplicitImplementation]
public interface INotifyPassengerExited { void OnPassengerExited(Actor self, Actor passenger); } public interface INotifyPassengerExited { void OnPassengerExited(Actor self, Actor passenger); }
[RequireExplicitImplementation]
public interface INotifyEnteredCargo { void OnEnteredCargo(Actor self, Actor cargo); }
[RequireExplicitImplementation]
public interface INotifyExitedCargo { void OnExitedCargo(Actor self, Actor cargo); }
[RequireExplicitImplementation] [RequireExplicitImplementation]
public interface IObservesVariablesInfo : ITraitInfo { } public interface IObservesVariablesInfo : ITraitInfo { }