Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix pillbox not uncloaking upon firing #21214

Merged
merged 2 commits into from
Feb 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Activities/Attack.cs
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ protected virtual void DoAttack(Actor self, AttackFrontal attack, IEnumerable<Ar
{
if (!attack.IsTraitPaused)
foreach (var a in armaments)
a.CheckFire(self, facing, target, false);
a.CheckFire(self, facing, target);
}

void IActivityNotifyStanceChanged.StanceChanged(Actor self, AutoTarget autoTarget, UnitStance oldStance, UnitStance newStance)
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Air/AttackBomber.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ void ITick.Tick(Actor self)
continue;

inAttackRange = true;
a.CheckFire(self, facing, target, false);
a.CheckFire(self, facing, target);
}

// Actors without armaments may want to trigger an action when it passes the target
Expand Down
30 changes: 18 additions & 12 deletions OpenRA.Mods.Common/Traits/Armament.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public class Armament : PausableConditionalTrait<ArmamentInfo>, ITick

BodyOrientation coords;
INotifyBurstComplete[] notifyBurstComplete;
INotifyAttack[] notifyAttacks;
List<(Actor NotifyActor, INotifyAttack Notify)> notifyAttacks;

int conditionToken = Actor.InvalidConditionToken;

Expand Down Expand Up @@ -174,7 +174,7 @@ protected override void Created(Actor self)
hovers = self.TraitOrDefault<Hovers>();
coords = self.Trait<BodyOrientation>();
notifyBurstComplete = self.TraitsImplementing<INotifyBurstComplete>().ToArray();
notifyAttacks = self.TraitsImplementing<INotifyAttack>().ToArray();
notifyAttacks = self.TraitsImplementing<INotifyAttack>().Select(a => (self, a)).ToList();

rangeModifiers = self.TraitsImplementing<IRangeModifier>().ToArray().Select(m => m.GetRangeModifier());
reloadModifiers = self.TraitsImplementing<IReloadModifier>().ToArray().Select(m => m.GetReloadModifier());
Expand All @@ -184,6 +184,16 @@ protected override void Created(Actor self)
base.Created(self);
}

public void AddNotifyAttacks(Actor attacker, INotifyAttack[] notifyAttacks)
{
this.notifyAttacks.AddRange(notifyAttacks.Select(a => (attacker, a)));
}

public void RemoveNotifyAttacks(INotifyAttack[] notifyAttacks)
{
this.notifyAttacks.RemoveAll(pair => notifyAttacks.Any(notify => notify == pair.Notify));
}

void UpdateCondition(Actor self)
{
if (string.IsNullOrEmpty(Info.ReloadingCondition))
Expand Down Expand Up @@ -258,7 +268,7 @@ protected virtual bool CanFire(Actor self, in Target target)

// Note: facing is only used by the legacy positioning code
// The world coordinate model uses Actor.Orientation
public virtual bool CheckFire(Actor self, IFacing facing, in Target target, bool notifyAttacking)
public virtual bool CheckFire(Actor self, IFacing facing, in Target target)
{
if (!CanFire(self, target))
return false;
Expand All @@ -276,10 +286,6 @@ public virtual bool CheckFire(Actor self, IFacing facing, in Target target, bool

FireBarrel(self, facing, target, barrel);
UpdateBurst(self, target);

if (notifyAttacking)
foreach (var notify in notifyAttacks)
notify.Attacking(self, target, this, barrel);
}
while (FireDelay == 0 && CanFire(self, target));

Expand All @@ -288,8 +294,8 @@ public virtual bool CheckFire(Actor self, IFacing facing, in Target target, bool

protected virtual void FireBarrel(Actor self, IFacing facing, in Target target, Barrel barrel)
{
foreach (var na in notifyAttacks)
na.PreparingAttack(self, target, this, barrel);
foreach (var (notifyActor, notify) in notifyAttacks)
notify.PreparingAttack(notifyActor, target, this, barrel);

WPos MuzzlePosition() => self.CenterPosition + MuzzleOffset(self, barrel);
WAngle MuzzleFacing() => MuzzleOrientation(self, barrel).Yaw;
Expand Down Expand Up @@ -347,11 +353,11 @@ protected virtual void FireBarrel(Actor self, IFacing facing, in Target target,
if (burst == args.Weapon.Burst && args.Weapon.StartBurstReport != null && args.Weapon.StartBurstReport.Length > 0)
Game.Sound.Play(SoundType.World, args.Weapon.StartBurstReport, self.World, self.CenterPosition);

foreach (var na in notifyAttacks)
na.Attacking(self, delayedTarget, this, barrel);

Recoil = Info.Recoil;
}

foreach (var (notifyActor, notify) in notifyAttacks)
notify.Attacking(notifyActor, delayedTarget, this, barrel);
PunkPun marked this conversation as resolved.
Show resolved Hide resolved
});
}

Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Common/Traits/Attack/AttackBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ public virtual void DoAttack(Actor self, in Target target)
return;

foreach (var a in Armaments)
a.CheckFire(self, facing, target, false);
a.CheckFire(self, facing, target);
}

