Add UndeployOnPickup to GrantConditionOnDeploy.

This commit is contained in:
Paul Chote
2019-10-12 11:12:19 +01:00
committed by reaperrr
parent 69970d42f3
commit 5f8fa7a35a
2 changed files with 26 additions and 2 deletions

View File

@@ -9,7 +9,7 @@
*/
#endregion
using OpenRA.Mods.Common.Activities;
using System.Linq;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
@@ -37,6 +37,11 @@ namespace OpenRA.Mods.Common.Traits
public enum LockResponse { Success, Pending, Failed }
public interface IDelayCarryallPickup
{
bool TryLockForPickup(Actor self, Actor carrier);
}
public class Carryable : ConditionalTrait<CarryableInfo>
{
ConditionManager conditionManager;
@@ -45,6 +50,7 @@ namespace OpenRA.Mods.Common.Traits
int lockedToken = ConditionManager.InvalidConditionToken;
Mobile mobile;
IDelayCarryallPickup[] delayPickups;
public Actor Carrier { get; private set; }
public bool Reserved { get { return state != State.Free; } }
@@ -62,6 +68,7 @@ namespace OpenRA.Mods.Common.Traits
{
conditionManager = self.Trait<ConditionManager>();
mobile = self.TraitOrDefault<Mobile>();
delayPickups = self.TraitsImplementing<IDelayCarryallPickup>().ToArray();
base.Created(self);
}
@@ -121,6 +128,9 @@ namespace OpenRA.Mods.Common.Traits
if (state == State.Locked && Carrier != carrier)
return LockResponse.Failed;
if (delayPickups.Any(d => d.IsTraitEnabled() && !d.TryLockForPickup(self, carrier)))
return LockResponse.Pending;
if (state != State.Locked)
{
state = State.Locked;

View File

@@ -58,6 +58,9 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Undeploy before the actor tries to move?")]
public readonly bool UndeployOnMove = false;
[Desc("Undeploy before the actor is picked up by a Carryall?")]
public readonly bool UndeployOnPickup = false;
[VoiceReference]
public readonly string Voice = "Action";
@@ -87,7 +90,7 @@ namespace OpenRA.Mods.Common.Traits
public enum DeployState { Undeployed, Deploying, Deployed, Undeploying }
public class GrantConditionOnDeploy : PausableConditionalTrait<GrantConditionOnDeployInfo>, IResolveOrder, IIssueOrder,
INotifyDeployComplete, IIssueDeployOrder, IOrderVoice, IWrapMove
INotifyDeployComplete, IIssueDeployOrder, IOrderVoice, IWrapMove, IDelayCarryallPickup
{
readonly Actor self;
readonly bool checkTerrainType;
@@ -157,6 +160,17 @@ namespace OpenRA.Mods.Common.Traits
return activity;
}
bool IDelayCarryallPickup.TryLockForPickup(Actor self, Actor carrier)
{
if (!Info.UndeployOnPickup || deployState == DeployState.Undeployed || IsTraitDisabled)
return true;
if (deployState == DeployState.Deployed && !IsTraitPaused)
Undeploy();
return false;
}
IEnumerable<IOrderTargeter> IIssueOrder.Orders
{
get