Introduce FirstEnabledConditionalTraitOrDefault

This commit is contained in:
abcdefg30
2022-10-09 22:56:40 +02:00
committed by Gustas
parent 858d782af1
commit 75f642bd09
6 changed files with 27 additions and 7 deletions

View File

@@ -538,6 +538,26 @@ namespace OpenRA
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)
{
return new LineSplitEnumerator(str.AsSpan(), separator);

View File

@@ -37,7 +37,7 @@ namespace OpenRA.Mods.Cnc.Scripting
}
var cs = actor.TraitsImplementing<Chronoshiftable>()
.FirstEnabledTraitOrDefault();
.FirstEnabledConditionalTraitOrDefault();
if (cs != null && cs.CanChronoshiftTo(actor, cell))
cs.Teleport(actor, cell, duration, killCargo, Self);

View File

@@ -90,7 +90,7 @@ namespace OpenRA.Mods.Cnc.Traits
foreach (var target in UnitsInRange(order.ExtraLocation))
{
var cs = target.TraitsImplementing<Chronoshiftable>()
.FirstEnabledTraitOrDefault();
.FirstEnabledConditionalTraitOrDefault();
if (cs == null)
continue;

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Scripting
public void Demolish(Actor target)
{
// NB: Scripted actions get no visible targetlines.
var demolition = demolitions.FirstEnabledTraitOrDefault();
var demolition = demolitions.FirstEnabledConditionalTraitOrDefault();
if (demolition != null)
Self.QueueActivity(demolition.GetDemolishActivity(Self, Target.FromActor(target), null));
}

View File

@@ -185,7 +185,7 @@ namespace OpenRA.Mods.Common.Scripting
{
get
{
var tooltip = tooltips.FirstEnabledTraitOrDefault();
var tooltip = tooltips.FirstEnabledConditionalTraitOrDefault();
return tooltip?.Info.Name;
}

View File

@@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Traits.Render
if (token == Actor.InvalidConditionToken)
token = self.GrantCondition(info.Condition);
var wsb = wsbs.FirstEnabledTraitOrDefault();
var wsb = wsbs.FirstEnabledConditionalTraitOrDefault();
if (wsb == null)
return;
@@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits.Render
if (token == Actor.InvalidConditionToken)
token = self.GrantCondition(info.Condition);
var wsb = wsbs.FirstEnabledTraitOrDefault();
var wsb = wsbs.FirstEnabledConditionalTraitOrDefault();
if (wsb == null)
return;
@@ -117,7 +117,7 @@ namespace OpenRA.Mods.Common.Traits.Render
// (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.
// 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);