using System.Reflection; using Gamecraft.Blocks.BlockGroups; using HarmonyLib; using RobocraftX.Blocks; using RobocraftX.Common; using RobocraftX.GroupTags; using RobocraftX.StateSync; using Svelto.ECS; using Svelto.ECS.Native; using Techblox.Blocks.Connections; using Unity.Collections; using Unity.Jobs; using Allocator = Unity.Collections.Allocator; using TechbloxModdingAPI.Engines; using TechbloxModdingAPI.Utility; namespace TechbloxModdingAPI.Blocks.Engines { public class RemovalEngine : IApiEngine, IDeterministicTimeStopped { private static IEntityFunctions _entityFunctions; private static MachineGraphConnectionEntityFactory _connectionFactory; private NativeHashSet removedConnections = new(2000, Allocator.Persistent); public bool RemoveBlock(EGID target) { if (!entitiesDB.Exists(target)) return false; using var connStructMapper = entitiesDB.QueryNativeMappedEntities(GroupTag.Groups, Svelto.Common.Allocator.Temp); if (entitiesDB.TryQueryNativeMappedEntities( ConnectionsExclusiveGroups.MACHINE_CONNECTION_GROUP, out var mapper)) { BlockGroupUtility.RemoveBlockConnections(target, removedConnections, _connectionFactory, connStructMapper, mapper, entitiesDB.GetEntityReferenceMap(), _entityFunctions); } _entityFunctions.RemoveEntity(target); return true; } public void Ready() { } public EntitiesDB entitiesDB { get; set; } public void Dispose() { removedConnections.Dispose(); } public string Name => "TechbloxModdingAPIRemovalGameEngine"; public string name => Name; public bool isRemovable => false; [HarmonyPatch] class FactoryObtainerPatch { static void Postfix(IEntityFunctions entityFunctions, MachineGraphConnectionEntityFactory machineGraphConnectionEntityFactory) { _entityFunctions = entityFunctions; _connectionFactory = machineGraphConnectionEntityFactory; Logging.MetaDebugLog("Requirements injected."); } static MethodBase TargetMethod(Harmony instance) { return AccessTools.TypeByName("RobocraftX.CR.MachineEditing.RemoveBlockEngine").GetConstructors()[0]; } } public JobHandle DeterministicStep(in float deltaTime, JobHandle inputDeps) { removedConnections.Clear(); return default; } } }