示例#1
0
 public EnterBunker(Actor passengerActor, Actor bunkerActor, WPos pos, bool willDisappear = true, int maxTries = 0, bool repathWhileMoving = true)
     : base(passengerActor, Target.FromActor(bunkerActor))
 {
     this.bunkerActor   = bunkerActor;
     bunkerCargo        = bunkerActor.Trait <BunkerCargo>();
     bunkerPassenger    = passengerActor.Trait <BunkerPassenger>();
     this.willDisappear = willDisappear;
 }
示例#2
0
        public override bool Tick(Actor self)
        {
            if (IsCanceling || cargo.IsEmpty(self))
            {
                return(true);
            }

            if (cargo.CanUnload())
            {
                foreach (var inu in notifiers)
                {
                    inu.Unloading(self);
                }

                var actor = cargo.Peek(self);
                var spawn = self.CenterPosition;

                var exitSubCell = ChooseExitSubCell(actor);
                if (exitSubCell == null)
                {
                    self.NotifyBlocker(BlockedExitCells(actor));
                    QueueChild(new Wait(10));
                    return(false);
                }

                cargo.Unload(self);
                self.World.AddFrameEndTask(w =>
                {
                    if (actor.Disposed)
                    {
                        return;
                    }

                    var move = actor.Trait <IMove>();
                    var pos  = actor.Trait <IPositionable>();

                    //pos.SetPosition(self, exitSubCell.Value.First, exitSubCell.Value.Second);
                    //pos.SetVisualPosition(actor, spawn);

                    actor.CancelActivity();
                    if (cargo.Info.WillDisappear)
                    {
                        w.Add(actor);
                    }

                    BunkerPassenger bunkerPassenger = actor.TraitOrDefault <BunkerPassenger>();
                    bunkerPassenger.RevokeCondition();
                });
            }

            if (!unloadAll || !cargo.CanUnload())
            {
                if (cargo.Info.AfterUnloadDelay > 0)
                {
                    QueueChild(new Wait(cargo.Info.AfterUnloadDelay, false));
                }

                if (takeOffAfterUnload)
                {
                    QueueChild(new TakeOff(self));
                }

                return(true);
            }

            return(false);
        }