aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
authorUbitUmarov2017-10-25 02:59:19 +0100
committerUbitUmarov2017-10-25 02:59:19 +0100
commitf81375cf1e8f750f3491523d60eeb02eea785a6e (patch)
treeeafe39b56358c78073c6f2c6562264df8c2a1799 /OpenSim/Region/Framework
parentadd osGetSimulatorMemoryKB(). This allows work around the fact osGetSimulator... (diff)
downloadopensim-SC-f81375cf1e8f750f3491523d60eeb02eea785a6e.zip
opensim-SC-f81375cf1e8f750f3491523d60eeb02eea785a6e.tar.gz
opensim-SC-f81375cf1e8f750f3491523d60eeb02eea785a6e.tar.bz2
opensim-SC-f81375cf1e8f750f3491523d60eeb02eea785a6e.tar.xz
mantis 8253: try to recover information about takecontrols pass=false controls on crossings, also tell viewers about them. this may still not be correct. Use of multiple TakeControls on same avatar can still give unpredictable results (also on normal operation). In same cases last executed my override previus or not. Also change agent updates wait code
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs62
1 files changed, 40 insertions, 22 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 9cceb06..059a846 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -457,6 +457,9 @@ namespace OpenSim.Region.Framework.Scenes
457 /// </summary> 457 /// </summary>
458 private object m_originRegionIDAccessLock = new object(); 458 private object m_originRegionIDAccessLock = new object();
459 459
460
461 private AutoResetEvent m_updateAgentReceivedAfterTransferEvent = new AutoResetEvent(false);
462
460 /// <summary> 463 /// <summary>
461 /// Used by the entity transfer module to signal when the presence should not be closed because a subsequent 464 /// Used by the entity transfer module to signal when the presence should not be closed because a subsequent
462 /// teleport is reusing the connection. 465 /// teleport is reusing the connection.
@@ -1950,30 +1953,32 @@ namespace OpenSim.Region.Framework.Scenes
1950 // (which triggers Scene.IncomingUpdateChildAgent(AgentData cAgentData) here in the destination, 1953 // (which triggers Scene.IncomingUpdateChildAgent(AgentData cAgentData) here in the destination,
1951 // m_originRegionID is UUID.Zero; after, it's non-Zero. The CompleteMovement sequence initiated from the 1954 // m_originRegionID is UUID.Zero; after, it's non-Zero. The CompleteMovement sequence initiated from the
1952 // viewer (in turn triggered by the source region sending it a TeleportFinish event) waits until it's non-zero 1955 // viewer (in turn triggered by the source region sending it a TeleportFinish event) waits until it's non-zero
1953// m_updateAgentReceivedAfterTransferEvent.WaitOne(10000);
1954 int count = 50;
1955 UUID originID = UUID.Zero;
1956
1957 lock (m_originRegionIDAccessLock)
1958 originID = m_originRegionID;
1959 1956
1960 while (originID.Equals(UUID.Zero) && count-- > 0) 1957 try
1961 { 1958 {
1962 lock (m_originRegionIDAccessLock) 1959 if(m_updateAgentReceivedAfterTransferEvent.WaitOne(10000))
1963 originID = m_originRegionID; 1960 {
1964 1961 UUID originID = UUID.Zero;
1965 m_log.DebugFormat("[SCENE PRESENCE]: Agent {0} waiting for update in {1}", client.Name, Scene.Name);
1966 Thread.Sleep(200);
1967 }
1968 1962
1969 if (originID.Equals(UUID.Zero)) 1963 lock (m_originRegionIDAccessLock)
1970 { 1964 originID = m_originRegionID;
1971 // Movement into region will fail 1965 if (originID.Equals(UUID.Zero))
1972 m_log.WarnFormat("[SCENE PRESENCE]: Update agent {0} never arrived in {1}", client.Name, Scene.Name); 1966 {
1973 return false; 1967 // Movement into region will fail
1968 m_log.WarnFormat("[SCENE PRESENCE]: Update agent {0} at {1} got invalid origin region id ", client.Name, Scene.Name);
1969 return false;
1970 }
1971 return true;
1972 }
1973 else
1974 {
1975 m_log.WarnFormat("[SCENE PRESENCE]: Update agent {0} at {1} did not receive agent update ", client.Name, Scene.Name);
1976 return false;
1977 }
1974 } 1978 }
1979 catch { }
1975 1980
1976 return true; 1981 return false;
1977 } 1982 }
1978 1983
1979 public void RotateToLookAt(Vector3 lookAt) 1984 public void RotateToLookAt(Vector3 lookAt)
@@ -2283,6 +2288,13 @@ namespace OpenSim.Region.Framework.Scenes
2283 } 2288 }
2284 } 2289 }
2285 2290
2291 if(gotCrossUpdate)
2292 {
2293 if(IgnoredControls != ScriptControlled.CONTROL_ZERO)
2294 ControllingClient.SendTakeControls((int)IgnoredControls, false, true);
2295
2296 }
2297
2286 m_log.DebugFormat("[CompleteMovement] attachments: {0}ms", Util.EnvironmentTickCountSubtract(ts)); 2298 m_log.DebugFormat("[CompleteMovement] attachments: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2287 if (openChildAgents) 2299 if (openChildAgents)
2288 { 2300 {
@@ -4574,7 +4586,7 @@ namespace OpenSim.Region.Framework.Scenes
4574 return; 4586 return;
4575 4587
4576 CopyFrom(cAgentData); 4588 CopyFrom(cAgentData);
4577 4589 m_updateAgentReceivedAfterTransferEvent.Set();
4578 } 4590 }
4579 4591
4580 private static Vector3 marker = new Vector3(-1f, -1f, -1f); 4592 private static Vector3 marker = new Vector3(-1f, -1f, -1f);
@@ -4787,6 +4799,10 @@ namespace OpenSim.Region.Framework.Scenes
4787 AddToPhysicalScene(isFlying); 4799 AddToPhysicalScene(isFlying);
4788 } 4800 }
4789*/ 4801*/
4802
4803 if (Scene.AttachmentsModule != null)
4804 Scene.AttachmentsModule.CopyAttachments(cAgent, this);
4805
4790 try 4806 try
4791 { 4807 {
4792 lock (scriptedcontrols) 4808 lock (scriptedcontrols)
@@ -4794,6 +4810,7 @@ namespace OpenSim.Region.Framework.Scenes
4794 if (cAgent.Controllers != null) 4810 if (cAgent.Controllers != null)
4795 { 4811 {
4796 scriptedcontrols.Clear(); 4812 scriptedcontrols.Clear();
4813 IgnoredControls = ScriptControlled.CONTROL_ZERO;
4797 4814
4798 foreach (ControllerData c in cAgent.Controllers) 4815 foreach (ControllerData c in cAgent.Controllers)
4799 { 4816 {
@@ -4804,6 +4821,7 @@ namespace OpenSim.Region.Framework.Scenes
4804 sc.eventControls = (ScriptControlled)c.EventControls; 4821 sc.eventControls = (ScriptControlled)c.EventControls;
4805 4822
4806 scriptedcontrols[sc.itemID] = sc; 4823 scriptedcontrols[sc.itemID] = sc;
4824 IgnoredControls |= sc.ignoreControls; // this is not correct, aparently only last applied should count
4807 } 4825 }
4808 } 4826 }
4809 } 4827 }
@@ -4824,8 +4842,6 @@ namespace OpenSim.Region.Framework.Scenes
4824 if (cAgent.MotionState != 0) 4842 if (cAgent.MotionState != 0)
4825 Animator.currentControlState = (ScenePresenceAnimator.motionControlStates) cAgent.MotionState; 4843 Animator.currentControlState = (ScenePresenceAnimator.motionControlStates) cAgent.MotionState;
4826 4844
4827 if (Scene.AttachmentsModule != null)
4828 Scene.AttachmentsModule.CopyAttachments(cAgent, this);
4829 4845
4830 crossingFlags = cAgent.CrossingFlags; 4846 crossingFlags = cAgent.CrossingFlags;
4831 gotCrossUpdate = (crossingFlags != 0); 4847 gotCrossUpdate = (crossingFlags != 0);
@@ -5108,6 +5124,8 @@ namespace OpenSim.Region.Framework.Scenes
5108 ControllingClient = null; 5124 ControllingClient = null;
5109 LifecycleState = ScenePresenceState.Removed; 5125 LifecycleState = ScenePresenceState.Removed;
5110 IsDeleted = true; 5126 IsDeleted = true;
5127 m_updateAgentReceivedAfterTransferEvent.Dispose();
5128 m_updateAgentReceivedAfterTransferEvent = null;
5111 } 5129 }
5112 5130
5113 public void AddAttachment(SceneObjectGroup gobj) 5131 public void AddAttachment(SceneObjectGroup gobj)