Fix MCV deploy erasing Iron Curtain history.

This commit is contained in:
Paul Chote
2018-07-03 22:11:20 +00:00
parent d5399aaf6b
commit fd49e487ec
5 changed files with 76 additions and 2 deletions

View File

@@ -159,6 +159,7 @@
<Compile Include="Traits\Attack\AttackTDGunboatTurreted.cs" /> <Compile Include="Traits\Attack\AttackTDGunboatTurreted.cs" />
<Compile Include="Traits\GpsDot.cs" /> <Compile Include="Traits\GpsDot.cs" />
<Compile Include="Traits\ConyardChronoReturn.cs" /> <Compile Include="Traits\ConyardChronoReturn.cs" />
<Compile Include="Traits\TransferTimedExternalConditionOnTransform.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj"> <ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj">

View File

@@ -0,0 +1,64 @@
#region Copyright & License Information
/*
* Copyright 2007-2018 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using System.Linq;
using OpenRA.Mods.Common.Traits;
using OpenRA.Traits;
namespace OpenRA.Mods.Cnc.Traits
{
[Desc("A special case trait that re-grants a timed external condition when this actor transforms.",
"This trait does not work with permanently granted external conditions.",
"This trait changes the external condition source, so cannot be used for conditions that may later be revoked")]
public class TransferTimedExternalConditionOnTransformInfo : ITraitInfo, Requires<TransformsInfo>
{
[FieldLoader.Require]
[Desc("External condition to transfer")]
public readonly string Condition = null;
public object Create(ActorInitializer init) { return new TransferTimedExternalConditionOnTransform(this); }
}
public class TransferTimedExternalConditionOnTransform : IConditionTimerWatcher, INotifyTransform
{
readonly TransferTimedExternalConditionOnTransformInfo info;
int duration = 0;
int remaining = 0;
public TransferTimedExternalConditionOnTransform(TransferTimedExternalConditionOnTransformInfo info)
{
this.info = info;
}
void INotifyTransform.BeforeTransform(Actor self) { }
void INotifyTransform.OnTransform(Actor self) { }
void INotifyTransform.AfterTransform(Actor toActor)
{
if (remaining <= 0)
return;
var external = toActor.TraitsImplementing<ExternalCondition>()
.FirstOrDefault(t => t.Info.Condition == info.Condition && t.CanGrantCondition(toActor, this));
if (external != null)
external.GrantCondition(toActor, this, duration, remaining);
}
void IConditionTimerWatcher.Update(int duration, int remaining)
{
this.duration = duration;
this.remaining = remaining;
}
string IConditionTimerWatcher.Condition { get { return info.Condition; } }
}
}

View File

@@ -91,7 +91,7 @@ namespace OpenRA.Mods.Common.Traits
return true; return true;
} }
public int GrantCondition(Actor self, object source, int duration = 0) public int GrantCondition(Actor self, object source, int duration = 0, int remaining = 0)
{ {
if (!CanGrantCondition(self, source)) if (!CanGrantCondition(self, source))
return ConditionManager.InvalidConditionToken; return ConditionManager.InvalidConditionToken;
@@ -100,6 +100,11 @@ namespace OpenRA.Mods.Common.Traits
HashSet<int> permanent; HashSet<int> permanent;
permanentTokens.TryGetValue(source, out permanent); permanentTokens.TryGetValue(source, out permanent);
// Callers can override the amount of time remaining by passing a value
// between 1 and the duration
if (remaining <= 0 || remaining > duration)
remaining = duration;
if (duration > 0) if (duration > 0)
{ {
// Check level caps // Check level caps
@@ -137,7 +142,7 @@ namespace OpenRA.Mods.Common.Traits
} }
} }
var timedToken = new TimedToken(token, self, source, duration); var timedToken = new TimedToken(token, self, source, remaining);
var index = timedTokens.FindIndex(t => t.Expires >= timedToken.Expires); var index = timedTokens.FindIndex(t => t.Expires >= timedToken.Expires);
if (index >= 0) if (index >= 0)
timedTokens.Insert(index, timedToken); timedTokens.Insert(index, timedToken);

View File

@@ -1136,6 +1136,8 @@ FACT:
ConyardChronoReturn: ConyardChronoReturn:
Condition: chrono-vortex Condition: chrono-vortex
Damage: 950 Damage: 950
TransferTimedExternalConditionOnTransform:
Condition: invulnerability
PROC: PROC:
Inherits: ^Building Inherits: ^Building

View File

@@ -368,6 +368,8 @@ MCV:
Actor: MCV.Husk Actor: MCV.Husk
OwnerType: InternalName OwnerType: InternalName
EffectiveOwnerFromOwner: true EffectiveOwnerFromOwner: true
TransferTimedExternalConditionOnTransform:
Condition: invulnerability
JEEP: JEEP:
Inherits: ^Vehicle Inherits: ^Vehicle