diff --git a/OpenRA.Mods.Common/Traits/BotModules/BaseBuilderBotModule.cs b/OpenRA.Mods.Common/Traits/BotModules/BaseBuilderBotModule.cs index 81b827e0f5..8f35138d52 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/BaseBuilderBotModule.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/BaseBuilderBotModule.cs @@ -240,7 +240,7 @@ namespace OpenRA.Mods.Common.Traits for (var i = 0; i < updateCount; i++) { var rp = rallyPoints.Pop(); - if (rp.Actor.Owner == player) + if (rp.Actor.Owner == player && !rp.Actor.Disposed) SetRallyPoint(bot, rp); } } @@ -343,23 +343,37 @@ namespace OpenRA.Mods.Common.Traits Locomotor[] LocomotorsForProducibles(Actor producer) { - var buildingInfo = producer.Info.TraitInfoOrDefault(); - var productionInfo = producer.Info.TraitInfoOrDefault(); - var locomotors = Array.Empty(); + // Per-actor production + var productions = producer.TraitsImplementing(); - if (productionInfo != null && productionInfo.Produces.Length > 0) + // Player-wide production + if (!productions.Any()) + productions = producer.World.ActorsWithTrait().Where(x => x.Actor.Owner != producer.Owner).Select(x => x.Trait); + + var produces = productions.SelectMany(p => p.Info.Produces).ToHashSet(); + var locomotors = Array.Empty(); + if (produces.Count > 0) { - var productionQueues = producer.Owner.PlayerActor.TraitsImplementing() - .Where(pq => productionInfo.Produces.Contains(pq.Info.Type)); + // Per-actor production + var productionQueues = producer.TraitsImplementing(); + + // Player-wide production + if (!productionQueues.Any()) + productionQueues = producer.Owner.PlayerActor.TraitsImplementing(); + + productionQueues = productionQueues.Where(pq => produces.Contains(pq.Info.Type)); + var producibles = productionQueues.SelectMany(pq => pq.BuildableItems()); var locomotorNames = producibles .Select(p => p.TraitInfoOrDefault()) .Where(mi => mi != null) .Select(mi => mi.Locomotor) .ToHashSet(); - locomotors = world.WorldActor.TraitsImplementing() - .Where(l => locomotorNames.Contains(l.Info.Name)) - .ToArray(); + + if (locomotorNames.Count != 0) + locomotors = world.WorldActor.TraitsImplementing() + .Where(l => locomotorNames.Contains(l.Info.Name)) + .ToArray(); } return locomotors;