Fix RCS1061

This commit is contained in:
RoosterDragon
2023-03-18 12:16:52 +00:00
committed by Gustas
parent 5d91b678bb
commit 4dd787be13
32 changed files with 167 additions and 210 deletions

View File

@@ -980,6 +980,9 @@ dotnet_diagnostic.RCS1058.severity = warning
# Avoid locking on publicly accessible instance. # Avoid locking on publicly accessible instance.
dotnet_diagnostic.RCS1059.severity = warning dotnet_diagnostic.RCS1059.severity = warning
# Merge 'if' with nested 'if'.
dotnet_diagnostic.RCS1061.severity = warning
# Remove empty 'finally' clause. # Remove empty 'finally' clause.
dotnet_diagnostic.RCS1066.severity = warning dotnet_diagnostic.RCS1066.severity = warning

View File

@@ -195,11 +195,11 @@ namespace OpenRA
if (value != null) if (value != null)
{ {
var parts = value.Split(SplitComma); var parts = value.Split(SplitComma);
if (parts.Length == 3) if (parts.Length == 3
{ && WDist.TryParse(parts[0], out var rx)
if (WDist.TryParse(parts[0], out var rx) && WDist.TryParse(parts[1], out var ry) && WDist.TryParse(parts[2], out var rz)) && WDist.TryParse(parts[1], out var ry)
return new WVec(rx, ry, rz); && WDist.TryParse(parts[2], out var rz))
} return new WVec(rx, ry, rz);
} }
return InvalidValueAction(value, fieldType, fieldName); return InvalidValueAction(value, fieldType, fieldName);
@@ -219,8 +219,8 @@ namespace OpenRA
for (var i = 0; i < vecs.Length; ++i) for (var i = 0; i < vecs.Length; ++i)
{ {
if (WDist.TryParse(parts[3 * i], out var rx) if (WDist.TryParse(parts[3 * i], out var rx)
&& WDist.TryParse(parts[3 * i + 1], out var ry) && WDist.TryParse(parts[3 * i + 1], out var ry)
&& WDist.TryParse(parts[3 * i + 2], out var rz)) && WDist.TryParse(parts[3 * i + 2], out var rz))
vecs[i] = new WVec(rx, ry, rz); vecs[i] = new WVec(rx, ry, rz);
} }
@@ -235,13 +235,11 @@ namespace OpenRA
if (value != null) if (value != null)
{ {
var parts = value.Split(SplitComma); var parts = value.Split(SplitComma);
if (parts.Length == 3) if (parts.Length == 3
{ && WDist.TryParse(parts[0], out var rx)
if (WDist.TryParse(parts[0], out var rx) && WDist.TryParse(parts[1], out var ry)
&& WDist.TryParse(parts[1], out var ry) && WDist.TryParse(parts[2], out var rz))
&& WDist.TryParse(parts[2], out var rz)) return new WPos(rx, ry, rz);
return new WPos(rx, ry, rz);
}
} }
return InvalidValueAction(value, fieldType, fieldName); return InvalidValueAction(value, fieldType, fieldName);
@@ -259,13 +257,11 @@ namespace OpenRA
if (value != null) if (value != null)
{ {
var parts = value.Split(SplitComma); var parts = value.Split(SplitComma);
if (parts.Length == 3) if (parts.Length == 3
{ && Exts.TryParseInt32Invariant(parts[0], out var rr)
if (Exts.TryParseInt32Invariant(parts[0], out var rr) && Exts.TryParseInt32Invariant(parts[1], out var rp)
&& Exts.TryParseInt32Invariant(parts[1], out var rp) && Exts.TryParseInt32Invariant(parts[2], out var ry))
&& Exts.TryParseInt32Invariant(parts[2], out var ry)) return new WRot(new WAngle(rr), new WAngle(rp), new WAngle(ry));
return new WRot(new WAngle(rr), new WAngle(rp), new WAngle(ry));
}
} }
return InvalidValueAction(value, fieldType, fieldName); return InvalidValueAction(value, fieldType, fieldName);

View File

