diff options
4 files changed, 61 insertions, 14 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index b77f1b6..4071159 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -1096,13 +1096,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
1096 | public Quaternion SitTargetOrientation | 1096 | public Quaternion SitTargetOrientation |
1097 | { | 1097 | { |
1098 | get { return m_sitTargetOrientation; } | 1098 | get { return m_sitTargetOrientation; } |
1099 | set { m_sitTargetOrientation = value; } | 1099 | set |
1100 | { | ||
1101 | m_sitTargetOrientation = value; | ||
1102 | // m_log.DebugFormat("[SCENE OBJECT PART]: Set sit target orientation {0} for {1} {2}", m_sitTargetOrientation, Name, LocalId); | ||
1103 | } | ||
1100 | } | 1104 | } |
1101 | 1105 | ||
1102 | public Vector3 SitTargetPosition | 1106 | public Vector3 SitTargetPosition |
1103 | { | 1107 | { |
1104 | get { return m_sitTargetPosition; } | 1108 | get { return m_sitTargetPosition; } |
1105 | set { m_sitTargetPosition = value; } | 1109 | set |
1110 | { | ||
1111 | m_sitTargetPosition = value; | ||
1112 | // m_log.DebugFormat("[SCENE OBJECT PART]: Set sit target position to {0} for {1} {2}", m_sitTargetPosition, Name, LocalId); | ||
1113 | } | ||
1106 | } | 1114 | } |
1107 | 1115 | ||
1108 | // This sort of sucks, but I'm adding these in to make some of | 1116 | // 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 89e511f..4156f21 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -89,7 +89,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
89 | /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis | 89 | /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis |
90 | /// issue #1716 | 90 | /// issue #1716 |
91 | /// </summary> | 91 | /// </summary> |
92 | private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f); | 92 | public static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f); |
93 | 93 | ||
94 | /// <summary> | 94 | /// <summary> |
95 | /// Movement updates for agents in neighboring regions are sent directly to clients. | 95 | /// Movement updates for agents in neighboring regions are sent directly to clients. |
@@ -1873,7 +1873,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1873 | AddToPhysicalScene(false); | 1873 | AddToPhysicalScene(false); |
1874 | } | 1874 | } |
1875 | 1875 | ||
1876 | m_pos += ParentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight); | 1876 | m_pos += ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight); |
1877 | ParentPosition = Vector3.Zero; | 1877 | ParentPosition = Vector3.Zero; |
1878 | 1878 | ||
1879 | ParentID = 0; | 1879 | ParentID = 0; |
@@ -2283,6 +2283,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2283 | Vector3 sitTargetPos = part.SitTargetPosition; | 2283 | Vector3 sitTargetPos = part.SitTargetPosition; |
2284 | Quaternion sitTargetOrient = part.SitTargetOrientation; | 2284 | Quaternion sitTargetOrient = part.SitTargetOrientation; |
2285 | 2285 | ||
2286 | // m_log.DebugFormat( | ||
2287 | // "[SCENE PRESENCE]: Sitting {0} at sit target {1}, {2} on {3} {4}", | ||
2288 | // Name, sitTargetPos, sitTargetOrient, part.Name, part.LocalId); | ||
2289 | |||
2286 | //Quaternion vq = new Quaternion(sitTargetPos.X, sitTargetPos.Y+0.2f, sitTargetPos.Z+0.2f, 0); | 2290 | //Quaternion vq = new Quaternion(sitTargetPos.X, sitTargetPos.Y+0.2f, sitTargetPos.Z+0.2f, 0); |
2287 | //Quaternion nq = new Quaternion(-sitTargetOrient.X, -sitTargetOrient.Y, -sitTargetOrient.Z, sitTargetOrient.w); | 2291 | //Quaternion nq = new Quaternion(-sitTargetOrient.X, -sitTargetOrient.Y, -sitTargetOrient.Z, sitTargetOrient.w); |
2288 | 2292 | ||
@@ -2291,15 +2295,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
2291 | m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z); | 2295 | m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z); |
2292 | m_pos += SIT_TARGET_ADJUSTMENT; | 2296 | m_pos += SIT_TARGET_ADJUSTMENT; |
2293 | Rotation = sitTargetOrient; | 2297 | Rotation = sitTargetOrient; |
2294 | //Rotation = sitTargetOrient; | ||
2295 | ParentPosition = part.AbsolutePosition; | 2298 | ParentPosition = part.AbsolutePosition; |
2296 | |||
2297 | //SendTerseUpdateToAllClients(); | ||
2298 | } | 2299 | } |
2299 | else | 2300 | else |
2300 | { | 2301 | { |
2301 | m_pos -= part.AbsolutePosition; | 2302 | m_pos -= part.AbsolutePosition; |
2303 | |||
2302 | ParentPosition = part.AbsolutePosition; | 2304 | ParentPosition = part.AbsolutePosition; |
2305 | |||
2306 | // m_log.DebugFormat( | ||
2307 | // "[SCENE PRESENCE]: Sitting {0} at position {1} ({2} + {3}) on part {4} {5} without sit target", | ||
2308 | // Name, part.AbsolutePosition, m_pos, ParentPosition, part.Name, part.LocalId); | ||
2303 | } | 2309 | } |
2304 | } | 2310 | } |
2305 | else | 2311 | else |
@@ -2314,10 +2320,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2314 | 2320 | ||
2315 | Animator.TrySetMovementAnimation(sitAnimation); | 2321 | Animator.TrySetMovementAnimation(sitAnimation); |
2316 | SendAvatarDataToAllAgents(); | 2322 | SendAvatarDataToAllAgents(); |
2317 | // This may seem stupid, but Our Full updates don't send avatar rotation :P | ||
2318 | // So we're also sending a terse update (which has avatar rotation) | ||
2319 | // [Update] We do now. | ||
2320 | //SendTerseUpdateToAllClients(); | ||
2321 | } | 2323 | } |
2322 | 2324 | ||
2323 | /// <summary> | 2325 | /// <summary> |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 10181aa..56ff367 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 | |||
208 | ScenePresence sp; | 208 | ScenePresence sp; |
209 | scene.TryGetScenePresence(agentID, out sp); | 209 | scene.TryGetScenePresence(agentID, out sp); |
210 | sp.HandleAgentRequestSit(m_avatars[agentID], agentID, partID, Vector3.Zero); | 210 | sp.HandleAgentRequestSit(m_avatars[agentID], agentID, partID, Vector3.Zero); |
211 | sp.HandleAgentSit(m_avatars[agentID], agentID); | 211 | // sp.HandleAgentSit(m_avatars[agentID], agentID); |
212 | 212 | ||
213 | return true; | 213 | return true; |
214 | } | 214 | } |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs index 174d74c..d2b79f7 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 | |||
231 | } | 231 | } |
232 | 232 | ||
233 | [Test] | 233 | [Test] |
234 | public void TestSitAndStand() | 234 | public void TestSitAndStandWithSitTarget() |
235 | { | 235 | { |
236 | TestHelpers.InMethod(); | 236 | TestHelpers.InMethod(); |
237 | // log4net.Config.XmlConfigurator.Configure(); | 237 | // log4net.Config.XmlConfigurator.Configure(); |
@@ -245,12 +245,49 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests | |||
245 | ScenePresence npc = scene.GetScenePresence(npcId); | 245 | ScenePresence npc = scene.GetScenePresence(npcId); |
246 | SceneObjectPart part = SceneHelpers.AddSceneObject(scene); | 246 | SceneObjectPart part = SceneHelpers.AddSceneObject(scene); |
247 | 247 | ||
248 | // We must have a non Vector3.Zero sit target position otherwise part.SitTargetAvatar doesn't get set! | ||
249 | part.SitTargetPosition = new Vector3(0, 0, 1); | 248 | part.SitTargetPosition = new Vector3(0, 0, 1); |
250 | npcModule.Sit(npc.UUID, part.UUID, scene); | 249 | npcModule.Sit(npc.UUID, part.UUID, scene); |
251 | 250 | ||
252 | Assert.That(part.SitTargetAvatar, Is.EqualTo(npcId)); | 251 | Assert.That(part.SitTargetAvatar, Is.EqualTo(npcId)); |
253 | Assert.That(npc.ParentID, Is.EqualTo(part.LocalId)); | 252 | Assert.That(npc.ParentID, Is.EqualTo(part.LocalId)); |
253 | Assert.That( | ||
254 | npc.AbsolutePosition, | ||
255 | Is.EqualTo(part.AbsolutePosition + part.SitTargetPosition + ScenePresence.SIT_TARGET_ADJUSTMENT)); | ||
256 | |||
257 | npcModule.Stand(npc.UUID, scene); | ||
258 | |||
259 | Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); | ||
260 | Assert.That(npc.ParentID, Is.EqualTo(0)); | ||
261 | } | ||
262 | |||
263 | [Test] | ||
264 | public void TestSitAndStandWithNoSitTarget() | ||
265 | { | ||
266 | TestHelpers.InMethod(); | ||
267 | // log4net.Config.XmlConfigurator.Configure(); | ||
268 | |||
269 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); | ||
270 | |||
271 | // FIXME: To get this to work for now, we are going to place the npc right next to the target so that | ||
272 | // the autopilot doesn't trigger | ||
273 | Vector3 startPos = new Vector3(1, 1, 1); | ||
274 | |||
275 | INPCModule npcModule = scene.RequestModuleInterface<INPCModule>(); | ||
276 | UUID npcId = npcModule.CreateNPC("John", "Smith", startPos, scene, sp.Appearance); | ||
277 | |||
278 | ScenePresence npc = scene.GetScenePresence(npcId); | ||
279 | SceneObjectPart part = SceneHelpers.AddSceneObject(scene); | ||
280 | |||
281 | npcModule.Sit(npc.UUID, part.UUID, scene); | ||
282 | |||
283 | Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); | ||
284 | Assert.That(npc.ParentID, Is.EqualTo(part.LocalId)); | ||
285 | |||
286 | // FIXME: This is different for live avatars - z position is adjusted. This is half the height of the | ||
287 | // default avatar. | ||
288 | Assert.That( | ||
289 | npc.AbsolutePosition, | ||
290 | Is.EqualTo(part.AbsolutePosition + new Vector3(0, 0, 0.8857438f))); | ||
254 | 291 | ||
255 | npcModule.Stand(npc.UUID, scene); | 292 | npcModule.Stand(npc.UUID, scene); |
256 | 293 | ||