/// <summary> /// Provide the disposal outlet a container, from the disposal pipe network, /// from which its contents will be ejected into the world. The container object will be despawned. /// </summary> /// <param name="virtualContainer">The virtual container whose contents will be ejected.</param> public void ServerReceiveAndEjectContainer(DisposalVirtualContainer virtualContainer) { receivedContainers.Add(virtualContainer); virtualContainer.GetComponent <ObjectBehaviour>().parentContainer = objectBehaviour; if (!OutletOperating) { StartCoroutine(RunEjectionSequence()); } }
void StorePlayer(MouseDrop interaction) { if (virtualContainer == null) { virtualContainer = SpawnNewContainer(); } virtualContainer.AddPlayer(interaction.DroppedObject.GetComponent <ObjectBehaviour>()); this.RestartCoroutine(AutoFlush(), ref autoFlushCoroutine); }
void StoreItem() { if (virtualContainer == null) { virtualContainer = SpawnNewContainer(); } Inventory.ServerDrop(currentInteraction.HandSlot, currentInteraction.TargetVector); virtualContainer.AddItem(currentInteraction.HandObject.GetComponent <ObjectBehaviour>()); this.RestartCoroutine(AutoFlush(), ref autoFlushCoroutine); }
public void EjectContents() { if (autoFlushCoroutine != null) { StopCoroutine(autoFlushCoroutine); } if (BinFlushing) { return; } if (virtualContainer == null) { return; } Despawn.ServerSingle(virtualContainer.gameObject); virtualContainer = null; }
IEnumerator RunIntakeSequence() { // Intake orifice closes... SetIntakeOperating(true); DenyEntry(); virtualContainer = SpawnNewContainer(); yield return(WaitFor.Seconds(FLUSH_DELAY)); // Intake orifice closed. Release the charge. SoundManager.PlayNetworkedAtPos("DisposalMachineFlush", registerObject.WorldPositionServer, sourceObj: gameObject); DisposalsManager.Instance.NewDisposal(virtualContainer); // Restore charge, open orifice. yield return(WaitFor.Seconds(ANIMATION_TIME - FLUSH_DELAY)); virtualContainer = null; AllowEntry(); SetIntakeOperating(false); }
IEnumerator RunFlushSequence() { // Bin orifice closes... SetBinState(BinState.Flushing); yield return(WaitFor.Seconds(ANIMATION_TIME)); // Bin orifice closed. Release the charge. chargePressure = 0; SoundManager.PlayNetworkedAtPos("DisposalMachineFlush", registerObject.WorldPositionServer, sourceObj: gameObject); if (virtualContainer != null) { virtualContainer.GetComponent <ObjectBehaviour>().parentContainer = null; DisposalsManager.Instance.NewDisposal(virtualContainer); virtualContainer = null; } // Restore charge. SetBinState(BinState.Recharging); StartCoroutine(Recharge()); }
/// <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; }