@@ -226,14 +226,11 @@ namespace OpenRA.FileSystem
public bool TryOpen(string filename, out Stream s) public bool TryOpen(string filename, out Stream s)
{ {
var explicitSplit = filename.IndexOf('|'); var explicitSplit = filename.IndexOf('|');
if (explicitSplit > 0) if (explicitSplit > 0 && explicitMounts.TryGetValue(filename[..explicitSplit], out var explicitPackage))
{ {
if (explicitMounts.TryGetValue(filename[..explicitSplit], out var explicitPackage)) s = explicitPackage.GetStream(filename[(explicitSplit + 1)..]);
{ if (s != null)
s = explicitPackage.GetStream(filename[(explicitSplit + 1)..]); return true;
if (s != null)
return true;
}
} }
s = GetFromCache(filename); s = GetFromCache(filename);
@@ -262,10 +259,10 @@ namespace OpenRA.FileSystem
public bool Exists(string filename) public bool Exists(string filename)
{ {
var explicitSplit = filename.IndexOf('|'); var explicitSplit = filename.IndexOf('|');
if (explicitSplit > 0) if (explicitSplit > 0 &&
if (explicitMounts.TryGetValue(filename[..explicitSplit], out var explicitPackage)) explicitMounts.TryGetValue(filename[..explicitSplit], out var explicitPackage) &&
if (explicitPackage.Contains(filename[(explicitSplit + 1)..])) explicitPackage.Contains(filename[(explicitSplit + 1)..]))
return true; return true;
return fileIndex.ContainsKey(filename); return fileIndex.ContainsKey(filename);
} }

View File

@@ -169,9 +169,8 @@ namespace OpenRA.Network
} }
// Games advertised using the old API calculated the play time locally // Games advertised using the old API calculated the play time locally
if (State == 2 && PlayTime < 0) if (State == 2 && PlayTime < 0 && DateTime.TryParse(Started, out var startTime))
if (DateTime.TryParse(Started, out var startTime)) PlayTime = (int)(DateTime.UtcNow - startTime).TotalSeconds;
PlayTime = (int)(DateTime.UtcNow - startTime).TotalSeconds;
var externalKey = ExternalMod.MakeKey(Mod, Version); var externalKey = ExternalMod.MakeKey(Mod, Version);
if (Game.ExternalMods.TryGetValue(externalKey, out var external) && external.Version == Version) if (Game.ExternalMods.TryGetValue(externalKey, out var external) && external.Version == Version)

View File

@@ -40,13 +40,10 @@ namespace OpenRA.Scripting
t = nullable; t = nullable;
// Value wraps a CLR object // Value wraps a CLR object
if (value.TryGetClrObject(out var temp)) if (value.TryGetClrObject(out var temp) && temp.GetType() == t)
{ {
if (temp.GetType() == t) clrObject = temp;
{ return true;
clrObject = temp;
return true;
}
} }
if (value is LuaNil && !t.IsValueType) if (value is LuaNil && !t.IsValueType)

View File

@@ -153,9 +153,8 @@ namespace OpenRA.Server
return; return;
// Regularly check player ping // Regularly check player ping
if (lastPingSent.ElapsedMilliseconds > 1000) if (lastPingSent.ElapsedMilliseconds > 1000 && TrySendData(CreatePingFrame()))
if (TrySendData(CreatePingFrame())) lastPingSent.Restart();
lastPingSent.Restart();
// Send all data immediately, we will block again on read // Send all data immediately, we will block again on read
while (sendQueue.TryTake(out var data, 0)) while (sendQueue.TryTake(out var data, 0))

View File

@@ -750,13 +750,11 @@ namespace OpenRA.Support
public void Push(Expression expression, ExpressionType type) public void Push(Expression expression, ExpressionType type)
{ {
expressions.Add(expression); expressions.Add(expression);
if (type == ExpressionType.Int) if (type == ExpressionType.Int && expression.Type != typeof(int))
if (expression.Type != typeof(int)) throw new InvalidOperationException($"Expected System.Int type instead of {expression.Type} for {expression}");
throw new InvalidOperationException($"Expected System.Int type instead of {expression.Type} for {expression}");
if (type == ExpressionType.Bool) if (type == ExpressionType.Bool && expression.Type != typeof(bool))
if (expression.Type != typeof(bool)) throw new InvalidOperationException($"Expected System.Boolean type instead of {expression.Type} for {expression}");
throw new InvalidOperationException($"Expected System.Boolean type instead of {expression.Type} for {expression}");
types.Add(type); types.Add(type);
} }

