/*public static void Apply(HarmonyInstance harmony) * { * var fix = typeof(BuildingDecorationDetour).GetMethod("LoadPaths"); * harmony.Patch(OriginalMethod, new HarmonyMethod(fix), null, null); * * }*/ /*public static void Revert(HarmonyInstance harmony) * { * harmony.Unpatch(OriginalMethod, HarmonyPatchType.Prefix); * }*/ /*private static MethodInfo OriginalMethod => typeof(BuildingDecoration).GetMethod("LoadPaths");*/ #endregion DETOUR private static HashSet <ConnectionPoint> ReleaseCollidingSegments() { // We obtain a list of nodes adjacent to the deleted segment to know where to reconnect HashSet <ConnectionPoint> borderNodes = new HashSet <ConnectionPoint>(); if (ToolControllerDetour.CollidingSegmentsCache2 == null) { return(null); } foreach (ushort segment in ToolControllerDetour.CollidingSegmentsCache2) { //Debug.Log("Releasing segment " + segment); NetSegment netSegment = NetAccess.GetSegment(segment); // We keep untouchable segments if ((netSegment.m_flags & NetSegment.Flags.Untouchable) != NetSegment.Flags.None) { continue; } bool inverted = ((netSegment.m_flags & NetSegment.Flags.Invert) != NetSegment.Flags.None); borderNodes.Add(new ConnectionPoint(netSegment.m_startNode, netSegment.m_startDirection, netSegment.Info, inverted)); borderNodes.Add(new ConnectionPoint(netSegment.m_endNode, netSegment.m_endDirection, netSegment.Info, !inverted)); NetAccess.ReleaseSegment(segment, true); } borderNodes.RemoveWhere(n => !NetAccess.ExistsNode(n.Node)); ToolControllerDetour.CollidingSegmentsCache2 = null; //Debug.Log("Border nodes (1): " + borderNodes.Count); return(borderNodes); }