From f81375cf1e8f750f3491523d60eeb02eea785a6e Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 25 Oct 2017 02:59:19 +0100 Subject: 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 --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 62 +++++++++++++++--------- 1 file changed, 40 insertions(+), 22 deletions(-) (limited to 'OpenSim/Region') 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 /// private object m_originRegionIDAccessLock = new object(); + + private AutoResetEvent m_updateAgentReceivedAfterTransferEvent = new AutoResetEvent(false); + /// /// Used by the entity transfer module to signal when the presence should not be closed because a subsequent /// teleport is reusing the connection. @@ -1950,30 +1953,32 @@ namespace OpenSim.Region.Framework.Scenes // (which triggers Scene.IncomingUpdateChildAgent(AgentData cAgentData) here in the destination, // m_originRegionID is UUID.Zero; after, it's non-Zero. The CompleteMovement sequence initiated from the // viewer (in turn triggered by the source region sending it a TeleportFinish event) waits until it's non-zero -// m_updateAgentReceivedAfterTransferEvent.WaitOne(10000); - int count = 50; - UUID originID = UUID.Zero; - - lock (m_originRegionIDAccessLock) - originID = m_originRegionID; - while (originID.Equals(UUID.Zero) && count-- > 0) + try { - lock (m_originRegionIDAccessLock) - originID = m_originRegionID; - - m_log.DebugFormat("[SCENE PRESENCE]: Agent {0} waiting for update in {1}", client.Name, Scene.Name); - Thread.Sleep(200); - } + if(m_updateAgentReceivedAfterTransferEvent.WaitOne(10000)) + { + UUID originID = UUID.Zero; - if (originID.Equals(UUID.Zero)) - { - // Movement into region will fail - m_log.WarnFormat("[SCENE PRESENCE]: Update agent {0} never arrived in {1}", client.Name, Scene.Name); - return false; + lock (m_originRegionIDAccessLock) + originID = m_originRegionID; + if (originID.Equals(UUID.Zero)) + { + // Movement into region will fail + m_log.WarnFormat("[SCENE PRESENCE]: Update agent {0} at {1} got invalid origin region id ", client.Name, Scene.Name); + return false; + } + return true; + } + else + { + m_log.WarnFormat("[SCENE PRESENCE]: Update agent {0} at {1} did not receive agent update ", client.Name, Scene.Name); + return false; + } } + catch { } - return true; + return false; } public void RotateToLookAt(Vector3 lookAt) @@ -2283,6 +2288,13 @@ namespace OpenSim.Region.Framework.Scenes } } + if(gotCrossUpdate) + { + if(IgnoredControls != ScriptControlled.CONTROL_ZERO) + ControllingClient.SendTakeControls((int)IgnoredControls, false, true); + + } + m_log.DebugFormat("[CompleteMovement] attachments: {0}ms", Util.EnvironmentTickCountSubtract(ts)); if (openChildAgents) { @@ -4574,7 +4586,7 @@ namespace OpenSim.Region.Framework.Scenes return; CopyFrom(cAgentData); - + m_updateAgentReceivedAfterTransferEvent.Set(); } private static Vector3 marker = new Vector3(-1f, -1f, -1f); @@ -4787,6 +4799,10 @@ namespace OpenSim.Region.Framework.Scenes AddToPhysicalScene(isFlying); } */ + + if (Scene.AttachmentsModule != null) + Scene.AttachmentsModule.CopyAttachments(cAgent, this); + try { lock (scriptedcontrols) @@ -4794,6 +4810,7 @@ namespace OpenSim.Region.Framework.Scenes if (cAgent.Controllers != null) { scriptedcontrols.Clear(); + IgnoredControls = ScriptControlled.CONTROL_ZERO; foreach (ControllerData c in cAgent.Controllers) { @@ -4804,6 +4821,7 @@ namespace OpenSim.Region.Framework.Scenes sc.eventControls = (ScriptControlled)c.EventControls; scriptedcontrols[sc.itemID] = sc; + IgnoredControls |= sc.ignoreControls; // this is not correct, aparently only last applied should count } } } @@ -4824,8 +4842,6 @@ namespace OpenSim.Region.Framework.Scenes if (cAgent.MotionState != 0) Animator.currentControlState = (ScenePresenceAnimator.motionControlStates) cAgent.MotionState; - if (Scene.AttachmentsModule != null) - Scene.AttachmentsModule.CopyAttachments(cAgent, this); crossingFlags = cAgent.CrossingFlags; gotCrossUpdate = (crossingFlags != 0); @@ -5108,6 +5124,8 @@ namespace OpenSim.Region.Framework.Scenes ControllingClient = null; LifecycleState = ScenePresenceState.Removed; IsDeleted = true; + m_updateAgentReceivedAfterTransferEvent.Dispose(); + m_updateAgentReceivedAfterTransferEvent = null; } public void AddAttachment(SceneObjectGroup gobj) -- cgit v1.1 From d65f055e4eb7fe2861308670b97817f9a61376c6 Mon Sep 17 00:00:00 2001 From: Kevin Cozens Date: Thu, 26 Oct 2017 11:26:49 -0400 Subject: Whitespace cleanup. --- .../Shared/Api/Implementation/OSSL_Api.cs | 38 +++++++++++----------- 1 file changed, 19 insertions(+), 19 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index ba07f9c..cdeb117 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -261,7 +261,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } // Returns if OSSL is enabled. Throws a script exception if OSSL is not allowed.. - // for safe funtions always active + // for safe funtions always active public void CheckThreatLevel() { m_host.AddScriptLPS(1); @@ -1056,7 +1056,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api targetID, part.SitTargetPosition); } - + // Get a list of all the avatars/agents in the region public LSL_List osGetAgents() { @@ -1074,7 +1074,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osGetAgentIP(string agent) { - CheckThreatLevel(ThreatLevel.Severe, "osGetAgentIP"); + CheckThreatLevel(ThreatLevel.Severe, "osGetAgentIP"); if(!(World.Permissions.IsGod(m_host.OwnerID))) // user god always needed return ""; @@ -1651,7 +1651,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api else { if (UUID.TryParse(arg, out uuid)) - { + { if(newLand.OwnerID != uuid) { changed = true; @@ -1760,7 +1760,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(changedSeeAvs && avatar.currentParcelUUID == parcelID ) avatar.currentParcelUUID = parcelID; // force parcel flags review - + if(avatar.ControllingClient == null) return; @@ -4500,7 +4500,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// LSL_Vector CenterOfMass, center mass relative to root prim /// LSL_Vector Inertia, elements of diagonal of inertia Ixx,Iyy,Izz divided by total mass /// LSL_Vector aux, elements of upper triagle of inertia Ixy (= Iyx), Ixz (= Izx), Iyz(= Izy) divided by total mass - /// + /// public LSL_List osGetInertiaData() { CheckThreatLevel(); @@ -4513,8 +4513,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api SceneObjectGroup sog = m_host.ParentGroup; if(sog== null || sog.IsDeleted) - return result; - + return result; + sog.GetInertiaData(out TotalMass, out CenterOfMass, out Inertia, out aux ); if(TotalMass > 0) { @@ -4538,7 +4538,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// /// set inertial data /// replaces the automatic calculation of mass, center of mass and inertia - /// + /// /// /// total mass of linkset /// location of center of mass relative to root prim in local coords @@ -4562,7 +4562,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // need more checks Vector3 CenterOfMass = new Vector3((float)centerOfMass.x,(float)centerOfMass.y,(float)centerOfMass.z); - Vector3 Inertia; + Vector3 Inertia; float m = (float)mass; Inertia.X = m * (float)principalInertiaScaled.x; @@ -4578,7 +4578,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// /// set inertial data as a sphere /// replaces the automatic calculation of mass, center of mass and inertia - /// + /// /// /// total mass of linkset /// size of the Box @@ -4600,7 +4600,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // need more checks Vector3 CenterOfMass = new Vector3((float)centerOfMass.x,(float)centerOfMass.y,(float)centerOfMass.z); - Vector3 Inertia; + Vector3 Inertia; float lx = (float)boxSize.x; float ly = (float)boxSize.y; float lz = (float)boxSize.z; @@ -4620,7 +4620,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// /// set inertial data as a sphere /// replaces the automatic calculation of mass, center of mass and inertia - /// + /// /// /// total mass of linkset /// radius of the sphere @@ -4639,9 +4639,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; // need more checks - + Vector3 CenterOfMass = new Vector3((float)centerOfMass.x,(float)centerOfMass.y,(float)centerOfMass.z); - Vector3 Inertia; + Vector3 Inertia; float r = (float)radius; float m = (float)mass; float t = 0.4f * m * r * r; @@ -4656,7 +4656,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// /// set inertial data as a cylinder /// replaces the automatic calculation of mass, center of mass and inertia - /// + /// /// /// total mass of linkset /// radius of the cylinder @@ -4678,9 +4678,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; // need more checks - + Vector3 CenterOfMass = new Vector3((float)centerOfMass.x,(float)centerOfMass.y,(float)centerOfMass.z); - Vector3 Inertia; + Vector3 Inertia; float m = (float)mass; float r = (float)radius; r *= r; @@ -4702,7 +4702,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// /// removes inertial data manual override /// default automatic calculation is used again - /// + /// /// public void osClearInertia() { -- cgit v1.1 From fbb2f7f319125fc7abb4f521153ab937e222d3ce Mon Sep 17 00:00:00 2001 From: Kevin Cozens Date: Thu, 26 Oct 2017 13:29:14 -0400 Subject: Corrected name of function in call to CheckThreatLevel. --- OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index cdeb117..6e28fe0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -3593,7 +3593,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public int osGetSimulatorMemoryKB() { - CheckThreatLevel(ThreatLevel.Moderate, "osGetSimulatorMemory"); + CheckThreatLevel(ThreatLevel.Moderate, "osGetSimulatorMemoryKB"); long pws = System.Diagnostics.Process.GetCurrentProcess().WorkingSet64; -- cgit v1.1