View File

@@ -312,9 +312,8 @@ namespace OpenRA.Widgets
return true; return true;
foreach (var child in Children) foreach (var child in Children)
if (child.IsVisible()) if (child.IsVisible() && child.EventBoundsContains(location))
if (child.EventBoundsContains(location)) return true;
return true;
return false; return false;
} }

View File

@@ -378,11 +378,8 @@ namespace OpenRA.Mods.Cnc.FileFormats
if (tmp > 0) if (tmp > 0)
{ {
MulBignumWord(esi, globOne, tmp, 2 * len); MulBignumWord(esi, globOne, tmp, 2 * len);
if ((*edi & 0x8000) == 0) if ((*edi & 0x8000) == 0 && SubBigNum((uint*)esi, (uint*)esi, g1, 0, (int)len) != 0)
{ (*edi)--;
if (SubBigNum((uint*)esi, (uint*)esi, g1, 0, (int)len) != 0)
(*edi)--;
}
} }
} }

View File

@@ -235,10 +235,9 @@ namespace OpenRA.Mods.Cnc.FileSystem
} }
// Load the global mix database // Load the global mix database
if (globalFilenames == null) if (globalFilenames == null && context.TryOpen("global mix database.dat", out var mixDatabase))
if (context.TryOpen("global mix database.dat", out var mixDatabase)) using (var db = new XccGlobalDatabase(mixDatabase))
using (var db = new XccGlobalDatabase(mixDatabase)) globalFilenames = db.Entries.ToHashSet().ToArray();
globalFilenames = db.Entries.ToHashSet().ToArray();
package = new MixFile(s, filename, globalFilenames ?? Array.Empty<string>()); package = new MixFile(s, filename, globalFilenames ?? Array.Empty<string>());
return true; return true;

View File

@@ -60,14 +60,11 @@ namespace OpenRA.Mods.Cnc.Graphics
var tilesetNode = node.Value.NodeWithKeyOrDefault(tileset); var tilesetNode = node.Value.NodeWithKeyOrDefault(tileset);
if (tilesetNode != null) if (tilesetNode != null)
{ {
if (frames == null) if (frames == null && LoadField<string>("Length", null, data) != "*")
{ {
if (LoadField<string>("Length", null, data) != "*") var subStart = LoadField("Start", 0, data);
{ var subLength = LoadField("Length", 1, data);
var subStart = LoadField("Start", 0, data); frames = Exts.MakeArray(subLength, i => subStart + i);
var subLength = LoadField("Length", 1, data);
frames = Exts.MakeArray(subLength, i => subStart + i);
}
} }
return new[] { new ReservationInfo(tilesetNode.Value.Value, frames, frames, tilesetNode.Location) }; return new[] { new ReservationInfo(tilesetNode.Value.Value, frames, frames, tilesetNode.Location) };

View File

@@ -203,13 +203,10 @@ namespace OpenRA.Mods.Cnc.Traits
mad.initiated = true; mad.initiated = true;
} }
if (++ticks % mad.info.ThumpInterval == 0) if (++ticks % mad.info.ThumpInterval == 0 && mad.info.ThumpDamageWeapon != null)
{ {
if (mad.info.ThumpDamageWeapon != null) // Use .FromPos since this weapon needs to affect more than just the MadTank actor
{ mad.info.ThumpDamageWeaponInfo.Impact(Target.FromPos(self.CenterPosition), self);
// Use .FromPos since this weapon needs to affect more than just the MadTank actor
mad.info.ThumpDamageWeaponInfo.Impact(Target.FromPos(self.CenterPosition), self);
}
} }
if (ticks == mad.info.ChargeDelay) if (ticks == mad.info.ChargeDelay)

View File

