From 61a26a636b181cb474ccc7bd41476ae7a653a8d9 Mon Sep 17 00:00:00 2001 From: Taryn Hill Date: Fri, 11 Oct 2013 03:11:27 -0400 Subject: [PATCH 1/3] Moved EjectOnDeath to Mods.RA root --- OpenRA.Mods.RA/{Air => }/EjectOnDeath.cs | 0 OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename OpenRA.Mods.RA/{Air => }/EjectOnDeath.cs (100%) diff --git a/OpenRA.Mods.RA/Air/EjectOnDeath.cs b/OpenRA.Mods.RA/EjectOnDeath.cs similarity index 100% rename from OpenRA.Mods.RA/Air/EjectOnDeath.cs rename to OpenRA.Mods.RA/EjectOnDeath.cs diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 33fdb70e73..14aa9d463b 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -117,7 +117,7 @@ - + From e9652db486b8563844b7b5788c731cee9d47c102 Mon Sep 17 00:00:00 2001 From: Taryn Hill Date: Thu, 10 Oct 2013 22:34:54 -0400 Subject: [PATCH 2/3] EjectOnDeath works with air & ground vehicles, updated defaults.yaml --- OpenRA.Mods.RA/EjectOnDeath.cs | 39 ++++++++++++++++++++++------------ mods/ra/rules/defaults.yaml | 12 +++++++++++ 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/OpenRA.Mods.RA/EjectOnDeath.cs b/OpenRA.Mods.RA/EjectOnDeath.cs index e6d213c0e6..328acf06b2 100644 --- a/OpenRA.Mods.RA/EjectOnDeath.cs +++ b/OpenRA.Mods.RA/EjectOnDeath.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -8,6 +8,7 @@ */ #endregion +using System.Linq; using OpenRA.FileFormats; using OpenRA.Mods.RA.Effects; using OpenRA.Traits; @@ -20,33 +21,45 @@ namespace OpenRA.Mods.RA public readonly string PilotActor = "E1"; public readonly int SuccessRate = 50; public readonly string ChuteSound = "chute1.aud"; - public readonly WRange MinimumEjectHeight = new WRange(427); + public readonly bool EjectInAir = false; + public readonly bool EjectOnGround = false; } public class EjectOnDeath : INotifyKilled { public void Killed(Actor self, AttackInfo e) { - var info = self.Info.Traits.Get(); - var pilot = self.World.CreateActor(false, info.PilotActor.ToLowerInvariant(), - new TypeDictionary { new OwnerInit(self.Owner) }); - - var r = self.World.SharedRandom.Next(1, 100); var cp = self.CenterPosition; + var info = self.Info.Traits.Get(); + var r = self.World.SharedRandom.Next(1, 100); - if (IsSuitableCell(pilot, self.Location) && r > 100 - info.SuccessRate && cp.Z > info.MinimumEjectHeight.Range - && self.Owner.WinState != WinState.Lost) + if (r <= 100 - info.SuccessRate || self.Owner.WinState == WinState.Lost) + return; + + if ((!info.EjectInAir && cp.Z > 0) || (!info.EjectOnGround && cp.Z == 0)) + return; + + var pilot = self.World.CreateActor(false, info.PilotActor.ToLowerInvariant(), + new TypeDictionary { new OwnerInit(self.Owner), new LocationInit(self.Location) }); + + + if (IsSuitableCell(self, pilot, self.Location)) { - self.World.AddFrameEndTask(w => w.Add(new Parachute(pilot, cp))); - Sound.Play(info.ChuteSound, cp); + if (cp.Z > 0 && info.EjectInAir) + { + self.World.AddFrameEndTask(w => w.Add(new Parachute(pilot, cp))); + Sound.Play(info.ChuteSound, cp); + } + else if (cp.Z == 0 && info.EjectOnGround) + self.World.AddFrameEndTask(w => w.Add(pilot)); } else pilot.Destroy(); } - bool IsSuitableCell(Actor actorToDrop, CPos p) + bool IsSuitableCell(Actor self, Actor actorToDrop, CPos p) { - return actorToDrop.Trait().CanEnterCell(p); + return actorToDrop.Trait().CanEnterCell(self.Location, self, true); } } } \ No newline at end of file diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index 4cb165c5cf..99776134c4 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -37,6 +37,11 @@ Guard: Guardable: BodyOrientation: + EjectOnDeath: + PilotActor: e1 + SuccessRate: 20 + EjectOnGround: yes + EjectInAir: no ^Tank: AppearsOnRadar: @@ -77,6 +82,11 @@ Guard: Guardable: BodyOrientation: + EjectOnDeath: + PilotActor: e1 + SuccessRate: 20 + EjectOnGround: yes + EjectInAir: no ^Infantry: AppearsOnRadar: @@ -185,6 +195,8 @@ EjectOnDeath: PilotActor: E1 SuccessRate: 50 + EjectOnDeath: no + EjectInAir: yes GivesBounty: GpsDot: String:Plane From e3e7d0b38c26bb8c40020c39895b2ab17b2be63d Mon Sep 17 00:00:00 2001 From: Taryn Hill Date: Fri, 11 Oct 2013 02:46:32 -0400 Subject: [PATCH 3/3] Add ignoreActor and checkTransientActors to IPositionable.CanEnterCell Improved 'return' checks Removed unnecessary 'using' Fixed defaults.yaml spelling error --- OpenRA.Game/Traits/TraitsInterfaces.cs | 1 + OpenRA.Mods.RA/Air/Aircraft.cs | 1 + OpenRA.Mods.RA/Crate.cs | 13 ++++++++++--- OpenRA.Mods.RA/EjectOnDeath.cs | 16 ++++++++-------- OpenRA.Mods.RA/Husk.cs | 11 +++++++++-- mods/ra/rules/defaults.yaml | 2 +- 6 files changed, 30 insertions(+), 14 deletions(-) diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 63863d7847..d0447ab2f6 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -137,6 +137,7 @@ namespace OpenRA.Traits public interface IPositionable : IOccupySpace { bool CanEnterCell(CPos location); + bool CanEnterCell(CPos location, Actor ignoreActor, bool checkTransientActors); void SetPosition(Actor self, CPos cell); void SetPosition(Actor self, WPos pos); void SetVisualPosition(Actor self, WPos pos); diff --git a/OpenRA.Mods.RA/Air/Aircraft.cs b/OpenRA.Mods.RA/Air/Aircraft.cs index a88af7990a..73bffe7911 100755 --- a/OpenRA.Mods.RA/Air/Aircraft.cs +++ b/OpenRA.Mods.RA/Air/Aircraft.cs @@ -140,6 +140,7 @@ namespace OpenRA.Mods.RA.Air } public bool CanEnterCell(CPos location) { return true; } + public bool CanEnterCell(CPos cell, Actor ignoreActor, bool checkTransientActors) { return CanEnterCell(cell, null, true); } public int MovementSpeed { diff --git a/OpenRA.Mods.RA/Crate.cs b/OpenRA.Mods.RA/Crate.cs index 2fdeb44bce..e628356864 100644 --- a/OpenRA.Mods.RA/Crate.cs +++ b/OpenRA.Mods.RA/Crate.cs @@ -88,19 +88,26 @@ namespace OpenRA.Mods.RA public void SetPosition(Actor self, WPos pos) { SetPosition(self, pos.ToCPos()); } public void SetVisualPosition(Actor self, WPos pos) { SetPosition(self, pos.ToCPos()); } - public bool CanEnterCell(CPos cell) + public bool CanEnterCell(CPos cell, Actor ignoreActor, bool checkTransientActors) { if (!self.World.Map.IsInMap(cell.X, cell.Y)) return false; + var type = self.World.GetTerrainType(cell); if (!info.TerrainTypes.Contains(type)) return false; if (self.World.WorldActor.Trait().GetBuildingAt(cell) != null) return false; - if (self.World.ActorMap.GetUnitsAt(cell).Any()) return false; - return true; + if (!checkTransientActors) + return true; + + return !self.World.ActorMap.GetUnitsAt(cell) + .Where(x => x != ignoreActor) + .Any(); } + public bool CanEnterCell(CPos cell) { return CanEnterCell(cell, null, true); } + public void SetPosition(Actor self, CPos cell) { self.World.ActorMap.RemoveInfluence(self, this); diff --git a/OpenRA.Mods.RA/EjectOnDeath.cs b/OpenRA.Mods.RA/EjectOnDeath.cs index 328acf06b2..466597e774 100644 --- a/OpenRA.Mods.RA/EjectOnDeath.cs +++ b/OpenRA.Mods.RA/EjectOnDeath.cs @@ -8,7 +8,6 @@ */ #endregion -using System.Linq; using OpenRA.FileFormats; using OpenRA.Mods.RA.Effects; using OpenRA.Traits; @@ -29,15 +28,16 @@ namespace OpenRA.Mods.RA { public void Killed(Actor self, AttackInfo e) { - var cp = self.CenterPosition; - var info = self.Info.Traits.Get(); + if (self.Owner.WinState == WinState.Lost) + return; + var r = self.World.SharedRandom.Next(1, 100); + var info = self.Info.Traits.Get(); - if (r <= 100 - info.SuccessRate || self.Owner.WinState == WinState.Lost) + if (r <= 100 - info.SuccessRate) return; - if ((!info.EjectInAir && cp.Z > 0) || (!info.EjectOnGround && cp.Z == 0)) - return; + var cp = self.CenterPosition; var pilot = self.World.CreateActor(false, info.PilotActor.ToLowerInvariant(), new TypeDictionary { new OwnerInit(self.Owner), new LocationInit(self.Location) }); @@ -45,12 +45,12 @@ namespace OpenRA.Mods.RA if (IsSuitableCell(self, pilot, self.Location)) { - if (cp.Z > 0 && info.EjectInAir) + if (cp.Z > 0) { self.World.AddFrameEndTask(w => w.Add(new Parachute(pilot, cp))); Sound.Play(info.ChuteSound, cp); } - else if (cp.Z == 0 && info.EjectOnGround) + else self.World.AddFrameEndTask(w => w.Add(pilot)); } else diff --git a/OpenRA.Mods.RA/Husk.cs b/OpenRA.Mods.RA/Husk.cs index 7efd9e19e4..1edae2eb39 100644 --- a/OpenRA.Mods.RA/Husk.cs +++ b/OpenRA.Mods.RA/Husk.cs @@ -52,7 +52,7 @@ namespace OpenRA.Mods.RA } public IEnumerable> OccupiedCells() { yield return Pair.New(TopLeft, SubCell.FullCell); } - public bool CanEnterCell(CPos cell) + public bool CanEnterCell(CPos cell, Actor ignoreActor, bool checkTransientActors) { if (!self.World.Map.IsInMap(cell.X, cell.Y)) return false; @@ -60,9 +60,16 @@ namespace OpenRA.Mods.RA if (!info.AllowedTerrain.Contains(self.World.GetTerrainType(cell))) return false; - return !self.World.ActorMap.AnyUnitsAt(cell); + if (!checkTransientActors) + return true; + + return !self.World.ActorMap.GetUnitsAt(cell) + .Where(x => x != ignoreActor) + .Any(); } + public bool CanEnterCell(CPos cell) { return CanEnterCell(cell, null, true); } + public void SetPosition(Actor self, CPos cell) { SetPosition(self, cell.CenterPosition); } public void SetVisualPosition(Actor self, WPos pos) { diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index 99776134c4..c8eb7e9935 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -195,7 +195,7 @@ EjectOnDeath: PilotActor: E1 SuccessRate: 50 - EjectOnDeath: no + EjectOnGround: no EjectInAir: yes GivesBounty: GpsDot: