diff --git a/GamecraftModdingAPI/Block.cs b/GamecraftModdingAPI/Block.cs
index db220dc..88fcc3d 100644
--- a/GamecraftModdingAPI/Block.cs
+++ b/GamecraftModdingAPI/Block.cs
@@ -1,7 +1,9 @@
using System;
using Svelto.ECS;
+using Svelto.ECS.EntityStructs;
using RobocraftX.Common;
+using RobocraftX.Blocks.Scaling;
using Unity.Mathematics;
using GamecraftModdingAPI.Blocks;
@@ -9,6 +11,9 @@ using GamecraftModdingAPI.Utility;
namespace GamecraftModdingAPI
{
+ ///
+ /// A single (perhaps scaled) block. Properties may return default values if the block is removed and then setting them is ignored.
+ ///
public class Block
{
private static readonly PlacementEngine PlacementEngine = new PlacementEngine();
@@ -73,7 +78,8 @@ namespace GamecraftModdingAPI
public EGID Id { get; }
///
- /// The block's current position.
+ /// The block's current position or zero if the block no longer exists.
+ /// A block is 0.2 wide by default in terms of position.
///
public float3 Position
{
@@ -85,7 +91,7 @@ namespace GamecraftModdingAPI
}
///
- /// The block's current rotation in degrees.
+ /// The block's current rotation in degrees or zero if the block doesn't exist.
///
public float3 Rotation
{
@@ -97,10 +103,42 @@ namespace GamecraftModdingAPI
}
///
- /// The block's type (ID).
+ /// The block's non-uniform scale or zero if the block's invalid. Independent of the uniform scaling.
///
- public BlockIDs Type => (BlockIDs) (BlockEngine.GetBlockInfo(Id)?.DBID ?? 0);
+ public float3 Scale
+ {
+ get => BlockEngine.GetBlockInfo(Id)?.scale ?? float3.zero;
+ set
+ {
+ var def = new ScalingEntityStruct();
+ BlockEngine.GetBlockInfo(Id, ref def).scale = value;
+ }
+ }
+ ///
+ /// The block's uniform scale or zero if the block's invalid. Also sets the non-uniform scale.
+ ///
+ public int UniformScale
+ {
+ get => BlockEngine.GetBlockInfo(Id)?.desiredScaleFactor ?? 0;
+ set
+ {
+ var def = new BlockPlacementScaleEntityStruct();
+ ref var scaleStruct = ref BlockEngine.GetBlockInfo(Id, ref def);
+ scaleStruct.blockPlacementHeight = scaleStruct.blockPlacementWidth =
+ scaleStruct.desiredScaleFactor = scaleStruct.snapGridScale = value;
+ Scale = new float3(value, value, value);
+ }
+ }
+
+ ///
+ /// The block's type (ID). Returns BlockIDs.Invalid if the block doesn't exist anymore.
+ ///
+ public BlockIDs Type => (BlockIDs) (BlockEngine.GetBlockInfo(Id)?.DBID ?? ushort.MaxValue);
+
+ ///
+ /// The block's color. Returns BlockColors.Default if the block no longer exists.
+ ///
public BlockColor Color
{
get
@@ -118,10 +156,13 @@ namespace GamecraftModdingAPI
}
}
+ ///
+ /// Whether the block exists. The other properties will return a default value if the block doesn't exist.
+ ///
public bool Exists => BlockEngine.BlockExists(Id);
///
- /// Returns an array of blocks that are connected to this one.
+ /// Returns an array of blocks that are connected to this one. Returns an empty array if the block doesn't exist.
///
public Block[] GetConnectedCubes() => BlockEngine.GetConnectedBlocks(Id);
diff --git a/GamecraftModdingAPI/Blocks/BlockIDs.cs b/GamecraftModdingAPI/Blocks/BlockIDs.cs
index bba2583..a4d07ff 100644
--- a/GamecraftModdingAPI/Blocks/BlockIDs.cs
+++ b/GamecraftModdingAPI/Blocks/BlockIDs.cs
@@ -3,9 +3,10 @@ namespace GamecraftModdingAPI.Blocks
///
/// Possible block types
///
- public enum BlockIDs
+ public enum BlockIDs : ushort
{
- AluminiumCube,
+ Invalid = ushort.MaxValue,
+ AluminiumCube = 0,
AxleS,
HingeS = 3,
MotorS,
diff --git a/GamecraftModdingAPI/Main.cs b/GamecraftModdingAPI/Main.cs
index 3b15de8..5a65baf 100644
--- a/GamecraftModdingAPI/Main.cs
+++ b/GamecraftModdingAPI/Main.cs
@@ -72,7 +72,7 @@ namespace GamecraftModdingAPI
// init object-oriented classes
Player.Init();
Block.Init();
- DebugInterface.Init();
+ GameClient.Init();
Logging.MetaLog($"{currentAssembly.GetName().Name} v{currentAssembly.GetName().Version} initialized");
}
diff --git a/GamecraftModdingAPI/Tests/GamecraftModdingAPIPluginTest.cs b/GamecraftModdingAPI/Tests/GamecraftModdingAPIPluginTest.cs
index 2e97df7..e37a5bb 100644
--- a/GamecraftModdingAPI/Tests/GamecraftModdingAPIPluginTest.cs
+++ b/GamecraftModdingAPI/Tests/GamecraftModdingAPIPluginTest.cs
@@ -179,6 +179,8 @@ namespace GamecraftModdingAPI.Tests
CommandBuilder.Builder("Error", "Throw an error to make sure SimpleCustomCommandEngine's wrapper catches it.")
.Action(() => { throw new Exception("Error Command always throws an error"); })
.Build();
+
+ GameClient.SetDebugInfo("lookedAt", LookedAt);
/*
CommandManager.AddCommand(new SimpleCustomCommandEngine((float d) => { UnityEngine.Camera.main.fieldOfView = d; },
@@ -235,6 +237,17 @@ namespace GamecraftModdingAPI.Tests
}
}
+ private Player player;
+
+ private string LookedAt()
+ {
+ if (player == null)
+ player = new Player(Players.PlayerType.Local);
+ Block block = player.GetBlockLookedAt();
+ if (block == null) return "Block: none";
+ return "Block: " + block.Type + "\nColor: " + block.Color + "\n" + "At: " + block.Position;
+ }
+
public void OnFixedUpdate() { }
public void OnLateUpdate() { }
diff --git a/GamecraftModdingAPI/Utility/DebugInterfaceEngine.cs b/GamecraftModdingAPI/Utility/DebugInterfaceEngine.cs
index 2d470bb..b8b0222 100644
--- a/GamecraftModdingAPI/Utility/DebugInterfaceEngine.cs
+++ b/GamecraftModdingAPI/Utility/DebugInterfaceEngine.cs
@@ -19,7 +19,6 @@ namespace GamecraftModdingAPI.Utility
private static Dictionary> _extraInfo=new Dictionary>();
public void Ready()
{
- SetInfo("lookedAt", LookedAt);
}
public EntitiesDB entitiesDB { get; set; }
@@ -31,16 +30,6 @@ namespace GamecraftModdingAPI.Utility
public void SetInfo(string id, Func contentGetter) => _extraInfo[id] = contentGetter;
public bool RemoveInfo(string id) => _extraInfo.Remove(id);
- private Player player;
- private string LookedAt()
- {
- if (player == null)
- player = new Player(PlayerType.Local);
- Block block = player.GetBlockLookedAt();
- if (block == null) return "Block: none";
- return "Block: " + block.Type + "\nColor: " + block.Color + "\n" + "At: " + block.Position;
- }
-
public string Name { get; } = "GamecraftModdingAPIDebugInterfaceGameEngine";
public bool isRemovable { get; } = true;
@@ -63,7 +52,7 @@ namespace GamecraftModdingAPI.Utility
}
catch (Exception e)
{
- Console.WriteLine(e);
+ Logging.LogException(e, "Failed to inject AddInfo method for the debug display!");
}
return list;
@@ -71,8 +60,17 @@ namespace GamecraftModdingAPI.Utility
public static void AddInfo(StringBuffer sb)
{
- foreach (var info in _extraInfo.Values)
- sb.Append(info() + "\n");
+ foreach (var info in _extraInfo)
+ {
+ try
+ {
+ sb.Append(info.Value() + "\n");
+ }
+ catch (Exception e)
+ {
+ Logging.LogException(e, "Unable to get info for " + info.Key);
+ }
+ }
}
public static MethodInfo TargetMethod()
diff --git a/GamecraftModdingAPI/Utility/DebugInterface.cs b/GamecraftModdingAPI/Utility/GameClient.cs
similarity index 79%
rename from GamecraftModdingAPI/Utility/DebugInterface.cs
rename to GamecraftModdingAPI/Utility/GameClient.cs
index 1d5499e..98d8ccb 100644
--- a/GamecraftModdingAPI/Utility/DebugInterface.cs
+++ b/GamecraftModdingAPI/Utility/GameClient.cs
@@ -3,7 +3,7 @@ using GamecraftModdingAPI.Blocks;
namespace GamecraftModdingAPI.Utility
{
- public static class DebugInterface
+ public static class GameClient
{
private static DebugInterfaceEngine _engine = new DebugInterfaceEngine();
@@ -13,14 +13,14 @@ namespace GamecraftModdingAPI.Utility
///
/// A global ID for the custom information
/// A function that returns the current information
- public static void SetInfo(string id, Func contentGetter) => _engine.SetInfo(id, contentGetter);
+ public static void SetDebugInfo(string id, Func contentGetter) => _engine.SetInfo(id, contentGetter);
///
/// Removes an information provided by a plugin.
///
/// The ID of the custom information
///
- public static bool RemoveInfo(string id) => _engine.RemoveInfo(id);
+ public static bool RemoveDebugInfo(string id) => _engine.RemoveInfo(id);
public static void Init()
{