using RobocraftX.Common; using RobocraftX.DOTS; using Svelto.ECS; using Svelto.ECS.EntityStructs; using Unity.Mathematics; using Unity.Transforms; using TechbloxModdingAPI.Engines; using TechbloxModdingAPI.Utility; namespace TechbloxModdingAPI.Blocks.Engines { /// /// Engine which executes block movement actions /// public class MovementEngine : IApiEngine { public string Name { get; } = "TechbloxModdingAPIMovementGameEngine"; 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(Block block, float3 vector) { ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntityOrDefault(block); ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntityOrDefault(block); ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntityOrDefault(block); var phyStruct = this.entitiesDB.QueryEntityOptional(block); // main (persistent) position posStruct.position = vector; // placement grid position gridStruct.position = vector; // rendered position transStruct.position = vector; // collision position if (phyStruct) { //It exists FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.Get().dotsEntity, new Translation { Value = posStruct.position }); } entitiesDB.QueryEntityOrDefault(block).areConnectionsAssigned = false; return posStruct.position; } internal float3 GetPosition(Block block) { return entitiesDB.QueryEntityOrDefault(block).position; } } }