@@ -40,18 +40,18 @@ namespace GamecraftModdingAPI | |||
/// </summary> | |||
/// <param name="block">The block's type</param> | |||
/// <param name="color">The block's color</param> | |||
/// <param name="darkness">The block color's darkness (0-9) - 0 is default color</param> | |||
/// <param name="material">The block's material</param> | |||
/// <param name="position">The block's position - default block size is 0.2</param> | |||
/// <param name="rotation">The block's rotation in degrees</param> | |||
/// <param name="uscale">The block's uniform scale - default scale is 1 (with 0.2 width)</param> | |||
/// <param name="scale">The block's non-uniform scale - 0 means <paramref name="uscale"/> is used</param> | |||
/// <param name="player">The player who placed the block</param> | |||
/// <returns>The placed block or null if failed</returns> | |||
public static Block PlaceNew(BlockIDs block, float3 position, | |||
float3 rotation = default, BlockColors color = BlockColors.Default, byte darkness = 0, | |||
public static Block PlaceNew(BlockIDs block, float3 position, float3 rotation = default, | |||
BlockColors color = BlockColors.Default, BlockMaterial material = BlockMaterial.Default, | |||
int uscale = 1, float3 scale = default, Player player = null) | |||
{ | |||
return PlaceNew<Block>(block, position, rotation, color, darkness, uscale, scale, player); | |||
return PlaceNew<Block>(block, position, rotation, color, material, uscale, scale, player); | |||
} | |||
/// <summary> | |||
@@ -61,7 +61,7 @@ namespace GamecraftModdingAPI | |||
/// </summary> | |||
/// <param name="block">The block's type</param> | |||
/// <param name="color">The block's color</param> | |||
/// <param name="darkness">The block color's darkness (0-9) - 0 is default color</param> | |||
/// <param name="material">The block's materialr</param> | |||
/// <param name="position">The block's position - default block size is 0.2</param> | |||
/// <param name="rotation">The block's rotation in degrees</param> | |||
/// <param name="uscale">The block's uniform scale - default scale is 1 (with 0.2 width)</param> | |||
@@ -69,12 +69,12 @@ namespace GamecraftModdingAPI | |||
/// <param name="player">The player who placed the block</param> | |||
/// <returns>The placed block or null if failed</returns> | |||
public static T PlaceNew<T>(BlockIDs block, float3 position, | |||
float3 rotation = default, BlockColors color = BlockColors.Default, byte darkness = 0, | |||
float3 rotation = default, BlockColor? color = null, BlockMaterial material = BlockMaterial.Default, | |||
int uscale = 1, float3 scale = default, Player player = null) where T : Block | |||
{ | |||
if (PlacementEngine.IsInGame && GameState.IsBuildMode()) | |||
{ | |||
var egid = PlacementEngine.PlaceBlock(block, color, darkness, | |||
var egid = PlacementEngine.PlaceBlock(block, color ?? BlockColors.Default, material, | |||
position, uscale, scale, player, rotation, out var initializer); | |||
var bl = New<T>(egid.entityID, egid.groupID); | |||
bl.InitData.Group = BlockEngine.InitGroup(initializer); | |||
@@ -319,9 +319,7 @@ namespace GamecraftModdingAPI | |||
{ | |||
BlockEngine.SetBlockInfo(this, (ref ColourParameterEntityStruct color, BlockColor val) => | |||
{ | |||
color.indexInPalette = (byte) (val.Color + val.Darkness * 10); | |||
//color.overridePaletteColour = false; | |||
//color.needsUpdate = true; | |||
color.indexInPalette = val.Index; | |||
color.hasNetworkChange = true; | |||
color.paletteColour = BlockEngine.ConvertBlockColor(color.indexInPalette); | |||
}, value); | |||
@@ -339,13 +337,18 @@ namespace GamecraftModdingAPI | |||
BlockEngine.SetBlockInfo(this, (ref ColourParameterEntityStruct color, float4 val) => | |||
{ | |||
color.paletteColour = val; | |||
//color.overridePaletteColour = true; | |||
//color.needsUpdate = true; | |||
color.hasNetworkChange = true; | |||
}, value); | |||
} | |||
} | |||
public BlockMaterial Material | |||
{ | |||
get => BlockEngine.GetBlockInfo(this, (CubeMaterialStruct cmst) => (BlockMaterial) cmst.materialId); | |||
set => BlockEngine.SetBlockInfo(this, | |||
(ref CubeMaterialStruct cmst, BlockMaterial val) => cmst.materialId = (byte) val, value); | |||
} | |||
/// <summary> | |||
/// The text displayed on the block if applicable, or null. | |||
/// Setting it is temporary to the session, it won't be saved. | |||
@@ -433,7 +436,7 @@ namespace GamecraftModdingAPI | |||
/// <returns></returns> | |||
public T Copy<T>() where T : Block | |||
{ | |||
var block = PlaceNew<T>(Type, Position, Rotation, Color.Color, Color.Darkness, UniformScale, Scale); | |||
var block = PlaceNew<T>(Type, Position, Rotation, Color, Material, UniformScale, Scale); | |||
block.copiedFrom = Id; | |||
return block; | |||
} | |||
@@ -5,35 +5,35 @@ namespace GamecraftModdingAPI.Blocks | |||
{ | |||
public struct BlockColor | |||
{ | |||
public BlockColors Color; | |||
public byte Darkness; | |||
public BlockColors Color => Index == byte.MaxValue | |||
? BlockColors.Default | |||
: (BlockColors) (Index % 10); | |||
public byte Index => Color == BlockColors.Default | |||
? byte.MaxValue | |||
: (byte) (Darkness * 10 + Color); | |||
public byte Darkness => (byte) (Index == byte.MaxValue | |||
? 0 | |||
: Index / 10); | |||
public byte Index { get; } | |||
public BlockColor(byte index) | |||
{ | |||
if (index == byte.MaxValue) | |||
{ | |||
Color = BlockColors.Default; | |||
Darkness = 0; | |||
} | |||
else | |||
{ | |||
if (index > 99) | |||
throw new ArgumentOutOfRangeException(nameof(index), "Invalid color index. Must be 0-90 or 255."); | |||
Color = (BlockColors) (index % 10); | |||
Darkness = (byte) (index / 10); | |||
} | |||
if (index > 99 && index != byte.MaxValue) | |||
throw new ArgumentOutOfRangeException(nameof(index), "Invalid color index. Must be 0-90 or 255."); | |||
Index = index; | |||
} | |||
public BlockColor(BlockColors color, byte darkness) | |||
public BlockColor(BlockColors color, byte darkness = 0) | |||
{ | |||
if (darkness > 9) | |||
throw new ArgumentOutOfRangeException(nameof(darkness), "Darkness must be 0-9 where 0 is default."); | |||
Color = color; | |||
Darkness = darkness; | |||
if (color > BlockColors.Red) //Last valid color | |||
throw new ArgumentOutOfRangeException(nameof(color), "Invalid color!"); | |||
Index = (byte) (darkness * 10 + (byte) color); | |||
} | |||
public static implicit operator BlockColor(BlockColors color) | |||
{ | |||
return new BlockColor(color); | |||
} | |||
public float4 RGBA => Block.BlockEngine.ConvertBlockColor(Index); | |||
@@ -47,7 +47,7 @@ namespace GamecraftModdingAPI.Blocks | |||
/// <summary> | |||
/// Preset block colours | |||
/// </summary> | |||
public enum BlockColors | |||
public enum BlockColors : byte | |||
{ | |||
Default = byte.MaxValue, | |||
White = 0, | |||
@@ -0,0 +1,12 @@ | |||
namespace GamecraftModdingAPI.Blocks | |||
{ | |||
public enum BlockMaterial : byte | |||
{ | |||
Default = byte.MaxValue, | |||
SteelBodywork = 0, | |||
RigidSteel, | |||
CarbonFiber, | |||
Plastic, | |||
Wood | |||
} | |||
} |
@@ -40,17 +40,17 @@ namespace GamecraftModdingAPI.Blocks | |||
public EntitiesDB entitiesDB { get; set; } | |||
private static BlockEntityFactory _blockEntityFactory; //Injected from PlaceSingleBlockEngine | |||
public EGID PlaceBlock(BlockIDs block, BlockColors color, byte darkness, float3 position, int uscale, | |||
public EGID PlaceBlock(BlockIDs block, BlockColor color, BlockMaterial materialId, float3 position, int uscale, | |||
float3 scale, Player player, float3 rotation, out EntityInitializer initializer) | |||
{ //It appears that only the non-uniform scale has any visible effect, but if that's not given here it will be set to the uniform one | |||
if (darkness > 9) | |||
if (color.Darkness > 9) | |||
throw new Exception("That is too dark. Make sure to use 0-9 as darkness. (0 is default.)"); | |||
initializer = BuildBlock((ushort) block, (byte) (color + darkness * 10), position, uscale, scale, rotation, | |||
initializer = BuildBlock((ushort) block, color.Index, (byte) materialId, position, uscale, scale, rotation, | |||
(player ?? new Player(PlayerType.Local)).Id); | |||
return initializer.EGID; | |||
} | |||
private EntityInitializer BuildBlock(ushort block, byte color, float3 position, int uscale, float3 scale, float3 rot, uint playerId) | |||
private EntityInitializer BuildBlock(ushort block, byte color, byte materialId, float3 position, int uscale, float3 scale, float3 rot, uint playerId) | |||
{ | |||
if (_blockEntityFactory == null) | |||
throw new BlockException("The factory is null."); | |||
@@ -81,11 +81,11 @@ namespace GamecraftModdingAPI.Blocks | |||
indexInPalette = color, | |||
hasNetworkChange = true | |||
}); | |||
structInitializer.Init(new CubeMaterialStruct | |||
{ | |||
materialId = 0, //TODO | |||
cosmeticallyPaintedOnly = true //TODO | |||
}); | |||
if (materialId != byte.MaxValue) | |||
structInitializer.Init(new CubeMaterialStruct | |||
{ | |||
materialId = materialId | |||
}); | |||
uint prefabId = PrefabsID.GetOrCreatePrefabID(block, 0, 0, false); //TODO | |||
structInitializer.Init(new GFXPrefabEntityStructGPUI(prefabId)); | |||
structInitializer.Init(new PhysicsPrefabEntityStruct(prefabId)); | |||
@@ -224,8 +224,8 @@ namespace GamecraftModdingAPI.Tests | |||
float.Parse(s[1]), float.Parse(s[2]), float.Parse(s[3])); | |||
return; | |||
} | |||
new Player(PlayerType.Local).GetBlockLookedAt().Color = | |||
new BlockColor { Color = color }; | |||
new Player(PlayerType.Local).GetBlockLookedAt().Color = color; | |||
Logging.CommandLog("Colored block to " + color); | |||
}).Build(); | |||
@@ -31,8 +31,8 @@ namespace GamecraftModdingAPI.Utility | |||
public void SetInfo(string id, Func<string> contentGetter) => _extraInfo[id] = contentGetter; | |||
public bool RemoveInfo(string id) => _extraInfo.Remove(id); | |||
public string Name { get; } = "GamecraftModdingAPIDebugInterfaceGameEngine"; | |||
public bool isRemovable { get; } = true; | |||
public string Name => "GamecraftModdingAPIDebugInterfaceGameEngine"; | |||
public bool isRemovable => true; | |||
[HarmonyPatch] | |||
private class Patch | |||