From a2c3709c23998543d87a3f50e53feec18abd127b Mon Sep 17 00:00:00 2001 From: NGnius Date: Sat, 14 Dec 2019 15:40:09 -0500 Subject: [PATCH] Fix last block move logic --- extracommands/ExtraCommands.csproj | 3 + extracommands/ExtraCommandsPlugin.cs | 2 +- extracommands/MoveBlocksCommandEngine.cs | 92 ++++++++++++++++++++---- 3 files changed, 81 insertions(+), 16 deletions(-) diff --git a/extracommands/ExtraCommands.csproj b/extracommands/ExtraCommands.csproj index 8570e06..1aa49c7 100644 --- a/extracommands/ExtraCommands.csproj +++ b/extracommands/ExtraCommands.csproj @@ -31,6 +31,9 @@ ..\ref\RobocraftX.Blocks.dll + + ..\ref\RobocraftX.Blocks.Ghost.dll + ..\ref\RobocraftX.Character.dll diff --git a/extracommands/ExtraCommandsPlugin.cs b/extracommands/ExtraCommandsPlugin.cs index 3f7e4c4..e4e61c5 100644 --- a/extracommands/ExtraCommandsPlugin.cs +++ b/extracommands/ExtraCommandsPlugin.cs @@ -14,7 +14,7 @@ namespace ExtraCommands public string Name { get; } = "ExtraCommands"; - public string Version { get; } = "v0.0.3"; + public string Version { get; } = "v0.0.3a"; public string HarmonyID { get; } = "org.git.exmods.extracommands.extracommands"; diff --git a/extracommands/MoveBlocksCommandEngine.cs b/extracommands/MoveBlocksCommandEngine.cs index c1775d3..960a9fa 100644 --- a/extracommands/MoveBlocksCommandEngine.cs +++ b/extracommands/MoveBlocksCommandEngine.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using RobocraftX.Multiplayer; using RobocraftX.Common; using RobocraftX.Blocks; +using RobocraftX.Blocks.Ghost; using Svelto.ECS; using Svelto.ECS.EntityStructs; using Unity.Entities; @@ -13,13 +14,17 @@ using RobocraftX.SimulationModeState; using RobocraftX.UECS; using Unity.Transforms; using Unity.Mathematics; +using UnityEngine; namespace ExtraCommands.Building { [CustomCommand("MoveBlocks", "Move all blocks (including ground) from their original position")] - [CustomCommand("MoveLastBlock", "Move last block from original position")] + [CustomCommand("MoveLastBlock", "Move last block from their original position")] + [CustomCommand("MoveNearBlock", "Move blocks attached to your ghost block from their original position")] + [CustomCommand("SetNearThreshold", "Set the threshold for a block to be considered 'near' to the ghost block")] class MoveBlocksCommandEngine : CustomCommandEngine { + private float nearbyThreshold = 0.2f; public MoveBlocksCommandEngine(UnityContext ctxHolder, EnginesRoot enginesRoot, World physW, Action reloadGame, MultiplayerInitParameters mpParams) : base(ctxHolder, enginesRoot, physW, reloadGame, mpParams) { } @@ -27,7 +32,9 @@ namespace ExtraCommands.Building public override void Ready() { CustomCommandUtility.Register("MoveBlocks", MoveBlocksCommand, "Move all blocks (including ground) from their original position"); - CustomCommandUtility.Register("MoveLastBlock", MoveLastBlockCommand, "Move last block from original position"); + CustomCommandUtility.Register("MoveLastBlock", MoveLastBlockCommand, "Move last block from their original position"); + //CustomCommandUtility.Register("MoveNearBlock", MoveNearbyBlockCommand, "Move blocks near your ghost block from their original position"); + //CustomCommandUtility.Register("SetNearThreshold", (float t)=> { this.nearbyThreshold = t; }, "Set the threshold for a block to be considered 'near' to the ghost block"); } // Move every block by vector (x,y,z) @@ -51,17 +58,61 @@ namespace ExtraCommands.Building // Move block with highest index by vector (x,y,z) private void MoveLastBlockCommand(float x, float y, float z) { - uint count = entitiesDB.Count(CommonExclusiveGroups.OWNED_BLOCKS_GROUP); + //uint count = entitiesDB.Count(CommonExclusiveGroups.OWNED_BLOCKS_GROUP); ref SimulationModeStateEntityStruct simMode = ref this.entitiesDB.QueryUniqueEntity(SimulationModeStateExclusiveGroups.GAME_STATE_GROUP); if (simMode.simulationMode != SimulationMode.Build) { uREPL.Log.Error("Blocks can only be moved in Build Mode"); return; } - float3 newPos = TranslateConnectedBlocks(count-1, new float3(x,y,z)); + float3 newPos = TranslateConnectedBlocks(CommonExclusiveGroups.CurrentBlockEntityID-1, new float3(x,y,z)); uREPL.Log.Output($"Moved block to ({newPos.x},{newPos.y},{newPos.z})"); } + private void MoveNearbyBlockCommand(float x, float y, float z) + { + ref SimulationModeStateEntityStruct simMode = ref this.entitiesDB.QueryUniqueEntity(SimulationModeStateExclusiveGroups.GAME_STATE_GROUP); + if (simMode.simulationMode != SimulationMode.Build) + { + uREPL.Log.Error("Blocks can only be moved in Build Mode"); + return; + } + // get ghost block data + uint ghostCount; + uint ghostBlockIndex = 0; + Vector3 ghostLocation = Vector3.zero; + PositionEntityStruct[] ghostBlockPositions = entitiesDB.QueryEntities(GHOST_BLOCKS.GHOST_GROUPS_INCLUDING_INVISIBLE[0], out ghostCount); + for (uint i = 0; i < ghostCount; i++) + { + ref PositionEntityStruct pacman = ref ghostBlockPositions[i]; + if ((Vector3)pacman.position != Vector3.zero) + { + ghostLocation = pacman.position; + ghostBlockIndex = i; + break; + } + } + if (ghostLocation == Vector3.zero) + { + uREPL.Log.Output("Ghost block not found; nothing moved"); + return; + } + uint count; + PositionEntityStruct[] positions = entitiesDB.QueryEntities(CommonExclusiveGroups.OWNED_BLOCKS_GROUP, out count); + for (uint i = 0; i < count; i++) + { + if (Math.Abs(positions[i].position.x - ghostLocation.x) < nearbyThreshold + && Math.Abs(positions[i].position.y - ghostLocation.y) < nearbyThreshold + && Math.Abs(positions[i].position.z - ghostLocation.z) < nearbyThreshold) + { + float3 newPos = TranslateConnectedBlocks(i, new float3(x, y, z)); + uREPL.Log.Output($"Moved block to ({newPos.x},{newPos.y},{newPos.z})"); + return; + } + } + uREPL.Log.Output("No block found near ghost block"); + } + // Move the block denoted by blockID by translationVector (old_position += translationVector) private float3 TranslateSingleBlock(uint blockID, float3 translationVector) { @@ -91,27 +142,36 @@ namespace ExtraCommands.Building private float3 TranslateConnectedBlocks(uint blockID, float3 translationVector) { + uREPL.Log.Output($"Last block id {CommonExclusiveGroups.CurrentBlockEntityID}, chosen {blockID}"); //float3 newPosition = TranslateSingleBlock(blockID, translationVector); - HashSet processedCubes = new HashSet(); + //HashSet processedCubes = new HashSet(); Stack cubeStack = new Stack(); - cubeStack.Push(blockID); - uint count; - GridConnectionsEntityStruct blockConnections; - MachineGraphConnectionEntityStruct[] connections; + //cubeStack.Push(blockID); + //uint count; + //GridConnectionsEntityStruct[] blockConnections; + //MachineGraphConnectionEntityStruct[] connections; + Svelto.DataStructures.FasterList cubesToMove = new Svelto.DataStructures.FasterList(); + ConnectedCubesUtility.TreeTraversal.GetConnectedCubes(entitiesDB, blockID, cubeStack, cubesToMove, (in GridConnectionsEntityStruct g) => { return false; }); + for(int i = 0; i < cubesToMove.Count; i++) { + TranslateSingleBlock(cubesToMove[i], translationVector); + entitiesDB.QueryEntity(cubesToMove[i], CommonExclusiveGroups.OWNED_BLOCKS_GROUP).isProcessed = false; + } + /* while (cubeStack.Count > 0) // find all inter-connected blocks { uint connectedBlockID = cubeStack.Pop(); processedCubes.Add(connectedBlockID); - ScalingEntityStruct scale = entitiesDB.QueryEntity(connectedBlockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); + //ScalingEntityStruct scale = entitiesDB.QueryEntity(connectedBlockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); //uREPL.Log.Output($"Catching {connectedBlockID} with scale {scale.scale}"); - blockConnections = entitiesDB.QueryEntity(connectedBlockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); - connections = entitiesDB.QueryEntities(blockConnections.connectionGroup, out count); + uint index; + blockConnections = entitiesDB.QueryEntitiesAndIndex(connectedBlockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP, out index); + connections = entitiesDB.QueryEntities(blockConnections[(int)index].connectionGroup, out count); foreach (MachineGraphConnectionEntityStruct conn in connections) { if (!processedCubes.Contains(conn.connectedBlock.entityID) - && blockConnections.isConnectionGroupAssigned + && blockConnections[(int)index].isConnectionGroupAssigned && (conn.oppositeConnectionEgid.entityID != 0u || conn.oppositeConnectionEgid.entityID != conn.connectedBlock.entityID)) { @@ -123,8 +183,8 @@ namespace ExtraCommands.Building foreach (uint id in processedCubes) { TranslateSingleBlock(id, translationVector); - } - //uREPL.Log.Output($"Found {processedCubes.Count} connected blocks"); + }*/ + uREPL.Log.Output($"Found {cubesToMove.Count} connected blocks"); return this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP).position; } @@ -132,6 +192,8 @@ namespace ExtraCommands.Building { CustomCommandUtility.Unregister("MoveBlocks"); CustomCommandUtility.Unregister("MoveLastBlock"); + //CustomCommandUtility.Unregister("MoveNearBlock"); + //CustomCommandUtility.Unregister("SetNearThreshold"); } } }