Rename Explodes to FireWarheadsOnDeath

This commit is contained in:
Gustas
2024-08-26 22:42:26 +03:00
committed by abcdefg30
parent 29c4aebe19
commit c050b211eb
2 changed files with 14 additions and 15 deletions

View File

@@ -21,7 +21,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Cnc.Traits namespace OpenRA.Mods.Cnc.Traits
{ {
sealed class MadTankInfo : TraitInfo, IRulesetLoaded, Requires<ExplodesInfo>, Requires<WithFacingSpriteBodyInfo> sealed class MadTankInfo : TraitInfo, IRulesetLoaded, Requires<FireWarheadsOnDeathInfo>, Requires<WithFacingSpriteBodyInfo>
{ {
[SequenceReference] [SequenceReference]
public readonly string ThumpSequence = "piston"; public readonly string ThumpSequence = "piston";

View File

@@ -20,8 +20,8 @@ namespace OpenRA.Mods.Common.Traits
public enum DamageSource { Self, Killer } public enum DamageSource { Self, Killer }
[Desc("This actor explodes when killed.")] [Desc("This actor fires warheads when killed.")]
public class ExplodesInfo : ConditionalTraitInfo, Requires<IHealthInfo> public class FireWarheadsOnDeathInfo : ConditionalTraitInfo, Requires<IHealthInfo>
{ {
[WeaponReference] [WeaponReference]
[FieldLoader.Require] [FieldLoader.Require]
@@ -58,7 +58,7 @@ namespace OpenRA.Mods.Common.Traits
public WeaponInfo WeaponInfo { get; private set; } public WeaponInfo WeaponInfo { get; private set; }
public WeaponInfo EmptyWeaponInfo { get; private set; } public WeaponInfo EmptyWeaponInfo { get; private set; }
public override object Create(ActorInitializer init) { return new Explodes(this, init.Self); } public override object Create(ActorInitializer init) { return new FireWarheadsOnDeath(this, init.Self); }
public override void RulesetLoaded(Ruleset rules, ActorInfo ai) public override void RulesetLoaded(Ruleset rules, ActorInfo ai)
{ {
if (!string.IsNullOrEmpty(Weapon)) if (!string.IsNullOrEmpty(Weapon))
@@ -81,13 +81,13 @@ namespace OpenRA.Mods.Common.Traits
} }
} }
public class Explodes : ConditionalTrait<ExplodesInfo>, INotifyKilled, INotifyDamage public class FireWarheadsOnDeath : ConditionalTrait<FireWarheadsOnDeathInfo>, INotifyKilled, INotifyDamage
{ {
readonly IHealth health; readonly IHealth health;
BuildingInfo buildingInfo; BuildingInfo buildingInfo;
Armament[] armaments; Armament[] armaments;
public Explodes(ExplodesInfo info, Actor self) public FireWarheadsOnDeath(FireWarheadsOnDeathInfo info, Actor self)
: base(info) : base(info)
{ {
health = self.Trait<IHealth>(); health = self.Trait<IHealth>();
@@ -122,16 +122,15 @@ namespace OpenRA.Mods.Common.Traits
if (Info.Type == ExplosionType.Footprint && buildingInfo != null) if (Info.Type == ExplosionType.Footprint && buildingInfo != null)
{ {
var cells = buildingInfo.OccupiedTiles(self.Location); foreach (var c in buildingInfo.OccupiedTiles(self.Location))
foreach (var c in cells)
weapon.Impact(Target.FromPos(self.World.Map.CenterOfCell(c) + Info.Offset), source); weapon.Impact(Target.FromPos(self.World.Map.CenterOfCell(c) + Info.Offset), source);
return;
} }
else
// Use .FromPos since this actor is killed. Cannot use Target.FromActor {
// Use .FromPos since this actor is killed. Cannot use Target.FromActor.
weapon.Impact(Target.FromPos(self.CenterPosition + Info.Offset), source); weapon.Impact(Target.FromPos(self.CenterPosition + Info.Offset), source);
} }
}
WeaponInfo ChooseWeaponForExplosion(Actor self) WeaponInfo ChooseWeaponForExplosion(Actor self)
{ {
@@ -140,7 +139,7 @@ namespace OpenRA.Mods.Common.Traits
else if (self.World.SharedRandom.Next(100) > Info.LoadedChance) else if (self.World.SharedRandom.Next(100) > Info.LoadedChance)
return Info.EmptyWeaponInfo; return Info.EmptyWeaponInfo;
// PERF: Avoid LINQ // PERF: Avoid LINQ.
foreach (var a in armaments) foreach (var a in armaments)
if (!a.IsReloading) if (!a.IsReloading)
return Info.WeaponInfo; return Info.WeaponInfo;
@@ -156,7 +155,7 @@ namespace OpenRA.Mods.Common.Traits
if (!Info.DeathTypes.IsEmpty && !e.Damage.DamageTypes.Overlaps(Info.DeathTypes)) if (!Info.DeathTypes.IsEmpty && !e.Damage.DamageTypes.Overlaps(Info.DeathTypes))
return; return;
// Cast to long to avoid overflow when multiplying by the health // Cast to long to avoid overflow when multiplying by the health.
var source = Info.DamageSource == DamageSource.Self ? self : e.Attacker; var source = Info.DamageSource == DamageSource.Self ? self : e.Attacker;
if (health.HP * 100L < Info.DamageThreshold * (long)health.MaxHP) if (health.HP * 100L < Info.DamageThreshold * (long)health.MaxHP)
self.World.AddFrameEndTask(w => self.Kill(source, e.Damage.DamageTypes)); self.World.AddFrameEndTask(w => self.Kill(source, e.Damage.DamageTypes));