public new void ReleaseSegment(ushort segment, bool keepNodes) { var caller = new System.Diagnostics.StackFrame(1).GetMethod().Name; //Debug.Log("ReleaseSegment (" + NetManager.instance.m_segments.m_buffer[segment].Info.name + ") called by " + caller); switch (caller) { case "MoveMiddleNode": // segment that was modified because user added network, keep data until replacement segments were created // Delete data of last moved segment if (MoveMiddleNode_releasedSegment > 0) { EventSegmentRelease?.Invoke(MoveMiddleNode_releasedSegment); } // Save segment id MoveMiddleNode_releasedSegment = segment; break; case "SplitSegment": // segment that was split by new node, keep data until replacement segments were created // Delete data of last splitted segment if (SplitSegment_releasedSegment > 0) { EventSegmentRelease?.Invoke(SplitSegment_releasedSegment); } // Save segment id SplitSegment_releasedSegment = segment; break; case "DeleteSegmentImpl": // segment deleted with bulldozer by user, delete data case "ReleasePaths": // segment deleted because user bulldozed building with integrated networks, delete data default: // unknown caller, delete data EventSegmentRelease?.Invoke(segment); break; } // Call original method RedirectionHelper.RevertRedirect(_NetManager_ReleaseSegment_original, _NetManager_ReleaseSegment_state); NetManager.instance.ReleaseSegment(segment, keepNodes); RedirectionHelper.RedirectCalls(_NetManager_ReleaseSegment_original, _NetManager_ReleaseSegment_detour); }
public new bool CreateSegment(out ushort segment, ref Randomizer randomizer, NetInfo info, ushort startNode, ushort endNode, Vector3 startDirection, Vector3 endDirection, uint buildIndex, uint modifiedIndex, bool invert) { // Call original method RedirectionHelper.RevertRedirect(_NetManager_CreateSegment_original, _NetManager_CreateSegment_state); var success = NetManager.instance.CreateSegment(out segment, ref randomizer, info, startNode, endNode, startDirection, endDirection, buildIndex, modifiedIndex, invert); RedirectionHelper.RedirectCalls(_NetManager_CreateSegment_original, _NetManager_CreateSegment_detour); var caller = new System.Diagnostics.StackFrame(1).GetMethod().Name; //Debug.Log("CreateSegment (" + info.name + ") called by " + caller); switch (caller) { case "CreateNode": var caller2 = new System.Diagnostics.StackFrame(2).GetMethod().Name; //Debug.Log("... called by " + caller2); if (caller2 == "CreateNode") // check that caller was called by NetTool { var caller3Type = new System.Diagnostics.StackFrame(3).GetMethod().DeclaringType?.Name; //Debug.Log("... called by " + caller3Type); if (caller3Type != null && caller3Type.StartsWith("NetTool", StringComparison.Ordinal)) // new segment created by user, apply selected style // use StartsWith to cover NetToolFine from FineRoadHeights, and other possible NetTools { if (success) { EventSegmentCreate?.Invoke(segment); } // Delete data of deleted segments if (MoveMiddleNode_releasedSegment > 0) { EventSegmentRelease?.Invoke(MoveMiddleNode_releasedSegment); } if (SplitSegment_releasedSegment > 0) { EventSegmentRelease?.Invoke(SplitSegment_releasedSegment); } SplitSegment_releasedSegment = 0; MoveMiddleNode_releasedSegment = 0; } } else if (caller2 == "LoadPaths") // segment created because user placed building with integrated networks { // TODO SementDataManager should not appear here. Instead, add argument to CreateEvent! if (SegmentDataManager.Instance.AssetMode && success) { EventSegmentCreate?.Invoke(segment); } } break; case "MoveMiddleNode": // segment that was modified because user added network, apply style of previous segment if (MoveMiddleNode_releasedSegment > 0) { if (success) { EventSegmentTransferData?.Invoke(MoveMiddleNode_releasedSegment, segment); } // Delete data of previous segment EventSegmentRelease?.Invoke(MoveMiddleNode_releasedSegment); MoveMiddleNode_releasedSegment = 0; } break; case "SplitSegment": // segment that was split by new node, apply style of previous segment if (SplitSegment_releasedSegment > 0) { if (success) { EventSegmentTransferData?.Invoke(SplitSegment_releasedSegment, segment); } } break; default: // unknown caller, ignore break; } return(success); }