コード例 #1
0
 public void UpdateElectricElements()
 {
     foreach (KeyValuePair <Point3, bool> item in m_pointsToUpdate)
     {
         Point3 key       = item.Key;
         int    cellValue = SubsystemTerrain.Terrain.GetCellValue(key.X, key.Y, key.Z);
         for (int i = 0; i < 6; i++)
         {
             ElectricElement electricElement = GetElectricElement(key.X, key.Y, key.Z, i);
             if (electricElement != null)
             {
                 if (electricElement is WireDomainElectricElement)
                 {
                     m_wiresToUpdate[key] = true;
                 }
                 else
                 {
                     m_electricElementsToRemove[electricElement] = true;
                 }
             }
         }
         if (item.Value)
         {
             m_persistentElementsVoltages.Remove(key);
         }
         int num = Terrain.ExtractContents(cellValue);
         if (BlocksManager.Blocks[num] is IElectricWireElementBlock)
         {
             m_wiresToUpdate[key] = true;
         }
         else
         {
             IElectricElementBlock electricElementBlock = BlocksManager.Blocks[num] as IElectricElementBlock;
             if (electricElementBlock != null)
             {
                 ElectricElement electricElement2 = electricElementBlock.CreateElectricElement(this, cellValue, key.X, key.Y, key.Z);
                 if (electricElement2 != null)
                 {
                     m_electricElementsToAdd[key] = electricElement2;
                 }
             }
         }
     }
     RemoveWireDomains();
     foreach (KeyValuePair <ElectricElement, bool> item2 in m_electricElementsToRemove)
     {
         RemoveElectricElement(item2.Key);
     }
     AddWireDomains();
     foreach (ElectricElement value in m_electricElementsToAdd.Values)
     {
         AddElectricElement(value);
     }
     m_pointsToUpdate.Clear();
     m_wiresToUpdate.Clear();
     m_electricElementsToAdd.Clear();
     m_electricElementsToRemove.Clear();
 }
コード例 #2
0
        public void GetAllConnectedNeighbors(int x, int y, int z, int mountingFace, DynamicArray <ElectricConnectionPath> list)
        {
            int cellValue = SubsystemTerrain.Terrain.GetCellValue(x, y, z);
            IElectricElementBlock electricElementBlock = BlocksManager.Blocks[Terrain.ExtractContents(cellValue)] as IElectricElementBlock;

            if (electricElementBlock == null)
            {
                return;
            }
            for (ElectricConnectorDirection electricConnectorDirection = ElectricConnectorDirection.Top; electricConnectorDirection < (ElectricConnectorDirection)5; electricConnectorDirection++)
            {
                for (int i = 0; i < 4; i++)
                {
                    ElectricConnectionPath electricConnectionPath = m_connectionPathsTable[20 * mountingFace + 4 * (int)electricConnectorDirection + i];
                    if (electricConnectionPath == null)
                    {
                        break;
                    }
                    ElectricConnectorType?connectorType = electricElementBlock.GetConnectorType(SubsystemTerrain, cellValue, mountingFace, electricConnectionPath.ConnectorFace, x, y, z);
                    if (!connectorType.HasValue)
                    {
                        break;
                    }
                    int x2         = x + electricConnectionPath.NeighborOffsetX;
                    int y2         = y + electricConnectionPath.NeighborOffsetY;
                    int z2         = z + electricConnectionPath.NeighborOffsetZ;
                    int cellValue2 = SubsystemTerrain.Terrain.GetCellValue(x2, y2, z2);
                    IElectricElementBlock electricElementBlock2 = BlocksManager.Blocks[Terrain.ExtractContents(cellValue2)] as IElectricElementBlock;
                    if (electricElementBlock2 == null)
                    {
                        continue;
                    }
                    ElectricConnectorType?connectorType2 = electricElementBlock2.GetConnectorType(SubsystemTerrain, cellValue2, electricConnectionPath.NeighborFace, electricConnectionPath.NeighborConnectorFace, x2, y2, z2);
                    if (connectorType2.HasValue && ((connectorType.Value != 0 && connectorType2.Value != ElectricConnectorType.Output) || (connectorType.Value != ElectricConnectorType.Output && connectorType2.Value != 0)))
                    {
                        int connectionMask  = electricElementBlock.GetConnectionMask(cellValue);
                        int connectionMask2 = electricElementBlock2.GetConnectionMask(cellValue2);
                        if ((connectionMask & connectionMask2) != 0)
                        {
                            list.Add(electricConnectionPath);
                        }
                    }
                }
            }
        }