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.

86 lines
2.9KB

  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;
  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. removedConnections = new(2000, Allocator.Persistent);
  42. }
  43. public EntitiesDB entitiesDB { get; set; }
  44. public void Dispose()
  45. {
  46. removedConnections.Dispose();
  47. }
  48. public string Name => "TechbloxModdingAPIRemovalGameEngine";
  49. public string name => Name;
  50. public bool isRemovable => false;
  51. [HarmonyPatch]
  52. class FactoryObtainerPatch
  53. {
  54. static void Postfix(IEntityFunctions entityFunctions,
  55. MachineGraphConnectionEntityFactory machineGraphConnectionEntityFactory)
  56. {
  57. _entityFunctions = entityFunctions;
  58. _connectionFactory = machineGraphConnectionEntityFactory;
  59. Logging.MetaDebugLog("Requirements injected.");
  60. }
  61. static MethodBase TargetMethod(Harmony instance)
  62. {
  63. return AccessTools.TypeByName("RobocraftX.CR.MachineEditing.RemoveBlockEngine").GetConstructors()[0];
  64. }
  65. }
  66. public JobHandle DeterministicStep(in float deltaTime, JobHandle inputDeps)
  67. {
  68. if (removedConnections.IsCreated)
  69. removedConnections.Clear();
  70. return default;
  71. }
  72. }
  73. }