- Added a wrapper class that handles the individual wrapping of event handlers to individually handle exceptions - now it tracks the wrapped event handlers so it can unregister them properly - Fixed an exception that happened when two ECS objects were created with the same EGID - Added support for returning an existing ECS object if it exists instead of always creating a new one - Added a parameter to the entity query extension methods to override the group of the ECS object (could be used for the player properties)
57 lines
No EOL
3 KiB
C#
57 lines
No EOL
3 KiB
C#
using Svelto.ECS;
|
|
|
|
namespace TechbloxModdingAPI.Utility
|
|
{
|
|
public static class NativeApiExtensions
|
|
{
|
|
/// <summary>
|
|
/// Attempts to query an entity and returns an optional that contains the result if succeeded.
|
|
/// <b>This overload does not take initializer data into account.</b>
|
|
/// </summary>
|
|
/// <param name="entitiesDB">The entities DB</param>
|
|
/// <param name="egid">The EGID to query</param>
|
|
/// <typeparam name="T">The component type to query</typeparam>
|
|
/// <returns>An optional that contains the result on success or is empty if not found</returns>
|
|
public static OptionalRef<T> QueryEntityOptional<T>(this EntitiesDB entitiesDB, EGID egid)
|
|
where T : unmanaged, IEntityComponent
|
|
{
|
|
return entitiesDB.TryQueryEntitiesAndIndex<T>(egid, out uint index, out var array)
|
|
? new OptionalRef<T>(array, index)
|
|
: new OptionalRef<T>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Attempts to query an entity and returns the result in an optional reference.
|
|
/// </summary>
|
|
/// <param name="entitiesDB">The entities DB to query from</param>
|
|
/// <param name="obj">The ECS object to query</param>
|
|
/// <param name="group">The group of the entity if the object can have multiple</param>
|
|
/// <typeparam name="T">The component to query</typeparam>
|
|
/// <returns>A reference to the component or a dummy value</returns>
|
|
public static OptionalRef<T> QueryEntityOptional<T>(this EntitiesDB entitiesDB, EcsObjectBase obj, ExclusiveGroupStruct group = default)
|
|
where T : unmanaged, IEntityComponent
|
|
{
|
|
EGID id = group == ExclusiveGroupStruct.Invalid ? obj.Id : new EGID(obj.Id.entityID, group);
|
|
var opt = QueryEntityOptional<T>(entitiesDB, id);
|
|
return opt ? opt : new OptionalRef<T>(obj, true);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Attempts to query an entity and returns the result or a dummy value that can be modified.
|
|
/// </summary>
|
|
/// <param name="entitiesDB">The entities DB to query from</param>
|
|
/// <param name="obj">The ECS object to query</param>
|
|
/// <param name="group">The group of the entity if the object can have multiple</param>
|
|
/// <typeparam name="T">The component to query</typeparam>
|
|
/// <returns>A reference to the component or a dummy value</returns>
|
|
public static ref T QueryEntityOrDefault<T>(this EntitiesDB entitiesDB, EcsObjectBase obj, ExclusiveGroupStruct group = default)
|
|
where T : unmanaged, IEntityComponent
|
|
{
|
|
EGID id = group == ExclusiveGroupStruct.Invalid ? obj.Id : new EGID(obj.Id.entityID, group);
|
|
var opt = QueryEntityOptional<T>(entitiesDB, id);
|
|
if (opt) return ref opt.Get();
|
|
if (obj.InitData.Valid) return ref obj.InitData.Initializer(id).GetOrCreate<T>();
|
|
return ref opt.Get(); //Default value
|
|
}
|
|
}
|
|
} |