80 lines
3 KiB
C#
80 lines
3 KiB
C#
using RobocraftX.Common;
|
|
using RobocraftX.UECS;
|
|
using Svelto.ECS;
|
|
using Svelto.ECS.EntityStructs;
|
|
using Unity.Transforms;
|
|
using Unity.Mathematics;
|
|
|
|
using GamecraftModdingAPI.Utility;
|
|
using GamecraftModdingAPI.Engines;
|
|
|
|
namespace GamecraftModdingAPI.Blocks
|
|
{
|
|
/// <summary>
|
|
/// Engine which executes block movement actions
|
|
/// </summary>
|
|
public class MovementEngine : IApiEngine
|
|
{
|
|
public string Name { get; } = "GamecraftModdingAPIMovementGameEngine";
|
|
|
|
public EntitiesDB entitiesDB { set; private get; }
|
|
|
|
public bool isRemovable => false;
|
|
|
|
public bool IsInGame = false;
|
|
|
|
public void Dispose()
|
|
{
|
|
IsInGame = false;
|
|
}
|
|
|
|
public void Ready()
|
|
{
|
|
IsInGame = true;
|
|
}
|
|
|
|
// implementations for Movement static class
|
|
|
|
internal float3 MoveBlock(EGID blockID, BlockEngine.BlockInitData data, float3 vector)
|
|
{
|
|
if (!entitiesDB.Exists<PositionEntityStruct>(blockID))
|
|
{
|
|
if (data.Group == null) return float3.zero;
|
|
var init = new EntityComponentInitializer(blockID, data.Group);
|
|
init.GetOrCreate<PositionEntityStruct>().position = vector;
|
|
init.GetOrCreate<GridRotationStruct>().position = vector;
|
|
init.GetOrCreate<LocalTransformEntityStruct>().position = vector;
|
|
return vector;
|
|
}
|
|
ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntity<PositionEntityStruct>(blockID);
|
|
ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntity<GridRotationStruct>(blockID);
|
|
ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntity<LocalTransformEntityStruct>(blockID);
|
|
ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntity<UECSPhysicsEntityStruct>(blockID);
|
|
// main (persistent) position
|
|
posStruct.position = vector;
|
|
// placement grid position
|
|
gridStruct.position = vector;
|
|
// rendered position
|
|
transStruct.position = vector;
|
|
// collision position
|
|
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, new Translation
|
|
{
|
|
Value = posStruct.position
|
|
});
|
|
entitiesDB.QueryEntity<GridConnectionsEntityStruct>(blockID).isProcessed = false;
|
|
return posStruct.position;
|
|
}
|
|
|
|
internal float3 GetPosition(EGID blockID, BlockEngine.BlockInitData data)
|
|
{
|
|
if (!entitiesDB.Exists<PositionEntityStruct>(blockID))
|
|
{
|
|
if (data.Group == null) return float3.zero;
|
|
var init = new EntityComponentInitializer(blockID, data.Group);
|
|
return init.Has<PositionEntityStruct>() ? init.Get<PositionEntityStruct>().position : float3.zero;
|
|
}
|
|
ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntity<PositionEntityStruct>(blockID);
|
|
return posStruct.position;
|
|
}
|
|
}
|
|
}
|