diff --git a/GamecraftModdingAPI/Block.cs b/GamecraftModdingAPI/Block.cs
index c3e0393..f334c30 100644
--- a/GamecraftModdingAPI/Block.cs
+++ b/GamecraftModdingAPI/Block.cs
@@ -209,10 +209,10 @@ namespace GamecraftModdingAPI
///
public float3 Position
{
- get => Exists ? MovementEngine.GetPosition(Id) : float3.zero;
+ get => MovementEngine.GetPosition(Id, InitData);
set
{
- if (Exists) MovementEngine.MoveBlock(Id, value);
+ MovementEngine.MoveBlock(Id, InitData, value);
}
}
@@ -221,10 +221,10 @@ namespace GamecraftModdingAPI
///
public float3 Rotation
{
- get => Exists ? RotationEngine.GetRotation(Id) : float3.zero;
+ get => RotationEngine.GetRotation(Id, InitData);
set
{
- if (Exists) RotationEngine.RotateBlock(Id, value);
+ RotationEngine.RotateBlock(Id, InitData, value);
}
}
diff --git a/GamecraftModdingAPI/Blocks/ConsoleBlock.cs b/GamecraftModdingAPI/Blocks/ConsoleBlock.cs
index 4425a1e..edf3e76 100644
--- a/GamecraftModdingAPI/Blocks/ConsoleBlock.cs
+++ b/GamecraftModdingAPI/Blocks/ConsoleBlock.cs
@@ -22,6 +22,9 @@ namespace GamecraftModdingAPI.Blocks
// custom console block properties
+ ///
+ /// Setting a nonexistent command will crash the game when switching to simulation
+ ///
public string Command
{
get
diff --git a/GamecraftModdingAPI/Blocks/MovementEngine.cs b/GamecraftModdingAPI/Blocks/MovementEngine.cs
index 0ff119a..a4ac0fa 100644
--- a/GamecraftModdingAPI/Blocks/MovementEngine.cs
+++ b/GamecraftModdingAPI/Blocks/MovementEngine.cs
@@ -35,8 +35,17 @@ namespace GamecraftModdingAPI.Blocks
// implementations for Movement static class
- public float3 MoveBlock(EGID blockID, float3 vector)
+ internal float3 MoveBlock(EGID blockID, BlockEngine.BlockInitData data, float3 vector)
{
+ if (!entitiesDB.Exists(blockID))
+ {
+ if (data.Group == null) return float3.zero;
+ var init = new EntityComponentInitializer(blockID, data.Group);
+ init.Init(new PositionEntityStruct {position = vector});
+ init.Init(new GridRotationStruct {position = vector});
+ init.Init(new LocalTransformEntityStruct {position = vector});
+ return vector;
+ }
ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntity(blockID);
ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntity(blockID);
ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntity(blockID);
@@ -56,8 +65,14 @@ namespace GamecraftModdingAPI.Blocks
return posStruct.position;
}
- public float3 GetPosition(EGID blockID)
+ internal float3 GetPosition(EGID blockID, BlockEngine.BlockInitData data)
{
+ if (!entitiesDB.Exists(blockID))
+ {
+ if (data.Group == null) return float3.zero;
+ var init = new EntityComponentInitializer(blockID, data.Group);
+ return init.Has() ? init.Get().position : float3.zero;
+ }
ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntity(blockID);
return posStruct.position;
}
diff --git a/GamecraftModdingAPI/Blocks/RotationEngine.cs b/GamecraftModdingAPI/Blocks/RotationEngine.cs
index e9cd1ef..ca97874 100644
--- a/GamecraftModdingAPI/Blocks/RotationEngine.cs
+++ b/GamecraftModdingAPI/Blocks/RotationEngine.cs
@@ -35,23 +35,32 @@ namespace GamecraftModdingAPI.Blocks
// implementations for Rotation static class
- public float3 RotateBlock(EGID blockID, Vector3 vector)
+ internal float3 RotateBlock(EGID blockID, BlockEngine.BlockInitData data, Vector3 vector)
{
+ if (!entitiesDB.Exists(blockID))
+ {
+ if (data.Group == null) return float3.zero;
+ var init = new EntityComponentInitializer(blockID, data.Group);
+ init.Init(new RotationEntityStruct {rotation = new Quaternion {eulerAngles = vector}});
+ init.Init(new GridRotationStruct {rotation = new Quaternion {eulerAngles = vector}});
+ init.Init(new LocalTransformEntityStruct {rotation = new Quaternion {eulerAngles = vector}});
+ return vector;
+ }
ref RotationEntityStruct rotStruct = ref this.entitiesDB.QueryEntity(blockID);
ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntity(blockID);
ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntity(blockID);
ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntity(blockID);
// main (persistent) position
- Quaternion newRotation = (Quaternion)rotStruct.rotation;
- newRotation.eulerAngles += vector;
- rotStruct.rotation = (quaternion)newRotation;
+ Quaternion newRotation = rotStruct.rotation;
+ newRotation.eulerAngles = vector;
+ rotStruct.rotation = newRotation;
// placement grid rotation
- Quaternion newGridRotation = (Quaternion)gridStruct.rotation;
- newGridRotation.eulerAngles += vector;
- gridStruct.rotation = (quaternion)newGridRotation;
+ Quaternion newGridRotation = gridStruct.rotation;
+ newGridRotation.eulerAngles = vector;
+ gridStruct.rotation = newGridRotation;
// rendered position
- Quaternion newTransRotation = (Quaternion)rotStruct.rotation;
- newTransRotation.eulerAngles += vector;
+ Quaternion newTransRotation = rotStruct.rotation;
+ newTransRotation.eulerAngles = vector;
transStruct.rotation = newTransRotation;
// collision position
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, new Unity.Transforms.Rotation
@@ -63,8 +72,17 @@ namespace GamecraftModdingAPI.Blocks
}
- public float3 GetRotation(EGID blockID)
+ internal float3 GetRotation(EGID blockID, BlockEngine.BlockInitData data)
{
+ if (!entitiesDB.Exists(blockID))
+ {
+ if (data.Group == null) return float3.zero;
+ var init = new EntityComponentInitializer(blockID, data.Group);
+ return init.Has()
+ ? (float3) ((Quaternion) init.Get().rotation).eulerAngles
+ : float3.zero;
+ }
+
ref RotationEntityStruct rotStruct = ref entitiesDB.QueryEntity(blockID);
return ((Quaternion) rotStruct.rotation).eulerAngles;
}