From b0e90989a6188d63bb3f10a49f32844ef6dace1d Mon Sep 17 00:00:00 2001 From: reaperrr Date: Thu, 28 Jan 2016 23:13:29 +0100 Subject: [PATCH 1/3] Add plumbing for customizable vertical ProximityTrigger range And check DistanceAboveTerrain instead of just vertical distance to upgrade source. This is necessary to avoid situations where an actor is technically on the right vertical distance above/below ground, but not upgraded because it is located on a lower/higher terrain level than the upgrade source. --- OpenRA.Game/Traits/World/ActorMap.cs | 23 +++++++++++-------- .../Scripting/Global/TriggerGlobal.cs | 4 ++-- .../Traits/ProximityCapturable.cs | 4 ++-- .../Traits/Upgrades/UpgradeActorsNear.cs | 4 ++-- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/OpenRA.Game/Traits/World/ActorMap.cs b/OpenRA.Game/Traits/World/ActorMap.cs index 9a19b9c02d..b181c26297 100644 --- a/OpenRA.Game/Traits/World/ActorMap.cs +++ b/OpenRA.Game/Traits/World/ActorMap.cs @@ -98,22 +98,26 @@ namespace OpenRA.Traits WPos position; WDist range; + WDist vRange; + IEnumerable currentActors = Enumerable.Empty(); - public ProximityTrigger(WPos pos, WDist range, Action onActorEntered, Action onActorExited) + public ProximityTrigger(WPos pos, WDist range, WDist vRange, Action onActorEntered, Action onActorExited) { this.onActorEntered = onActorEntered; this.onActorExited = onActorExited; - Update(pos, range); + Update(pos, range, vRange); } - public void Update(WPos newPos, WDist newRange) + public void Update(WPos newPos, WDist newRange, WDist newVRange) { position = newPos; range = newRange; + vRange = newVRange; + + var offset = new WVec(newRange, newRange, newVRange); - var offset = new WVec(newRange, newRange, WDist.Zero); TopLeft = newPos - offset; BottomRight = newPos + offset; @@ -128,7 +132,8 @@ namespace OpenRA.Traits var oldActors = currentActors; var delta = new WVec(range, range, WDist.Zero); currentActors = am.ActorsInBox(position - delta, position + delta) - .Where(a => (a.CenterPosition - position).HorizontalLengthSquared < range.LengthSquared) + .Where(a => (a.CenterPosition - position).HorizontalLengthSquared < range.LengthSquared + && (vRange.Length == 0 || (a.World.Map.DistanceAboveTerrain(a.CenterPosition).LengthSquared <= vRange.LengthSquared))) .ToList(); var entered = currentActors.Except(oldActors); @@ -439,10 +444,10 @@ namespace OpenRA.Traits } } - public int AddProximityTrigger(WPos pos, WDist range, Action onEntry, Action onExit) + public int AddProximityTrigger(WPos pos, WDist range, WDist vRange, Action onEntry, Action onExit) { var id = nextTriggerId++; - var t = new ProximityTrigger(pos, range, onEntry, onExit); + var t = new ProximityTrigger(pos, range, vRange, onEntry, onExit); proximityTriggers.Add(id, t); foreach (var bin in BinsInBox(t.TopLeft, t.BottomRight)) @@ -463,7 +468,7 @@ namespace OpenRA.Traits t.Dispose(); } - public void UpdateProximityTrigger(int id, WPos newPos, WDist newRange) + public void UpdateProximityTrigger(int id, WPos newPos, WDist newRange, WDist newVRange) { ProximityTrigger t; if (!proximityTriggers.TryGetValue(id, out t)) @@ -472,7 +477,7 @@ namespace OpenRA.Traits foreach (var bin in BinsInBox(t.TopLeft, t.BottomRight)) bin.ProximityTriggers.Remove(t); - t.Update(newPos, newRange); + t.Update(newPos, newRange, newVRange); foreach (var bin in BinsInBox(t.TopLeft, t.BottomRight)) bin.ProximityTriggers.Add(t); diff --git a/OpenRA.Mods.Common/Scripting/Global/TriggerGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/TriggerGlobal.cs index aa034cd795..ef7120cc0d 100644 --- a/OpenRA.Mods.Common/Scripting/Global/TriggerGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/TriggerGlobal.cs @@ -373,7 +373,7 @@ namespace OpenRA.Mods.Common.Scripting } }; - triggerId = Context.World.ActorMap.AddProximityTrigger(pos, range, invokeEntry, null); + triggerId = Context.World.ActorMap.AddProximityTrigger(pos, range, WDist.Zero, invokeEntry, null); return triggerId; } @@ -400,7 +400,7 @@ namespace OpenRA.Mods.Common.Scripting } }; - triggerId = Context.World.ActorMap.AddProximityTrigger(pos, range, null, invokeExit); + triggerId = Context.World.ActorMap.AddProximityTrigger(pos, range, WDist.Zero, null, invokeExit); return triggerId; } diff --git a/OpenRA.Mods.Common/Traits/ProximityCapturable.cs b/OpenRA.Mods.Common/Traits/ProximityCapturable.cs index dd3100d8ec..bae826e072 100644 --- a/OpenRA.Mods.Common/Traits/ProximityCapturable.cs +++ b/OpenRA.Mods.Common/Traits/ProximityCapturable.cs @@ -67,7 +67,7 @@ namespace OpenRA.Mods.Common.Traits return; // TODO: Eventually support CellTriggers as well - proximityTrigger = self.World.ActorMap.AddProximityTrigger(self.CenterPosition, Info.Range, ActorEntered, ActorLeft); + proximityTrigger = self.World.ActorMap.AddProximityTrigger(self.CenterPosition, Info.Range, WDist.Zero, ActorEntered, ActorLeft); } void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) @@ -84,7 +84,7 @@ namespace OpenRA.Mods.Common.Traits if (!self.IsInWorld || self.CenterPosition == prevPosition) return; - self.World.ActorMap.UpdateProximityTrigger(proximityTrigger, self.CenterPosition, Info.Range); + self.World.ActorMap.UpdateProximityTrigger(proximityTrigger, self.CenterPosition, Info.Range, WDist.Zero); prevPosition = self.CenterPosition; } diff --git a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeActorsNear.cs b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeActorsNear.cs index 92031b42d6..c4907c0327 100644 --- a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeActorsNear.cs +++ b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeActorsNear.cs @@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Traits public void AddedToWorld(Actor self) { cachedPosition = self.CenterPosition; - proximityTrigger = self.World.ActorMap.AddProximityTrigger(cachedPosition, cachedRange, ActorEntered, ActorExited); + proximityTrigger = self.World.ActorMap.AddProximityTrigger(cachedPosition, cachedRange, WDist.Zero, ActorEntered, ActorExited); } public void RemovedFromWorld(Actor self) @@ -80,7 +80,7 @@ namespace OpenRA.Mods.Common.Traits { cachedPosition = self.CenterPosition; cachedRange = desiredRange; - self.World.ActorMap.UpdateProximityTrigger(proximityTrigger, cachedPosition, cachedRange); + self.World.ActorMap.UpdateProximityTrigger(proximityTrigger, cachedPosition, cachedRange, WDist.Zero); } } From dca26b71f4c2120b89e96c71514534a2d2f26c24 Mon Sep 17 00:00:00 2001 From: reaperrr Date: Wed, 24 Feb 2016 23:57:02 +0100 Subject: [PATCH 2/3] Add VerticalLength and VerticalLengthSquared For possible future use. --- OpenRA.Game/WVec.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenRA.Game/WVec.cs b/OpenRA.Game/WVec.cs index 068845bf37..50c306fd29 100644 --- a/OpenRA.Game/WVec.cs +++ b/OpenRA.Game/WVec.cs @@ -41,6 +41,8 @@ namespace OpenRA public int Length { get { return (int)Exts.ISqrt(LengthSquared); } } public long HorizontalLengthSquared { get { return (long)X * X + (long)Y * Y; } } public int HorizontalLength { get { return (int)Exts.ISqrt(HorizontalLengthSquared); } } + public long VerticalLengthSquared { get { return (long)Z * Z; } } + public int VerticalLength { get { return (int)Exts.ISqrt(VerticalLengthSquared); } } public WVec Rotate(WRot rot) { From 2fe91cd1a24321c4225bf1a026ad0e71341c7b3b Mon Sep 17 00:00:00 2001 From: reaperrr Date: Thu, 28 Jan 2016 23:16:38 +0100 Subject: [PATCH 3/3] Make vertical range of UpgradeActorsNear customizable --- .../Traits/Upgrades/UpgradeActorsNear.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeActorsNear.cs b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeActorsNear.cs index c4907c0327..ec0c19ad0d 100644 --- a/OpenRA.Mods.Common/Traits/Upgrades/UpgradeActorsNear.cs +++ b/OpenRA.Mods.Common/Traits/Upgrades/UpgradeActorsNear.cs @@ -23,6 +23,10 @@ namespace OpenRA.Mods.Common.Traits [Desc("The range to search for actors to upgrade.")] public readonly WDist Range = WDist.FromCells(3); + [Desc("The maximum vertical range above terrain to search for actors to upgrade.", + "Ignored if 0 (actors are upgraded regardless of vertical distance).")] + public readonly WDist MaximumVerticalOffset = WDist.Zero; + [Desc("What diplomatic stances are affected.")] public readonly Stance ValidStances = Stance.Ally; @@ -44,6 +48,8 @@ namespace OpenRA.Mods.Common.Traits WPos cachedPosition; WDist cachedRange; WDist desiredRange; + WDist cachedVRange; + WDist desiredVRange; bool cachedDisabled = true; @@ -52,12 +58,13 @@ namespace OpenRA.Mods.Common.Traits this.info = info; this.self = self; cachedRange = info.Range; + cachedVRange = info.MaximumVerticalOffset; } public void AddedToWorld(Actor self) { cachedPosition = self.CenterPosition; - proximityTrigger = self.World.ActorMap.AddProximityTrigger(cachedPosition, cachedRange, WDist.Zero, ActorEntered, ActorExited); + proximityTrigger = self.World.ActorMap.AddProximityTrigger(cachedPosition, cachedRange, cachedVRange, ActorEntered, ActorExited); } public void RemovedFromWorld(Actor self) @@ -73,14 +80,16 @@ namespace OpenRA.Mods.Common.Traits { Game.Sound.Play(disabled ? info.DisableSound : info.EnableSound, self.CenterPosition); desiredRange = disabled ? WDist.Zero : info.Range; + desiredVRange = disabled ? WDist.Zero : info.MaximumVerticalOffset; cachedDisabled = disabled; } - if (self.CenterPosition != cachedPosition || desiredRange != cachedRange) + if (self.CenterPosition != cachedPosition || desiredRange != cachedRange || desiredVRange != cachedVRange) { cachedPosition = self.CenterPosition; cachedRange = desiredRange; - self.World.ActorMap.UpdateProximityTrigger(proximityTrigger, cachedPosition, cachedRange, WDist.Zero); + cachedVRange = desiredVRange; + self.World.ActorMap.UpdateProximityTrigger(proximityTrigger, cachedPosition, cachedRange, cachedVRange); } }