diff --git a/OpenRA.Mods.RA/Crate.cs b/OpenRA.Mods.RA/Crate.cs index 99e24922a6..68fd5d5d92 100644 --- a/OpenRA.Mods.RA/Crate.cs +++ b/OpenRA.Mods.RA/Crate.cs @@ -45,22 +45,18 @@ namespace OpenRA.Mods.RA public object Create(ActorInitializer init) { return new Crate(init); } } - class Crate : ICrushable, IOccupySpace, ITick + class Crate : ITick { readonly Actor self; [Sync] - readonly int2 location; - [Sync] int ticks; public Crate(ActorInitializer init) { this.self = init.self; - this.location = init.location; - self.World.WorldActor.traits.Get().Add(self, this); } - public void OnCrush(Actor crusher) + public void OnCollected(Actor crusher) { var shares = self.traits.WithInterface().Select(a => Pair.New(a, a.GetSelectionShares(crusher))); var totalShares = shares.Sum(a => a.Second); @@ -77,19 +73,20 @@ namespace OpenRA.Mods.RA n -= s.Second; } - public bool IsPathableCrush(UnitMovementType umt, Player player) { return true; } - public bool IsCrushableBy(UnitMovementType umt, Player player) { return true; } - - public int2 TopLeft { get { return location; } } - - public IEnumerable OccupiedCells() { yield return TopLeft; } - public void Tick(Actor self) { + var cell = ((1/24f) * self.CenterLocation).ToInt2(); + var collector = self.World.WorldActor.traits.Get().GetUnitsAt(cell).FirstOrDefault(); + if (collector != null) + { + OnCollected(collector); + return; + } + if (++ticks >= self.Info.Traits.Get().Lifetime * 25) self.World.AddFrameEndTask(w => w.Remove(self)); - var seq = self.World.GetTerrainType(self.Location) == TerrainType.Water ? "water" : "idle"; + var seq = self.World.GetTerrainType(cell) == TerrainType.Water ? "water" : "idle"; if (seq != self.traits.Get().anim.CurrentSequence.Name) self.traits.Get().anim.PlayRepeating(seq); } diff --git a/OpenRA.Mods.RA/CrateDrop.cs b/OpenRA.Mods.RA/CrateDrop.cs index a9906defac..b249e8f36c 100644 --- a/OpenRA.Mods.RA/CrateDrop.cs +++ b/OpenRA.Mods.RA/CrateDrop.cs @@ -71,7 +71,6 @@ namespace OpenRA.Mods.RA { var crate = new Actor(w, "crate", new int2(0, 0), w.WorldActor.Owner); crates.Add(crate); - self.World.WorldActor.traits.Get().Remove(crate, crate.traits.Get()); var startPos = w.ChooseRandomEdgeCell(); var plane = w.CreateActor("BADR", startPos, w.WorldActor.Owner);