diff --git a/OpenRA.Mods.Common/Lint/CheckHitShapes.cs b/OpenRA.Mods.Common/Lint/CheckHitShapes.cs new file mode 100644 index 0000000000..0c781cd6ca --- /dev/null +++ b/OpenRA.Mods.Common/Lint/CheckHitShapes.cs @@ -0,0 +1,38 @@ +#region Copyright & License Information +/* + * Copyright 2007-2017 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; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Lint +{ + class CheckHitShapes : ILintRulesPass + { + public void Run(Action emitError, Action emitWarning, Ruleset rules) + { + foreach (var actorInfo in rules.Actors) + { + if (actorInfo.Key.StartsWith("^", StringComparison.Ordinal)) + continue; + + var health = actorInfo.Value.TraitInfoOrDefault(); + if (health == null) + continue; + + var hitShapes = actorInfo.Value.TraitInfos(); + if (!hitShapes.Any()) + emitError("Actor type `{0}` has a Health trait but no HitShape trait!".F(actorInfo.Key)); + } + } + } +} diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index a36ebcb597..bb3fa18f6a 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -717,6 +717,7 @@ + diff --git a/OpenRA.Mods.Common/Traits/Health.cs b/OpenRA.Mods.Common/Traits/Health.cs index 14384fc9f7..ea313ad329 100644 --- a/OpenRA.Mods.Common/Traits/Health.cs +++ b/OpenRA.Mods.Common/Traits/Health.cs @@ -14,7 +14,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { - public class HealthInfo : ITraitInfo, UsesInit + public class HealthInfo : ITraitInfo, UsesInit, IRulesetLoaded { [Desc("HitPoints")] public readonly int HP = 0; @@ -22,6 +22,12 @@ namespace OpenRA.Mods.Common.Traits public readonly bool NotifyAppliedDamage = true; public virtual object Create(ActorInitializer init) { return new Health(init, this); } + + public void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + if (!ai.HasTraitInfo()) + throw new YamlException("Actors with Health need at least one HitShape trait!"); + } } public class Health : IHealth, ISync, ITick