using System; using RobocraftX.Blocks; using Gamecraft.Blocks.TimerBlock; using Svelto.ECS; using Unity.Mathematics; using GamecraftModdingAPI; using GamecraftModdingAPI.Utility; namespace GamecraftModdingAPI.Blocks { public class Timer : Block { /// <summary> /// Places a new timer block. /// </summary> public static Timer PlaceNew(float3 position, float3 rotation = default, BlockColors color = BlockColors.Default, byte darkness = 0, int uscale = 1, float3 scale = default, Player player = null) { if (PlacementEngine.IsInGame && GameState.IsBuildMode()) { EGID id = PlacementEngine.PlaceBlock(BlockIDs.Timer, color, darkness, position, uscale, scale, player, rotation); return new Timer(id); } return null; } public Timer(EGID id) : base(id) { if (!BlockEngine.GetBlockInfoExists<TimerBlockDataStruct>(this.Id)) { throw new BlockTypeException($"Block is not a {this.GetType().Name} block"); } } public Timer(uint id) : base(id) { if (!BlockEngine.GetBlockInfoExists<TimerBlockDataStruct>(this.Id)) { throw new BlockTypeException($"Block is not a {this.GetType().Name} block"); } } // custom timer properties /// <summary> /// The player-specified start time. /// </summary> public float Start { get { return BlockEngine.GetBlockInfo<TimerBlockDataStruct>(Id).startTime; } set { ref TimerBlockDataStruct tbds = ref BlockEngine.GetBlockInfo<TimerBlockDataStruct>(Id); tbds.startTime = value; } } /// <summary> /// The player-specified end time. /// </summary> public float End { get { return BlockEngine.GetBlockInfo<TimerBlockDataStruct>(Id).endTime; } set { ref TimerBlockDataStruct tbds = ref BlockEngine.GetBlockInfo<TimerBlockDataStruct>(Id); tbds.endTime = value; } } /// <summary> /// Whether to display time with millisecond precision. /// </summary> public bool DisplayMilliseconds { get { return BlockEngine.GetBlockInfo<TimerBlockDataStruct>(Id).outputFormatHasMS; } set { ref TimerBlockDataStruct tbds = ref BlockEngine.GetBlockInfo<TimerBlockDataStruct>(Id); tbds.outputFormatHasMS = value; } } /// <summary> /// Current time (as of the last video frame), in milliseconds. /// </summary> public int CurrentTime { get { return BlockEngine.GetBlockInfo<TimerBlockLabelCacheEntityStruct>(Id).timeLastRenderFrameMS; } set { ref TimerBlockLabelCacheEntityStruct tblces = ref BlockEngine.GetBlockInfo<TimerBlockLabelCacheEntityStruct>(Id); tblces.timeLastRenderFrameMS = value; } } } }