diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index ab2bbf0a33..2c3a95cdbd 100755 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -364,6 +364,11 @@ namespace OpenRA { server = new Server.Server(modData, settings, map); JoinServer(IPAddress.Loopback.ToString(), settings.Server.ListenPort); - } + } + + public static bool IsCurrentWorld(World world) + { + return orderManager != null && orderManager.world == world; + } } } diff --git a/OpenRA.Mods.RA/Reservable.cs b/OpenRA.Mods.RA/Reservable.cs index 2a750f9df8..459b0d355d 100755 --- a/OpenRA.Mods.RA/Reservable.cs +++ b/OpenRA.Mods.RA/Reservable.cs @@ -30,13 +30,17 @@ namespace OpenRA.Mods.RA public IDisposable Reserve(Actor self, Actor forActor) { - reservedFor = forActor; + reservedFor = forActor; + + // NOTE: we really dont care about the GC eating DisposableActions that apply to a world *other* than + // the one we're playing in. - return new DisposableAction(() => reservedFor = null, - () => Game.RunAfterTick(() => - {throw new InvalidOperationException("Attempted to finalize an undisposed DisposableAction. {0} ({1}) reserved {2} ({3})" - .F(forActor.Info.Name, forActor.ActorID, self.Info.Name, self.ActorID));}) - ); + return new DisposableAction( + () => reservedFor = null, + () => Game.RunAfterTick( + () => { if (Game.IsCurrentWorld( self.World )) throw new InvalidOperationException( + "Attempted to finalize an undisposed DisposableAction. {0} ({1}) reserved {2} ({3})" + .F(forActor.Info.Name, forActor.ActorID, self.Info.Name, self.ActorID)); })); } public static bool IsReserved(Actor a)