Introduce FirstEnabledConditionalTraitOrDefault
This commit is contained in:
@@ -538,6 +538,26 @@ namespace OpenRA
|
|||||||
return default;
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static T FirstEnabledConditionalTraitOrDefault<T>(this IEnumerable<T> ts) where T : IDisabledTrait
|
||||||
|
{
|
||||||
|
// PERF: Avoid LINQ.
|
||||||
|
foreach (var t in ts)
|
||||||
|
if (!t.IsTraitDisabled)
|
||||||
|
return t;
|
||||||
|
|
||||||
|
return default(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static T FirstEnabledConditionalTraitOrDefault<T>(this T[] ts) where T : IDisabledTrait
|
||||||
|
{
|
||||||
|
// PERF: Avoid LINQ.
|
||||||
|
foreach (var t in ts)
|
||||||
|
if (!t.IsTraitDisabled)
|
||||||
|
return t;
|
||||||
|
|
||||||
|
return default(T);
|
||||||
|
}
|
||||||
|
|
||||||
public static LineSplitEnumerator SplitLines(this string str, char separator)
|
public static LineSplitEnumerator SplitLines(this string str, char separator)
|
||||||
{
|
{
|
||||||
return new LineSplitEnumerator(str.AsSpan(), separator);
|
return new LineSplitEnumerator(str.AsSpan(), separator);
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace OpenRA.Mods.Cnc.Scripting
|
|||||||
}
|
}
|
||||||
|
|
||||||
var cs = actor.TraitsImplementing<Chronoshiftable>()
|
var cs = actor.TraitsImplementing<Chronoshiftable>()
|
||||||
.FirstEnabledTraitOrDefault();
|
.FirstEnabledConditionalTraitOrDefault();
|
||||||
|
|
||||||
if (cs != null && cs.CanChronoshiftTo(actor, cell))
|
if (cs != null && cs.CanChronoshiftTo(actor, cell))
|
||||||
cs.Teleport(actor, cell, duration, killCargo, Self);
|
cs.Teleport(actor, cell, duration, killCargo, Self);
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
foreach (var target in UnitsInRange(order.ExtraLocation))
|
foreach (var target in UnitsInRange(order.ExtraLocation))
|
||||||
{
|
{
|
||||||
var cs = target.TraitsImplementing<Chronoshiftable>()
|
var cs = target.TraitsImplementing<Chronoshiftable>()
|
||||||
.FirstEnabledTraitOrDefault();
|
.FirstEnabledConditionalTraitOrDefault();
|
||||||
|
|
||||||
if (cs == null)
|
if (cs == null)
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Scripting
|
|||||||
public void Demolish(Actor target)
|
public void Demolish(Actor target)
|
||||||
{
|
{
|
||||||
// NB: Scripted actions get no visible targetlines.
|
// NB: Scripted actions get no visible targetlines.
|
||||||
var demolition = demolitions.FirstEnabledTraitOrDefault();
|
var demolition = demolitions.FirstEnabledConditionalTraitOrDefault();
|
||||||
if (demolition != null)
|
if (demolition != null)
|
||||||
Self.QueueActivity(demolition.GetDemolishActivity(Self, Target.FromActor(target), null));
|
Self.QueueActivity(demolition.GetDemolishActivity(Self, Target.FromActor(target), null));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ namespace OpenRA.Mods.Common.Scripting
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
var tooltip = tooltips.FirstEnabledTraitOrDefault();
|
var tooltip = tooltips.FirstEnabledConditionalTraitOrDefault();
|
||||||
|
|
||||||
return tooltip?.Info.Name;
|
return tooltip?.Info.Name;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
if (token == Actor.InvalidConditionToken)
|
if (token == Actor.InvalidConditionToken)
|
||||||
token = self.GrantCondition(info.Condition);
|
token = self.GrantCondition(info.Condition);
|
||||||
|
|
||||||
var wsb = wsbs.FirstEnabledTraitOrDefault();
|
var wsb = wsbs.FirstEnabledConditionalTraitOrDefault();
|
||||||
|
|
||||||
if (wsb == null)
|
if (wsb == null)
|
||||||
return;
|
return;
|
||||||
@@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
if (token == Actor.InvalidConditionToken)
|
if (token == Actor.InvalidConditionToken)
|
||||||
token = self.GrantCondition(info.Condition);
|
token = self.GrantCondition(info.Condition);
|
||||||
|
|
||||||
var wsb = wsbs.FirstEnabledTraitOrDefault();
|
var wsb = wsbs.FirstEnabledConditionalTraitOrDefault();
|
||||||
|
|
||||||
if (wsb == null)
|
if (wsb == null)
|
||||||
return;
|
return;
|
||||||
@@ -117,7 +117,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
// (sell/transform/etc) runs. This causes visual glitches that we attempt to minimize
|
// (sell/transform/etc) runs. This causes visual glitches that we attempt to minimize
|
||||||
// by forcing the animation to frame 0 and regranting the make condition.
|
// by forcing the animation to frame 0 and regranting the make condition.
|
||||||
// These workarounds will break the actor if the followup activity doesn't dispose it!
|
// These workarounds will break the actor if the followup activity doesn't dispose it!
|
||||||
wsbs.FirstEnabledTraitOrDefault()?.DefaultAnimation.PlayFetchIndex(info.Sequence, () => 0);
|
wsbs.FirstEnabledConditionalTraitOrDefault()?.DefaultAnimation.PlayFetchIndex(info.Sequence, () => 0);
|
||||||
|
|
||||||
token = self.GrantCondition(info.Condition);
|
token = self.GrantCondition(info.Condition);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user