@@ -441,14 +441,12 @@ namespace OpenRA.Mods.Cnc.UtilityCommands
// Only import the top-left cell of multi-celled overlays // Only import the top-left cell of multi-celled overlays
// Returning true here means this is a part of a bigger overlay that has already been handled. // Returning true here means this is a part of a bigger overlay that has already been handled.
var aboveType = overlayPack[overlayIndex[cell - new CVec(1, 0)]]; var aboveType = overlayPack[overlayIndex[cell - new CVec(1, 0)]];
if (shape.Width > 1 && aboveType != 0xFF) if (shape.Width > 1 && aboveType != 0xFF && OverlayToActor.TryGetValue(aboveType, out var a) && a == actorType)
if (OverlayToActor.TryGetValue(aboveType, out var a) && a == actorType) return true;
return true;
var leftType = overlayPack[overlayIndex[cell - new CVec(0, 1)]]; var leftType = overlayPack[overlayIndex[cell - new CVec(0, 1)]];
if (shape.Height > 1 && leftType != 0xFF) if (shape.Height > 1 && leftType != 0xFF && OverlayToActor.TryGetValue(leftType, out var l) && l == actorType)
if (OverlayToActor.TryGetValue(leftType, out var a) && a == actorType) return true;
return true;
} }
actorReference = new ActorReference(actorType) actorReference = new ActorReference(actorType)

View File

@@ -282,14 +282,12 @@ namespace OpenRA.Mods.Cnc.UtilityCommands
// Only import the top-left cell of multi-celled overlays // Only import the top-left cell of multi-celled overlays
// Returning true here means this is a part of a bigger overlay that has already been handled. // Returning true here means this is a part of a bigger overlay that has already been handled.
var aboveType = overlayPack[overlayIndex[cell - new CVec(1, 0)]]; var aboveType = overlayPack[overlayIndex[cell - new CVec(1, 0)]];
if (shape.Width > 1 && aboveType != 0xFF) if (shape.Width > 1 && aboveType != 0xFF && OverlayToActor.TryGetValue(aboveType, out var a) && a == actorType)
if (OverlayToActor.TryGetValue(aboveType, out var a) && a == actorType) return true;
return true;
var leftType = overlayPack[overlayIndex[cell - new CVec(0, 1)]]; var leftType = overlayPack[overlayIndex[cell - new CVec(0, 1)]];
if (shape.Height > 1 && leftType != 0xFF) if (shape.Height > 1 && leftType != 0xFF && OverlayToActor.TryGetValue(leftType, out var l) && l == actorType)
if (OverlayToActor.TryGetValue(leftType, out var a) && a == actorType) return true;
return true;
} }
// Fix position of vein hole actors. // Fix position of vein hole actors.

View File

@@ -58,14 +58,11 @@ namespace OpenRA.Mods.Common.Graphics
var tilesetNode = node.Value.NodeWithKeyOrDefault(tileset); var tilesetNode = node.Value.NodeWithKeyOrDefault(tileset);
if (tilesetNode != null) if (tilesetNode != null)
{ {
if (frames == null) if (frames == null && LoadField<string>("Length", null, data) != "*")
{ {
if (LoadField<string>("Length", null, data) != "*") var subStart = LoadField("Start", 0, data);
{ var subLength = LoadField("Length", 1, data);
var subStart = LoadField("Start", 0, data); frames = Exts.MakeArray(subLength, i => subStart + i);
var subLength = LoadField("Length", 1, data);
frames = Exts.MakeArray(subLength, i => subStart + i);
}
} }
return new[] { new ReservationInfo(tilesetNode.Value.Value, frames, frames, tilesetNode.Location) }; return new[] { new ReservationInfo(tilesetNode.Value.Value, frames, frames, tilesetNode.Location) };

View File

@@ -109,9 +109,10 @@ namespace OpenRA.Mods.Common.Lint
} }
foreach (var n in node.Value.Nodes) foreach (var n in node.Value.Nodes)
if (checkArgKeys.Contains(n.Key)) if (checkArgKeys.Contains(n.Key) &&
if (!namedKeys.Contains(n.Value.Value) && !Hotkey.TryParse(n.Value.Value, out var unused)) !namedKeys.Contains(n.Value.Value) &&
emitError($"{filename} {node.Value.Value}:{n.Key} refers to a Key named `{n.Value.Value}` that does not exist."); !Hotkey.TryParse(n.Value.Value, out var unused))
emitError($"{filename} {node.Value.Value}:{n.Key} refers to a Key named `{n.Value.Value}` that does not exist.");
} }
if (node.Value.Nodes != null) if (node.Value.Nodes != null)

View File

