From d45f871d8f3abcc58556d6f5a834b132da6ec0ab Mon Sep 17 00:00:00 2001 From: Teravus Ovares (Dan Olivares) Date: Sat, 29 Aug 2009 03:36:41 -0400 Subject: * Only lock the Borders when they're being changed, otherwise one avatar's movement could hinder another avatar's movement. --- OpenSim/Region/Framework/Scenes/Scene.cs | 179 ++++++++++++++++++++++--------- 1 file changed, 130 insertions(+), 49 deletions(-) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 2c1d0e5..3e573cf 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -81,6 +81,8 @@ namespace OpenSim.Region.Framework.Scenes protected List m_regionRestartNotifyList = new List(); protected List m_neighbours = new List(); + public volatile bool BordersLocked = false; + public List NorthBorders = new List(); public List EastBorders = new List(); public List SouthBorders = new List(); @@ -331,6 +333,8 @@ namespace OpenSim.Region.Framework.Scenes m_config = config; Random random = new Random(); + + BordersLocked = true; Border northBorder = new Border(); northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- @@ -352,6 +356,7 @@ namespace OpenSim.Region.Framework.Scenes westBorder.CrossDirection = Cardinals.W; WestBorders.Add(westBorder); + BordersLocked = false; m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); m_moduleLoader = moduleLoader; @@ -482,6 +487,7 @@ namespace OpenSim.Region.Framework.Scenes /// public Scene(RegionInfo regInfo) { + BordersLocked = true; Border northBorder = new Border(); northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- northBorder.CrossDirection = Cardinals.N; @@ -501,6 +507,7 @@ namespace OpenSim.Region.Framework.Scenes westBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> westBorder.CrossDirection = Cardinals.W; WestBorders.Add(westBorder); + BordersLocked = false; m_regInfo = regInfo; m_eventManager = new EventManager(); @@ -1801,105 +1808,179 @@ namespace OpenSim.Region.Framework.Scenes public Border GetCrossedBorder(Vector3 position, Cardinals gridline) { + if (BordersLocked) + { + switch (gridline) + { + case Cardinals.N: + lock (NorthBorders) + { + foreach (Border b in NorthBorders) + { + if (b.TestCross(position)) + return b; + } + } + break; + case Cardinals.S: + lock (SouthBorders) + { + foreach (Border b in SouthBorders) + { + if (b.TestCross(position)) + return b; + } + } - switch (gridline) + break; + case Cardinals.E: + lock (EastBorders) + { + foreach (Border b in EastBorders) + { + if (b.TestCross(position)) + return b; + } + } + + break; + case Cardinals.W: + + lock (WestBorders) + { + foreach (Border b in WestBorders) + { + if (b.TestCross(position)) + return b; + } + } + break; + + } + } + else { - case Cardinals.N: - lock (NorthBorders) - { + switch (gridline) + { + case Cardinals.N: foreach (Border b in NorthBorders) { if (b.TestCross(position)) return b; } - } - break; - case Cardinals.S: - - - lock (SouthBorders) - { + + break; + case Cardinals.S: foreach (Border b in SouthBorders) { if (b.TestCross(position)) return b; } - } - - break; - case Cardinals.E: - lock (EastBorders) - { + break; + case Cardinals.E: foreach (Border b in EastBorders) { if (b.TestCross(position)) return b; } - } - break; - case Cardinals.W: - - lock (WestBorders) - { + break; + case Cardinals.W: foreach (Border b in WestBorders) { if (b.TestCross(position)) return b; } - } - break; + break; + } } + return null; } public bool TestBorderCross(Vector3 position, Cardinals border) { - switch (border) + if (BordersLocked) { - case Cardinals.N: - lock (NorthBorders) - { - foreach(Border b in NorthBorders) + switch (border) + { + case Cardinals.N: + lock (NorthBorders) + { + foreach (Border b in NorthBorders) + { + if (b.TestCross(position)) + return true; + } + } + break; + case Cardinals.E: + lock (EastBorders) + { + foreach (Border b in EastBorders) + { + if (b.TestCross(position)) + return true; + } + } + break; + case Cardinals.S: + lock (SouthBorders) + { + foreach (Border b in SouthBorders) + { + if (b.TestCross(position)) + return true; + } + } + break; + case Cardinals.W: + lock (WestBorders) + { + foreach (Border b in WestBorders) + { + if (b.TestCross(position)) + return true; + } + } + break; + } + } + else + { + switch (border) + { + case Cardinals.N: + foreach (Border b in NorthBorders) { if (b.TestCross(position)) return true; } - } - break; - case Cardinals.E: - lock (EastBorders) - { + break; + case Cardinals.E: foreach (Border b in EastBorders) { if (b.TestCross(position)) return true; } - } - break; - case Cardinals.S: - lock (SouthBorders) - { + break; + case Cardinals.S: foreach (Border b in SouthBorders) { if (b.TestCross(position)) return true; } - } - break; - case Cardinals.W: - lock (WestBorders) - { + break; + case Cardinals.W: foreach (Border b in WestBorders) { if (b.TestCross(position)) return true; - } - } - break; - + } + break; + } } return false; } -- cgit v1.1