From 3d5a9e6748ef743c4db04b427d4d76ea65269618 Mon Sep 17 00:00:00 2001 From: diva Date: Sun, 15 Feb 2009 05:00:58 +0000 Subject: This started as way to correct Mantis #3158, which I believe should be fixed now. The flying status was temporarily being ignored, which caused the avie to drop sometimes -- there was a race condition. In the process it also fixes that annoying bug in basic physics where the avie would drop half-way to the ground upon region crossings (SetAppearance was missing). Additionally, a lot of child-agent-related code has been cleaned up; namely child agents are now consistently not added to physical scenes, and they also don't have appearances. All of that happens in MakeRoot, consistently. --- OpenSim/Region/Framework/Scenes/Scene.cs | 8 ++-- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 2 +- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 55 ++++++++++++---------- .../BasicPhysicsPlugin/BasicPhysicsPlugin.cs | 3 +- .../Region/Physics/BulletXPlugin/BulletXPlugin.cs | 3 +- OpenSim/Region/Physics/Manager/PhysicsScene.cs | 4 +- OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 3 +- OpenSim/Region/Physics/POSPlugin/POSScene.cs | 3 +- OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs | 3 +- 9 files changed, 47 insertions(+), 37 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 24cb48a..0f57b7c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2090,8 +2090,8 @@ namespace OpenSim.Region.Framework.Scenes /// protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client) { - AvatarAppearance appearance = null; - GetAvatarAppearance(client, out appearance); + AvatarAppearance appearance = new AvatarAppearance(); + //GetAvatarAppearance(client, out appearance); ScenePresence avatar = m_sceneGraph.CreateAndAddChildScenePresence(client, appearance); //avatar.KnownRegions = GetChildrenSeeds(avatar.UUID); @@ -2339,7 +2339,7 @@ namespace OpenSim.Region.Framework.Scenes } // Don't disable this log message - it's too helpful - m_log.DebugFormat( + m_log.InfoFormat( "[CONNECTION BEGIN]: Region {0} told of incoming client {1} {2} {3} (circuit code {4})", RegionInfo.RegionName, agent.firstname, agent.lastname, agent.AgentID, agent.circuitcode); @@ -3295,7 +3295,7 @@ namespace OpenSim.Region.Framework.Scenes } catch (Exception e) { - m_log.Info("[BUG]: " + e.ToString()); + m_log.Info("[BUG] in " + RegionInfo.RegionName + ": " + e.ToString()); } } } diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 2edfca8..ecce237 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -646,7 +646,7 @@ namespace OpenSim.Region.Framework.Scenes else { m_numRootAgents++; - presence.AddToPhysicalScene(); + presence.AddToPhysicalScene(false); } Entities[presence.UUID] = presence; diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index f841707..a93fcb2 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -611,7 +611,7 @@ namespace OpenSim.Region.Framework.Scenes m_controllingClient.OnRequestWearables += SendWearables; m_controllingClient.OnSetAppearance += SetAppearance; m_controllingClient.OnCompleteMovementToRegion += CompleteMovement; - m_controllingClient.OnCompleteMovementToRegion += SendInitialData; + //m_controllingClient.OnCompleteMovementToRegion += SendInitialData; m_controllingClient.OnAgentUpdate += HandleAgentUpdate; m_controllingClient.OnAgentRequestSit += HandleAgentRequestSit; m_controllingClient.OnAgentSit += HandleAgentSit; @@ -829,7 +829,6 @@ namespace OpenSim.Region.Framework.Scenes pos = emergencyPos; } - m_isChildAgent = false; float localAVHeight = 1.56f; if (m_avHeight != 127.0f) @@ -845,8 +844,8 @@ namespace OpenSim.Region.Framework.Scenes } AbsolutePosition = pos; - AddToPhysicalScene(); - m_physicsActor.Flying = isFlying; + AddToPhysicalScene(isFlying); + SetHeight(m_appearance.AvatarHeight); // Don't send an animation pack here, since on a region crossing this will sometimes cause a flying // avatar to return to the standing position in mid-air. On login it looks like this is being sent @@ -861,13 +860,16 @@ namespace OpenSim.Region.Framework.Scenes else m_log.ErrorFormat("[SCENE]: Could not find user info for {0} when making it a root agent", m_uuid); - //m_scene.CapsModule.AddCapsHandler(m_uuid); - // On the next prim update, all objects will be sent // m_pendingObjects = null; + m_isChildAgent = false; + + SendInitialData(); + m_scene.EventManager.TriggerOnMakeRootAgent(this); + } /// @@ -916,10 +918,14 @@ namespace OpenSim.Region.Framework.Scenes /// public void Teleport(Vector3 pos) { + bool isFlying = false; + if (m_physicsActor != null) + isFlying = m_physicsActor.Flying; + RemoveFromPhysicalScene(); Velocity = new Vector3(0, 0, 0); AbsolutePosition = pos; - AddToPhysicalScene(); + AddToPhysicalScene(isFlying); SendTerseUpdateToAllClients(); } @@ -1021,8 +1027,8 @@ namespace OpenSim.Region.Framework.Scenes if (m_isChildAgent) { m_isChildAgent = false; - - MakeRootAgent(AbsolutePosition, false); + bool m_flying = ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); + MakeRootAgent(AbsolutePosition, m_flying); if ((m_callbackURI != null) && !m_callbackURI.Equals("")) { @@ -1068,7 +1074,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error# 9999903"); } - AddToPhysicalScene(); + AddToPhysicalScene(false); } else { @@ -1464,7 +1470,7 @@ namespace OpenSim.Region.Framework.Scenes if (m_physicsActor == null) { - AddToPhysicalScene(); + AddToPhysicalScene(m_physicsActor.Flying); } m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight); @@ -2231,7 +2237,7 @@ namespace OpenSim.Region.Framework.Scenes // just to add it back again, but it saves us from having to update // 3 variables 10 times a second. m_scene.PhysicsScene.RemoveAvatar(m_physicsActor); - AddToPhysicalScene(); + AddToPhysicalScene(m_physicsActor.Flying); } m_appearance.SetAppearance(texture, visualParam); SetHeight(m_appearance.AvatarHeight); @@ -2420,12 +2426,18 @@ namespace OpenSim.Region.Framework.Scenes protected void CrossToNewRegion() { m_inTransit = true; + + if ((m_physicsActor != null) && m_physicsActor.Flying) + m_AgentControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; + else if ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0) + m_AgentControlFlags &= ~(uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; + m_scene.CrossAgentToNewRegion(this, m_physicsActor.Flying); } public void RestoreInCurrentScene() { - AddToPhysicalScene(); + AddToPhysicalScene(false); // not exactly false } /// @@ -2583,10 +2595,6 @@ namespace OpenSim.Region.Framework.Scenes cAgent.HeadRotation = m_headrotation; cAgent.BodyRotation = m_bodyRot; cAgent.ControlFlags = m_AgentControlFlags; - if ((m_physicsActor != null) && (m_physicsActor.Flying)) - { - cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; - } if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) cAgent.GodLevel = (byte)m_godlevel; @@ -2625,10 +2633,7 @@ namespace OpenSim.Region.Framework.Scenes m_headrotation = cAgent.HeadRotation; m_bodyRot = cAgent.BodyRotation; m_AgentControlFlags = cAgent.ControlFlags; // We need more flags! - if (m_physicsActor != null) - { - m_physicsActor.Flying = ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); - } + if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) m_godlevel = cAgent.GodLevel; m_setAlwaysRun = cAgent.AlwaysRun; @@ -2755,7 +2760,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// Adds a physical representation of the avatar to the Physics plugin /// - public void AddToPhysicalScene() + public void AddToPhysicalScene(bool isFlying) { PhysicsScene scene = m_scene.PhysicsScene; @@ -2765,13 +2770,13 @@ namespace OpenSim.Region.Framework.Scenes if (m_avHeight == 127.0f) { - m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new PhysicsVector(0, 0, 1.56f)); + m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new PhysicsVector(0, 0, 1.56f), isFlying); } else { - m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new PhysicsVector(0, 0, m_avHeight)); + m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new PhysicsVector(0, 0, m_avHeight), isFlying); } - + //m_physicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients; m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate; m_physicsActor.SubscribeEvents(1000); diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs index 010d9d3..3081077 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs @@ -83,10 +83,11 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin { } - public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size) + public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) { BasicActor act = new BasicActor(); act.Position = position; + act.Flying = isFlying; _actors.Add(act); return act; } diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs index 29a19de..8891163 100644 --- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs +++ b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs @@ -573,13 +573,14 @@ namespace OpenSim.Region.Physics.BulletXPlugin } - public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size) + public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) { PhysicsVector pos = new PhysicsVector(); pos.X = position.X; pos.Y = position.Y; pos.Z = position.Z + 20; BulletXCharacter newAv = null; + newAv.Flying = isFlying; lock (BulletXLock) { newAv = new BulletXCharacter(avName, this, pos); diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs index 2cf4d5a..fbf92a9 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsScene.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs @@ -62,7 +62,7 @@ namespace OpenSim.Region.Physics.Manager public abstract void Initialise(IMesher meshmerizer, IConfigSource config); - public abstract PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size); + public abstract PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying); public abstract void RemoveAvatar(PhysicsActor actor); @@ -162,7 +162,7 @@ namespace OpenSim.Region.Physics.Manager // Does nothing right now } - public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size) + public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) { m_log.InfoFormat("[PHYSICS]: NullPhysicsScene : AddAvatar({0})", position); return PhysicsActor.Null; diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index ae47636..f30de4d 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs @@ -1313,13 +1313,14 @@ namespace OpenSim.Region.Physics.OdePlugin #region Add/Remove Entities - public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size) + public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) { PhysicsVector pos = new PhysicsVector(); pos.X = position.X; pos.Y = position.Y; pos.Z = position.Z; OdeCharacter newAv = new OdeCharacter(avName, this, pos, ode, size, avPIDD, avPIDP, avCapRadius, avStandupTensor, avDensity, avHeightFudgeFactor, avMovementDivisorWalk, avMovementDivisorRun); + newAv.Flying = isFlying; _characters.Add(newAv); return newAv; } diff --git a/OpenSim/Region/Physics/POSPlugin/POSScene.cs b/OpenSim/Region/Physics/POSPlugin/POSScene.cs index 44a105d..84ffe5f 100644 --- a/OpenSim/Region/Physics/POSPlugin/POSScene.cs +++ b/OpenSim/Region/Physics/POSPlugin/POSScene.cs @@ -56,10 +56,11 @@ namespace OpenSim.Region.Physics.POSPlugin { } - public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size) + public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) { POSCharacter act = new POSCharacter(); act.Position = position; + act.Flying = isFlying; _characters.Add(act); return act; } diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs index fa59dbe..18935fb 100644 --- a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs +++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs @@ -102,13 +102,14 @@ namespace OpenSim.Region.Physics.PhysXPlugin } - public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size) + public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) { Vec3 pos = new Vec3(); pos.X = position.X; pos.Y = position.Y; pos.Z = position.Z; PhysXCharacter act = new PhysXCharacter(scene.AddCharacter(pos)); + act.Flying = isFlying; act.Position = position; _characters.Add(act); return act; -- cgit v1.1