using System; using System.Collections.Generic; using Godot; public class Sector { public Vector3I Coordinates; public FastUniqueList GameObjects = new(); public Sector(Vector3I coordinates) { Coordinates = coordinates; } public void Simulate(double delta, HashSet ignoreObjects = null) { GameObjects.ForEach(gameObject => { if (ignoreObjects == null || !ignoreObjects.Contains(gameObject)) { gameObject.Simulate(delta); } }); } public void NetworkSync(long id) { GameObjects.ForEach(gameObject => { gameObject.NetworkWrite(id, false); }); } public void AssignObject(GameObject gameObject) { QueueManager.SectorReassignQueue.Enqueue((this, gameObject)); } public void SpawnObjects() { GameObjects.ForEach(GameManager.Instance.Spawn); } public GameObject GetObjectById(Guid id) { foreach (GameObject gameObject in GameObjects) { if (gameObject.UUID.Equals(id)) { return gameObject; } } return null; } public bool RemoveObjectById(Guid id) { foreach (GameObject gameObject in GameObjects) { if (gameObject.UUID.Equals(id)) { GameObjects.Remove(gameObject); return true; } } return false; } public List GetNeighbouringSectors() { List neighbours = []; Sector[,,] allSectors = GameManager.GameUniverse.Sectors; int sizeX = allSectors.GetLength(0); int sizeY = allSectors.GetLength(1); int sizeZ = allSectors.GetLength(2); int startX = Mathf.Clamp(Coordinates.X - 1, 0, sizeX - 1); int startY = Mathf.Clamp(Coordinates.Y - 1, 0, sizeY - 1); int startZ = Mathf.Clamp(Coordinates.Z - 1, 0, sizeZ - 1); int endX = Mathf.Clamp(Coordinates.X + 1, 0, sizeX - 1); int endY = Mathf.Clamp(Coordinates.Y + 1, 0, sizeY - 1); int endZ = Mathf.Clamp(Coordinates.Z + 1, 0, sizeZ - 1); for (int x = startX; x <= endX; x++) { for (int y = startY; y <= endY; y++) { for (int z = startZ; z <= endZ; z++) { neighbours.Add(allSectors[x, y, z]); } } } return neighbours; } public override bool Equals(object obj) { Sector sector = (Sector)obj; return sector.Coordinates == Coordinates; } public override int GetHashCode() { return Coordinates.GetHashCode(); } }