diff --git a/OpenRA.Mods.Common/Activities/RepairBridge.cs b/OpenRA.Mods.Common/Activities/RepairBridge.cs index 3ca19a356a..d5584c9bab 100644 --- a/OpenRA.Mods.Common/Activities/RepairBridge.cs +++ b/OpenRA.Mods.Common/Activities/RepairBridge.cs @@ -15,51 +15,72 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Activities { - class RepairBridge : LegacyEnter + class RepairBridge : Enter { - readonly Actor target; - readonly LegacyBridgeHut legacyHut; - readonly BridgeHut hut; + readonly EnterBehaviour enterBehaviour; readonly string notification; - public RepairBridge(Actor self, Actor target, EnterBehaviour enterBehaviour, string notification) - : base(self, target, enterBehaviour, targetLineColor: Color.Yellow) + Actor enterActor; + BridgeHut enterHut; + LegacyBridgeHut enterLegacyHut; + + public RepairBridge(Actor self, Target target, EnterBehaviour enterBehaviour, string notification) + : base(self, target, Color.Yellow) { - this.target = target; - legacyHut = target.TraitOrDefault(); - hut = target.TraitOrDefault(); + this.enterBehaviour = enterBehaviour; this.notification = notification; } - protected override bool CanReserve(Actor self) + bool CanEnterHut() { - if (legacyHut != null) - return legacyHut.BridgeDamageState != DamageState.Undamaged && !legacyHut.Repairing && legacyHut.Bridge.GetHut(0) != null && legacyHut.Bridge.GetHut(1) != null; + if (enterLegacyHut != null) + return enterLegacyHut.BridgeDamageState != DamageState.Undamaged && !enterLegacyHut.Repairing && + enterLegacyHut.Bridge.GetHut(0) != null && enterLegacyHut.Bridge.GetHut(1) != null; - if (hut != null) - return hut.BridgeDamageState != DamageState.Undamaged && !hut.Repairing; + if (enterHut != null) + return enterHut.BridgeDamageState != DamageState.Undamaged && !enterHut.Repairing; return false; } - protected override void OnInside(Actor self) + protected override bool TryStartEnter(Actor self, Actor targetActor) { - if (legacyHut != null) - { - if (legacyHut.BridgeDamageState == DamageState.Undamaged || legacyHut.Repairing || legacyHut.Bridge.GetHut(0) == null || legacyHut.Bridge.GetHut(1) == null) - return; + enterActor = targetActor; + enterLegacyHut = enterActor.TraitOrDefault(); + enterHut = enterActor.TraitOrDefault(); - legacyHut.Repair(self); - } - else if (hut != null) + // Make sure we can still repair the target before entering + // (but not before, because this may stop the actor in the middle of nowhere) + if (!CanEnterHut()) { - if (hut.BridgeDamageState == DamageState.Undamaged || hut.Repairing) - return; - - hut.Repair(target, self); + Cancel(self, true); + return false; } + return true; + } + + protected override void OnEnterComplete(Actor self, Actor targetActor) + { + // Make sure the target hasn't changed while entering + // OnEnterComplete is only called if targetActor is alive + if (targetActor != enterActor) + return; + + if (!CanEnterHut()) + return; + + if (enterLegacyHut != null) + enterLegacyHut.Repair(self); + else if (enterHut != null) + enterHut.Repair(enterActor, self); + Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", notification, self.Owner.Faction.InternalName); + + if (enterBehaviour == EnterBehaviour.Dispose) + self.Dispose(); + else if (enterBehaviour == EnterBehaviour.Suicide) + self.Kill(self); } } } diff --git a/OpenRA.Mods.Common/Traits/RepairsBridges.cs b/OpenRA.Mods.Common/Traits/RepairsBridges.cs index a787a385f7..b0063eb3d4 100644 --- a/OpenRA.Mods.Common/Traits/RepairsBridges.cs +++ b/OpenRA.Mods.Common/Traits/RepairsBridges.cs @@ -82,6 +82,7 @@ namespace OpenRA.Mods.Common.Traits public void ResolveOrder(Actor self, Order order) { // TODO: Add support for FrozenActors + // The activity supports it, but still missing way to freeze bridge state on the hut if (order.OrderString == "RepairBridge" && order.Target.Type == TargetType.Actor) { var targetActor = order.Target.Actor; @@ -104,7 +105,7 @@ namespace OpenRA.Mods.Common.Traits self.CancelActivity(); self.SetTargetLine(order.Target, Color.Yellow); - self.QueueActivity(new RepairBridge(self, targetActor, info.EnterBehaviour, info.RepairNotification)); + self.QueueActivity(new RepairBridge(self, order.Target, info.EnterBehaviour, info.RepairNotification)); } } diff --git a/mods/ts/rules/bridges.yaml b/mods/ts/rules/bridges.yaml index 2365ad6b5a..a67a164522 100644 --- a/mods/ts/rules/bridges.yaml +++ b/mods/ts/rules/bridges.yaml @@ -14,6 +14,8 @@ CABHUT: -SelectionDecorations: -Demolishable: -Explodes: + -FrozenUnderFog: + HiddenUnderShroud: MapEditorData: Categories: Bridge