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(); } }