|
- 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
- {
- /// <summary>
- /// Engine which executes block movement actions
- /// </summary>
- 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<PositionEntityStruct>(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
- ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntity<GridRotationStruct>(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
- ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntity<LocalTransformEntityStruct>(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
- ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntity<UECSPhysicsEntityStruct>(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<uint> cubeStack = new Stack<uint>();
- Gamecraft.DataStructures.FasterList<uint> cubesToMove = new Gamecraft.DataStructures.FasterList<uint>();
- 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<GridConnectionsEntityStruct>(cubesToMove[i], CommonExclusiveGroups.OWNED_BLOCKS_GROUP).isProcessed = false;
- }
- return this.entitiesDB.QueryEntity<PositionEntityStruct>(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP).position;
- }
-
- public bool IsBuildMode()
- {
- return GamecraftModdingAPI.Utility.GameState.IsBuildMode();
- }
- }
- }
|