Fix #595 - IDisposable crash.
This commit is contained in:
@@ -39,8 +39,9 @@ namespace OpenRA.Mods.RA.Air
|
|||||||
NextActivity);
|
NextActivity);
|
||||||
|
|
||||||
var res = dest.TraitOrDefault<Reservable>();
|
var res = dest.TraitOrDefault<Reservable>();
|
||||||
|
var heli = self.Trait<Helicopter>();
|
||||||
if (res != null)
|
if (res != null)
|
||||||
self.Trait<Helicopter>().reservation = res.Reserve(dest, self);
|
heli.reservation = res.Reserve(dest, self, heli);
|
||||||
|
|
||||||
var exit = dest.Info.Traits.WithInterface<ExitInfo>().FirstOrDefault();
|
var exit = dest.Info.Traits.WithInterface<ExitInfo>().FirstOrDefault();
|
||||||
var offset = exit != null ? exit.SpawnOffset : int2.Zero;
|
var offset = exit != null ? exit.SpawnOffset : int2.Zero;
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ namespace OpenRA.Mods.RA.Air
|
|||||||
if (Reservable.IsReserved(order.TargetActor)) return;
|
if (Reservable.IsReserved(order.TargetActor)) return;
|
||||||
var res = order.TargetActor.TraitOrDefault<Reservable>();
|
var res = order.TargetActor.TraitOrDefault<Reservable>();
|
||||||
if (res != null)
|
if (res != null)
|
||||||
reservation = res.Reserve(order.TargetActor, self);
|
reservation = res.Reserve(order.TargetActor, self, this);
|
||||||
|
|
||||||
var exit = order.TargetActor.Info.Traits.WithInterface<ExitInfo>().FirstOrDefault();
|
var exit = order.TargetActor.Info.Traits.WithInterface<ExitInfo>().FirstOrDefault();
|
||||||
var offset = exit != null ? exit.SpawnOffset : int2.Zero;
|
var offset = exit != null ? exit.SpawnOffset : int2.Zero;
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Air
|
|||||||
{
|
{
|
||||||
var res = afld.Trait<Reservable>();
|
var res = afld.Trait<Reservable>();
|
||||||
if (res != null)
|
if (res != null)
|
||||||
reservation = res.Reserve(afld, self);
|
reservation = res.Reserve(afld, self, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Air
|
|||||||
if (res != null)
|
if (res != null)
|
||||||
{
|
{
|
||||||
plane.UnReserve();
|
plane.UnReserve();
|
||||||
plane.reservation = res.Reserve(dest, self);
|
plane.reservation = res.Reserve(dest, self, plane);
|
||||||
}
|
}
|
||||||
|
|
||||||
var landPos = dest.CenterLocation;
|
var landPos = dest.CenterLocation;
|
||||||
|
|||||||
@@ -10,14 +10,16 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using OpenRA.Traits;
|
using OpenRA.Traits;
|
||||||
|
using OpenRA.Mods.RA.Air;
|
||||||
|
|
||||||
namespace OpenRA.Mods.RA
|
namespace OpenRA.Mods.RA
|
||||||
{
|
{
|
||||||
class ReservableInfo : TraitInfo<Reservable> {}
|
class ReservableInfo : TraitInfo<Reservable> {}
|
||||||
|
|
||||||
public class Reservable : ITick
|
public class Reservable : ITick, INotifyDamage, INotifyCapture, INotifySold
|
||||||
{
|
{
|
||||||
Actor reservedFor;
|
Actor reservedFor;
|
||||||
|
Aircraft herp;
|
||||||
|
|
||||||
public void Tick(Actor self)
|
public void Tick(Actor self)
|
||||||
{
|
{
|
||||||
@@ -28,15 +30,16 @@ namespace OpenRA.Mods.RA
|
|||||||
reservedFor = null; /* not likely to arrive now. */
|
reservedFor = null; /* not likely to arrive now. */
|
||||||
}
|
}
|
||||||
|
|
||||||
public IDisposable Reserve(Actor self, Actor forActor)
|
public IDisposable Reserve(Actor self, Actor forActor, Aircraft derp)
|
||||||
{
|
{
|
||||||
reservedFor = forActor;
|
reservedFor = forActor;
|
||||||
|
herp = derp;
|
||||||
|
|
||||||
// NOTE: we really dont care about the GC eating DisposableActions that apply to a world *other* than
|
// NOTE: we really dont care about the GC eating DisposableActions that apply to a world *other* than
|
||||||
// the one we're playing in.
|
// the one we're playing in.
|
||||||
|
|
||||||
return new DisposableAction(
|
return new DisposableAction(
|
||||||
() => reservedFor = null,
|
() => {reservedFor = null; herp = null;},
|
||||||
() => Game.RunAfterTick(
|
() => Game.RunAfterTick(
|
||||||
() => { if (Game.IsCurrentWorld( self.World )) throw new InvalidOperationException(
|
() => { if (Game.IsCurrentWorld( self.World )) throw new InvalidOperationException(
|
||||||
"Attempted to finalize an undisposed DisposableAction. {0} ({1}) reserved {2} ({3})"
|
"Attempted to finalize an undisposed DisposableAction. {0} ({1}) reserved {2} ({3})"
|
||||||
@@ -48,5 +51,24 @@ namespace OpenRA.Mods.RA
|
|||||||
var res = a.TraitOrDefault<Reservable>();
|
var res = a.TraitOrDefault<Reservable>();
|
||||||
return res != null && res.reservedFor != null;
|
return res != null && res.reservedFor != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Damaged(Actor self, AttackInfo e)
|
||||||
|
{
|
||||||
|
if (herp != null && e.DamageStateChanged && e.DamageState == DamageState.Dead)
|
||||||
|
herp.UnReserve();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCapture (Actor self, Actor captor, Player oldOwner, Player newOwner)
|
||||||
|
{
|
||||||
|
if (herp != null)
|
||||||
|
herp.UnReserve();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Selling (Actor self) { Sold(self); }
|
||||||
|
public void Sold (Actor self)
|
||||||
|
{
|
||||||
|
if (herp != null)
|
||||||
|
herp.UnReserve();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user