From f2b5040d309818d817fa25a3e81e0d75ef0b8ca2 Mon Sep 17 00:00:00 2001 From: Raffael Zica Date: Tue, 3 Oct 2017 20:45:49 +0200 Subject: [PATCH] YamlException is now thrown if WeaponInfo can not be found in Ruleset.Weapons Removed invalid spacing at the end of the line 36 in ThrowsShrapnel Prevented NullReferenceException in cases where weapons aren't optional --- OpenRA.Mods.Cnc/Traits/MadTank.cs | 15 +++++++++++++-- .../Traits/SupportPowers/IonCannonPower.cs | 8 +++++++- OpenRA.Mods.Common/Traits/Air/FallsToEarth.cs | 10 +++++++++- .../Traits/Buildings/GroundLevelBridge.cs | 10 +++++++++- OpenRA.Mods.Common/Traits/Explodes.cs | 19 +++++++++++++++++-- .../Traits/ExplosionOnDamageTransition.cs | 10 +++++++++- .../Traits/SupportPowers/NukePower.cs | 8 +++++++- OpenRA.Mods.Common/Traits/ThrowsShrapnel.cs | 9 ++++++++- 8 files changed, 79 insertions(+), 10 deletions(-) diff --git a/OpenRA.Mods.Cnc/Traits/MadTank.cs b/OpenRA.Mods.Cnc/Traits/MadTank.cs index 8bd499a622..3289221824 100644 --- a/OpenRA.Mods.Cnc/Traits/MadTank.cs +++ b/OpenRA.Mods.Cnc/Traits/MadTank.cs @@ -56,8 +56,19 @@ namespace OpenRA.Mods.Cnc.Traits public object Create(ActorInitializer init) { return new MadTank(init.Self, this); } public void RulesetLoaded(Ruleset rules, ActorInfo ai) { - ThumpDamageWeaponInfo = rules.Weapons[ThumpDamageWeapon.ToLowerInvariant()]; - DetonationWeaponInfo = rules.Weapons[DetonationWeapon.ToLowerInvariant()]; + WeaponInfo thumpDamageWeapon; + WeaponInfo detonationWeapon; + var thumpDamageWeaponToLower = (ThumpDamageWeapon ?? string.Empty).ToLowerInvariant(); + var detonationWeaponToLower = (DetonationWeapon ?? string.Empty).ToLowerInvariant(); + + if (!rules.Weapons.TryGetValue(thumpDamageWeaponToLower, out thumpDamageWeapon)) + throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(thumpDamageWeaponToLower)); + + if (!rules.Weapons.TryGetValue(detonationWeaponToLower, out detonationWeapon)) + throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(detonationWeaponToLower)); + + ThumpDamageWeaponInfo = thumpDamageWeapon; + DetonationWeaponInfo = detonationWeapon; } } diff --git a/OpenRA.Mods.Cnc/Traits/SupportPowers/IonCannonPower.cs b/OpenRA.Mods.Cnc/Traits/SupportPowers/IonCannonPower.cs index b2eaba51bf..526ad72d55 100644 --- a/OpenRA.Mods.Cnc/Traits/SupportPowers/IonCannonPower.cs +++ b/OpenRA.Mods.Cnc/Traits/SupportPowers/IonCannonPower.cs @@ -49,7 +49,13 @@ namespace OpenRA.Mods.Cnc.Traits public override object Create(ActorInitializer init) { return new IonCannonPower(init.Self, this); } public override void RulesetLoaded(Ruleset rules, ActorInfo ai) { - WeaponInfo = rules.Weapons[Weapon.ToLowerInvariant()]; + WeaponInfo weapon; + var weaponToLower = (Weapon ?? string.Empty).ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(weaponToLower, out weapon)) + throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); + + WeaponInfo = weapon; + base.RulesetLoaded(rules, ai); } } diff --git a/OpenRA.Mods.Common/Traits/Air/FallsToEarth.cs b/OpenRA.Mods.Common/Traits/Air/FallsToEarth.cs index 1670e55e61..4ebf09ab94 100644 --- a/OpenRA.Mods.Common/Traits/Air/FallsToEarth.cs +++ b/OpenRA.Mods.Common/Traits/Air/FallsToEarth.cs @@ -30,7 +30,15 @@ namespace OpenRA.Mods.Common.Traits public object Create(ActorInitializer init) { return new FallsToEarth(init.Self, this); } public void RulesetLoaded(Ruleset rules, ActorInfo ai) { - ExplosionWeapon = string.IsNullOrEmpty(Explosion) ? null : rules.Weapons[Explosion.ToLowerInvariant()]; + if (string.IsNullOrEmpty(Explosion)) + return; + + WeaponInfo weapon; + var weaponToLower = Explosion.ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(weaponToLower, out weapon)) + throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); + + ExplosionWeapon = weapon; } } diff --git a/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs b/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs index b91643b381..2e0b601126 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs @@ -30,7 +30,15 @@ namespace OpenRA.Mods.Common.Traits public WeaponInfo DemolishWeaponInfo { get; private set; } - public void RulesetLoaded(Ruleset rules, ActorInfo ai) { DemolishWeaponInfo = rules.Weapons[DemolishWeapon.ToLowerInvariant()]; } + public void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + WeaponInfo weapon; + var weaponToLower = (DemolishWeapon ?? string.Empty).ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(weaponToLower, out weapon)) + throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); + + DemolishWeaponInfo = weapon; + } public object Create(ActorInitializer init) { return new GroundLevelBridge(init.Self, this); } } diff --git a/OpenRA.Mods.Common/Traits/Explodes.cs b/OpenRA.Mods.Common/Traits/Explodes.cs index a8ab0695f0..13647337c2 100644 --- a/OpenRA.Mods.Common/Traits/Explodes.cs +++ b/OpenRA.Mods.Common/Traits/Explodes.cs @@ -50,8 +50,23 @@ namespace OpenRA.Mods.Common.Traits public override object Create(ActorInitializer init) { return new Explodes(this, init.Self); } public override void RulesetLoaded(Ruleset rules, ActorInfo ai) { - WeaponInfo = string.IsNullOrEmpty(Weapon) ? null : rules.Weapons[Weapon.ToLowerInvariant()]; - EmptyWeaponInfo = string.IsNullOrEmpty(EmptyWeapon) ? null : rules.Weapons[EmptyWeapon.ToLowerInvariant()]; + if (!string.IsNullOrEmpty(Weapon)) + { + WeaponInfo weapon; + var weaponToLower = Weapon.ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(weaponToLower, out weapon)) + throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); + WeaponInfo = weapon; + } + + if (!string.IsNullOrEmpty(EmptyWeapon)) + { + WeaponInfo emptyWeapon; + var emptyWeaponToLower = EmptyWeapon.ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(emptyWeaponToLower, out emptyWeapon)) + throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(emptyWeaponToLower)); + EmptyWeaponInfo = emptyWeapon; + } base.RulesetLoaded(rules, ai); } diff --git a/OpenRA.Mods.Common/Traits/ExplosionOnDamageTransition.cs b/OpenRA.Mods.Common/Traits/ExplosionOnDamageTransition.cs index 896751b0e4..b32f974a86 100644 --- a/OpenRA.Mods.Common/Traits/ExplosionOnDamageTransition.cs +++ b/OpenRA.Mods.Common/Traits/ExplosionOnDamageTransition.cs @@ -35,7 +35,15 @@ namespace OpenRA.Mods.Common.Traits public void RulesetLoaded(Ruleset rules, ActorInfo ai) { - WeaponInfo = string.IsNullOrEmpty(Weapon) ? null : rules.Weapons[Weapon.ToLowerInvariant()]; + if (string.IsNullOrEmpty(Weapon)) + return; + + WeaponInfo weapon; + var weaponToLower = Weapon.ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(weaponToLower, out weapon)) + throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); + + WeaponInfo = weapon; } } diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/NukePower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/NukePower.cs index c408cb1cdd..a74f32f153 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/NukePower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/NukePower.cs @@ -80,7 +80,13 @@ namespace OpenRA.Mods.Common.Traits public override object Create(ActorInitializer init) { return new NukePower(init.Self, this); } public override void RulesetLoaded(Ruleset rules, ActorInfo ai) { - WeaponInfo = rules.Weapons[MissileWeapon.ToLowerInvariant()]; + WeaponInfo weapon; + var weaponToLower = (MissileWeapon ?? string.Empty).ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(weaponToLower, out weapon)) + throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); + + WeaponInfo = weapon; + base.RulesetLoaded(rules, ai); } } diff --git a/OpenRA.Mods.Common/Traits/ThrowsShrapnel.cs b/OpenRA.Mods.Common/Traits/ThrowsShrapnel.cs index 1651f3d197..d8d73aa459 100644 --- a/OpenRA.Mods.Common/Traits/ThrowsShrapnel.cs +++ b/OpenRA.Mods.Common/Traits/ThrowsShrapnel.cs @@ -33,7 +33,14 @@ namespace OpenRA.Mods.Common.Traits public object Create(ActorInitializer actor) { return new ThrowsShrapnel(this); } public void RulesetLoaded(Ruleset rules, ActorInfo ai) { - WeaponInfos = Weapons.Select(w => rules.Weapons[w.ToLowerInvariant()]).ToArray(); + WeaponInfos = Weapons.Select(w => + { + WeaponInfo weapon; + var weaponToLower = w.ToLowerInvariant(); + if (!rules.Weapons.TryGetValue(weaponToLower, out weapon)) + throw new YamlException("Weapons Ruleset does not contain an entry '{0}'".F(weaponToLower)); + return weapon; + }).ToArray(); } }