diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index aa389ba..9ae9b59 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2359,8 +2359,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2359 | { | 2359 | { |
2360 | m_host.AddScriptLPS(1); | 2360 | m_host.AddScriptLPS(1); |
2361 | 2361 | ||
2362 | |||
2363 | // Teravus: if (m_host.ParentID == 0) is bug code because the ParentID for the Avatar will cause this to be nonzero for root prim attachments | ||
2364 | // which is then treated like a child prim rotation and it's offset gets cumulatively multiplied against. | ||
2365 | // to fix the scripted rotations we also have to check to see if the root part localid is the same as the host's localid. | ||
2366 | // RootPart != null should shortcircuit | ||
2367 | |||
2362 | // try to let this work as in SL... | 2368 | // try to let this work as in SL... |
2363 | if (m_host.ParentID == 0) | 2369 | if (m_host.ParentID == 0 || (m_host.ParentGroup != null && m_host == m_host.ParentGroup.RootPart)) |
2364 | { | 2370 | { |
2365 | // special case: If we are root, rotate complete SOG to new rotation | 2371 | // special case: If we are root, rotate complete SOG to new rotation |
2366 | SetRot(m_host, rot); | 2372 | SetRot(m_host, rot); |
@@ -2443,6 +2449,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2443 | 2449 | ||
2444 | m_host.AddScriptLPS(1); | 2450 | m_host.AddScriptLPS(1); |
2445 | Quaternion q = m_host.GetWorldRotation(); | 2451 | Quaternion q = m_host.GetWorldRotation(); |
2452 | |||
2453 | if (m_host.ParentGroup != null && m_host.ParentGroup.AttachmentPoint != 0) | ||
2454 | { | ||
2455 | ScenePresence avatar = World.GetScenePresence(m_host.ParentGroup.AttachedAvatar); | ||
2456 | if (avatar != null) | ||
2457 | { | ||
2458 | if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0) | ||
2459 | q = avatar.CameraRotation * q; // Mouselook | ||
2460 | else | ||
2461 | q = avatar.Rotation * q; // Currently infrequently updated so may be inaccurate | ||
2462 | } | ||
2463 | } | ||
2464 | |||
2446 | return new LSL_Rotation(q.X, q.Y, q.Z, q.W); | 2465 | return new LSL_Rotation(q.X, q.Y, q.Z, q.W); |
2447 | } | 2466 | } |
2448 | 2467 | ||
@@ -2468,7 +2487,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2468 | q = part.ParentGroup.GroupRotation; // just the group rotation | 2487 | q = part.ParentGroup.GroupRotation; // just the group rotation |
2469 | return new LSL_Rotation(q.X, q.Y, q.Z, q.W); | 2488 | return new LSL_Rotation(q.X, q.Y, q.Z, q.W); |
2470 | } | 2489 | } |
2490 | |||
2471 | q = part.GetWorldRotation(); | 2491 | q = part.GetWorldRotation(); |
2492 | if (part.ParentGroup.AttachmentPoint != 0) | ||
2493 | { | ||
2494 | ScenePresence avatar = World.GetScenePresence(part.ParentGroup.AttachedAvatar); | ||
2495 | if (avatar != null) | ||
2496 | { | ||
2497 | if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0) | ||
2498 | q = avatar.CameraRotation * q; // Mouselook | ||
2499 | else | ||
2500 | q = avatar.Rotation * q; // Currently infrequently updated so may be inaccurate | ||
2501 | } | ||
2502 | } | ||
2503 | |||
2472 | return new LSL_Rotation(q.X, q.Y, q.Z, q.W); | 2504 | return new LSL_Rotation(q.X, q.Y, q.Z, q.W); |
2473 | } | 2505 | } |
2474 | 2506 | ||
@@ -7909,7 +7941,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7909 | 7941 | ||
7910 | LSL_Rotation q = rules.GetQuaternionItem(idx++); | 7942 | LSL_Rotation q = rules.GetQuaternionItem(idx++); |
7911 | // try to let this work as in SL... | 7943 | // try to let this work as in SL... |
7912 | if (part.ParentID == 0) | 7944 | if (part.ParentID == 0 || (part.ParentGroup != null && part == part.ParentGroup.RootPart)) |
7913 | { | 7945 | { |
7914 | // special case: If we are root, rotate complete SOG to new rotation | 7946 | // special case: If we are root, rotate complete SOG to new rotation |
7915 | SetRot(part, q); | 7947 | SetRot(part, q); |
@@ -8701,7 +8733,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8701 | 8733 | ||
8702 | LSL_List remaining = GetPrimParams(m_host, rules, ref result); | 8734 | LSL_List remaining = GetPrimParams(m_host, rules, ref result); |
8703 | 8735 | ||
8704 | while (remaining != null && remaining.Length > 2) | 8736 | while ((object)remaining != null && remaining.Length > 2) |
8705 | { | 8737 | { |
8706 | int linknumber = remaining.GetLSLIntegerItem(0); | 8738 | int linknumber = remaining.GetLSLIntegerItem(0); |
8707 | rules = remaining.GetSublist(1, -1); | 8739 | rules = remaining.GetSublist(1, -1); |
@@ -8742,11 +8774,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8742 | remaining = GetPrimParams(avatar, rules, ref res); | 8774 | remaining = GetPrimParams(avatar, rules, ref res); |
8743 | } | 8775 | } |
8744 | 8776 | ||
8745 | if (remaining != null && remaining.Length > 0) | 8777 | if ((object)remaining != null && remaining.Length > 0) |
8746 | { | 8778 | { |
8747 | linknumber = remaining.GetLSLIntegerItem(0); | 8779 | linknumber = remaining.GetLSLIntegerItem(0); |
8748 | rules = remaining.GetSublist(1, -1); | 8780 | rules = remaining.GetSublist(1, -1); |
8749 | } | 8781 | } |
8782 | else | ||
8783 | break; | ||
8750 | } | 8784 | } |
8751 | 8785 | ||
8752 | return res; | 8786 | return res; |