/// <summary>
        /// Advances the disposal traversal by one tile.
        /// </summary>
        public void Traverse()
        {
            ReadyToTraverse = false;

            // Check if just started so we don't end the traversal at the disposal machine we started from.
            if (justStarted == false && currentPipe.PipeType == DisposalPipeType.Terminal)
            {
                EjectViaDisposalPipeTerminal();
                return;
            }

            // Advance to next pipe
            justStarted = false;
            OrientationEnum nextPipeRequiredSide = GetConnectedSide(currentPipeOutputSide).AsEnum();
            DisposalPipe    nextPipe             = GetPipeAt(NextPipeLocalPosition, requiredSide: nextPipeRequiredSide);

            if (nextPipe == null)
            {
                EjectViaPipeEnd();
                return;
            }

            TransferContainerToVector(NextPipeVector);
            currentPipeLocalPos   = NextPipeLocalPosition;
            currentPipeOutputSide = Orientation.FromEnum(GetPipeLeavingSide(nextPipe, nextPipeRequiredSide));
            currentPipe           = nextPipe;

            ReadyToTraverse = true;
        }
        /// <summary>
        /// Create a new disposal instance.
        /// Note: start a disposal instance by using DisposalsManager.Instance.NewDisposal(),
        /// as it will handle instance updates.
        /// </summary>
        /// <param name="container">The virtual container holding the entities to be disposed of.</param>
        public DisposalTraversal(DisposalVirtualContainer container)
        {
            RegisterTile registerTile = container.GetComponent <RegisterTile>();

            matrix = registerTile.Matrix;
            currentPipeLocalPos = registerTile.LocalPositionServer;
            virtualContainer    = container;
            containerTransform  = container.GetComponent <CustomNetTransform>();

            currentPipe = GetPipeAt(currentPipeLocalPos, DisposalPipeType.Terminal);
            if (currentPipe == null)
            {
                virtualContainer.EjectContents();
                DespawnContainerAndFinish();
                return;
            }
            // First() assumes initial pipe is of type: Terminal (as it has just one connectable side)
            // Not an issue unless new traversals do not start from disposal machines.
            // Consider refactoring and using GetPipeLeavingSide(currentPipe, someSide); if this becomes an issue.
            currentPipeOutputSide = Orientation.FromEnum(currentPipe.ConnectablePoints.First().Key);

            justStarted     = true;
            ReadyToTraverse = true;
        }
Esempio n. 3
0
 public void Initialise(DisposalPipe TileToTake, Vector3Int position)
 {
     DisposalPipeTile = TileToTake;
     NodeLocation     = position;
 }