using System.Reflection; using Harmony; using RobocraftX.Blocks; using RobocraftX.Blocks.Ghost; using RobocraftX.Character.Camera; using RobocraftX.Character.Factories; using RobocraftX.Common; using RobocraftX.Players; using Svelto.ECS; using uREPL; using GamecraftModdingAPI.Commands; using GamecraftModdingAPI.Utility; namespace GamecraftModdingAPI.Blocks { public class RemovalEngine : IApiEngine { private static IEntityFunctions _entityFunctions; private static MachineGraphConnectionEntityFactory _connectionFactory; public bool RemoveBlock(EGID target) { if (!entitiesDB.Exists(target)) return false; var connections = entitiesDB.QueryEntity(target); for (int i = connections.connections.Length - 1; i >= 0; i--) _connectionFactory.RemoveConnection(connections, i, entitiesDB); _entityFunctions.RemoveEntity(target); return true; } /// /// Returns the block the player is currently looking at. /// /// The player's ID /// The maximum distance from the player (default is the player's building reach) /// The block's EGID or null if not found public EGID? GetBlockUnderCursor(uint playerId, float maxDistance = -1f) { if (!entitiesDB.TryQueryMappedEntities( CameraExclusiveGroups.CameraGroup, out var mapper)) return null; mapper.TryGetEntity(playerId, out CharacterCameraRayCastEntityStruct rayCast); float distance = maxDistance < 0 ? GhostBlockUtils.GetBuildInteractionDistance(entitiesDB, rayCast) : maxDistance; if (rayCast.hit && rayCast.distance <= distance) return rayCast.hitEgid; return null; } public void Ready() { CommandManager.AddCommand(new SimpleCustomCommandEngine(() => { var block = GetBlockUnderCursor(LocalPlayerIDUtility.GetLocalPlayerID(entitiesDB)); if (block.HasValue) { RemoveBlock(block.Value); Log.Output("Removed block."); } else Log.Output("No block found where you're looking at."); }, "removeCube", "Removes the cube you're looking at.")); } public EntitiesDB entitiesDB { get; set; } public void Dispose() { } public string Name { get; } = "GamecraftModdingAPIRemovalGameEngine"; [HarmonyPatch] public class FactoryObtainerPatch { static void Postfix(IEntityFunctions entityFunctions, MachineGraphConnectionEntityFactory machineGraphConnectionEntityFactory) { _entityFunctions = entityFunctions; _connectionFactory = machineGraphConnectionEntityFactory; Logging.MetaDebugLog("Requirements injected."); } static MethodBase TargetMethod(HarmonyInstance instance) { return AccessTools.TypeByName("RobocraftX.CR.MachineEditing.RemoveBlockEngine").GetConstructors()[0]; } } } }