aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs44
1 files changed, 37 insertions, 7 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index cb13855..523a6ca 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -8003,7 +8003,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8003 case (int)ScriptBaseClass.PRIM_TEXT: 8003 case (int)ScriptBaseClass.PRIM_TEXT:
8004 case (int)ScriptBaseClass.PRIM_BUMP_SHINY: 8004 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
8005 case (int)ScriptBaseClass.PRIM_OMEGA: 8005 case (int)ScriptBaseClass.PRIM_OMEGA:
8006 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8007 if (remain < 3) 8006 if (remain < 3)
8008 return; 8007 return;
8009 idx += 3; 8008 idx += 3;
@@ -8023,6 +8022,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8023 8022
8024 idx += 7; 8023 idx += 7;
8025 break; 8024 break;
8025
8026 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8027 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
8028 return;
8029 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++);
8030 LSL_List new_rules = rules.GetSublist(idx, -1);
8031 setLinkPrimParams((int)new_linknumber, new_rules);
8032 return;
8026 } 8033 }
8027 } 8034 }
8028 } 8035 }
@@ -8034,6 +8041,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8034 8041
8035 int idx = 0; 8042 int idx = 0;
8036 8043
8044 SceneObjectGroup parentgrp = part.ParentGroup;
8045
8037 bool positionChanged = false; 8046 bool positionChanged = false;
8038 LSL_Vector currentPosition = GetPartLocalPos(part); 8047 LSL_Vector currentPosition = GetPartLocalPos(part);
8039 8048
@@ -8073,8 +8082,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8073 return; 8082 return;
8074 8083
8075 LSL_Rotation q = rules.GetQuaternionItem(idx++); 8084 LSL_Rotation q = rules.GetQuaternionItem(idx++);
8085 SceneObjectPart rootPart = parentgrp.RootPart;
8076 // try to let this work as in SL... 8086 // try to let this work as in SL...
8077 if (part.ParentID == 0) 8087 if (rootPart == part)
8078 { 8088 {
8079 // special case: If we are root, rotate complete SOG to new rotation 8089 // special case: If we are root, rotate complete SOG to new rotation
8080 SetRot(part, Rot2Quaternion(q)); 8090 SetRot(part, Rot2Quaternion(q));
@@ -8083,7 +8093,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8083 { 8093 {
8084 // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. 8094 // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask.
8085 // sounds like sl bug that we need to replicate 8095 // sounds like sl bug that we need to replicate
8086 SceneObjectPart rootPart = part.ParentGroup.RootPart;
8087 SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q)); 8096 SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q));
8088 } 8097 }
8089 8098
@@ -8336,7 +8345,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8336 return; 8345 return;
8337 8346
8338 string ph = rules.Data[idx++].ToString(); 8347 string ph = rules.Data[idx++].ToString();
8339 m_host.ParentGroup.ScriptSetPhantomStatus(ph.Equals("1")); 8348 parentgrp.ScriptSetPhantomStatus(ph.Equals("1"));
8340 8349
8341 break; 8350 break;
8342 8351
@@ -8389,7 +8398,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8389 return; 8398 return;
8390 string temp = rules.Data[idx++].ToString(); 8399 string temp = rules.Data[idx++].ToString();
8391 8400
8392 m_host.ParentGroup.ScriptSetTemporaryStatus(temp.Equals("1")); 8401 parentgrp.ScriptSetTemporaryStatus(temp.Equals("1"));
8393 8402
8394 break; 8403 break;
8395 8404
@@ -8442,10 +8451,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8442 case (int)ScriptBaseClass.PRIM_LINK_TARGET: 8451 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8443 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. 8452 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
8444 return; 8453 return;
8454
8455 // do a pending position change
8456 if (positionChanged)
8457 {
8458 if (parentgrp == null)
8459 return;
8460
8461 if (parentgrp.RootPart == part)
8462 {
8463
8464 Util.FireAndForget(delegate(object x)
8465 {
8466 parentgrp.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z));
8467 });
8468 }
8469 else
8470 {
8471 part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z);
8472 parentgrp.HasGroupChanged = true;
8473 parentgrp.ScheduleGroupForTerseUpdate();
8474 }
8475 }
8476
8445 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); 8477 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++);
8446 LSL_List new_rules = rules.GetSublist(idx, -1); 8478 LSL_List new_rules = rules.GetSublist(idx, -1);
8447 setLinkPrimParams((int)new_linknumber, new_rules); 8479 setLinkPrimParams((int)new_linknumber, new_rules);
8448
8449 return; 8480 return;
8450 } 8481 }
8451 } 8482 }
@@ -8475,7 +8506,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8475 8506
8476 if (positionChanged) 8507 if (positionChanged)
8477 { 8508 {
8478 SceneObjectGroup parentgrp = part.ParentGroup;
8479 if (parentgrp == null) 8509 if (parentgrp == null)
8480 return; 8510 return;
8481 8511