diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index c8f28c7c07..e4bee0c18d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1129,13 +1129,21 @@ namespace OpenSim.Region.Framework.Scenes public Quaternion SitTargetOrientation { get { return m_sitTargetOrientation; } - set { m_sitTargetOrientation = value; } + set + { + m_sitTargetOrientation = value; +// m_log.DebugFormat("[SCENE OBJECT PART]: Set sit target orientation {0} for {1} {2}", m_sitTargetOrientation, Name, LocalId); + } } public Vector3 SitTargetPosition { get { return m_sitTargetPosition; } - set { m_sitTargetPosition = value; } + set + { + m_sitTargetPosition = value; +// m_log.DebugFormat("[SCENE OBJECT PART]: Set sit target position to {0} for {1} {2}", m_sitTargetPosition, Name, LocalId); + } } // This sort of sucks, but I'm adding these in to make some of diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 1c892fed69..b95d6139aa 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -92,7 +92,7 @@ namespace OpenSim.Region.Framework.Scenes /// // private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f); // Value revised by KF 091121 by comparison with SL. - private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.418f); + public static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.418f); /// /// Movement updates for agents in neighboring regions are sent directly to clients. @@ -2617,7 +2617,6 @@ namespace OpenSim.Region.Framework.Scenes RemoveFromPhysicalScene(); Animator.TrySetMovementAnimation(sitAnimation); SendAvatarDataToAllAgents(); - //SendTerseUpdateToAllClients(); } public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal) diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 10181aa9a5..56ff3675ac 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -208,7 +208,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC ScenePresence sp; scene.TryGetScenePresence(agentID, out sp); sp.HandleAgentRequestSit(m_avatars[agentID], agentID, partID, Vector3.Zero); - sp.HandleAgentSit(m_avatars[agentID], agentID); +// sp.HandleAgentSit(m_avatars[agentID], agentID); return true; } diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs index 174d74c6e4..d2b79f749a 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs @@ -231,7 +231,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests } [Test] - public void TestSitAndStand() + public void TestSitAndStandWithSitTarget() { TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); @@ -245,12 +245,49 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests ScenePresence npc = scene.GetScenePresence(npcId); SceneObjectPart part = SceneHelpers.AddSceneObject(scene); - // We must have a non Vector3.Zero sit target position otherwise part.SitTargetAvatar doesn't get set! part.SitTargetPosition = new Vector3(0, 0, 1); npcModule.Sit(npc.UUID, part.UUID, scene); Assert.That(part.SitTargetAvatar, Is.EqualTo(npcId)); Assert.That(npc.ParentID, Is.EqualTo(part.LocalId)); + Assert.That( + npc.AbsolutePosition, + Is.EqualTo(part.AbsolutePosition + part.SitTargetPosition + ScenePresence.SIT_TARGET_ADJUSTMENT)); + + npcModule.Stand(npc.UUID, scene); + + Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); + Assert.That(npc.ParentID, Is.EqualTo(0)); + } + + [Test] + public void TestSitAndStandWithNoSitTarget() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); + + // FIXME: To get this to work for now, we are going to place the npc right next to the target so that + // the autopilot doesn't trigger + Vector3 startPos = new Vector3(1, 1, 1); + + INPCModule npcModule = scene.RequestModuleInterface(); + UUID npcId = npcModule.CreateNPC("John", "Smith", startPos, scene, sp.Appearance); + + ScenePresence npc = scene.GetScenePresence(npcId); + SceneObjectPart part = SceneHelpers.AddSceneObject(scene); + + npcModule.Sit(npc.UUID, part.UUID, scene); + + Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); + Assert.That(npc.ParentID, Is.EqualTo(part.LocalId)); + + // FIXME: This is different for live avatars - z position is adjusted. This is half the height of the + // default avatar. + Assert.That( + npc.AbsolutePosition, + Is.EqualTo(part.AbsolutePosition + new Vector3(0, 0, 0.8857438f))); npcModule.Stand(npc.UUID, scene); diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 19d87c29a7..363051062f 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs @@ -1269,7 +1269,7 @@ namespace OpenSim.Region.Physics.OdePlugin // m_taintForce = Vector3.Zero. Need to lock ProcessTaints() when we set a new tainted force. doForce(m_taintForce); } - + m_taintForce = Vector3.Zero; } diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 6e3481150f..ffd6dc06b8 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -2250,7 +2250,10 @@ Console.WriteLine(" JointCreateFixed"); { if (!m_isSelected) { + // Not sure exactly why this sleep is here, but from experimentation it appears to stop an avatar + // walking through a default rez size prim if it keeps kicking it around - justincc. Thread.Sleep(20); + if (IsPhysical) { if (Body != IntPtr.Zero)