Files
QuartZ-dump/GlobalShared/API/GlobalAPI.cs
2024-12-29 21:15:58 +01:00

174 lines
5.9 KiB
C#

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<IGridData> GetAllGrids()
{
return OcTreeHandler.GridTree.GetAll();
}
#region Experimental Spatial Data API
public static IEnumerable<IGridData> LocateGridsExperimental(BoundingBoxD box)
{
return OcTreeHandler.GridTree.GetEnumerable(box);
}
public static IEnumerable<IGridData> LocateGridsExperimental(BoundingSphereD sphere)
{
return OcTreeHandler.GridTree.GetEnumerable(sphere);
}
public static IEnumerable<IGridData> LocateGridsExperimental(MyOrientedBoundingBoxD box)
{
return OcTreeHandler.GridTree.GetEnumerable(box);
}
public static IEnumerable<IControllableEntityData> LocateCharactersExperimental(BoundingBoxD box)
{
return OcTreeHandler.CharacterTree.GetEnumerable(box);
}
public static IEnumerable<IControllableEntityData> LocateCharactersExperimental(BoundingSphereD sphere)
{
return OcTreeHandler.CharacterTree.GetEnumerable(sphere);
}
public static IEnumerable<IControllableEntityData> LocateCharactersExperimental(MyOrientedBoundingBoxD box)
{
return OcTreeHandler.CharacterTree.GetEnumerable(box);
}
#endregion
#region Spatial Data API
public static void LocateGrids(List<IGridData> list, BoundingBoxD box, long flags = 0L)
{
OcTreeHandler.GridTree.GetExact(list, box, flags);
}
public static void LocateGrids(List<IGridData> list, BoundingSphereD sphere, long flags = 0L)
{
OcTreeHandler.GridTree.GetExact(list, sphere, flags);
}
public static void LocateGrids(List<IGridData> list, MyOrientedBoundingBoxD box, long flags = 0L)
{
OcTreeHandler.GridTree.GetExact(list, box, flags);
}
public static void LocateCharacters(List<IControllableEntityData> list, BoundingBoxD box, long flags = 0L)
{
OcTreeHandler.CharacterTree.GetExact(list, box, flags);
}
public static void LocateCharacters(List<IControllableEntityData> list, BoundingSphereD sphere,
long flags = 0L)
{
OcTreeHandler.CharacterTree.GetExact(list, sphere, flags);
}
public static void LocateCharacters(List<IControllableEntityData> list, MyOrientedBoundingBoxD box,
long flags = 0L)
{
OcTreeHandler.CharacterTree.GetExact(list, box, flags);
}
#endregion
#region Extensions
private static readonly List<GridData> _internalGridList = new List<GridData>();
private static readonly List<ControllableEntityData>
_internalCharacterList = new List<ControllableEntityData>();
private static void GetExact(this GenericOcTree<GridData> ocTree, List<IGridData> list, BoundingSphereD sphere,
long flags = 0L)
{
_internalGridList.Clear();
ocTree.GetExact(_internalGridList, sphere, flags);
list.AddRange(_internalGridList);
}
private static void GetExact(this GenericOcTree<GridData> ocTree, List<IGridData> list, BoundingBoxD box,
long flags = 0L)
{
_internalGridList.Clear();
ocTree.GetExact(_internalGridList, box, flags);
list.AddRange(_internalGridList);
}
private static void GetExact(this GenericOcTree<GridData> ocTree, List<IGridData> list,
MyOrientedBoundingBoxD box,
long flags = 0L)
{
_internalGridList.Clear();
ocTree.GetExact(_internalGridList, box, flags);
list.AddRange(_internalGridList);
}
private static void GetExact(this GenericOcTree<ControllableEntityData> ocTree,
List<IControllableEntityData> list, BoundingSphereD sphere,
long flags = 0L)
{
_internalCharacterList.Clear();
ocTree.GetExact(_internalCharacterList, sphere, flags);
list.AddRange(_internalCharacterList);
}
private static void GetExact(this GenericOcTree<ControllableEntityData> ocTree,
List<IControllableEntityData> list, BoundingBoxD box,
long flags = 0L)
{
_internalCharacterList.Clear();
ocTree.GetExact(_internalCharacterList, box, flags);
list.AddRange(_internalCharacterList);
}
private static void GetExact(this GenericOcTree<ControllableEntityData> ocTree,
List<IControllableEntityData> list,
MyOrientedBoundingBoxD box,
long flags = 0L)
{
_internalCharacterList.Clear();
ocTree.GetExact(_internalCharacterList, box, flags);
list.AddRange(_internalCharacterList);
}
#endregion
}
}