IEnumerable<IOrderTargeter> IIssueOrder.Orders
Expand Down
31 changes: 26 additions & 5 deletions OpenRA.Mods.Common/Traits/Attack/AttackGarrisoned.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ public override void RulesetLoaded(Ruleset rules, ActorInfo ai)
public class AttackGarrisoned : AttackFollow, INotifyPassengerEntered, INotifyPassengerExited, IRender
{
public new readonly AttackGarrisonedInfo Info;
INotifyAttack[] notifyAttacks;
readonly Lazy<BodyOrientation> coords;
readonly List<Armament> armaments;
readonly List<AnimationWithOffset> muzzles;
Expand All @@ -97,6 +98,12 @@ public AttackGarrisoned(Actor self, AttackGarrisonedInfo info)
paxRender = new Dictionary<Actor, RenderSprites>();
}

protected override void Created(Actor self)
{
notifyAttacks = self.TraitsImplementing<INotifyAttack>().ToArray();
base.Created(self);
}

protected override Func<IEnumerable<Armament>> InitializeGetArmaments(Actor self)
{
return () => armaments;
Expand All @@ -107,17 +114,31 @@ void INotifyPassengerEntered.OnPassengerEntered(Actor self, Actor passenger)
paxFacing.Add(passenger, passenger.Trait<IFacing>());
paxPos.Add(passenger, passenger.Trait<IPositionable>());
paxRender.Add(passenger, passenger.Trait<RenderSprites>());
armaments.AddRange(
passenger.TraitsImplementing<Armament>()
.Where(a => Info.Armaments.Contains(a.Info.Name)));

foreach (var a in passenger.TraitsImplementing<Armament>())
{
if (Info.Armaments.Contains(a.Info.Name))
{
a.AddNotifyAttacks(self, notifyAttacks);
armaments.Add(a);
}
}
}

void INotifyPassengerExited.OnPassengerExited(Actor self, Actor passenger)
{
paxFacing.Remove(passenger);
paxPos.Remove(passenger);
paxRender.Remove(passenger);
armaments.RemoveAll(a => a.Actor == passenger);

foreach (var a in armaments.ToList())
{
if (a.Actor == passenger)
{
a.RemoveNotifyAttacks(notifyAttacks);
armaments.Remove(a);
}
}
}

FirePort SelectFirePort(Actor self, WAngle targetYaw)
Expand Down Expand Up @@ -164,7 +185,7 @@ public override void DoAttack(Actor self, in Target target)
paxFacing[a.Actor].Facing = targetYaw;
paxPos[a.Actor].SetCenterPosition(a.Actor, pos + PortOffset(self, port));

if (!a.CheckFire(a.Actor, facing, target, true))
if (!a.CheckFire(a.Actor, facing, target))
continue;

if (a.Info.MuzzleSequence != null)
abcdefg30 marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.D2k/Activities/SwallowActor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ bool AttackTargets(Actor self, IReadOnlyCollection<Actor> targets)
if (affectedPlayers.Contains(self.World.LocalPlayer))
TextNotificationsManager.AddTransientLine(self.World.LocalPlayer, swallow.Info.WormAttackTextNotification);

return armament.CheckFire(self, facing, target, true);
return armament.CheckFire(self, facing, target);
}

public override bool Tick(Actor self)
Expand Down