From e281cfc93e83b4c8ba6db0b1ff96a0e09d10b3d3 Mon Sep 17 00:00:00 2001
From: biwa <6475593+biwa@users.noreply.github.com>
Date: Fri, 3 Sep 2021 20:00:14 +0200
Subject: [PATCH] 3D Floor Mode: fixed some problems when relocating control
 sectors that contain things

---
 Source/Plugins/3DFloorMode/ThreeDFloorMode.cs | 49 ++++++++-----------
 1 file changed, 20 insertions(+), 29 deletions(-)

diff --git a/Source/Plugins/3DFloorMode/ThreeDFloorMode.cs b/Source/Plugins/3DFloorMode/ThreeDFloorMode.cs
index 7e018996c..6998e96bd 100644
--- a/Source/Plugins/3DFloorMode/ThreeDFloorMode.cs
+++ b/Source/Plugins/3DFloorMode/ThreeDFloorMode.cs
@@ -18,30 +18,20 @@
 #region ================== Namespaces
 
 using System;
-using System.Collections;
 using System.Collections.Generic;
-using System.Globalization;
-using System.Text;
-using System.Windows.Forms;
-using System.IO;
-using System.Reflection;
+using System.Drawing;
+using System.Threading.Tasks;
 using System.Linq;
-using System.Diagnostics;
+using System.Windows.Forms;
 using CodeImp.DoomBuilder.Windows;
-using CodeImp.DoomBuilder.IO;
-using CodeImp.DoomBuilder.Data;
 using CodeImp.DoomBuilder.Map;
 using CodeImp.DoomBuilder.Rendering;
 using CodeImp.DoomBuilder.Geometry;
 using CodeImp.DoomBuilder.Editing;
-using System.Drawing;
 using CodeImp.DoomBuilder.Actions;
-using CodeImp.DoomBuilder.Types;
 using CodeImp.DoomBuilder.BuilderModes;
-using CodeImp.DoomBuilder.BuilderModes.Interface;
 using CodeImp.DoomBuilder.Controls;
 using CodeImp.DoomBuilder.Config;
-// using CodeImp.DoomBuilder.GZBuilder.Geometry;
 
 #endregion
 
@@ -1504,6 +1494,7 @@ namespace CodeImp.DoomBuilder.ThreeDFloorMode
 		public void RelocateControlSectors()
 		{
 			List<Vector2D> positions;
+			Dictionary<Sector, List<Thing>> controlsectorthings = new Dictionary<Sector, List<Thing>>();
 
 			if (threedfloors.Count == 0)
 			{
@@ -1528,6 +1519,11 @@ namespace CodeImp.DoomBuilder.ThreeDFloorMode
 				return;
 			}
 
+			// Update all thing's sector, since we might have to move things that are in control sectors
+			Parallel.ForEach(General.Map.Map.Things, t => {
+				t.DetermineSector(blockmap);
+			});
+
 			// Control sectors are not allowed to be bigger than what the CSA expects, otherwise sectors might overlap
 			// Abort relocation if one of the control sectors is too big (that should only happen if the user edited the
 			// sector manually
@@ -1540,6 +1536,16 @@ namespace CodeImp.DoomBuilder.ThreeDFloorMode
 					General.Interface.DisplayStatus(StatusType.Warning, string.Format("Control sector {0} exceeds horizontal or vertical dimension of {1}. Aborted", tdf.Sector.Index, BuilderPlug.Me.ControlSectorArea.SectorSize));
 					return;
 				}
+
+				if (!controlsectorthings.ContainsKey(tdf.Sector))
+					controlsectorthings.Add(tdf.Sector, new List<Thing>());
+
+				// Find all things in the 3D floor's control sector so they can be also moved
+				List<BlockEntry> belist = blockmap.GetSquareRange(tdf.Sector.BBox);
+				foreach (BlockEntry be in belist)
+					foreach (Thing t in be.Things)
+						if(t.Sector == tdf.Sector)
+							controlsectorthings[tdf.Sector].Add(t);
 			}
 
 			General.Map.UndoRedo.CreateUndo("Relocate 3D floor control sectors");
@@ -1552,21 +1558,6 @@ namespace CodeImp.DoomBuilder.ThreeDFloorMode
 			{
 				Vector2D offset = new Vector2D(tdf.Sector.BBox.Left - positions[i].x, tdf.Sector.BBox.Bottom - positions[i].y);
 				HashSet<Vertex> vertices = new HashSet<Vertex>();
-				List<Thing> movethings = new List<Thing>();
-				List<BlockEntry> belist = blockmap.GetSquareRange(tdf.Sector.BBox);
-
-				// Find all things in the 3D floor's control sector so they can be also moved
-				foreach (BlockEntry be in belist)
-				{
-					foreach (Thing t in be.Things)
-					{
-						// Always determine the thing's current sector because it might have change since the last determination
-						t.DetermineSector(blockmap);
-
-						if (t.Sector == tdf.Sector)
-							movethings.Add(t);
-					}
-				}
 
 				// Get all vertices
 				foreach (Sidedef sd in tdf.Sector.Sidedefs)
@@ -1580,7 +1571,7 @@ namespace CodeImp.DoomBuilder.ThreeDFloorMode
 					v.Move(v.Position - offset);
 
 				// Move the things in the control sector
-				foreach (Thing t in movethings)
+				foreach (Thing t in controlsectorthings[tdf.Sector])
 					t.Move(t.Position - new Vector3D(offset));
 
 				// The bounding box of the sector has changed
-- 
GitLab