@@ -40,9 +40,8 @@ namespace OpenRA.Mods.Common.Lint
if (!playerNames.Contains(ownerName)) if (!playerNames.Contains(ownerName))
emitError($"Actor `{kv.Key}` is owned by unknown player `{ownerName}`."); emitError($"Actor `{kv.Key}` is owned by unknown player `{ownerName}`.");
if (actorsWithRequiredOwner.TryGetValue(kv.Value.Value, out var info)) if (actorsWithRequiredOwner.TryGetValue(kv.Value.Value, out var info) && !info.ValidOwnerNames.Contains(ownerName))
if (!info.ValidOwnerNames.Contains(ownerName)) emitError($"Actor `{kv.Key}` owner `{ownerName}` is not one of ValidOwnerNames: {info.ValidOwnerNames.JoinWith(", ")}");
emitError($"Actor `{kv.Key}` owner `{ownerName}` is not one of ValidOwnerNames: {info.ValidOwnerNames.JoinWith(", ")}");
} }
} }
} }

View File

@@ -256,9 +256,9 @@ namespace OpenRA.Mods.Common.Lint
if (element is Placeable placeable) if (element is Placeable placeable)
{ {
var expression = placeable.Expression; var expression = placeable.Expression;
if (expression is IInlineExpression inlineExpression) if (expression is IInlineExpression inlineExpression &&
if (inlineExpression is VariableReference variableReference) inlineExpression is VariableReference variableReference)
CheckVariableReference(variableReference.Id.Name.ToString(), key, attribute, emitWarning, file); CheckVariableReference(variableReference.Id.Name.ToString(), key, attribute, emitWarning, file);
if (expression is SelectExpression selectExpression) if (expression is SelectExpression selectExpression)
{ {
@@ -269,9 +269,9 @@ namespace OpenRA.Mods.Common.Lint
if (variantElement is Placeable variantPlaceable) if (variantElement is Placeable variantPlaceable)
{ {
var variantExpression = variantPlaceable.Expression; var variantExpression = variantPlaceable.Expression;
if (variantExpression is IInlineExpression variantInlineExpression) if (variantExpression is IInlineExpression variantInlineExpression &&
if (variantInlineExpression is VariableReference variantVariableReference) variantInlineExpression is VariableReference variantVariableReference)
CheckVariableReference(variantVariableReference.Id.Name.ToString(), key, attribute, emitWarning, file); CheckVariableReference(variantVariableReference.Id.Name.ToString(), key, attribute, emitWarning, file);
} }
} }
} }

View File

@@ -377,9 +377,8 @@ namespace OpenRA.Mods.Common.Projectiles
// If the impact position is within any actor's HitShape, we have a direct hit // If the impact position is within any actor's HitShape, we have a direct hit
// PERF: Avoid using TraitsImplementing<HitShape> that needs to find the actor in the trait dictionary. // PERF: Avoid using TraitsImplementing<HitShape> that needs to find the actor in the trait dictionary.
foreach (var targetPos in victim.EnabledTargetablePositions) foreach (var targetPos in victim.EnabledTargetablePositions)
if (targetPos is HitShape h) if (targetPos is HitShape h && h.DistanceFromEdge(victim, pos).Length <= 0)
if (h.DistanceFromEdge(victim, pos).Length <= 0) return true;
return true;
} }
return false; return false;

View File

@@ -94,9 +94,10 @@ namespace OpenRA.Mods.Common.Traits
var pos = self.CenterPosition; var pos = self.CenterPosition;
var armaments = ChooseArmamentsForTarget(target, forceAttack); var armaments = ChooseArmamentsForTarget(target, forceAttack);
foreach (var a in armaments) foreach (var a in armaments)
if (target.IsInRange(pos, a.MaxRange()) && (a.Weapon.MinRange == WDist.Zero || !target.IsInRange(pos, a.Weapon.MinRange))) if (target.IsInRange(pos, a.MaxRange()) &&
if (TargetInFiringArc(self, target, Info.FacingTolerance)) (a.Weapon.MinRange == WDist.Zero || !target.IsInRange(pos, a.Weapon.MinRange)) &&
return true; TargetInFiringArc(self, target, Info.FacingTolerance))
return true;
return false; return false;
} }

View File

