87 lines
3.3 KiB
C#
87 lines
3.3 KiB
C#
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>
|
|
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>();
|
|
Svelto.DataStructures.FasterList<uint> cubesToMove = new Svelto.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 this.entitiesDB.QueryUniqueEntity<SimulationModeStateEntityStruct>(SimulationModeStateExclusiveGroups.GAME_STATE_GROUP).simulationMode == SimulationMode.Build;
|
|
}
|
|
}
|
|
}
|