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(); }
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); } } } } }