using System; using Godot; public class Universe { public Sector[,,] Sectors; public Vector3I Size; public Universe(Vector3I size) { Sectors = new Sector[size.X, size.Y, size.Z]; Size = size; } public Universe(int sizeX, int sizeY, int sizeZ) { Sectors = new Sector[sizeX, sizeY, sizeZ]; Size = new(sizeX, sizeY, sizeZ); } public Sector GetSector(Vector3I coordinates) { return Sectors[coordinates.X, coordinates.Y, coordinates.Z]; } public Sector GetSector(int x, int y, int z) { return Sectors[x, y, z]; } public bool IsInside(Vector3I sectorCoordinates, Vector3 localCoordinates) { Vector3 sectorSize = GameManager.Generator.GetSectorSize() / 2; Vector3I universeSize = GameManager.GameUniverse.Size; if ( sectorCoordinates.X == 0 && localCoordinates.X < -sectorSize.X || sectorCoordinates.Y == 0 && localCoordinates.Y < -sectorSize.Y || sectorCoordinates.Z == 0 && localCoordinates.Z < -sectorSize.Z ) { return false; } if ( sectorCoordinates.X == universeSize.X - 1 && localCoordinates.X >= sectorSize.X || sectorCoordinates.Y == universeSize.Y - 1 && localCoordinates.Y >= sectorSize.Y || sectorCoordinates.Z == universeSize.Z - 1 && localCoordinates.Z >= sectorSize.Z ) { return false; } return true; } public void ForEachSector(Action action) { int sizeX = Sectors.GetLength(0); int sizeY = Sectors.GetLength(1); int sizeZ = Sectors.GetLength(2); for (int x = 0; x < sizeX; x++) { for (int y = 0; y < sizeY; y++) { for (int z = 0; z < sizeZ; z++) { action(Sectors[x, y, z]); } } } } }