diff options
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 179 |
1 files changed, 130 insertions, 49 deletions
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 | |||
81 | protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>(); | 81 | protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>(); |
82 | protected List<RegionInfo> m_neighbours = new List<RegionInfo>(); | 82 | protected List<RegionInfo> m_neighbours = new List<RegionInfo>(); |
83 | 83 | ||
84 | public volatile bool BordersLocked = false; | ||
85 | |||
84 | public List<Border> NorthBorders = new List<Border>(); | 86 | public List<Border> NorthBorders = new List<Border>(); |
85 | public List<Border> EastBorders = new List<Border>(); | 87 | public List<Border> EastBorders = new List<Border>(); |
86 | public List<Border> SouthBorders = new List<Border>(); | 88 | public List<Border> SouthBorders = new List<Border>(); |
@@ -331,6 +333,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
331 | m_config = config; | 333 | m_config = config; |
332 | 334 | ||
333 | Random random = new Random(); | 335 | Random random = new Random(); |
336 | |||
337 | BordersLocked = true; | ||
334 | 338 | ||
335 | Border northBorder = new Border(); | 339 | Border northBorder = new Border(); |
336 | northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- | 340 | northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- |
@@ -352,6 +356,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
352 | westBorder.CrossDirection = Cardinals.W; | 356 | westBorder.CrossDirection = Cardinals.W; |
353 | WestBorders.Add(westBorder); | 357 | WestBorders.Add(westBorder); |
354 | 358 | ||
359 | BordersLocked = false; | ||
355 | 360 | ||
356 | m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); | 361 | m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); |
357 | m_moduleLoader = moduleLoader; | 362 | m_moduleLoader = moduleLoader; |
@@ -482,6 +487,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
482 | /// <param name="regInfo"></param> | 487 | /// <param name="regInfo"></param> |
483 | public Scene(RegionInfo regInfo) | 488 | public Scene(RegionInfo regInfo) |
484 | { | 489 | { |
490 | BordersLocked = true; | ||
485 | Border northBorder = new Border(); | 491 | Border northBorder = new Border(); |
486 | northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- | 492 | northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- |
487 | northBorder.CrossDirection = Cardinals.N; | 493 | northBorder.CrossDirection = Cardinals.N; |
@@ -501,6 +507,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
501 | westBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> | 507 | westBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> |
502 | westBorder.CrossDirection = Cardinals.W; | 508 | westBorder.CrossDirection = Cardinals.W; |
503 | WestBorders.Add(westBorder); | 509 | WestBorders.Add(westBorder); |
510 | BordersLocked = false; | ||
504 | 511 | ||
505 | m_regInfo = regInfo; | 512 | m_regInfo = regInfo; |
506 | m_eventManager = new EventManager(); | 513 | m_eventManager = new EventManager(); |
@@ -1801,105 +1808,179 @@ namespace OpenSim.Region.Framework.Scenes | |||
1801 | 1808 | ||
1802 | public Border GetCrossedBorder(Vector3 position, Cardinals gridline) | 1809 | public Border GetCrossedBorder(Vector3 position, Cardinals gridline) |
1803 | { | 1810 | { |
1811 | if (BordersLocked) | ||
1812 | { | ||
1813 | switch (gridline) | ||
1814 | { | ||
1815 | case Cardinals.N: | ||
1816 | lock (NorthBorders) | ||
1817 | { | ||
1818 | foreach (Border b in NorthBorders) | ||
1819 | { | ||
1820 | if (b.TestCross(position)) | ||
1821 | return b; | ||
1822 | } | ||
1823 | } | ||
1824 | break; | ||
1825 | case Cardinals.S: | ||
1826 | lock (SouthBorders) | ||
1827 | { | ||
1828 | foreach (Border b in SouthBorders) | ||
1829 | { | ||
1830 | if (b.TestCross(position)) | ||
1831 | return b; | ||
1832 | } | ||
1833 | } | ||
1804 | 1834 | ||
1805 | switch (gridline) | 1835 | break; |
1836 | case Cardinals.E: | ||
1837 | lock (EastBorders) | ||
1838 | { | ||
1839 | foreach (Border b in EastBorders) | ||
1840 | { | ||
1841 | if (b.TestCross(position)) | ||
1842 | return b; | ||
1843 | } | ||
1844 | } | ||
1845 | |||
1846 | break; | ||
1847 | case Cardinals.W: | ||
1848 | |||
1849 | lock (WestBorders) | ||
1850 | { | ||
1851 | foreach (Border b in WestBorders) | ||
1852 | { | ||
1853 | if (b.TestCross(position)) | ||
1854 | return b; | ||
1855 | } | ||
1856 | } | ||
1857 | break; | ||
1858 | |||
1859 | } | ||
1860 | } | ||
1861 | else | ||
1806 | { | 1862 | { |
1807 | case Cardinals.N: | 1863 | switch (gridline) |
1808 | lock (NorthBorders) | 1864 | { |
1809 | { | 1865 | case Cardinals.N: |
1810 | foreach (Border b in NorthBorders) | 1866 | foreach (Border b in NorthBorders) |
1811 | { | 1867 | { |
1812 | if (b.TestCross(position)) | 1868 | if (b.TestCross(position)) |
1813 | return b; | 1869 | return b; |
1814 | } | 1870 | } |
1815 | } | 1871 | |
1816 | break; | 1872 | break; |
1817 | case Cardinals.S: | 1873 | case Cardinals.S: |
1818 | |||
1819 | |||
1820 | lock (SouthBorders) | ||
1821 | { | ||
1822 | foreach (Border b in SouthBorders) | 1874 | foreach (Border b in SouthBorders) |
1823 | { | 1875 | { |
1824 | if (b.TestCross(position)) | 1876 | if (b.TestCross(position)) |
1825 | return b; | 1877 | return b; |
1826 | } | 1878 | } |
1827 | } | 1879 | break; |
1828 | 1880 | case Cardinals.E: | |
1829 | break; | ||
1830 | case Cardinals.E: | ||
1831 | lock (EastBorders) | ||
1832 | { | ||
1833 | foreach (Border b in EastBorders) | 1881 | foreach (Border b in EastBorders) |
1834 | { | 1882 | { |
1835 | if (b.TestCross(position)) | 1883 | if (b.TestCross(position)) |
1836 | return b; | 1884 | return b; |
1837 | } | 1885 | } |
1838 | } | ||
1839 | 1886 | ||
1840 | break; | 1887 | break; |
1841 | case Cardinals.W: | 1888 | case Cardinals.W: |
1842 | |||
1843 | lock (WestBorders) | ||
1844 | { | ||
1845 | foreach (Border b in WestBorders) | 1889 | foreach (Border b in WestBorders) |
1846 | { | 1890 | { |
1847 | if (b.TestCross(position)) | 1891 | if (b.TestCross(position)) |
1848 | return b; | 1892 | return b; |
1849 | } | 1893 | } |
1850 | } | 1894 | break; |
1851 | break; | ||
1852 | 1895 | ||
1896 | } | ||
1853 | } | 1897 | } |
1898 | |||
1854 | 1899 | ||
1855 | return null; | 1900 | return null; |
1856 | } | 1901 | } |
1857 | 1902 | ||
1858 | public bool TestBorderCross(Vector3 position, Cardinals border) | 1903 | public bool TestBorderCross(Vector3 position, Cardinals border) |
1859 | { | 1904 | { |
1860 | switch (border) | 1905 | if (BordersLocked) |
1861 | { | 1906 | { |
1862 | case Cardinals.N: | 1907 | switch (border) |
1863 | lock (NorthBorders) | 1908 | { |
1864 | { | 1909 | case Cardinals.N: |
1865 | foreach(Border b in NorthBorders) | 1910 | lock (NorthBorders) |
1911 | { | ||
1912 | foreach (Border b in NorthBorders) | ||
1913 | { | ||
1914 | if (b.TestCross(position)) | ||
1915 | return true; | ||
1916 | } | ||
1917 | } | ||
1918 | break; | ||
1919 | case Cardinals.E: | ||
1920 | lock (EastBorders) | ||
1921 | { | ||
1922 | foreach (Border b in EastBorders) | ||
1923 | { | ||
1924 | if (b.TestCross(position)) | ||
1925 | return true; | ||
1926 | } | ||
1927 | } | ||
1928 | break; | ||
1929 | case Cardinals.S: | ||
1930 | lock (SouthBorders) | ||
1931 | { | ||
1932 | foreach (Border b in SouthBorders) | ||
1933 | { | ||
1934 | if (b.TestCross(position)) | ||
1935 | return true; | ||
1936 | } | ||
1937 | } | ||
1938 | break; | ||
1939 | case Cardinals.W: | ||
1940 | lock (WestBorders) | ||
1941 | { | ||
1942 | foreach (Border b in WestBorders) | ||
1943 | { | ||
1944 | if (b.TestCross(position)) | ||
1945 | return true; | ||
1946 | } | ||
1947 | } | ||
1948 | break; | ||
1949 | } | ||
1950 | } | ||
1951 | else | ||
1952 | { | ||
1953 | switch (border) | ||
1954 | { | ||
1955 | case Cardinals.N: | ||
1956 | foreach (Border b in NorthBorders) | ||
1866 | { | 1957 | { |
1867 | if (b.TestCross(position)) | 1958 | if (b.TestCross(position)) |
1868 | return true; | 1959 | return true; |
1869 | } | 1960 | } |
1870 | } | 1961 | break; |
1871 | break; | 1962 | case Cardinals.E: |
1872 | case Cardinals.E: | ||
1873 | lock (EastBorders) | ||
1874 | { | ||
1875 | foreach (Border b in EastBorders) | 1963 | foreach (Border b in EastBorders) |
1876 | { | 1964 | { |
1877 | if (b.TestCross(position)) | 1965 | if (b.TestCross(position)) |
1878 | return true; | 1966 | return true; |
1879 | } | 1967 | } |
1880 | } | 1968 | break; |
1881 | break; | 1969 | case Cardinals.S: |
1882 | case Cardinals.S: | ||
1883 | lock (SouthBorders) | ||
1884 | { | ||
1885 | foreach (Border b in SouthBorders) | 1970 | foreach (Border b in SouthBorders) |
1886 | { | 1971 | { |
1887 | if (b.TestCross(position)) | 1972 | if (b.TestCross(position)) |
1888 | return true; | 1973 | return true; |
1889 | } | 1974 | } |
1890 | } | 1975 | break; |
1891 | break; | 1976 | case Cardinals.W: |
1892 | case Cardinals.W: | ||
1893 | lock (WestBorders) | ||
1894 | { | ||
1895 | foreach (Border b in WestBorders) | 1977 | foreach (Border b in WestBorders) |
1896 | { | 1978 | { |
1897 | if (b.TestCross(position)) | 1979 | if (b.TestCross(position)) |
1898 | return true; | 1980 | return true; |
1899 | } | 1981 | } |
1900 | } | 1982 | break; |
1901 | break; | 1983 | } |
1902 | |||
1903 | } | 1984 | } |
1904 | return false; | 1985 | return false; |
1905 | } | 1986 | } |