diff options
Diffstat (limited to '')
6 files changed, 111 insertions, 188 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index d21452f..6859b83 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -80,7 +80,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
80 | public event DeRezObject OnDeRezObject; | 80 | public event DeRezObject OnDeRezObject; |
81 | public event RezRestoreToWorld OnRezRestoreToWorld; | 81 | public event RezRestoreToWorld OnRezRestoreToWorld; |
82 | public event ModifyTerrain OnModifyTerrain; | 82 | public event ModifyTerrain OnModifyTerrain; |
83 | public event Action<IClientAPI, uint> OnRegionHandShakeReply; | 83 | public event Action<IClientAPI> OnRegionHandShakeReply; |
84 | public event GenericCall1 OnRequestWearables; | 84 | public event GenericCall1 OnRequestWearables; |
85 | public event SetAppearance OnSetAppearance; | 85 | public event SetAppearance OnSetAppearance; |
86 | public event AvatarNowWearing OnAvatarNowWearing; | 86 | public event AvatarNowWearing OnAvatarNowWearing; |
@@ -8923,7 +8923,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
8923 | 8923 | ||
8924 | private bool HandlerRegionHandshakeReply(IClientAPI sender, Packet Pack) | 8924 | private bool HandlerRegionHandshakeReply(IClientAPI sender, Packet Pack) |
8925 | { | 8925 | { |
8926 | Action<IClientAPI, uint> handlerRegionHandShakeReply = OnRegionHandShakeReply; | 8926 | Action<IClientAPI> handlerRegionHandShakeReply = OnRegionHandShakeReply; |
8927 | if (handlerRegionHandShakeReply == null) | 8927 | if (handlerRegionHandShakeReply == null) |
8928 | return true; // silence the warning | 8928 | return true; // silence the warning |
8929 | 8929 | ||
@@ -8936,7 +8936,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
8936 | else | 8936 | else |
8937 | m_viewerHandShakeFlags = 0; | 8937 | m_viewerHandShakeFlags = 0; |
8938 | 8938 | ||
8939 | handlerRegionHandShakeReply(this, m_viewerHandShakeFlags); | 8939 | handlerRegionHandShakeReply(this); |
8940 | 8940 | ||
8941 | return true; | 8941 | return true; |
8942 | } | 8942 | } |
@@ -15364,15 +15364,30 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
15364 | return new HashSet<string>(m_inPacketsToDrop); | 15364 | return new HashSet<string>(m_inPacketsToDrop); |
15365 | } | 15365 | } |
15366 | 15366 | ||
15367 | public void CheckViewerCaps() | 15367 | public uint GetViewerCaps() |
15368 | { | 15368 | { |
15369 | m_SupportObjectAnimations = false; | 15369 | m_SupportObjectAnimations = false; |
15370 | uint ret; | ||
15371 | if(m_supportViewerCache) | ||
15372 | ret = m_viewerHandShakeFlags; | ||
15373 | else | ||
15374 | ret = m_viewerHandShakeFlags & 4; | ||
15375 | |||
15370 | if (m_scene.CapsModule != null) | 15376 | if (m_scene.CapsModule != null) |
15371 | { | 15377 | { |
15372 | Caps cap = m_scene.CapsModule.GetCapsForUser(CircuitCode); | 15378 | Caps cap = m_scene.CapsModule.GetCapsForUser(CircuitCode); |
15373 | if (cap != null && (cap.Flags & Caps.CapsFlags.ObjectAnim) != 0) | 15379 | if(cap != null) |
15374 | m_SupportObjectAnimations = true; | 15380 | { |
15381 | if((cap.Flags & Caps.CapsFlags.SentSeeds) != 0) | ||
15382 | ret |= 0x1000; | ||
15383 | if ((cap.Flags & Caps.CapsFlags.ObjectAnim) != 0) | ||
15384 | { | ||
15385 | m_SupportObjectAnimations = true; | ||
15386 | ret |= 0x2000; | ||
15387 | } | ||
15388 | } | ||
15375 | } | 15389 | } |
15390 | return ret; // ??? | ||
15376 | } | 15391 | } |
15377 | } | 15392 | } |
15378 | } | 15393 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index b105d52..6746573 100755 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | |||
@@ -1698,7 +1698,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1698 | } | 1698 | } |
1699 | 1699 | ||
1700 | // Now we know we can handle more data | 1700 | // Now we know we can handle more data |
1701 | Thread.Sleep(200); | 1701 | //Thread.Sleep(200); |
1702 | 1702 | ||
1703 | // Obtain the pending queue and remove it from the cache | 1703 | // Obtain the pending queue and remove it from the cache |
1704 | Queue<UDPPacketBuffer> queue = null; | 1704 | Queue<UDPPacketBuffer> queue = null; |
@@ -1727,7 +1727,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1727 | { | 1727 | { |
1728 | if(aCircuit.teleportFlags <= 0) | 1728 | if(aCircuit.teleportFlags <= 0) |
1729 | client.SendRegionHandshake(); | 1729 | client.SendRegionHandshake(); |
1730 | client.CheckViewerCaps(); | ||
1731 | } | 1730 | } |
1732 | } | 1731 | } |
1733 | else | 1732 | else |
@@ -1743,8 +1742,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1743 | } | 1742 | } |
1744 | 1743 | ||
1745 | // m_log.DebugFormat( | 1744 | // m_log.DebugFormat( |
1746 | // "[LLUDPSERVER]: Handling UseCircuitCode request from {0} took {1}ms", | 1745 | // "[LLUDPSERVER]: Handling UseCircuitCode request from {0} took {1}ms", |
1747 | // buffer.RemoteEndPoint, (DateTime.Now - startTime).Milliseconds); | 1746 | // buffer.RemoteEndPoint, (DateTime.Now - startTime).Milliseconds); |
1748 | 1747 | ||
1749 | } | 1748 | } |
1750 | catch (Exception e) | 1749 | catch (Exception e) |
@@ -1758,117 +1757,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1758 | e.StackTrace); | 1757 | e.StackTrace); |
1759 | } | 1758 | } |
1760 | } | 1759 | } |
1761 | /* | ||
1762 | protected void HandleCompleteMovementIntoRegion(object o) | ||
1763 | { | ||
1764 | IPEndPoint endPoint = null; | ||
1765 | IClientAPI client = null; | ||
1766 | |||
1767 | try | ||
1768 | { | ||
1769 | object[] array = (object[])o; | ||
1770 | endPoint = (IPEndPoint)array[0]; | ||
1771 | CompleteAgentMovementPacket packet = (CompleteAgentMovementPacket)array[1]; | ||
1772 | |||
1773 | m_log.DebugFormat( | ||
1774 | "[LLUDPSERVER]: Handling CompleteAgentMovement request from {0} in {1}", endPoint, Scene.Name); | ||
1775 | |||
1776 | // Determine which agent this packet came from | ||
1777 | // We need to wait here because in when using the OpenSimulator V2 teleport protocol to travel to a destination | ||
1778 | // simulator with no existing child presence, the viewer (at least LL 3.3.4) will send UseCircuitCode | ||
1779 | // and then CompleteAgentMovement immediately without waiting for an ack. As we are now handling these | ||
1780 | // packets asynchronously, we need to account for this thread proceeding more quickly than the | ||
1781 | // UseCircuitCode thread. | ||
1782 | int count = 40; | ||
1783 | while (count-- > 0) | ||
1784 | { | ||
1785 | if (Scene.TryGetClient(endPoint, out client)) | ||
1786 | { | ||
1787 | if (!client.IsActive) | ||
1788 | { | ||
1789 | // This check exists to catch a condition where the client has been closed by another thread | ||
1790 | // but has not yet been removed from the client manager (and possibly a new connection has | ||
1791 | // not yet been established). | ||
1792 | m_log.DebugFormat( | ||
1793 | "[LLUDPSERVER]: Received a CompleteAgentMovement from {0} for {1} in {2} but client is not active yet. Waiting.", | ||
1794 | endPoint, client.Name, Scene.Name); | ||
1795 | } | ||
1796 | else if (client.SceneAgent == null) | ||
1797 | { | ||
1798 | // This check exists to catch a condition where the new client has been added to the client | ||
1799 | // manager but the SceneAgent has not yet been set in Scene.AddNewAgent(). If we are too | ||
1800 | // eager, then the new ScenePresence may not have registered a listener for this messsage | ||
1801 | // before we try to process it. | ||
1802 | // XXX: A better long term fix may be to add the SceneAgent before the client is added to | ||
1803 | // the client manager | ||
1804 | m_log.DebugFormat( | ||
1805 | "[LLUDPSERVER]: Received a CompleteAgentMovement from {0} for {1} in {2} but client SceneAgent not set yet. Waiting.", | ||
1806 | endPoint, client.Name, Scene.Name); | ||
1807 | } | ||
1808 | else | ||
1809 | { | ||
1810 | break; | ||
1811 | } | ||
1812 | } | ||
1813 | else | ||
1814 | { | ||
1815 | m_log.DebugFormat( | ||
1816 | "[LLUDPSERVER]: Received a CompleteAgentMovement from {0} in {1} but no client exists yet. Waiting.", | ||
1817 | endPoint, Scene.Name); | ||
1818 | } | ||
1819 | |||
1820 | Thread.Sleep(200); | ||
1821 | } | ||
1822 | |||
1823 | if (client == null) | ||
1824 | { | ||
1825 | m_log.DebugFormat( | ||
1826 | "[LLUDPSERVER]: No client found for CompleteAgentMovement from {0} in {1} after wait. Dropping.", | ||
1827 | endPoint, Scene.Name); | ||
1828 | |||
1829 | return; | ||
1830 | } | ||
1831 | else if (!client.IsActive || client.SceneAgent == null) | ||
1832 | { | ||
1833 | // This check exists to catch a condition where the client has been closed by another thread | ||
1834 | // but has not yet been removed from the client manager. | ||
1835 | // The packet could be simply ignored but it is useful to know if this condition occurred for other debugging | ||
1836 | // purposes. | ||
1837 | m_log.DebugFormat( | ||
1838 | "[LLUDPSERVER]: Received a CompleteAgentMovement from {0} for {1} in {2} but client is not active after wait. Dropping.", | ||
1839 | endPoint, client.Name, Scene.Name); | ||
1840 | |||
1841 | return; | ||
1842 | } | ||
1843 | |||
1844 | IncomingPacket incomingPacket1; | ||
1845 | |||
1846 | // Inbox insertion | ||
1847 | if (UsePools) | ||
1848 | { | ||
1849 | incomingPacket1 = m_incomingPacketPool.GetObject(); | ||
1850 | incomingPacket1.Client = (LLClientView)client; | ||
1851 | incomingPacket1.Packet = packet; | ||
1852 | } | ||
1853 | else | ||
1854 | { | ||
1855 | incomingPacket1 = new IncomingPacket((LLClientView)client, packet); | ||
1856 | } | ||
1857 | |||
1858 | packetInbox.Enqueue(incomingPacket1); | ||
1859 | } | ||
1860 | catch (Exception e) | ||
1861 | { | ||
1862 | m_log.ErrorFormat( | ||
1863 | "[LLUDPSERVER]: CompleteAgentMovement handling from endpoint {0}, client {1} {2} failed. Exception {3}{4}", | ||
1864 | endPoint != null ? endPoint.ToString() : "n/a", | ||
1865 | client != null ? client.Name : "unknown", | ||
1866 | client != null ? client.AgentId.ToString() : "unknown", | ||
1867 | e.Message, | ||
1868 | e.StackTrace); | ||
1869 | } | ||
1870 | } | ||
1871 | */ | ||
1872 | 1760 | ||
1873 | /// <summary> | 1761 | /// <summary> |
1874 | /// Send an ack immediately to the given endpoint. | 1762 | /// Send an ack immediately to the given endpoint. |
@@ -1936,7 +1824,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1936 | { | 1824 | { |
1937 | if (Scene.TryGetClient(agentID, out client)) | 1825 | if (Scene.TryGetClient(agentID, out client)) |
1938 | { | 1826 | { |
1939 | if (client.SceneAgent != null) | 1827 | if (client.SceneAgent != null && |
1828 | client.CircuitCode == circuitCode && | ||
1829 | client.SessionId == sessionID && | ||
1830 | client.RemoteEndPoint == remoteEndPoint && | ||
1831 | client.SceneAgent.ControllingClient.SecureSessionId == sessionInfo.LoginInfo.SecureSession) | ||
1940 | return client; | 1832 | return client; |
1941 | Scene.CloseAgent(agentID, true); | 1833 | Scene.CloseAgent(agentID, true); |
1942 | } | 1834 | } |
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 26500ab..094b0f5 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs | |||
@@ -1841,7 +1841,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1841 | UUID lgid = LandData.GlobalID; | 1841 | UUID lgid = LandData.GlobalID; |
1842 | m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) | 1842 | m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) |
1843 | { | 1843 | { |
1844 | if(sp.IsNPC || sp.IsLoggingIn || sp.IsDeleted || sp.currentParcelUUID != lgid) | 1844 | if(sp.IsNPC || sp.IsDeleted || sp.currentParcelUUID != lgid) |
1845 | return; | 1845 | return; |
1846 | cur += (now - sp.ParcelDwellTickMS); | 1846 | cur += (now - sp.ParcelDwellTickMS); |
1847 | sp.ParcelDwellTickMS = now; | 1847 | sp.ParcelDwellTickMS = now; |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index a95036c..123b605 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -99,6 +99,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
99 | public bool IsViewerUIGod { get; set; } | 99 | public bool IsViewerUIGod { get; set; } |
100 | public bool IsGod { get; set; } | 100 | public bool IsGod { get; set; } |
101 | 101 | ||
102 | private bool m_gotRegionHandShake = false; | ||
103 | |||
102 | private PresenceType m_presenceType; | 104 | private PresenceType m_presenceType; |
103 | public PresenceType PresenceType | 105 | public PresenceType PresenceType |
104 | { | 106 | { |
@@ -288,7 +290,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
288 | private Quaternion m_lastRotation; | 290 | private Quaternion m_lastRotation; |
289 | private Vector3 m_lastVelocity; | 291 | private Vector3 m_lastVelocity; |
290 | private Vector3 m_lastSize = new Vector3(0.45f,0.6f,1.9f); | 292 | private Vector3 m_lastSize = new Vector3(0.45f,0.6f,1.9f); |
291 | private bool SentInitialData = false; | 293 | private bool NeedInitialData = false; |
292 | 294 | ||
293 | private int m_userFlags; | 295 | private int m_userFlags; |
294 | public int UserFlags | 296 | public int UserFlags |
@@ -881,7 +883,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
881 | } | 883 | } |
882 | 884 | ||
883 | public bool IsChildAgent { get; set; } | 885 | public bool IsChildAgent { get; set; } |
884 | public bool IsLoggingIn { get; set; } | ||
885 | 886 | ||
886 | /// <summary> | 887 | /// <summary> |
887 | /// If the avatar is sitting, the local ID of the prim that it's sitting on. If not sitting then zero. | 888 | /// If the avatar is sitting, the local ID of the prim that it's sitting on. If not sitting then zero. |
@@ -1074,7 +1075,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1074 | AttachmentsSyncLock = new Object(); | 1075 | AttachmentsSyncLock = new Object(); |
1075 | AllowMovement = true; | 1076 | AllowMovement = true; |
1076 | IsChildAgent = true; | 1077 | IsChildAgent = true; |
1077 | IsLoggingIn = false; | ||
1078 | m_sendCoarseLocationsMethod = SendCoarseLocationsDefault; | 1078 | m_sendCoarseLocationsMethod = SendCoarseLocationsDefault; |
1079 | Animator = new ScenePresenceAnimator(this); | 1079 | Animator = new ScenePresenceAnimator(this); |
1080 | Overrides = new MovementAnimationOverrides(); | 1080 | Overrides = new MovementAnimationOverrides(); |
@@ -1307,7 +1307,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1307 | ParentPart = null; | 1307 | ParentPart = null; |
1308 | PrevSitOffset = Vector3.Zero; | 1308 | PrevSitOffset = Vector3.Zero; |
1309 | HandleForceReleaseControls(ControllingClient, UUID); // needs testing | 1309 | HandleForceReleaseControls(ControllingClient, UUID); // needs testing |
1310 | IsLoggingIn = false; | ||
1311 | } | 1310 | } |
1312 | else | 1311 | else |
1313 | { | 1312 | { |
@@ -1331,10 +1330,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1331 | } | 1330 | } |
1332 | ParentUUID = UUID.Zero; | 1331 | ParentUUID = UUID.Zero; |
1333 | } | 1332 | } |
1334 | else | ||
1335 | { | ||
1336 | IsLoggingIn = false; | ||
1337 | } | ||
1338 | 1333 | ||
1339 | IsChildAgent = false; | 1334 | IsChildAgent = false; |
1340 | } | 1335 | } |
@@ -2163,7 +2158,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2163 | //m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | 2158 | //m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts)); |
2164 | 2159 | ||
2165 | // recheck to reduce timing issues | 2160 | // recheck to reduce timing issues |
2166 | ControllingClient.CheckViewerCaps(); | 2161 | ControllingClient.GetViewerCaps(); |
2167 | 2162 | ||
2168 | bool isHGTP = (m_teleportFlags & TeleportFlags.ViaHGLogin) != 0; | 2163 | bool isHGTP = (m_teleportFlags & TeleportFlags.ViaHGLogin) != 0; |
2169 | 2164 | ||
@@ -2325,9 +2320,40 @@ namespace OpenSim.Region.Framework.Scenes | |||
2325 | } | 2320 | } |
2326 | } | 2321 | } |
2327 | } | 2322 | } |
2328 | if(!IsNPC) | 2323 | //m_log.DebugFormat("[CompleteMovement] attachments: {0}ms", Util.EnvironmentTickCountSubtract(ts)); |
2324 | if (!IsNPC) | ||
2329 | { | 2325 | { |
2330 | //m_log.DebugFormat("[CompleteMovement] attachments: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | 2326 | if (!string.IsNullOrEmpty(m_callbackURI)) |
2327 | { | ||
2328 | m_log.DebugFormat( | ||
2329 | "[SCENE PRESENCE]: Releasing {0} {1} with old callback to {2}", | ||
2330 | client.Name, client.AgentId, m_callbackURI); | ||
2331 | |||
2332 | UUID originID; | ||
2333 | |||
2334 | lock (m_originRegionIDAccessLock) | ||
2335 | originID = m_originRegionID; | ||
2336 | |||
2337 | Scene.SimulationService.ReleaseAgent(originID, UUID, m_callbackURI); | ||
2338 | m_callbackURI = null; | ||
2339 | //m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
2340 | } | ||
2341 | else if (!string.IsNullOrEmpty(m_newCallbackURI)) | ||
2342 | { | ||
2343 | m_log.DebugFormat( | ||
2344 | "[SCENE PRESENCE]: Releasing {0} {1} with callback to {2}", | ||
2345 | client.Name, client.AgentId, m_newCallbackURI); | ||
2346 | |||
2347 | UUID originID; | ||
2348 | |||
2349 | lock (m_originRegionIDAccessLock) | ||
2350 | originID = m_originRegionID; | ||
2351 | |||
2352 | Scene.SimulationService.ReleaseAgent(originID, UUID, m_newCallbackURI); | ||
2353 | m_newCallbackURI = null; | ||
2354 | //m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
2355 | } | ||
2356 | |||
2331 | if (openChildAgents) | 2357 | if (openChildAgents) |
2332 | { | 2358 | { |
2333 | // Create child agents in neighbouring regions | 2359 | // Create child agents in neighbouring regions |
@@ -2360,36 +2386,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2360 | 2386 | ||
2361 | //m_log.DebugFormat("[CompleteMovement] SendInitialDataToMe: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | 2387 | //m_log.DebugFormat("[CompleteMovement] SendInitialDataToMe: {0}ms", Util.EnvironmentTickCountSubtract(ts)); |
2362 | 2388 | ||
2363 | if (!string.IsNullOrEmpty(m_callbackURI)) | ||
2364 | { | ||
2365 | m_log.DebugFormat( | ||
2366 | "[SCENE PRESENCE]: Releasing {0} {1} with old callback to {2}", | ||
2367 | client.Name, client.AgentId, m_callbackURI); | ||
2368 | |||
2369 | UUID originID; | ||
2370 | |||
2371 | lock (m_originRegionIDAccessLock) | ||
2372 | originID = m_originRegionID; | ||
2373 | |||
2374 | Scene.SimulationService.ReleaseAgent(originID, UUID, m_callbackURI); | ||
2375 | m_callbackURI = null; | ||
2376 | //m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
2377 | } | ||
2378 | else if (!string.IsNullOrEmpty(m_newCallbackURI)) | ||
2379 | { | ||
2380 | m_log.DebugFormat( | ||
2381 | "[SCENE PRESENCE]: Releasing {0} {1} with callback to {2}", | ||
2382 | client.Name, client.AgentId, m_newCallbackURI); | ||
2383 | |||
2384 | UUID originID; | ||
2385 | |||
2386 | lock (m_originRegionIDAccessLock) | ||
2387 | originID = m_originRegionID; | ||
2388 | |||
2389 | Scene.SimulationService.ReleaseAgent(originID, UUID, m_newCallbackURI); | ||
2390 | m_newCallbackURI = null; | ||
2391 | //m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | ||
2392 | } | ||
2393 | 2389 | ||
2394 | if (openChildAgents) | 2390 | if (openChildAgents) |
2395 | { | 2391 | { |
@@ -3850,15 +3846,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
3850 | 3846 | ||
3851 | public override void Update() | 3847 | public override void Update() |
3852 | { | 3848 | { |
3853 | if(IsChildAgent || IsDeleted) | 3849 | if (IsDeleted) |
3854 | return; | 3850 | return; |
3855 | 3851 | ||
3856 | CheckForBorderCrossing(); | 3852 | if (NeedInitialData) |
3853 | { | ||
3854 | SendInitialData(); | ||
3855 | return; | ||
3856 | } | ||
3857 | 3857 | ||
3858 | if (IsInTransit || IsLoggingIn) | 3858 | if (IsChildAgent || IsInTransit) |
3859 | return; | 3859 | return; |
3860 | 3860 | ||
3861 | if(m_movingToTarget) | 3861 | CheckForBorderCrossing(); |
3862 | |||
3863 | if (m_movingToTarget) | ||
3862 | { | 3864 | { |
3863 | m_delayedStop = -1; | 3865 | m_delayedStop = -1; |
3864 | Vector3 control = Vector3.Zero; | 3866 | Vector3 control = Vector3.Zero; |
@@ -4033,25 +4035,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
4033 | ControllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations); | 4035 | ControllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations); |
4034 | } | 4036 | } |
4035 | 4037 | ||
4036 | public void RegionHandShakeReply (IClientAPI client, uint flags) | 4038 | public void RegionHandShakeReply (IClientAPI client) |
4037 | { | 4039 | { |
4038 | if(IsNPC) | 4040 | if(IsNPC) |
4039 | return; | 4041 | return; |
4040 | 4042 | ||
4041 | lock (m_completeMovementLock) | 4043 | lock (m_completeMovementLock) |
4042 | { | 4044 | { |
4043 | if (SentInitialData) | 4045 | if(m_gotRegionHandShake) |
4044 | return; | 4046 | return; |
4045 | SentInitialData = true; | 4047 | NeedInitialData = true; |
4046 | } | 4048 | } |
4049 | } | ||
4050 | |||
4051 | private void SendInitialData() | ||
4052 | { | ||
4053 | uint flags = ControllingClient.GetViewerCaps(); | ||
4054 | if((flags & 0x1000) == 0) // wait for seeds sending | ||
4055 | return; | ||
4056 | |||
4057 | NeedInitialData = false; | ||
4047 | 4058 | ||
4048 | bool selfappearance = (flags & 4) != 0; | 4059 | bool selfappearance = (flags & 4) != 0; |
4049 | bool cacheCulling = (flags & 1) != 0; | ||
4050 | bool cacheEmpty; | ||
4051 | if(cacheCulling) | ||
4052 | cacheEmpty = (flags & 2) != 0; | ||
4053 | else | ||
4054 | cacheEmpty = true; | ||
4055 | 4060 | ||
4056 | Util.FireAndForget(delegate | 4061 | Util.FireAndForget(delegate |
4057 | { | 4062 | { |
@@ -4066,9 +4071,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
4066 | SendOtherAgentsAvatarFullToMe(); | 4071 | SendOtherAgentsAvatarFullToMe(); |
4067 | } | 4072 | } |
4068 | 4073 | ||
4069 | // recheck to reduce timing issues | ||
4070 | ControllingClient.CheckViewerCaps(); | ||
4071 | |||
4072 | if (m_scene.ObjectsCullingByDistance) | 4074 | if (m_scene.ObjectsCullingByDistance) |
4073 | { | 4075 | { |
4074 | m_reprioritizationBusy = true; | 4076 | m_reprioritizationBusy = true; |
@@ -4081,6 +4083,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
4081 | return; | 4083 | return; |
4082 | } | 4084 | } |
4083 | 4085 | ||
4086 | bool cacheCulling = (flags & 1) != 0; | ||
4087 | bool cacheEmpty; | ||
4088 | if (cacheCulling) | ||
4089 | cacheEmpty = (flags & 2) != 0; | ||
4090 | else | ||
4091 | cacheEmpty = true; | ||
4092 | |||
4084 | EntityBase[] entities = Scene.Entities.GetEntities(); | 4093 | EntityBase[] entities = Scene.Entities.GetEntities(); |
4085 | if(cacheEmpty) | 4094 | if(cacheEmpty) |
4086 | { | 4095 | { |
@@ -6816,7 +6825,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
6816 | lock (m_completeMovementLock) | 6825 | lock (m_completeMovementLock) |
6817 | { | 6826 | { |
6818 | GodController.HasMovedAway(); | 6827 | GodController.HasMovedAway(); |
6819 | SentInitialData = false; | 6828 | NeedInitialData = false; |
6829 | m_gotRegionHandShake = false; | ||
6820 | } | 6830 | } |
6821 | 6831 | ||
6822 | List<ScenePresence> allpresences = m_scene.GetScenePresences(); | 6832 | List<ScenePresence> allpresences = m_scene.GetScenePresences(); |
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 80baf82..9f85185 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs | |||
@@ -699,7 +699,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
699 | public event TeleportCancel OnTeleportCancel; | 699 | public event TeleportCancel OnTeleportCancel; |
700 | public event DeRezObject OnDeRezObject; | 700 | public event DeRezObject OnDeRezObject; |
701 | public event RezRestoreToWorld OnRezRestoreToWorld; | 701 | public event RezRestoreToWorld OnRezRestoreToWorld; |
702 | public event Action<IClientAPI, uint> OnRegionHandShakeReply; | 702 | public event Action<IClientAPI> OnRegionHandShakeReply; |
703 | public event GenericCall1 OnRequestWearables; | 703 | public event GenericCall1 OnRequestWearables; |
704 | public event Action<IClientAPI, bool> OnCompleteMovementToRegion; | 704 | public event Action<IClientAPI, bool> OnCompleteMovementToRegion; |
705 | public event UpdateAgent OnPreAgentUpdate; | 705 | public event UpdateAgent OnPreAgentUpdate; |
@@ -938,12 +938,12 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
938 | 938 | ||
939 | if (OnRegionHandShakeReply != null) | 939 | if (OnRegionHandShakeReply != null) |
940 | { | 940 | { |
941 | OnRegionHandShakeReply(this, 0); | 941 | OnRegionHandShakeReply(this); |
942 | } | 942 | } |
943 | 943 | ||
944 | if (OnCompleteMovementToRegion != null) | 944 | if (OnCompleteMovementToRegion != null) |
945 | { | 945 | { |
946 | OnCompleteMovementToRegion(this, true); | 946 | OnCompleteMovementToRegion(this, false); |
947 | } | 947 | } |
948 | } | 948 | } |
949 | 949 | ||
@@ -1773,7 +1773,10 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
1773 | return 0; | 1773 | return 0; |
1774 | } | 1774 | } |
1775 | 1775 | ||
1776 | public void CheckViewerCaps() { } | 1776 | public uint GetViewerCaps() |
1777 | { | ||
1778 | return 0; | ||
1779 | } | ||
1777 | 1780 | ||
1778 | } | 1781 | } |
1779 | } | 1782 | } |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index a7ed7d1..954d336 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | |||
@@ -319,7 +319,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
319 | 319 | ||
320 | public event DeRezObject OnDeRezObject; | 320 | public event DeRezObject OnDeRezObject; |
321 | public event RezRestoreToWorld OnRezRestoreToWorld; | 321 | public event RezRestoreToWorld OnRezRestoreToWorld; |
322 | public event Action<IClientAPI, uint> OnRegionHandShakeReply; | 322 | public event Action<IClientAPI> OnRegionHandShakeReply; |
323 | public event GenericCall1 OnRequestWearables; | 323 | public event GenericCall1 OnRequestWearables; |
324 | public event Action<IClientAPI, bool> OnCompleteMovementToRegion; | 324 | public event Action<IClientAPI, bool> OnCompleteMovementToRegion; |
325 | public event UpdateAgent OnPreAgentUpdate; | 325 | public event UpdateAgent OnPreAgentUpdate; |
@@ -928,7 +928,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
928 | { | 928 | { |
929 | if (OnRegionHandShakeReply != null) | 929 | if (OnRegionHandShakeReply != null) |
930 | { | 930 | { |
931 | OnRegionHandShakeReply(this, 0); | 931 | OnRegionHandShakeReply(this); |
932 | } | 932 | } |
933 | } | 933 | } |
934 | 934 | ||
@@ -1384,7 +1384,10 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
1384 | return 0; | 1384 | return 0; |
1385 | } | 1385 | } |
1386 | 1386 | ||
1387 | public void CheckViewerCaps() { } | 1387 | public uint GetViewerCaps() |
1388 | { | ||
1389 | return 0; | ||
1390 | } | ||
1388 | 1391 | ||
1389 | } | 1392 | } |
1390 | } | 1393 | } |