Exemple #1
0
        // 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));
        }
Exemple #2
0
        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);
                }
            }
        }
Exemple #3
0
        public virtual void UnreserveCarryable(Actor self)
        {
            if (Carryable != null && Carryable.IsInWorld && !Carryable.IsDead)
            {
                Carryable.Trait <Carryable>().UnReserve(Carryable);
            }

            Carryable = null;
            State     = CarryallState.Idle;
        }
Exemple #4
0
        void INotifyActorDisposing.Disposing(Actor self)
        {
            if (State == CarryallState.Carrying)
            {
                Carryable.Dispose();
                Carryable = null;
            }

            UnreserveCarryable(self);
        }
Exemple #5
0
        void INotifyKilled.Killed(Actor self, AttackInfo e)
        {
            if (State == CarryallState.Carrying)
            {
                if (Carryable.IsInWorld && !Carryable.IsDead)
                {
                    Carryable.Kill(e.Attacker);
                }
                Carryable = null;
            }

            UnreserveCarryable(self);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
 public FerryUnit(Actor self, Actor cargo)
 {
     this.cargo   = cargo;
     carryable    = cargo.Trait <Carryable>();
     carryallInfo = self.Trait <Carryall>().Info;
 }