@@ -247,13 +247,11 @@ namespace OpenRA.Mods.Common.Traits
a => a.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount)); a => a.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount));
// First priority is to get out of a low power situation // First priority is to get out of a low power situation
if (playerPower != null && playerPower.ExcessPower < minimumExcessPower) if (playerPower != null && playerPower.ExcessPower < minimumExcessPower &&
power != null && power.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount) > 0)
{ {
if (power != null && power.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount) > 0) AIUtils.BotDebug("{0} decided to build {1}: Priority override (low power)", queue.Actor.Owner, power.Name);
{ return power;
AIUtils.BotDebug("{0} decided to build {1}: Priority override (low power)", queue.Actor.Owner, power.Name);
return power;
}
} }
// Next is to build up a strong economy // Next is to build up a strong economy

View File

@@ -34,14 +34,11 @@ namespace OpenRA.Mods.Common.Traits
return; return;
var rb = self.TraitOrDefault<RepairableBuilding>(); var rb = self.TraitOrDefault<RepairableBuilding>();
if (rb != null) if (rb != null && e.DamageState > DamageState.Light && e.PreviousDamageState <= DamageState.Light && !rb.RepairActive)
{ {
if (e.DamageState > DamageState.Light && e.PreviousDamageState <= DamageState.Light && !rb.RepairActive) AIUtils.BotDebug("{0} noticed damage {1} {2}->{3}, repairing.",
{ self.Owner, self, e.PreviousDamageState, e.DamageState);
AIUtils.BotDebug("{0} noticed damage {1} {2}->{3}, repairing.", bot.QueueOrder(new Order("RepairBuilding", self.Owner.PlayerActor, Target.FromActor(self), false));
self.Owner, self, e.PreviousDamageState, e.DamageState);
bot.QueueOrder(new Order("RepairBuilding", self.Owner.PlayerActor, Target.FromActor(self), false));
}
} }
} }
} }

View File

@@ -75,11 +75,13 @@ namespace OpenRA.Mods.Common.Traits
// Timed tokens do not count towards the source cap: the condition with the shortest // Timed tokens do not count towards the source cap: the condition with the shortest
// remaining duration can always be revoked to make room. // remaining duration can always be revoked to make room.
if (Info.SourceCap > 0) if (Info.SourceCap > 0 &&
if (permanentTokens.TryGetValue(source, out var permanentTokensForSource) && permanentTokensForSource.Count >= Info.SourceCap) permanentTokens.TryGetValue(source, out var permanentTokensForSource) &&
return false; permanentTokensForSource.Count >= Info.SourceCap)
return false;
if (Info.TotalCap > 0 && permanentTokens.Values.Sum(t => t.Count) >= Info.TotalCap) if (Info.TotalCap > 0 &&
permanentTokens.Values.Sum(t => t.Count) >= Info.TotalCap)
return false; return false;
return true; return true;

View File

@@ -93,29 +93,34 @@ namespace OpenRA.Mods.Common.Traits
static bool TargetChanged(in Target lastTarget, in Target target) static bool TargetChanged(in Target lastTarget, in Target target)
{ {
// Invalidate reveal changing the target. // Invalidate reveal changing the target.
if (lastTarget.Type == TargetType.FrozenActor && target.Type == TargetType.Actor) if (lastTarget.Type == TargetType.FrozenActor &&
if (lastTarget.FrozenActor.Actor == target.Actor) target.Type == TargetType.Actor &&
return false; lastTarget.FrozenActor.Actor == target.Actor)
return false;
if (lastTarget.Type == TargetType.Actor && target.Type == TargetType.FrozenActor) if (lastTarget.Type == TargetType.Actor &&
if (target.FrozenActor.Actor == lastTarget.Actor) target.Type == TargetType.FrozenActor &&
return false; target.FrozenActor.Actor == lastTarget.Actor)
return false;
if (lastTarget.Type != target.Type) if (lastTarget.Type != target.Type)
return true; return true;
// Invalidate attacking different targets with shared target types. // Invalidate attacking different targets with shared target types.
if (lastTarget.Type == TargetType.Actor && target.Type == TargetType.Actor) if (lastTarget.Type == TargetType.Actor &&
if (lastTarget.Actor != target.Actor) target.Type == TargetType.Actor &&
return true; lastTarget.Actor != target.Actor)
return true;
if (lastTarget.Type == TargetType.FrozenActor && target.Type == TargetType.FrozenActor) if (lastTarget.Type == TargetType.FrozenActor &&
if (lastTarget.FrozenActor != target.FrozenActor) target.Type == TargetType.FrozenActor &&
return true; lastTarget.FrozenActor != target.FrozenActor)
return true;
if (lastTarget.Type == TargetType.Terrain && target.Type == TargetType.Terrain) if (lastTarget.Type == TargetType.Terrain &&
if (lastTarget.CenterPosition != target.CenterPosition) target.Type == TargetType.Terrain &&
return true; lastTarget.CenterPosition != target.CenterPosition)
return true;
return false; return false;
} }

