diff --git a/OpenRA.Mods.Common/Traits/World/SpawnMapActors.cs b/OpenRA.Mods.Common/Traits/World/SpawnMapActors.cs index 626425539b..a57f0e0619 100644 --- a/OpenRA.Mods.Common/Traits/World/SpawnMapActors.cs +++ b/OpenRA.Mods.Common/Traits/World/SpawnMapActors.cs @@ -26,6 +26,10 @@ namespace OpenRA.Mods.Common.Traits public void WorldLoaded(World world, WorldRenderer wr) { + var preventMapSpawns = world.WorldActor.TraitsImplementing() + .Concat(world.WorldActor.Owner.PlayerActor.TraitsImplementing()) + .ToArray(); + foreach (var kv in world.Map.ActorDefinitions) { var actorReference = new ActorReference(kv.Value.Value, kv.Value.ToDictionary()); @@ -38,11 +42,24 @@ namespace OpenRA.Mods.Common.Traits var initDict = actorReference.InitDict; initDict.Add(new SkipMakeAnimsInit()); initDict.Add(new SpawnedByMapInit(kv.Key)); + + if (PreventMapSpawn(world, actorReference, preventMapSpawns)) + continue; + var actor = world.CreateActor(actorReference.Type, initDict); Actors[kv.Key] = actor; LastMapActorID = actor.ActorID; } } + + bool PreventMapSpawn(World world, ActorReference actorReference, IEnumerable preventMapSpawns) + { + foreach (var pms in preventMapSpawns) + if (pms.PreventMapSpawn(world, actorReference)) + return true; + + return false; + } } public class SkipMakeAnimsInit : IActorInit, ISuppressInitExport { } diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index 63bc6ee49b..0e299a74f1 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -538,4 +538,10 @@ namespace OpenRA.Mods.Common.Traits OnChange = onChange; } } + + [RequireExplicitImplementation] + public interface IPreventMapSpawn + { + bool PreventMapSpawn(World world, ActorReference actorReference); + } }