174 lines
5.9 KiB
C#
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
|
|
}
|
|
} |