Rework harvester resource claiming:
* Maintains lists of claims, and only restricts reservations for friendly units. * Removes OnNotifyResourceClaimLost; it's not clear whether that is still useful, and it prevents future necessary cleanups. * Moves other code without changing behaviour. This fixed stale claims from dead units and enemy claims from preventing otherwise valid harvest activities.
This commit is contained in:
@@ -24,8 +24,7 @@ namespace OpenRA.Mods.Common.Activities
|
||||
readonly HarvesterInfo harvInfo;
|
||||
readonly Mobile mobile;
|
||||
readonly MobileInfo mobileInfo;
|
||||
readonly ResourceLayer resLayer;
|
||||
readonly ResourceClaimLayer territory;
|
||||
readonly ResourceClaimLayer claimLayer;
|
||||
readonly IPathFinder pathFinder;
|
||||
readonly DomainIndex domainIndex;
|
||||
|
||||
@@ -37,8 +36,7 @@ namespace OpenRA.Mods.Common.Activities
|
||||
harvInfo = self.Info.TraitInfo<HarvesterInfo>();
|
||||
mobile = self.Trait<Mobile>();
|
||||
mobileInfo = self.Info.TraitInfo<MobileInfo>();
|
||||
resLayer = self.World.WorldActor.Trait<ResourceLayer>();
|
||||
territory = self.World.WorldActor.TraitOrDefault<ResourceClaimLayer>();
|
||||
claimLayer = self.World.WorldActor.Trait<ResourceClaimLayer>();
|
||||
pathFinder = self.World.WorldActor.Trait<IPathFinder>();
|
||||
domainIndex = self.World.WorldActor.Trait<DomainIndex>();
|
||||
}
|
||||
@@ -90,8 +88,8 @@ namespace OpenRA.Mods.Common.Activities
|
||||
}
|
||||
else
|
||||
{
|
||||
// Attempt to claim a resource as ours
|
||||
if (territory != null && !territory.ClaimResource(self, closestHarvestablePosition.Value))
|
||||
// Attempt to claim the target cell
|
||||
if (!claimLayer.TryClaimCell(self, closestHarvestablePosition.Value))
|
||||
return ActivityUtils.SequenceActivities(new Wait(25), this);
|
||||
|
||||
// If not given a direct order, assume ordered to the first resource location we find:
|
||||
@@ -115,7 +113,7 @@ namespace OpenRA.Mods.Common.Activities
|
||||
/// </summary>
|
||||
CPos? ClosestHarvestablePos(Actor self)
|
||||
{
|
||||
if (self.CanHarvestAt(self.Location, resLayer, harvInfo, territory))
|
||||
if (harv.CanHarvestCell(self, self.Location) && claimLayer.CanClaimCell(self, self.Location))
|
||||
return self.Location;
|
||||
|
||||
// Determine where to search from and how far to search:
|
||||
@@ -126,8 +124,8 @@ namespace OpenRA.Mods.Common.Activities
|
||||
// Find any harvestable resources:
|
||||
var passable = (uint)mobileInfo.GetMovementClass(self.World.Map.Rules.TileSet);
|
||||
List<CPos> path;
|
||||
using (var search = PathSearch.Search(self.World, mobileInfo, self, true,
|
||||
loc => domainIndex.IsPassable(self.Location, loc, mobileInfo, passable) && self.CanHarvestAt(loc, resLayer, harvInfo, territory))
|
||||
using (var search = PathSearch.Search(self.World, mobileInfo, self, true, loc =>
|
||||
domainIndex.IsPassable(self.Location, loc, mobileInfo, passable) && harv.CanHarvestCell(self, loc) && claimLayer.CanClaimCell(self, loc))
|
||||
.WithCustomCost(loc =>
|
||||
{
|
||||
if ((avoidCell.HasValue && loc == avoidCell.Value) ||
|
||||
|
||||
Reference in New Issue
Block a user