A stable modding interface between Techblox and mods https://mod.exmods.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.8KB

  1. using System.Reflection;
  2. using Gamecraft.Blocks.BlockGroups;
  3. using HarmonyLib;
  4. using RobocraftX.Blocks;
  5. using RobocraftX.Common;
  6. using RobocraftX.GroupTags;
  7. using RobocraftX.StateSync;
  8. using Svelto.ECS;
  9. using Svelto.ECS.Native;
  10. using Techblox.Blocks.Connections;
  11. using Unity.Collections;
  12. using Unity.Jobs;
  13. using Allocator = Unity.Collections.Allocator;
  14. using TechbloxModdingAPI.Engines;
  15. using TechbloxModdingAPI.Utility;
  16. namespace TechbloxModdingAPI.Blocks.Engines
  17. {
  18. public class RemovalEngine : IApiEngine, IDeterministicTimeStopped
  19. {
  20. private static IEntityFunctions _entityFunctions;
  21. private static MachineGraphConnectionEntityFactory _connectionFactory;
  22. private NativeHashSet<ulong> removedConnections = new(2000, Allocator.Persistent);
  23. public bool RemoveBlock(EGID target)
  24. {
  25. if (!entitiesDB.Exists<MachineGraphConnectionsEntityStruct>(target))
  26. return false;
  27. using var connStructMapper =
  28. entitiesDB.QueryNativeMappedEntities<MachineGraphConnectionsEntityStruct>(GroupTag<BLOCK_TAG>.Groups,
  29. Svelto.Common.Allocator.Temp);
  30. if (entitiesDB.TryQueryNativeMappedEntities<MachineConnectionComponent>(
  31. ConnectionsExclusiveGroups.MACHINE_CONNECTION_GROUP, out var mapper))
  32. {
  33. BlockGroupUtility.RemoveBlockConnections(target, removedConnections, _connectionFactory,
  34. connStructMapper, mapper, entitiesDB.GetEntityReferenceMap(), _entityFunctions);
  35. }
  36. _entityFunctions.RemoveEntity<BlockEntityDescriptor>(target);
  37. return true;
  38. }
  39. public void Ready()
  40. {
  41. }
  42. public EntitiesDB entitiesDB { get; set; }
  43. public void Dispose()
  44. {
  45. removedConnections.Dispose();
  46. }
  47. public string Name => "TechbloxModdingAPIRemovalGameEngine";
  48. public string name => Name;
  49. public bool isRemovable => false;
  50. [HarmonyPatch]
  51. class FactoryObtainerPatch
  52. {
  53. static void Postfix(IEntityFunctions entityFunctions,
  54. MachineGraphConnectionEntityFactory machineGraphConnectionEntityFactory)
  55. {
  56. _entityFunctions = entityFunctions;
  57. _connectionFactory = machineGraphConnectionEntityFactory;
  58. Logging.MetaDebugLog("Requirements injected.");
  59. }
  60. static MethodBase TargetMethod(Harmony instance)
  61. {
  62. return AccessTools.TypeByName("RobocraftX.CR.MachineEditing.RemoveBlockEngine").GetConstructors()[0];
  63. }
  64. }
  65. public JobHandle DeterministicStep(in float deltaTime, JobHandle inputDeps)
  66. {
  67. removedConnections.Clear();
  68. return default;
  69. }
  70. }
  71. }