aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs43
1 files changed, 27 insertions, 16 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index a37c68e..b507937 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2337,13 +2337,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2337 // (root prim). ParentID may be nonzero in attachments and 2337 // (root prim). ParentID may be nonzero in attachments and
2338 // using it would cause attachments and HUDs to rotate 2338 // using it would cause attachments and HUDs to rotate
2339 // to the wrong positions. 2339 // to the wrong positions.
2340
2340 SetRot(m_host, Rot2Quaternion(rot)); 2341 SetRot(m_host, Rot2Quaternion(rot));
2341 } 2342 }
2342 else 2343 else
2343 { 2344 {
2344 // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. 2345 // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask.
2345 SceneObjectPart rootPart = m_host.ParentGroup.RootPart; 2346 SceneObjectPart rootPart;// = m_host.ParentGroup.RootPart;
2346 if (rootPart != null) // better safe than sorry 2347 if (m_host.ParentGroup != null && ((rootPart = m_host.ParentGroup.RootPart) != null)) // better safe than sorry
2347 { 2348 {
2348 SetRot(m_host, rootPart.RotationOffset * Rot2Quaternion(rot)); 2349 SetRot(m_host, rootPart.RotationOffset * Rot2Quaternion(rot));
2349 } 2350 }
@@ -2355,6 +2356,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2355 public void llSetLocalRot(LSL_Rotation rot) 2356 public void llSetLocalRot(LSL_Rotation rot)
2356 { 2357 {
2357 m_host.AddScriptLPS(1); 2358 m_host.AddScriptLPS(1);
2359
2358 SetRot(m_host, Rot2Quaternion(rot)); 2360 SetRot(m_host, Rot2Quaternion(rot));
2359 ScriptSleep(200); 2361 ScriptSleep(200);
2360 } 2362 }
@@ -2364,25 +2366,33 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2364 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 2366 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2365 return; 2367 return;
2366 2368
2367 part.UpdateRotation(rot); 2369 bool isroot = (part == part.ParentGroup.RootPart);
2368 // Update rotation does not move the object in the physics scene if it's a linkset.
2369 2370
2370//KF: Do NOT use this next line if using ODE physics engine. This need a switch based on .ini Phys Engine type 2371 // SL doesn't let scripts rotate root of physical linksets
2371// part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition; 2372 if (isroot && part.IsPhysical)
2373 return;
2374
2375 part.UpdateRotation(rot);
2372 2376
2373 // So, after thinking about this for a bit, the issue with the part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition line 2377 // Update rotation does not move the object in the physics scene if it's a linkset.
2374 // is it isn't compatible with vehicles because it causes the vehicle body to have to be broken down and rebuilt 2378 // so do a nasty update
2375 // It's perfectly okay when the object is not an active physical body though. 2379 // but only root part rotation changes positions and only needed if we have physics actor
2376 // So, part.ParentGroup.ResetChildPrimPhysicsPositions(); does the thing that Kitto is warning against 2380 if (isroot && part.PhysActor != null)
2377 // but only if the object is not physial and active. This is important for rotating doors.
2378 // without the absoluteposition = absoluteposition happening, the doors do not move in the physics
2379 // scene
2380 PhysicsActor pa = part.PhysActor;
2381 // only root part rot changes positions
2382 if (pa != null && !pa.IsPhysical && part == part.ParentGroup.RootPart)
2383 { 2381 {
2384 part.ParentGroup.ResetChildPrimPhysicsPositions(); 2382 part.ParentGroup.ResetChildPrimPhysicsPositions();
2385 } 2383 }
2384 else // fix sitting avatars
2385 {
2386 List<ScenePresence> sittingavas = part.ParentGroup.GetLinkedAvatars();
2387 if (sittingavas.Count > 0)
2388 {
2389 foreach (ScenePresence av in sittingavas)
2390 {
2391 if (isroot || part.LocalId == av.ParentID)
2392 av.SendAvatarDataToAllAgents();
2393 }
2394 }
2395 }
2386 } 2396 }
2387 2397
2388 /// <summary> 2398 /// <summary>
@@ -8544,6 +8554,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8544 case (int)ScriptBaseClass.PRIM_ROT_LOCAL: 8554 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
8545 if (remain < 1) 8555 if (remain < 1)
8546 return; 8556 return;
8557
8547 LSL_Rotation lr = rules.GetQuaternionItem(idx++); 8558 LSL_Rotation lr = rules.GetQuaternionItem(idx++);
8548 SetRot(part, Rot2Quaternion(lr)); 8559 SetRot(part, Rot2Quaternion(lr));
8549 break; 8560 break;