using System.Collections.Generic; using Global.Shared.OcTree; using Global.Shared.OcTree.Data; using Global.Shared.Plugin; using Sandbox.Game.Entities; using Sandbox.ModAPI; using VRageMath; namespace Global.Shared.API { public static class GlobalAPI { private static OcTreeHandler OcTreeHandler => GlobalStatic.OcTreeHandler; public static bool IsAwareOfGrid(long entityId) { return OcTreeHandler.GridTree.Contains(entityId); } public static IGridData GetGridById(long entityId) { IGridData grid = OcTreeHandler.GridTree.Get(entityId); if (grid != null) return grid; var entity = MyAPIGateway.Entities.GetEntityById(entityId); if (!(entity is MyCubeGrid g)) { var text = entity != null ? $"a {entity.GetType().Name}" : "non existent"; GlobalInstance.Log.Error($"GetGridById: Entity is not a grid, it is a {text}"); return null; } grid = OcTreeHandler.AddGrid(g); return grid; } public static IEnumerable GetAllGrids() { return OcTreeHandler.GridTree.GetAll(); } #region Experimental Spatial Data API public static IEnumerable LocateGridsExperimental(BoundingBoxD box) { return OcTreeHandler.GridTree.GetEnumerable(box); } public static IEnumerable LocateGridsExperimental(BoundingSphereD sphere) { return OcTreeHandler.GridTree.GetEnumerable(sphere); } public static IEnumerable LocateGridsExperimental(MyOrientedBoundingBoxD box) { return OcTreeHandler.GridTree.GetEnumerable(box); } public static IEnumerable LocateCharactersExperimental(BoundingBoxD box) { return OcTreeHandler.CharacterTree.GetEnumerable(box); } public static IEnumerable LocateCharactersExperimental(BoundingSphereD sphere) { return OcTreeHandler.CharacterTree.GetEnumerable(sphere); } public static IEnumerable LocateCharactersExperimental(MyOrientedBoundingBoxD box) { return OcTreeHandler.CharacterTree.GetEnumerable(box); } #endregion #region Spatial Data API public static void LocateGrids(List list, BoundingBoxD box, long flags = 0L) { OcTreeHandler.GridTree.GetExact(list, box, flags); } public static void LocateGrids(List list, BoundingSphereD sphere, long flags = 0L) { OcTreeHandler.GridTree.GetExact(list, sphere, flags); } public static void LocateGrids(List list, MyOrientedBoundingBoxD box, long flags = 0L) { OcTreeHandler.GridTree.GetExact(list, box, flags); } public static void LocateCharacters(List list, BoundingBoxD box, long flags = 0L) { OcTreeHandler.CharacterTree.GetExact(list, box, flags); } public static void LocateCharacters(List list, BoundingSphereD sphere, long flags = 0L) { OcTreeHandler.CharacterTree.GetExact(list, sphere, flags); } public static void LocateCharacters(List list, MyOrientedBoundingBoxD box, long flags = 0L) { OcTreeHandler.CharacterTree.GetExact(list, box, flags); } #endregion #region Extensions private static readonly List _internalGridList = new List(); private static readonly List _internalCharacterList = new List(); private static void GetExact(this GenericOcTree ocTree, List list, BoundingSphereD sphere, long flags = 0L) { _internalGridList.Clear(); ocTree.GetExact(_internalGridList, sphere, flags); list.AddRange(_internalGridList); } private static void GetExact(this GenericOcTree ocTree, List list, BoundingBoxD box, long flags = 0L) { _internalGridList.Clear(); ocTree.GetExact(_internalGridList, box, flags); list.AddRange(_internalGridList); } private static void GetExact(this GenericOcTree ocTree, List list, MyOrientedBoundingBoxD box, long flags = 0L) { _internalGridList.Clear(); ocTree.GetExact(_internalGridList, box, flags); list.AddRange(_internalGridList); } private static void GetExact(this GenericOcTree ocTree, List list, BoundingSphereD sphere, long flags = 0L) { _internalCharacterList.Clear(); ocTree.GetExact(_internalCharacterList, sphere, flags); list.AddRange(_internalCharacterList); } private static void GetExact(this GenericOcTree ocTree, List list, BoundingBoxD box, long flags = 0L) { _internalCharacterList.Clear(); ocTree.GetExact(_internalCharacterList, box, flags); list.AddRange(_internalCharacterList); } private static void GetExact(this GenericOcTree ocTree, List list, MyOrientedBoundingBoxD box, long flags = 0L) { _internalCharacterList.Clear(); ocTree.GetExact(_internalCharacterList, box, flags); list.AddRange(_internalCharacterList); } #endregion } }