public virtual void UpdateOutputs() { if (Interface.CallHook("OnOutputUpdate", this) != null || !ShouldUpdateOutputs() || !ensureOutputsUpdated) { return; } ensureOutputsUpdated = false; using (TimeWarning.New("ProcessIOOutputs")) { for (int i = 0; i < outputs.Length; i++) { IOSlot iOSlot = outputs[i]; bool flag = true; IOEntity iOEntity = iOSlot.connectedTo.Get(); if (!(iOEntity != null)) { continue; } if (ioType == IOType.Fluidic && !DisregardGravityRestrictionsOnLiquid && !iOEntity.DisregardGravityRestrictionsOnLiquid) { using (TimeWarning.New("FluidOutputProcessing")) { if (!iOEntity.AllowLiquidPassthrough(this, base.transform.TransformPoint(iOSlot.handlePosition))) { flag = false; } } } int passthroughAmount = GetPassthroughAmount(i); iOEntity.UpdateFromInput(flag ? passthroughAmount : 0, iOSlot.connectedToSlot); } } }
public virtual void SendChangedToRootRecursive(bool forceUpdate, ref List <IOEntity> existing) { bool flag = IsRootEntity(); if (existing.Contains(this)) { return; } existing.Add(this); bool flag2 = false; for (int i = 0; i < inputs.Length; i++) { IOSlot iOSlot = inputs[i]; if (!iOSlot.mainPowerSlot) { continue; } IOEntity iOEntity = iOSlot.connectedTo.Get(); if (!(iOEntity == null) && !existing.Contains(iOEntity)) { flag2 = true; if (forceUpdate) { iOEntity.ensureOutputsUpdated = true; } iOEntity.SendChangedToRootRecursive(forceUpdate, ref existing); } } if (flag) { forceUpdate = forceUpdate && !flag2; OnCircuitChanged(forceUpdate); } }
public virtual void Init() { for (int i = 0; i < outputs.Length; i++) { IOSlot iOSlot = outputs[i]; iOSlot.connectedTo.Init(); if (iOSlot.connectedTo.Get() != null) { int connectedToSlot = iOSlot.connectedToSlot; if (connectedToSlot < 0 || connectedToSlot >= iOSlot.connectedTo.Get().inputs.Length) { Debug.LogError("Slot IOR Error: " + base.name + " setting up inputs for " + iOSlot.connectedTo.Get().name + " slot : " + iOSlot.connectedToSlot); } else { iOSlot.connectedTo.Get().inputs[iOSlot.connectedToSlot].connectedTo.Set(this); iOSlot.connectedTo.Get().inputs[iOSlot.connectedToSlot].connectedToSlot = i; iOSlot.connectedTo.Get().inputs[iOSlot.connectedToSlot].connectedTo.Init(); } } } UpdateUsedOutputs(); if (IsRootEntity()) { Invoke(MarkDirtyForceUpdateOutputs, UnityEngine.Random.Range(1f, 1f)); } }
public bool IsConnectedTo(IOEntity entity, int depth, bool defaultReturn = false) { if (depth > 0) { for (int i = 0; i < inputs.Length; i++) { IOSlot iOSlot = inputs[i]; if (!iOSlot.mainPowerSlot) { continue; } IOEntity iOEntity = iOSlot.connectedTo.Get(); if (iOEntity != null) { if (iOEntity == entity) { return(true); } if (ConsiderConnectedTo(entity)) { return(true); } if (iOEntity.IsConnectedTo(entity, depth - 1, defaultReturn)) { return(true); } } } return(false); } return(defaultReturn); }
public bool IsConnectedTo(IOEntity entity, int slot, int depth, bool defaultReturn = false) { if (depth > 0 && slot < inputs.Length) { IOSlot iOSlot = inputs[slot]; if (iOSlot.mainPowerSlot) { IOEntity iOEntity = iOSlot.connectedTo.Get(); if (iOEntity != null) { if (iOEntity == entity) { return(true); } if (ConsiderConnectedTo(entity)) { return(true); } if (iOEntity.IsConnectedTo(entity, depth - 1, defaultReturn)) { return(true); } } } } return(false); }
public override void UpdateOutputs() { if (!ShouldUpdateOutputs() || !ensureOutputsUpdated) { return; } for (int i = 0; i < 4; i++) { IOSlot iOSlot = outputs[i]; if (iOSlot.connectedTo.Get() != null) { iOSlot.connectedTo.Get().UpdateFromInput(inputAmounts[i], iOSlot.connectedToSlot); } } }
protected int GetPassthroughAmountForAnySlot(int slot, bool isInputSlot) { int result = 0; if (isInputSlot) { if (slot >= 0 && slot < inputs.Length) { IOSlot iOSlot = inputs[slot]; IOEntity iOEntity = iOSlot.connectedTo.Get(); if (iOEntity != null && iOSlot.connectedToSlot >= 0 && iOSlot.connectedToSlot < iOEntity.outputs.Length) { result = iOEntity.GetPassthroughAmount(inputs[slot].connectedToSlot); } } } else if (slot >= 0 && slot < outputs.Length) { result = GetPassthroughAmount(slot); } return(result); }
public override void Load(LoadInfo info) { base.Load(info); if (info.msg.ioEntity == null) { return; } if (!info.fromDisk && info.msg.ioEntity.inputs != null) { int count = info.msg.ioEntity.inputs.Count; if (inputs.Length != count) { inputs = new IOSlot[count]; } for (int i = 0; i < count; i++) { if (inputs[i] == null) { inputs[i] = new IOSlot(); } ProtoBuf.IOEntity.IOConnection iOConnection = info.msg.ioEntity.inputs[i]; inputs[i].connectedTo = new IORef(); inputs[i].connectedTo.entityRef.uid = iOConnection.connectedID; if (base.isClient) { inputs[i].connectedTo.InitClient(); } inputs[i].connectedToSlot = iOConnection.connectedToSlot; inputs[i].niceName = iOConnection.niceName; inputs[i].type = (IOType)iOConnection.type; inputs[i].wireColour = (WireTool.WireColour)iOConnection.colour; } } if (info.msg.ioEntity.outputs == null) { return; } if (!info.fromDisk && base.isClient) { IOSlot[] array = outputs; for (int j = 0; j < array.Length; j++) { array[j].Clear(); } } int count2 = info.msg.ioEntity.outputs.Count; IOSlot[] array2 = null; if (outputs.Length != count2 && count2 > 0) { array2 = outputs; outputs = new IOSlot[count2]; for (int k = 0; k < array2.Length; k++) { if (k < count2) { outputs[k] = array2[k]; } } } for (int l = 0; l < count2; l++) { if (outputs[l] == null) { outputs[l] = new IOSlot(); } ProtoBuf.IOEntity.IOConnection iOConnection2 = info.msg.ioEntity.outputs[l]; outputs[l].connectedTo = new IORef(); outputs[l].connectedTo.entityRef.uid = iOConnection2.connectedID; if (base.isClient) { outputs[l].connectedTo.InitClient(); } outputs[l].connectedToSlot = iOConnection2.connectedToSlot; outputs[l].niceName = iOConnection2.niceName; outputs[l].type = (IOType)iOConnection2.type; outputs[l].wireColour = (WireTool.WireColour)iOConnection2.colour; if (info.fromDisk || base.isClient) { List <ProtoBuf.IOEntity.IOConnection.LineVec> linePointList = iOConnection2.linePointList; if (outputs[l].linePoints == null || outputs[l].linePoints.Length != linePointList.Count) { outputs[l].linePoints = new Vector3[linePointList.Count]; } if (outputs[l].slackLevels == null || outputs[l].slackLevels.Length != linePointList.Count) { outputs[l].slackLevels = new float[linePointList.Count]; } for (int m = 0; m < linePointList.Count; m++) { outputs[l].linePoints[m] = linePointList[m].vec; outputs[l].slackLevels[m] = linePointList[m].vec.w; } } } }