NorbiPeti
9609187cff
Removed GameState methods from block APIs Created a BlockUtility class to get the block the player is looking at Changed the return type of PlaceBlock, returning the ID of the newly placed block or null
83 lines
3.1 KiB
C#
83 lines
3.1 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;
|
|
using Svelto.DataStructures;
|
|
|
|
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 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>();
|
|
FasterList<uint> cubesToMove = new 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;
|
|
}
|
|
}
|
|
}
|