From 9944748cbf856fac244248784222a80156447695 Mon Sep 17 00:00:00 2001 From: biwa <6475593+biwa@users.noreply.github.com> Date: Fri, 16 Jul 2021 17:56:55 +0200 Subject: [PATCH] Fixed a bug that could cause a crash when going over the maximum linedef limit --- Source/Core/Geometry/Tools.cs | 3 ++- Source/Core/Map/MapSet.cs | 24 +++++++++++++++---- .../ClassicModes/DrawGeometryMode.cs | 2 -- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Source/Core/Geometry/Tools.cs b/Source/Core/Geometry/Tools.cs index 6253e909c..d6b888163 100755 --- a/Source/Core/Geometry/Tools.cs +++ b/Source/Core/Geometry/Tools.cs @@ -1400,7 +1400,8 @@ namespace CodeImp.DoomBuilder.Geometry // Before this point, the new geometry is not linked with the existing geometry. // Now perform standard geometry stitching to merge the new geometry with the rest // of the map. The marked vertices indicate the new geometry. - map.StitchGeometry(); + if (!map.StitchGeometry()) + return false; map.Update(true, false); // Find our new lines again, because they have been merged with the other geometry diff --git a/Source/Core/Map/MapSet.cs b/Source/Core/Map/MapSet.cs index 1b37ec71b..62213815d 100755 --- a/Source/Core/Map/MapSet.cs +++ b/Source/Core/Map/MapSet.cs @@ -2129,22 +2129,36 @@ namespace CodeImp.DoomBuilder.Map // Split moving lines with unselected vertices ICollection<Vertex> nearbyfixedverts = FilterByArea(fixedverts, ref editarea); - if(!SplitLinesByVertices(movinglines, nearbyfixedverts, STITCH_DISTANCE, movinglines, mergemode)) + if (!SplitLinesByVertices(movinglines, nearbyfixedverts, STITCH_DISTANCE, movinglines, mergemode)) + { + EndAddRemove(); // Unfreeze arrays before returning return false; + } // Split non-moving lines with selected vertices fixedlines = new HashSet<Linedef>(fixedlines.Where(fixedline => !fixedline.IsDisposed)); - if(!SplitLinesByVertices(fixedlines, movingverts, STITCH_DISTANCE, movinglines, mergemode)) + if (!SplitLinesByVertices(fixedlines, movingverts, STITCH_DISTANCE, movinglines, mergemode)) + { + EndAddRemove(); // Unfreeze arrays before returning return false; + } //mxd. Split moving lines with fixed lines - if(!SplitLinesByLines(fixedlines, movinglines, mergemode)) return false; + if (!SplitLinesByLines(fixedlines, movinglines, mergemode)) + { + EndAddRemove(); // Unfreeze arrays before returning + return false; + } // Remove looped linedefs RemoveLoopedLinedefs(movinglines); - + // Join overlapping lines - if(!JoinOverlappingLines(movinglines)) return false; + if (!JoinOverlappingLines(movinglines)) + { + EndAddRemove(); // Unfreeze arrays before returning + return false; + } //mxd. Remove remaining new verts from dragged shape if possible if(mergemode == MergeGeometryMode.REPLACE) diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs index 1e16d9c6c..950c71716 100755 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs @@ -839,8 +839,6 @@ namespace CodeImp.DoomBuilder.BuilderModes else { // Drawing failed - // NOTE: I have to call this twice, because the first time only cancels this volatile mode - General.Map.UndoRedo.WithdrawUndo(); General.Map.UndoRedo.WithdrawUndo(); } } -- GitLab