diff --git a/extracommands/CustomCommandAttribute.cs b/extracommands/CustomCommandAttribute.cs
index 30af547..df7cb5c 100644
--- a/extracommands/CustomCommandAttribute.cs
+++ b/extracommands/CustomCommandAttribute.cs
@@ -7,9 +7,12 @@ namespace ExtraCommands
{
public string Name { get; protected set; }
- public CustomCommandAttribute(string name = "")
+ public string Description { get; protected set; }
+
+ public CustomCommandAttribute(string name = "", string description = "")
{
this.Name = name;
+ this.Description = description;
}
}
}
diff --git a/extracommands/ExtraCommands.csproj b/extracommands/ExtraCommands.csproj
index 576f441..ba954b4 100644
--- a/extracommands/ExtraCommands.csproj
+++ b/extracommands/ExtraCommands.csproj
@@ -31,6 +31,9 @@
..\ref\RobocraftX.Input.dll
+
+ ..\ref\RobocraftX.MainGame.dll
+
..\ref\RobocraftX.Multiplayer.dll
@@ -49,6 +52,9 @@
..\ref\Svelto.ECS.dll
+
+ ..\ref\Svelto.Tasks.dll
+
..\ref\Unity.Entities.dll
@@ -70,6 +76,9 @@
..\ref\Unity.Mathematics.Extensions.Hybrid.dll
+
+ ..\ref\Unity.Transforms.dll
+
..\ref\UnityEngine.dll
diff --git a/extracommands/MoveBlocksCommandEngine.cs b/extracommands/MoveBlocksCommandEngine.cs
index 35fdad5..033242c 100644
--- a/extracommands/MoveBlocksCommandEngine.cs
+++ b/extracommands/MoveBlocksCommandEngine.cs
@@ -1,20 +1,21 @@
using System;
-using RobocraftX.GUI.CommandLine;
+using System.Collections.Generic;
using RobocraftX.Multiplayer;
-using RobocraftX.StateSync;
-using RobocraftX.Character;
using RobocraftX.Common;
using Svelto.ECS;
using Svelto.ECS.EntityStructs;
using Unity.Entities;
-using UnityEngine;
-using uREPL;
using Svelto.Context;
+using Svelto.Tasks;
using RobocraftX;
+using RobocraftX.SimulationModeState;
+using RobocraftX.UECS;
+using Unity.Transforms;
namespace ExtraCommands.Building
{
- //[CustomCommand("MoveBlocks", "Move blocks from their original position")]
+ [CustomCommand("MoveBlocks", "Move all blocks (including ground) from their original position")]
+ [CustomCommand("MoveLastBlock", "Move last block from original position")]
class MoveBlocksCommandEngine : CustomCommandEngine
{
public MoveBlocksCommandEngine(UnityContext ctxHolder, EnginesRoot enginesRoot, World physW, Action reloadGame, MultiplayerInitParameters mpParams) : base(ctxHolder, enginesRoot, physW, reloadGame, mpParams)
@@ -23,30 +24,134 @@ namespace ExtraCommands.Building
public override void Ready()
{
- CustomCommandUtility.Register("MoveBlocks", MoveBlocksCommand, "Move blocks from their original position");
+ CustomCommandUtility.Register("MoveBlocks", MoveBlocksCommand, "Move all blocks (including ground) from their original position");
+ CustomCommandUtility.Register("MoveLastBlock", MoveLastBlockCommand, "Move last block from original position");
}
+ // Move every block by vector (x,y,z)
private void MoveBlocksCommand(float x, float y, float z)
{
- uint blockCount;
- PositionEntityStruct[] posStructs = this.entitiesDB.QueryEntities(CommonExclusiveGroups.OWNED_BLOCKS_GROUP, out blockCount);
- for (uint i = 0; i < blockCount; i++)
+ ref SimulationModeStateEntityStruct simMode = ref this.entitiesDB.QueryUniqueEntity(SimulationModeStateExclusiveGroups.GAME_STATE_GROUP);
+ if (simMode.simulationMode != SimulationMode.Build)
{
- ref PositionEntityStruct posStruct = ref posStructs[i];
- if (!posStruct.Equals(null) && !posStruct.position.Equals(null))
+ uREPL.Log.Error("Blocks can only be moved in Build Mode");
+ return;
+ }
+ uint posCount, transCount, phyCount;
+ PositionEntityStruct[] posStructs = this.entitiesDB.QueryEntities(CommonExclusiveGroups.OWNED_BLOCKS_GROUP, out posCount);
+ LocalTransformEntityStruct[] transStructs = this.entitiesDB.QueryEntities(CommonExclusiveGroups.OWNED_BLOCKS_GROUP, out transCount);
+ UECSPhysicsEntityStruct[] phyStructs = this.entitiesDB.QueryEntities(CommonExclusiveGroups.OWNED_BLOCKS_GROUP, out phyCount);
+ if (posCount != transCount || transCount != phyCount)
+ {
+ uREPL.Log.Error("Block lists returned are not the same length!"); // they're arrays, not lists
+ return;
+ }
+ for (uint i = 0; i < posCount; i++)
+ {
+ ref PositionEntityStruct posStruct = ref posStructs[i]; // main (persistent) position
+ posStruct.position.x += x;
+ posStruct.position.y += y;
+ posStruct.position.z += z;
+ ref LocalTransformEntityStruct transStruct = ref transStructs[i]; // rendered position
+ transStruct.position.x += x;
+ transStruct.position.y += y;
+ transStruct.position.z += z;
+ ref UECSPhysicsEntityStruct phyStruct = ref phyStructs[i]; // collision position
+ this.physWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, new Translation
{
- posStruct.position.x += x;
- posStruct.position.y += y;
- posStruct.position.z += z;
- } else {
- uREPL.Log.Warn("Null position found for position "+i);
+ Value = posStruct.position
+ });
+ }
+ uREPL.Log.Output($"Moved {posCount} blocks");
+ }
+
+ // Move block with highest index by vector (x,y,z)
+ private void MoveLastBlockCommand(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;
+ }
+ uint posCount, transCount, phyCount;
+ PositionEntityStruct[] posStructs = this.entitiesDB.QueryEntities(CommonExclusiveGroups.OWNED_BLOCKS_GROUP, out posCount);
+ LocalTransformEntityStruct[] transStructs = this.entitiesDB.QueryEntities(CommonExclusiveGroups.OWNED_BLOCKS_GROUP, out transCount);
+ UECSPhysicsEntityStruct[] phyStructs = this.entitiesDB.QueryEntities(CommonExclusiveGroups.OWNED_BLOCKS_GROUP, out phyCount);
+ if (posCount == 0 || transCount == 0 || phyCount == 0)
+ {
+ uREPL.Log.Error("No block found");
+ return;
+ }
+ ref PositionEntityStruct posStruct = ref posStructs[posCount-1]; // main (persistent) position
+ posStruct.position.x += x;
+ posStruct.position.y += y;
+ posStruct.position.z += z;
+ ref LocalTransformEntityStruct transStruct = ref transStructs[transCount-1]; // rendered position
+ transStruct.position.x += x;
+ transStruct.position.y += y;
+ transStruct.position.z += z;
+ ref UECSPhysicsEntityStruct phyStruct = ref phyStructs[phyCount-1]; // collision position
+ this.physWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, new Translation
+ {
+ Value = posStruct.position
+ });
+ uREPL.Log.Output($"Moved block to ({posStruct.position.x},{posStruct.position.y},{posStruct.position.z})");
+ }
+
+ // unused; for future reference
+ private void ToggleMode()
+ {
+ ref SimulationModeStateEntityStruct ptr = ref this.entitiesDB.QueryUniqueEntity(SimulationModeStateExclusiveGroups.GAME_STATE_GROUP);
+ ref SimulationFrameEntityStruct ptr2 = ref this.entitiesDB.QueryUniqueEntity(SimulationFrame.SimulationFrameGroup);
+ switch (ptr.simulationMode)
+ {
+ case SimulationMode.Build:
+ ptr.simulationMode = SimulationMode.SwitchToSim;
+ ptr.simulationModeChangeFrame = ptr2.simFrame;
+ return;
+ case SimulationMode.SwitchToSim:
+ case SimulationMode.SwitchToBuild:
+ return;
+ case SimulationMode.Simulation:
+ ptr.simulationMode = SimulationMode.SwitchToBuild;
+ ptr.simulationModeChangeFrame = ptr2.simFrame;
+ ptr.rigidBodiesCreated = false;
+ return;
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+ }
+
+ // unused; for future reference
+ private IEnumerator TriggerSwitchToSimTask()
+ {
+ this.ToggleMode();
+ yield break;
+ }
+
+ // unused; for future reference
+ private IEnumerator WaitThenTriggerSwitchToBuildTask()
+ {
+ while (true)
+ {
+ SimulationModeStateEntityStruct modeStruct = this.entitiesDB.QueryUniqueEntity(SimulationModeStateExclusiveGroups.GAME_STATE_GROUP);
+ if (modeStruct.simulationMode == SimulationMode.Simulation)
+ {
+ this.ToggleMode();
+ break;
+ } else
+ {
+ yield return Yield.It;
}
}
+ yield break;
}
public override void Dispose()
{
CustomCommandUtility.Unregister("MoveBlocks");
+ CustomCommandUtility.Unregister("MoveLastBlock");
}
}
}