View File

@@ -48,17 +48,16 @@ namespace OpenRA.Mods.Common.Traits
void INotifyDockClient.Docked(Actor self, Actor host) void INotifyDockClient.Docked(Actor self, Actor host)
{ {
if (info.Condition != null && (info.DockHostNames == null || info.DockHostNames.Contains(host.Info.Name))) if (info.Condition != null &&
(info.DockHostNames == null || info.DockHostNames.Contains(host.Info.Name)) &&
token == Actor.InvalidConditionToken)
{ {
if (token == Actor.InvalidConditionToken) if (delayedtoken == Actor.InvalidConditionToken)
token = self.GrantCondition(info.Condition);
else
{ {
if (delayedtoken == Actor.InvalidConditionToken) token = delayedtoken;
token = self.GrantCondition(info.Condition); delayedtoken = Actor.InvalidConditionToken;
else
{
token = delayedtoken;
delayedtoken = Actor.InvalidConditionToken;
}
} }
} }
} }

View File

@@ -48,17 +48,16 @@ namespace OpenRA.Mods.Common.Traits
void INotifyDockHost.Docked(Actor self, Actor client) void INotifyDockHost.Docked(Actor self, Actor client)
{ {
if (info.Condition != null && (info.DockClientNames == null || info.DockClientNames.Contains(client.Info.Name))) if (info.Condition != null &&
(info.DockClientNames == null || info.DockClientNames.Contains(client.Info.Name)) &&
token == Actor.InvalidConditionToken)
{ {
if (token == Actor.InvalidConditionToken) if (delayedtoken == Actor.InvalidConditionToken)
token = self.GrantCondition(info.Condition);
else
{ {
if (delayedtoken == Actor.InvalidConditionToken) token = delayedtoken;
token = self.GrantCondition(info.Condition); delayedtoken = Actor.InvalidConditionToken;
else
{
token = delayedtoken;
delayedtoken = Actor.InvalidConditionToken;
}
} }
} }
} }

View File

@@ -97,15 +97,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var palettePresetRows = 2; var palettePresetRows = 2;
var paletteCustomRows = 1; var paletteCustomRows = 1;
if (logicArgs.TryGetValue("PaletteColumns", out var yaml)) if (logicArgs.TryGetValue("PaletteColumns", out var yaml) && !int.TryParse(yaml.Value, out paletteCols))
if (!int.TryParse(yaml.Value, out paletteCols)) throw new YamlException($"Invalid value for PaletteColumns: {yaml.Value}");
throw new YamlException($"Invalid value for PaletteColumns: {yaml.Value}"); if (logicArgs.TryGetValue("PalettePresetRows", out yaml) && !int.TryParse(yaml.Value, out palettePresetRows))
if (logicArgs.TryGetValue("PalettePresetRows", out yaml)) throw new YamlException($"Invalid value for PalettePresetRows: {yaml.Value}");
if (!int.TryParse(yaml.Value, out palettePresetRows)) if (logicArgs.TryGetValue("PaletteCustomRows", out yaml) && !int.TryParse(yaml.Value, out paletteCustomRows))
throw new YamlException($"Invalid value for PalettePresetRows: {yaml.Value}"); throw new YamlException($"Invalid value for PaletteCustomRows: {yaml.Value}");
if (logicArgs.TryGetValue("PaletteCustomRows", out yaml))
if (!int.TryParse(yaml.Value, out paletteCustomRows))
throw new YamlException($"Invalid value for PaletteCustomRows: {yaml.Value}");
var presetColors = colorManager.PresetColors; var presetColors = colorManager.PresetColors;
for (var j = 0; j < palettePresetRows; j++) for (var j = 0; j < palettePresetRows; j++)

View File

