aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework')
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs239
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs6
2 files changed, 117 insertions, 128 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 49d3b9b..efee080 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -724,10 +724,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
724 return; 724 return;
725 } 725 }
726 726
727 uint newRegionX, newRegionY, oldRegionX, oldRegionY;
728 Util.RegionHandleToRegionLoc(reg.RegionHandle, out newRegionX, out newRegionY);
729 Util.RegionHandleToRegionLoc(sp.Scene.RegionInfo.RegionHandle, out oldRegionX, out oldRegionY);
730
731 ulong destinationHandle = finalDestination.RegionHandle; 727 ulong destinationHandle = finalDestination.RegionHandle;
732 728
733 // Let's do DNS resolution only once in this process, please! 729 // Let's do DNS resolution only once in this process, please!
@@ -815,7 +811,19 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
815 } 811 }
816 812
817 IClientIPEndpoint ipepClient; 813 IClientIPEndpoint ipepClient;
818 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) 814
815 uint newRegionX, newRegionY, oldRegionX, oldRegionY;
816 Util.RegionHandleToRegionLoc(destinationHandle, out newRegionX, out newRegionY);
817 Util.RegionHandleToRegionLoc(sourceRegion.RegionHandle, out oldRegionX, out oldRegionY);
818 int oldSizeX = (int)sourceRegion.RegionSizeX;
819 int oldSizeY = (int)sourceRegion.RegionSizeY;
820 int newSizeX = finalDestination.RegionSizeX;
821 int newSizeY = finalDestination.RegionSizeY;
822
823 bool OutSideViewRange = NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY,
824 oldSizeX, oldSizeY, newSizeX, newSizeY);
825
826 if (OutSideViewRange)
819 { 827 {
820 m_log.DebugFormat( 828 m_log.DebugFormat(
821 "[ENTITY TRANSFER MODULE]: Determined that region {0} at {1},{2} needs new child agent for agent {3} from {4}", 829 "[ENTITY TRANSFER MODULE]: Determined that region {0} at {1},{2} needs new child agent for agent {3} from {4}",
@@ -846,13 +854,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
846 float.TryParse(versionComponents[1], out versionNumber); 854 float.TryParse(versionComponents[1], out versionNumber);
847 855
848 if (versionNumber >= 0.2f && MaxOutgoingTransferVersion >= versionNumber) 856 if (versionNumber >= 0.2f && MaxOutgoingTransferVersion >= versionNumber)
849 TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason); 857 TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, OutSideViewRange , version, out reason);
850 else 858 else
851 TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason); 859 TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, OutSideViewRange, version, out reason);
852 } 860 }
853 861
854 private void TransferAgent_V1(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, 862 private void TransferAgent_V1(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination,
855 IPEndPoint endPoint, uint teleportFlags, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, string version, out string reason) 863 IPEndPoint endPoint, uint teleportFlags, bool OutSideViewRange, string version, out string reason)
856 { 864 {
857 ulong destinationHandle = finalDestination.RegionHandle; 865 ulong destinationHandle = finalDestination.RegionHandle;
858 AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); 866 AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
@@ -904,9 +912,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
904 m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring); 912 m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring);
905 913
906 // OK, it got this agent. Let's close some child agents 914 // OK, it got this agent. Let's close some child agents
907
908 915
909 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) 916
917 if (OutSideViewRange)
910 { 918 {
911 if (m_eqModule != null) 919 if (m_eqModule != null)
912 { 920 {
@@ -1065,17 +1073,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1065 // Well, this is it. The agent is over there. 1073 // Well, this is it. The agent is over there.
1066// KillEntity(sp.Scene, sp.LocalId); 1074// KillEntity(sp.Scene, sp.LocalId);
1067 1075
1068 bool l_needsclosing = NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg); 1076 sp.HasMovedAway(!OutSideViewRange);
1069 sp.HasMovedAway(!l_needsclosing);
1070 1077
1071 sp.CloseChildAgents(newRegionX, newRegionY); 1078 sp.CloseChildAgents(destinationHandle,finalDestination.RegionSizeX,finalDestination.RegionSizeY);
1072 1079
1073 // Now let's make it officially a child agent 1080 // Now let's make it officially a child agent
1074 sp.MakeChildAgent(destinationHandle); 1081 sp.MakeChildAgent(destinationHandle);
1075 1082
1076 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone 1083 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone
1077 1084
1078 if (l_needsclosing) 1085 if (OutSideViewRange)
1079 { 1086 {
1080 if (!sp.Scene.IncomingPreCloseClient(sp)) 1087 if (!sp.Scene.IncomingPreCloseClient(sp))
1081 return; 1088 return;
@@ -1090,17 +1097,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1090 1097
1091 sp.Scene.CloseAgent(sp.UUID, false); 1098 sp.Scene.CloseAgent(sp.UUID, false);
1092 } 1099 }
1093/*
1094 else
1095 {
1096 // now we have a child agent in this region.
1097 sp.Reset();
1098 }
1099 */
1100 } 1100 }
1101 1101
1102 private void TransferAgent_V2(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, 1102 private void TransferAgent_V2(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination,
1103 IPEndPoint endPoint, uint teleportFlags, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, string version, out string reason) 1103 IPEndPoint endPoint, uint teleportFlags, bool OutSideViewRange, string version, out string reason)
1104 { 1104 {
1105 ulong destinationHandle = finalDestination.RegionHandle; 1105 ulong destinationHandle = finalDestination.RegionHandle;
1106 AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); 1106 AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
@@ -1207,8 +1207,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1207 1207
1208 m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); 1208 m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp);
1209 1209
1210 bool l_needsclosing = NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg); 1210 sp.HasMovedAway(!OutSideViewRange);
1211 sp.HasMovedAway(!l_needsclosing);
1212 1211
1213 // Need to signal neighbours whether child agents may need closing irrespective of whether this 1212 // Need to signal neighbours whether child agents may need closing irrespective of whether this
1214 // one needed closing. We also need to close child agents as quickly as possible to avoid complicated 1213 // one needed closing. We also need to close child agents as quickly as possible to avoid complicated
@@ -1216,7 +1215,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1216 // to a neighbour A2 then off to a non-neighbour C). Closing child agents any later requires complex 1215 // to a neighbour A2 then off to a non-neighbour C). Closing child agents any later requires complex
1217 // distributed checks to avoid problems in rapid reteleporting scenarios and where child agents are 1216 // distributed checks to avoid problems in rapid reteleporting scenarios and where child agents are
1218 // abandoned without proper close by viewer but then re-used by an incoming connection. 1217 // abandoned without proper close by viewer but then re-used by an incoming connection.
1219 sp.CloseChildAgents(newRegionX, newRegionY); 1218 sp.CloseChildAgents(destinationHandle, finalDestination.RegionSizeX, finalDestination.RegionSizeY);
1220 1219
1221// AgentHasMovedAway(sp, true); 1220// AgentHasMovedAway(sp, true);
1222 // Well, this is it. The agent is over there. 1221 // Well, this is it. The agent is over there.
@@ -1226,7 +1225,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1226 sp.MakeChildAgent(destinationHandle); 1225 sp.MakeChildAgent(destinationHandle);
1227 1226
1228 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone 1227 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone
1229 if (l_needsclosing) 1228 if (OutSideViewRange)
1230 { 1229 {
1231 if (!sp.Scene.IncomingPreCloseClient(sp)) 1230 if (!sp.Scene.IncomingPreCloseClient(sp))
1232 return; 1231 return;
@@ -1350,7 +1349,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1350 // This returns 'true' if the new region already has a child agent for our 1349 // This returns 'true' if the new region already has a child agent for our
1351 // incoming agent. The implication is that, if 'false', we have to create the 1350 // incoming agent. The implication is that, if 'false', we have to create the
1352 // child and then teleport into the region. 1351 // child and then teleport into the region.
1353 protected virtual bool NeedsNewAgent(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY) 1352 protected virtual bool NeedsNewAgent(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY,
1353 int oldsizeX, int oldsizeY, int newsizeX, int newsizeY)
1354 { 1354 {
1355 if (m_regionCombinerModule != null && m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID)) 1355 if (m_regionCombinerModule != null && m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID))
1356 { 1356 {
@@ -1363,17 +1363,19 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1363 1363
1364 return !(newRegionX >= swCorner.X && newRegionX <= neCorner.X && newRegionY >= swCorner.Y && newRegionY <= neCorner.Y); 1364 return !(newRegionX >= swCorner.X && newRegionX <= neCorner.X && newRegionY >= swCorner.Y && newRegionY <= neCorner.Y);
1365 } 1365 }
1366 else
1367 {
1368 return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY);
1369 }
1370 }
1371 1366
1372 protected virtual bool NeedsClosing(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, GridRegion reg) 1367 return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY,
1373 { 1368 oldsizeX, oldsizeY, newsizeX, newsizeY);
1374 return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY);
1375 } 1369 }
1370/*
1371 protected virtual bool NeedsClosing(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY,
1372 uint oldsizeX, uint oldsizeY, uint newsizeX, uint newsizeY, GridRegion reg)
1373 {
1376 1374
1375 return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY,
1376 oldsizeX, oldsizeY, newsizeX, newsizeY);
1377 }
1378*/
1377 #endregion 1379 #endregion
1378 1380
1379 #region Landmark Teleport 1381 #region Landmark Teleport
@@ -1830,9 +1832,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1830 // this may need the attachments 1832 // this may need the attachments
1831 1833
1832 agent.HasMovedAway(true); 1834 agent.HasMovedAway(true);
1833// agent.parcelRegionCross();
1834
1835// AgentHasMovedAway(agent, true);
1836 1835
1837 agent.MakeChildAgent(neighbourRegion.RegionHandle); 1836 agent.MakeChildAgent(neighbourRegion.RegionHandle);
1838 1837
@@ -1840,19 +1839,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1840 // but not sure yet what the side effects would be. 1839 // but not sure yet what the side effects would be.
1841 m_entityTransferStateMachine.ResetFromTransit(agent.UUID); 1840 m_entityTransferStateMachine.ResetFromTransit(agent.UUID);
1842 1841
1843 // now we have a child agent in this region. Request all interesting data about other (root) agents 1842 agent.CloseChildAgents(neighbourRegion.RegionHandle, neighbourRegion.RegionSizeX, neighbourRegion.RegionSizeY);
1844
1845 // why do that? we either where a root having all that or we are leaving the area
1846 1843
1847// agent.SendOtherAgentsAvatarDataToMe();
1848// agent.SendOtherAgentsAppearanceToMe();
1849
1850 // Next, let's close the child agent connections that are too far away.
1851 uint neighbourx;
1852 uint neighboury;
1853 Util.RegionHandleToRegionLoc(neighbourRegion.RegionHandle, out neighbourx, out neighboury);
1854
1855 agent.CloseChildAgents(neighbourx, neighboury);
1856 1844
1857 // the user may change their profile information in other region, 1845 // the user may change their profile information in other region,
1858 // so the userinfo in UserProfileCache is not reliable any more, delete it 1846 // so the userinfo in UserProfileCache is not reliable any more, delete it
@@ -1908,12 +1896,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1908 1896
1909 if (seeds.ContainsKey(regionhandler)) 1897 if (seeds.ContainsKey(regionhandler))
1910 seeds.Remove(regionhandler); 1898 seeds.Remove(regionhandler);
1911 1899/*
1912 List<ulong> oldregions = new List<ulong>(seeds.Keys); 1900 List<ulong> oldregions = new List<ulong>(seeds.Keys);
1913 1901
1914 if (oldregions.Contains(currentRegionHandler)) 1902 if (oldregions.Contains(currentRegionHandler))
1915 oldregions.Remove(currentRegionHandler); 1903 oldregions.Remove(currentRegionHandler);
1916 1904*/
1917 if (!seeds.ContainsKey(currentRegionHandler)) 1905 if (!seeds.ContainsKey(currentRegionHandler))
1918 seeds.Add(currentRegionHandler, sp.ControllingClient.RequestClientInfo().CapsPath); 1906 seeds.Add(currentRegionHandler, sp.ControllingClient.RequestClientInfo().CapsPath);
1919 1907
@@ -1927,6 +1915,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1927 agent.Appearance.AvatarHeight = sp.Appearance.AvatarHeight; 1915 agent.Appearance.AvatarHeight = sp.Appearance.AvatarHeight;
1928 1916
1929 agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); 1917 agent.CapsPath = CapsUtil.GetRandomCapsObjectPath();
1918
1930 seeds.Add(regionhandler, agent.CapsPath); 1919 seeds.Add(regionhandler, agent.CapsPath);
1931 1920
1932// agent.ChildrenCapSeeds = new Dictionary<ulong, string>(seeds); 1921// agent.ChildrenCapSeeds = new Dictionary<ulong, string>(seeds);
@@ -1936,7 +1925,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1936 { 1925 {
1937 sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, seeds); 1926 sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, seeds);
1938 } 1927 }
1928
1939 sp.KnownRegions = seeds; 1929 sp.KnownRegions = seeds;
1930 sp.AddNeighbourRegionSizeInfo(region);
1940 1931
1941 if (currentAgentCircuit != null) 1932 if (currentAgentCircuit != null)
1942 { 1933 {
@@ -2012,7 +2003,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
2012 2003
2013 if (m_regionInfo != null) 2004 if (m_regionInfo != null)
2014 { 2005 {
2015 neighbours = GetNeighbours(sp, m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); 2006 neighbours = GetNeighbors(sp, m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
2016 } 2007 }
2017 else 2008 else
2018 { 2009 {
@@ -2024,7 +2015,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
2024 LinkedList<ulong> previousRegionNeighbourHandles; 2015 LinkedList<ulong> previousRegionNeighbourHandles;
2025 Dictionary<ulong, string> seeds; 2016 Dictionary<ulong, string> seeds;
2026 ICapabilitiesModule capsModule = spScene.CapsModule; 2017 ICapabilitiesModule capsModule = spScene.CapsModule;
2027 2018
2028 if (capsModule != null) 2019 if (capsModule != null)
2029 { 2020 {
2030 seeds = new Dictionary<ulong, string>(capsModule.GetChildrenSeeds(sp.UUID)); 2021 seeds = new Dictionary<ulong, string>(capsModule.GetChildrenSeeds(sp.UUID));
@@ -2046,7 +2037,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
2046 2037
2047 List<AgentCircuitData> cagents = new List<AgentCircuitData>(); 2038 List<AgentCircuitData> cagents = new List<AgentCircuitData>();
2048 List<ulong> newneighbours = new List<ulong>(); 2039 List<ulong> newneighbours = new List<ulong>();
2049 2040
2050 foreach (GridRegion neighbour in neighbours) 2041 foreach (GridRegion neighbour in neighbours)
2051 { 2042 {
2052 ulong handler = neighbour.RegionHandle; 2043 ulong handler = neighbour.RegionHandle;
@@ -2096,13 +2087,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
2096 seeds.Remove(handler); 2087 seeds.Remove(handler);
2097 2088
2098 /// Update all child agent with everyone's seeds 2089 /// Update all child agent with everyone's seeds
2099// foreach (AgentCircuitData a in cagents) 2090 // foreach (AgentCircuitData a in cagents)
2100// a.ChildrenCapSeeds = new Dictionary<ulong, string>(seeds); 2091 // a.ChildrenCapSeeds = new Dictionary<ulong, string>(seeds);
2101 2092
2102 if (capsModule != null) 2093 if (capsModule != null)
2103 capsModule.SetChildrenSeed(sp.UUID, seeds); 2094 capsModule.SetChildrenSeed(sp.UUID, seeds);
2104 2095
2105 sp.KnownRegions = seeds; 2096 sp.KnownRegions = seeds;
2097 sp.SetNeighbourRegionSizeInfo(neighbours);
2106 2098
2107 AgentPosition agentpos = new AgentPosition(); 2099 AgentPosition agentpos = new AgentPosition();
2108 agentpos.AgentID = new UUID(sp.UUID.Guid); 2100 agentpos.AgentID = new UUID(sp.UUID.Guid);
@@ -2114,59 +2106,56 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
2114 agentpos.Velocity = sp.Velocity; 2106 agentpos.Velocity = sp.Velocity;
2115 agentpos.RegionHandle = currentRegionHandler; 2107 agentpos.RegionHandle = currentRegionHandler;
2116 agentpos.Throttles = spClient.GetThrottlesPacked(1); 2108 agentpos.Throttles = spClient.GetThrottlesPacked(1);
2117// agentpos.ChildrenCapSeeds = seeds; 2109 // agentpos.ChildrenCapSeeds = seeds;
2118 2110
2119 if (neighbours.Count - previousRegionNeighbourHandles.Count > 0) 2111 Util.FireAndForget(delegate
2120 { 2112 {
2121 Util.FireAndForget(delegate 2113 Thread.Sleep(200); // the original delay that was at InformClientOfNeighbourAsync start
2122 { 2114 int count = 0;
2123 Thread.Sleep(200); // the original delay that was at InformClientOfNeighbourAsync start
2124 int count = 0;
2125 2115
2126 foreach (GridRegion neighbour in neighbours) 2116 foreach (GridRegion neighbour in neighbours)
2117 {
2118 ulong handler = neighbour.RegionHandle;
2119 try
2127 { 2120 {
2128 ulong handler = neighbour.RegionHandle; 2121 if (newneighbours.Contains(handler))
2129 try
2130 {
2131 if (newneighbours.Contains(handler))
2132 {
2133 InformClientOfNeighbourAsync(sp, cagents[count], neighbour,
2134 neighbour.ExternalEndPoint, true);
2135 count++;
2136 }
2137 else if(!previousRegionNeighbourHandles.Contains(handler))
2138 {
2139 spScene.SimulationService.UpdateAgent(neighbour, agentpos);
2140 }
2141 }
2142 catch (ArgumentOutOfRangeException)
2143 { 2122 {
2144 m_log.ErrorFormat( 2123 InformClientOfNeighbourAsync(sp, cagents[count], neighbour,
2145 "[ENTITY TRANSFER MODULE]: Neighbour Regions response included the current region in the neighbour list. The following region will not display to the client: {0} for region {1} ({2}, {3}).", 2124 neighbour.ExternalEndPoint, true);
2146 neighbour.ExternalHostName, 2125 count++;
2147 neighbour.RegionHandle,
2148 neighbour.RegionLocX,
2149 neighbour.RegionLocY);
2150 } 2126 }
2151 catch (Exception e) 2127 else if (!previousRegionNeighbourHandles.Contains(handler))
2152 { 2128 {
2153 m_log.ErrorFormat( 2129 spScene.SimulationService.UpdateAgent(neighbour, agentpos);
2154 "[ENTITY TRANSFER MODULE]: Could not resolve external hostname {0} for region {1} ({2}, {3}). {4}",
2155 neighbour.ExternalHostName,
2156 neighbour.RegionHandle,
2157 neighbour.RegionLocX,
2158 neighbour.RegionLocY,
2159 e);
2160
2161 // FIXME: Okay, even though we've failed, we're still going to throw the exception on,
2162 // since I don't know what will happen if we just let the client continue
2163
2164 // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes.
2165 // throw e;
2166 } 2130 }
2167 } 2131 }
2168 }); 2132 catch (ArgumentOutOfRangeException)
2169 } 2133 {
2134 m_log.ErrorFormat(
2135 "[ENTITY TRANSFER MODULE]: Neighbour Regions response included the current region in the neighbour list. The following region will not display to the client: {0} for region {1} ({2}, {3}).",
2136 neighbour.ExternalHostName,
2137 neighbour.RegionHandle,
2138 neighbour.RegionLocX,
2139 neighbour.RegionLocY);
2140 }
2141 catch (Exception e)
2142 {
2143 m_log.ErrorFormat(
2144 "[ENTITY TRANSFER MODULE]: Could not resolve external hostname {0} for region {1} ({2}, {3}). {4}",
2145 neighbour.ExternalHostName,
2146 neighbour.RegionHandle,
2147 neighbour.RegionLocX,
2148 neighbour.RegionLocY,
2149 e);
2150
2151 // FIXME: Okay, even though we've failed, we're still going to throw the exception on,
2152 // since I don't know what will happen if we just let the client continue
2153
2154 // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes.
2155 // throw e;
2156 }
2157 }
2158 });
2170 } 2159 }
2171 2160
2172 // Computes the difference between two region bases. 2161 // Computes the difference between two region bases.
@@ -2179,12 +2168,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
2179 0f); 2168 0f);
2180 } 2169 }
2181 2170
2182 public GridRegion GetRegionContainingWorldLocation(IGridService pGridService, UUID pScopeID, double px, double py)
2183 {
2184 // Since we don't know how big the regions could be, we have to search a very large area
2185 // to find possible regions.
2186 return GetRegionContainingWorldLocation(pGridService, pScopeID, px, py, Constants.MaximumRegionSize);
2187 }
2188 2171
2189 #region NotFoundLocationCache class 2172 #region NotFoundLocationCache class
2190 // A collection of not found locations to make future lookups 'not found' lookups quick. 2173 // A collection of not found locations to make future lookups 'not found' lookups quick.
@@ -2269,6 +2252,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
2269 #endregion // NotFoundLocationCache class 2252 #endregion // NotFoundLocationCache class
2270 private NotFoundLocationCache m_notFoundLocationCache = new NotFoundLocationCache(); 2253 private NotFoundLocationCache m_notFoundLocationCache = new NotFoundLocationCache();
2271 2254
2255// needed for current OSG or old grid code
2256
2257 public GridRegion GetRegionContainingWorldLocation(IGridService pGridService, UUID pScopeID, double px, double py)
2258 {
2259 // Since we don't know how big the regions could be, we have to search a very large area
2260 // to find possible regions.
2261 return GetRegionContainingWorldLocation(pGridService, pScopeID, px, py, Constants.MaximumRegionSize);
2262 }
2263
2272 // Given a world position, get the GridRegion info for 2264 // Given a world position, get the GridRegion info for
2273 // the region containing that point. 2265 // the region containing that point.
2274 // Someday this should be a method on GridService. 2266 // Someday this should be a method on GridService.
@@ -2457,7 +2449,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
2457 /// <param name="pRegionLocX"></param> 2449 /// <param name="pRegionLocX"></param>
2458 /// <param name="pRegionLocY"></param> 2450 /// <param name="pRegionLocY"></param>
2459 /// <returns></returns> 2451 /// <returns></returns>
2460 protected List<GridRegion> GetNeighbours(ScenePresence avatar, uint pRegionLocX, uint pRegionLocY) 2452 protected List<GridRegion> GetNeighbors(ScenePresence avatar, uint pRegionLocX, uint pRegionLocY)
2461 { 2453 {
2462 Scene pScene = avatar.Scene; 2454 Scene pScene = avatar.Scene;
2463 RegionInfo m_regionInfo = pScene.RegionInfo; 2455 RegionInfo m_regionInfo = pScene.RegionInfo;
@@ -2468,23 +2460,20 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
2468 // view to include everything in the megaregion 2460 // view to include everything in the megaregion
2469 if (m_regionCombinerModule == null || !m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID)) 2461 if (m_regionCombinerModule == null || !m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID))
2470 { 2462 {
2471 // The area to check is as big as the current region. 2463 uint dd = (uint)avatar.DrawDistance;
2472 // We presume all adjacent regions are the same size as this region. 2464
2473 // this needs to be reduced a lot 2465 // until avatar movement updates client connections, we need to seend at least this current region imediate Neighbors
2474 // and updated in avatar CheckForSignificantMovement (larger than current 64m?) 2466 uint ddX = Math.Max(dd, Constants.RegionSize);
2475 // and draw distance changes 2467 uint ddY = Math.Max(dd, Constants.RegionSize);
2476 // sending client the necessary information 2468
2477 uint dd = Math.Max((uint)avatar.DrawDistance, Constants.RegionSize); 2469 ddX--;
2478 2470 ddY--;
2479 dd--; 2471
2480 uint ddX = Math.Max(dd, Scene.RegionInfo.RegionSizeX); 2472 // reference to region edges. Should be avatar position
2481 uint ddY = Math.Max(dd, Scene.RegionInfo.RegionSizeY); 2473 uint startX = Util.RegionToWorldLoc(pRegionLocX);
2482 2474 uint endX = startX + m_regionInfo.RegionSizeX;
2483 // region center. Should be avatar position 2475 uint startY = Util.RegionToWorldLoc(pRegionLocY);
2484 uint startX = Util.RegionToWorldLoc(pRegionLocX) + m_regionInfo.RegionSizeX / 2; 2476 uint endY = startY + m_regionInfo.RegionSizeY;
2485 uint endX = startX;
2486 uint startY = Util.RegionToWorldLoc(pRegionLocY) + m_regionInfo.RegionSizeY / 2;
2487 uint endY = startY;
2488 2477
2489 startX -= ddX; 2478 startX -= ddX;
2490 startY -= ddY; 2479 startY -= ddY;
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
index 7abdc21..4ef2fa9 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
@@ -243,19 +243,19 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
243 243
244 return region; 244 return region;
245 } 245 }
246 246/* NEEDFIX
247 protected override bool NeedsClosing(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, GridRegion reg) 247 protected override bool NeedsClosing(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, GridRegion reg)
248 { 248 {
249 if (base.NeedsClosing(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) 249 if (base.NeedsClosing(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, reg))
250 return true; 250 return true;
251 251
252 int flags = Scene.GridService.GetRegionFlags(Scene.RegionInfo.ScopeID, reg.RegionID); 252 int flags = Scene.GridService.GetRegionFlags(Scene.RegionInfo.ScopeID, reg.RegionID);
253 if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Framework.RegionFlags.Hyperlink) != 0) 253 if (flags == -1 || (flags & (int)OpenSim.Framework.RegionFlags.Hyperlink) != 0)
254 return true; 254 return true;
255 255
256 return false; 256 return false;
257 } 257 }
258 258*/
259 protected override void AgentHasMovedAway(ScenePresence sp, bool logout) 259 protected override void AgentHasMovedAway(ScenePresence sp, bool logout)
260 { 260 {
261 base.AgentHasMovedAway(sp, logout); 261 base.AgentHasMovedAway(sp, logout);