Exemplo n.º 1
0
 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);
         }
     }
 }
Exemplo n.º 2
0
    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);
        }
    }
Exemplo n.º 3
0
 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));
     }
 }
Exemplo n.º 4
0
 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);
 }
Exemplo n.º 5
0
 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);
 }
Exemplo n.º 6
0
 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);
         }
     }
 }
Exemplo n.º 7
0
    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);
    }
Exemplo n.º 8
0
    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;
                }
            }
        }
    }