using System.Collections.Generic; using RobocraftX.Blocks; using RobocraftX.Common; using RobocraftX.GUI.Hotbar.Colours; using Svelto.DataStructures; using Svelto.ECS; using GamecraftModdingAPI.Engines; namespace GamecraftModdingAPI.Blocks { public class BlockEngine : IApiEngine { public string Name { get; } = "GamecraftModdingAPIBlockGameEngine"; public EntitiesDB entitiesDB { set; private get; } public bool isRemovable => false; public void Dispose() { } public void Ready() { } public Block[] GetConnectedBlocks(EGID blockID) { if (!BlockExists(blockID)) return new Block[0]; Stack cubeStack = new Stack(); FasterList cubesToProcess = new FasterList(); ConnectedCubesUtility.TreeTraversal.GetConnectedCubes(entitiesDB, blockID.entityID, cubeStack, cubesToProcess, (in GridConnectionsEntityStruct g) => { return false; }); var ret = new Block[cubesToProcess.count]; for (int i = 0; i < cubesToProcess.count; i++) ret[i] = new Block(cubesToProcess[i]); return ret; } public void SetBlockColorFromPalette(ref ColourParameterEntityStruct color) { ref var paletteEntry = ref entitiesDB.QueryEntity(color.indexInPalette, CommonExclusiveGroups.COLOUR_PALETTE_GROUP); color.paletteColour = paletteEntry.Colour; } /// /// Get a struct of a block. Can be used to set properties. /// Returns a default value if not found. /// /// The block's ID /// The struct to query /// An editable reference to the struct public ref T GetBlockInfo(EGID blockID) where T : struct, IEntityComponent { if (entitiesDB.Exists(blockID)) return ref entitiesDB.QueryEntity(blockID); T[] structHolder = new T[1]; //Create something that can be referenced return ref structHolder[0]; //Gets a default value automatically } /// /// Get a struct of a block. Can be used to set properties. /// Returns a default value if not found. /// /// The block's ID /// Whether the specified struct exists for the block /// The struct to query /// An editable reference to the struct public ref T GetBlockInfo(EGID blockID, out bool exists) where T : struct, IEntityComponent { exists = entitiesDB.Exists(blockID); if (exists) return ref entitiesDB.QueryEntity(blockID); T[] structHolder = new T[1]; ref T structRef = ref structHolder[0]; return ref structRef; } public bool BlockExists(EGID id) { return entitiesDB.Exists(id); } public bool GetBlockInfoExists(EGID blockID) where T : struct, IEntityComponent { return entitiesDB.Exists(blockID); } #if DEBUG public EntitiesDB GetEntitiesDB() { return entitiesDB; } #endif } }