Only allow docking to allied refineries if directly ordered
This commit is contained in:
@@ -128,7 +128,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
/// <summary>Clone of <see cref="DockClientManager.DockingPossible(Actor, bool)"/>.</summary>
|
/// <summary>Clone of <see cref="DockClientManager.DockingPossible(Actor, bool)"/>.</summary>
|
||||||
public bool DockingPossible(Actor target, bool forceEnter)
|
public bool DockingPossible(Actor target, bool forceEnter)
|
||||||
{
|
{
|
||||||
return !IsTraitDisabled && target.TraitsImplementing<DockHost>().Any(host => dockClients.Any(client => client.IsDockingPossible(host.GetDockType)));
|
return !IsTraitDisabled && target.TraitsImplementing<DockHost>().Any(host => dockClients.Any(client => client.CanDock(host.GetDockType)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Clone of <see cref="DockClientManager.CanDockAt(Actor, bool, bool)"/>.</summary>
|
/// <summary>Clone of <see cref="DockClientManager.CanDockAt(Actor, bool, bool)"/>.</summary>
|
||||||
|
|||||||
@@ -30,20 +30,15 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
DockClientManager = self.TraitOrDefault<DockClientManager>();
|
DockClientManager = self.TraitOrDefault<DockClientManager>();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual bool CanDock()
|
public virtual bool CanDock(BitSet<DockType> type, bool forceEnter = false)
|
||||||
{
|
{
|
||||||
return true;
|
return !IsTraitDisabled && GetDockType.Overlaps(type);
|
||||||
}
|
|
||||||
|
|
||||||
public virtual bool IsDockingPossible(BitSet<DockType> type, bool forceEnter = false)
|
|
||||||
{
|
|
||||||
return !IsTraitDisabled && GetDockType.Overlaps(type) && (forceEnter || CanDock());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual bool CanDockAt(Actor hostActor, IDockHost host, bool forceEnter = false, bool ignoreOccupancy = false)
|
public virtual bool CanDockAt(Actor hostActor, IDockHost host, bool forceEnter = false, bool ignoreOccupancy = false)
|
||||||
{
|
{
|
||||||
return (forceEnter || self.Owner.IsAlliedWith(hostActor.Owner)) &&
|
return (forceEnter || self.Owner.IsAlliedWith(hostActor.Owner)) &&
|
||||||
IsDockingPossible(host.GetDockType, forceEnter) &&
|
CanDock(host.GetDockType, forceEnter) &&
|
||||||
host.IsDockingPossible(self, this, ignoreOccupancy);
|
host.IsDockingPossible(self, this, ignoreOccupancy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -229,7 +229,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
/// <summary>Do we have an enabled client with matching <paramref name="type"/>.</summary>
|
/// <summary>Do we have an enabled client with matching <paramref name="type"/>.</summary>
|
||||||
public bool DockingPossible(BitSet<DockType> type, bool forceEnter = false)
|
public bool DockingPossible(BitSet<DockType> type, bool forceEnter = false)
|
||||||
{
|
{
|
||||||
return !IsTraitDisabled && dockClients.Any(client => client.IsDockingPossible(type, forceEnter));
|
return !IsTraitDisabled && dockClients.Any(client => client.CanDock(type, forceEnter));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Does this <paramref name="target"/> contain at least one enabled <see cref="IDockHost"/> with maching <see cref="DockType"/>.</summary>
|
/// <summary>Does this <paramref name="target"/> contain at least one enabled <see cref="IDockHost"/> with maching <see cref="DockType"/>.</summary>
|
||||||
@@ -237,7 +237,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
return !IsTraitDisabled &&
|
return !IsTraitDisabled &&
|
||||||
target.TraitsImplementing<IDockHost>()
|
target.TraitsImplementing<IDockHost>()
|
||||||
.Any(host => dockClients.Any(client => client.IsDockingPossible(host.GetDockType, forceEnter)));
|
.Any(host => dockClients.Any(client => client.CanDock(host.GetDockType, forceEnter)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Can we dock to this <paramref name="host"/>.</summary>
|
/// <summary>Can we dock to this <paramref name="host"/>.</summary>
|
||||||
@@ -281,7 +281,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
/// <remarks>Does not check if <see cref="DockClientManager"/> is enabled.</remarks>
|
/// <remarks>Does not check if <see cref="DockClientManager"/> is enabled.</remarks>
|
||||||
public IEnumerable<IDockClient> AvailableDockClients(BitSet<DockType> type, bool forceEnter = false)
|
public IEnumerable<IDockClient> AvailableDockClients(BitSet<DockType> type, bool forceEnter = false)
|
||||||
{
|
{
|
||||||
return dockClients.Where(client => client.IsDockingPossible(type, forceEnter));
|
return dockClients.Where(client => client.CanDock(type, forceEnter));
|
||||||
}
|
}
|
||||||
|
|
||||||
void INotifyKilled.Killed(Actor self, AttackInfo e) { UnreserveHost(); }
|
void INotifyKilled.Killed(Actor self, AttackInfo e) { UnreserveHost(); }
|
||||||
@@ -327,7 +327,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (requireForceMove() && !forceEnter)
|
if (requireForceMove() && !forceEnter)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!self.Owner.IsAlliedWith(target.Actor.Owner) || !canTarget(target.Actor, forceEnter))
|
if (!canTarget(target.Actor, forceEnter))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
cursor = useEnterCursor(target.Actor, forceEnter) ? enterCursor : enterBlockedCursor;
|
cursor = useEnterCursor(target.Actor, forceEnter) ? enterCursor : enterBlockedCursor;
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
readonly IResourceLayer resourceLayer;
|
readonly IResourceLayer resourceLayer;
|
||||||
readonly ResourceClaimLayer claimLayer;
|
readonly ResourceClaimLayer claimLayer;
|
||||||
readonly IStoresResources[] storesResources;
|
readonly IStoresResources[] storesResources;
|
||||||
|
readonly Actor self;
|
||||||
int conditionToken = Actor.InvalidConditionToken;
|
int conditionToken = Actor.InvalidConditionToken;
|
||||||
|
|
||||||
public override BitSet<DockType> GetDockType => Info.Type;
|
public override BitSet<DockType> GetDockType => Info.Type;
|
||||||
@@ -107,6 +108,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
storesResources = self.TraitsImplementing<IStoresResources>().Where(sr => info.Resources.Any(r => sr.HasType(r))).ToArray();
|
storesResources = self.TraitsImplementing<IStoresResources>().Where(sr => info.Resources.Any(r => sr.HasType(r))).ToArray();
|
||||||
resourceLayer = self.World.WorldActor.Trait<IResourceLayer>();
|
resourceLayer = self.World.WorldActor.Trait<IResourceLayer>();
|
||||||
claimLayer = self.World.WorldActor.Trait<ResourceClaimLayer>();
|
claimLayer = self.World.WorldActor.Trait<ResourceClaimLayer>();
|
||||||
|
this.self = self;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Created(Actor self)
|
protected override void Created(Actor self)
|
||||||
@@ -124,9 +126,15 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public bool IsEmpty => storesResources.All(sr => sr.ContentsSum == 0);
|
public bool IsEmpty => storesResources.All(sr => sr.ContentsSum == 0);
|
||||||
public int Fullness => storesResources.Sum(sr => sr.ContentsSum * 100 / sr.Capacity) / storesResources.Length;
|
public int Fullness => storesResources.Sum(sr => sr.ContentsSum * 100 / sr.Capacity) / storesResources.Length;
|
||||||
|
|
||||||
protected override bool CanDock()
|
public override bool CanDock(BitSet<DockType> type, bool forceEnter = false)
|
||||||
{
|
{
|
||||||
return !IsEmpty;
|
return base.CanDock(type, forceEnter) && (forceEnter || !IsEmpty);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool CanDockAt(Actor hostActor, IDockHost host, bool forceEnter = false, bool ignoreOccupancy = false)
|
||||||
|
{
|
||||||
|
return base.CanDockAt(hostActor, host, forceEnter, ignoreOccupancy)
|
||||||
|
&& (self.Owner == hostActor.Owner || (ignoreOccupancy && self.Owner.IsAlliedWith(hostActor.Owner)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateCondition(Actor self)
|
void UpdateCondition(Actor self)
|
||||||
@@ -154,7 +162,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
IAcceptResources acceptResources;
|
IAcceptResources acceptResources;
|
||||||
public override void OnDockStarted(Actor self, Actor hostActor, IDockHost host)
|
public override void OnDockStarted(Actor self, Actor hostActor, IDockHost host)
|
||||||
{
|
{
|
||||||
if (IsDockingPossible(host.GetDockType))
|
if (base.CanDock(host.GetDockType))
|
||||||
acceptResources = hostActor.TraitOrDefault<IAcceptResources>();
|
acceptResources = hostActor.TraitOrDefault<IAcceptResources>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -225,7 +225,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
/// Does not check if <see cref="Traits.DockClientManager"/> is enabled.
|
/// Does not check if <see cref="Traits.DockClientManager"/> is enabled.
|
||||||
/// Function should only be called from within <see cref="IDockClient"/> or <see cref="Traits.DockClientManager"/>.
|
/// Function should only be called from within <see cref="IDockClient"/> or <see cref="Traits.DockClientManager"/>.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
bool IsDockingPossible(BitSet<DockType> type, bool forceEnter = false);
|
bool CanDock(BitSet<DockType> type, bool forceEnter = false);
|
||||||
|
|
||||||
/// <summary>Is this client allowed to dock to <paramref name="host"/>.</summary>
|
/// <summary>Is this client allowed to dock to <paramref name="host"/>.</summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
|
|||||||
Reference in New Issue
Block a user