// Check if we can drop the unit at our current location. public bool CanUnload() { var localOffset = CarryableOffset.Rotate(body.QuantizeOrientation(self, self.Orientation)); var targetCell = self.World.Map.CellContaining(self.CenterPosition + body.LocalToWorld(localOffset)); return(Carryable != null && Carryable.Trait <IPositionable>().CanEnterCell(targetCell, self)); }
IEnumerable <IRenderable> IRender.Render(Actor self, WorldRenderer wr) { if (State == CarryallState.Carrying && !Carryable.IsDead) { if (carryablePreview == null) { var carryableInits = new TypeDictionary() { new OwnerInit(Carryable.Owner), new DynamicFacingInit(() => facing.Facing), }; foreach (var api in Carryable.TraitsImplementing <IActorPreviewInitModifier>()) { api.ModifyActorPreviewInit(Carryable, carryableInits); } var init = new ActorPreviewInitializer(Carryable.Info, wr, carryableInits); carryablePreview = Carryable.Info.TraitInfos <IRenderActorPreviewInfo>() .SelectMany(rpi => rpi.RenderPreview(init)) .ToArray(); } var offset = body.LocalToWorld(CarryableOffset.Rotate(body.QuantizeOrientation(self, self.Orientation))); var previewRenderables = carryablePreview .SelectMany(p => p.Render(wr, self.CenterPosition + offset)) .OrderBy(WorldRenderer.RenderableZPositionComparisonKey); foreach (var r in previewRenderables) { yield return(r); } } }
public virtual void UnreserveCarryable(Actor self) { if (Carryable != null && Carryable.IsInWorld && !Carryable.IsDead) { Carryable.Trait <Carryable>().UnReserve(Carryable); } Carryable = null; State = CarryallState.Idle; }
void INotifyActorDisposing.Disposing(Actor self) { if (State == CarryallState.Carrying) { Carryable.Dispose(); Carryable = null; } UnreserveCarryable(self); }
void INotifyKilled.Killed(Actor self, AttackInfo e) { if (State == CarryallState.Carrying) { if (Carryable.IsInWorld && !Carryable.IsDead) { Carryable.Kill(e.Attacker); } Carryable = null; } UnreserveCarryable(self); }
void INotifyKilled.Killed(Actor self, AttackInfo e) { if (State == CarryallState.Carrying) { if (!Carryable.IsDead) { var positionable = Carryable.Trait <IPositionable>(); positionable.SetPosition(Carryable, self.Location); Carryable.Kill(e.Attacker); } Carryable = null; } UnreserveCarryable(self); }
public FerryUnit(Actor self, Actor cargo) { this.cargo = cargo; carryable = cargo.Trait <Carryable>(); carryallInfo = self.Trait <Carryall>().Info; }