@@ -140,15 +140,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic
} }
// Check for duplicate actor ID // Check for duplicate actor ID
if (!CurrentActor.ID.Equals(actorId, StringComparison.OrdinalIgnoreCase)) if (!CurrentActor.ID.Equals(actorId, StringComparison.OrdinalIgnoreCase) && editorActorLayer[actorId] != null)
{ {
if (editorActorLayer[actorId] != null) nextActorIDStatus = ActorIDStatus.Duplicate;
{ actorIDErrorLabel.Text = TranslationProvider.GetString(DuplicateActorId);
nextActorIDStatus = ActorIDStatus.Duplicate; actorIDErrorLabel.Visible = true;
actorIDErrorLabel.Text = TranslationProvider.GetString(DuplicateActorId); return;
actorIDErrorLabel.Visible = true;
return;
}
} }
SetActorID(actorId); SetActorID(actorId);

View File

@@ -100,27 +100,24 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
badgesVisible = false; badgesVisible = false;
if (localProfile.State == LocalPlayerProfile.LinkState.Linked) if (localProfile.State == LocalPlayerProfile.LinkState.Linked && localProfile.ProfileData.Badges.Count > 0)
{ {
if (localProfile.ProfileData.Badges.Count > 0) Func<int, int> negotiateWidth = _ => widget.Get("PROFILE_HEADER").Bounds.Width;
{
Func<int, int> negotiateWidth = _ => widget.Get("PROFILE_HEADER").Bounds.Width;
// Remove any stale badges that may be left over from a previous session // Remove any stale badges that may be left over from a previous session
badgeContainer.RemoveChildren(); badgeContainer.RemoveChildren();
var badges = Ui.LoadWidget("PLAYER_PROFILE_BADGES_INSERT", badgeContainer, new WidgetArgs() var badges = Ui.LoadWidget("PLAYER_PROFILE_BADGES_INSERT", badgeContainer, new WidgetArgs()
{ {
{ "worldRenderer", worldRenderer }, { "worldRenderer", worldRenderer },
{ "profile", localProfile.ProfileData }, { "profile", localProfile.ProfileData },
{ "negotiateWidth", negotiateWidth } { "negotiateWidth", negotiateWidth }
}); });
if (badges.Bounds.Height > 0) if (badges.Bounds.Height > 0)
{ {
badgeContainer.Bounds.Height = badges.Bounds.Height; badgeContainer.Bounds.Height = badges.Bounds.Height;
badgesVisible = true; badgesVisible = true;
}
} }
} }

View File

@@ -25,9 +25,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var keyhandler = widget.Get<LogicKeyListenerWidget>(parentName); var keyhandler = widget.Get<LogicKeyListenerWidget>(parentName);
keyhandler.AddHandler(e => keyhandler.AddHandler(e =>
{ {
if (e.Event == KeyInputEvent.Down) if (e.Event == KeyInputEvent.Down && namedKey.IsActivatedBy(e))
if (namedKey.IsActivatedBy(e)) return OnHotkeyActivated(e);
return OnHotkeyActivated(e);
return false; return false;
}); });

View File

@@ -107,16 +107,15 @@ namespace OpenRA.Mods.Common.Widgets
if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Up) if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Up)
{ {
if (useClassicMouseStyle && HasMouseFocus) if (useClassicMouseStyle && HasMouseFocus &&
!IsValidDragbox && World.Selection.Actors.Count != 0 &&
!multiClick && uog.InputOverridesSelection(World, mousePos, mi))
{ {
if (!IsValidDragbox && World.Selection.Actors.Count != 0 && !multiClick && uog.InputOverridesSelection(World, mousePos, mi)) // Order units instead of selecting
{ ApplyOrders(World, mi);
// Order units instead of selecting isDragging = false;
ApplyOrders(World, mi); YieldMouseFocus(mi);
isDragging = false; return true;
YieldMouseFocus(mi);
return true;
}
} }
if (multiClick) if (multiClick)

View File

@@ -131,15 +131,12 @@ namespace OpenRA.Platforms.Default
public void Dispose() public void Dispose()
{ {
if (!disposed) if (!disposed && faceHandle.IsAllocated)
{ {
if (faceHandle.IsAllocated) FreeType.FT_Done_Face(face);
{
FreeType.FT_Done_Face(face);
faceHandle.Free(); faceHandle.Free();
disposed = true; disposed = true;
}
} }
} }
} }