using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using RobocraftX; using RobocraftX.Blocks; using RobocraftX.Blocks.Ghost; using RobocraftX.Common; using RobocraftX.Multiplayer; using RobocraftX.SimulationModeState; using RobocraftX.UECS; using Unity.Entities; using Svelto.Context; using Svelto.ECS; using Svelto.ECS.EntityStructs; using Unity.Transforms; using Unity.Mathematics; using UnityEngine; using GamecraftModdingAPI.Utility; namespace GamecraftModdingAPI.Blocks { /// /// Engine which executes block movement actions /// public class MovementEngine : IApiEngine { public string Name { get; } = "GamecraftModdingAPIMovementGameEngine"; public IEntitiesDB entitiesDB { set; private get; } public bool IsInGame = false; public void Dispose() { IsInGame = false; } public void Ready() { IsInGame = true; } // implementations for Movement static class public float3 MoveBlock(uint blockID, float3 vector) { ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); // 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 }); return posStruct.position; } public float3 MoveConnectedBlocks(uint blockID, float3 vector) { Stack cubeStack = new Stack(); Gamecraft.DataStructures.FasterList cubesToMove = new Gamecraft.DataStructures.FasterList(); ConnectedCubesUtility.TreeTraversal.GetConnectedCubes(entitiesDB, blockID, cubeStack, cubesToMove, (in GridConnectionsEntityStruct g) => { return false; }); for (int i = 0; i < cubesToMove.Count; i++) { MoveBlock(cubesToMove[i], vector); entitiesDB.QueryEntity(cubesToMove[i], CommonExclusiveGroups.OWNED_BLOCKS_GROUP).isProcessed = false; } return this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP).position; } public bool IsBuildMode() { return GamecraftModdingAPI.Utility.GameState.IsBuildMode(); } } }