aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs178
1 files changed, 165 insertions, 13 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 065d3df..c3d4306 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -7905,7 +7905,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7905 protected void SetPrimParams(ScenePresence av, LSL_List rules) 7905 protected void SetPrimParams(ScenePresence av, LSL_List rules)
7906 { 7906 {
7907 //This is a special version of SetPrimParams to deal with avatars which are sat on the linkset. 7907 //This is a special version of SetPrimParams to deal with avatars which are sat on the linkset.
7908 //We only support PRIM_POSITION and PRIM_ROTATION
7909 7908
7910 int idx = 0; 7909 int idx = 0;
7911 7910
@@ -7940,7 +7939,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7940 v /= localRot; 7939 v /= localRot;
7941 7940
7942 LSL_Vector sitOffset = (llRot2Up(new LSL_Rotation(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W)) * av.Appearance.AvatarHeight * 0.02638f); 7941 LSL_Vector sitOffset = (llRot2Up(new LSL_Rotation(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W)) * av.Appearance.AvatarHeight * 0.02638f);
7943 7942
7944 v = v + 2 * sitOffset; 7943 v = v + 2 * sitOffset;
7945 7944
7946 av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z); 7945 av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z);
@@ -7949,6 +7948,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7949 } 7948 }
7950 break; 7949 break;
7951 7950
7951 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
7952 {
7953 if (remain < 1)
7954 return;
7955 LSL_Vector v;
7956 v = rules.GetVector3Item(idx++);
7957
7958 SceneObjectPart part = World.GetSceneObjectPart(av.ParentID);
7959 if (part == null)
7960 break;
7961
7962 LSL_Vector sitOffset = (llRot2Up(new LSL_Rotation(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W)) * av.Appearance.AvatarHeight * 0.02638f);
7963
7964 v += 2 * sitOffset;
7965
7966 av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z);
7967 av.SendAvatarDataToAllAgents();
7968
7969 }
7970 break;
7971
7952 case (int)ScriptBaseClass.PRIM_ROTATION: 7972 case (int)ScriptBaseClass.PRIM_ROTATION:
7953 { 7973 {
7954 if (remain < 1) 7974 if (remain < 1)
@@ -7969,6 +7989,109 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7969 av.SendAvatarDataToAllAgents(); 7989 av.SendAvatarDataToAllAgents();
7970 } 7990 }
7971 break; 7991 break;
7992
7993 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
7994 {
7995 if (remain < 1)
7996 return;
7997
7998 LSL_Rotation r;
7999 r = rules.GetQuaternionItem(idx++);
8000 av.Rotation = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s);
8001 av.SendAvatarDataToAllAgents();
8002 }
8003 break;
8004
8005 // parse rest doing nothing but number of parameters error check
8006 case (int)ScriptBaseClass.PRIM_SIZE:
8007 case (int)ScriptBaseClass.PRIM_MATERIAL:
8008 case (int)ScriptBaseClass.PRIM_PHANTOM:
8009 case (int)ScriptBaseClass.PRIM_PHYSICS:
8010 case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE:
8011 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
8012 case (int)ScriptBaseClass.PRIM_NAME:
8013 case (int)ScriptBaseClass.PRIM_DESC:
8014 if (remain < 1)
8015 return;
8016 idx++;
8017 break;
8018
8019 case (int)ScriptBaseClass.PRIM_GLOW:
8020 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
8021 case (int)ScriptBaseClass.PRIM_TEXGEN:
8022 if (remain < 2)
8023 return;
8024 idx += 2;
8025 break;
8026
8027 case (int)ScriptBaseClass.PRIM_TYPE:
8028 if (remain < 3)
8029 return;
8030 code = (int)rules.GetLSLIntegerItem(idx++);
8031 remain = rules.Length - idx;
8032 switch (code)
8033 {
8034 case (int)ScriptBaseClass.PRIM_TYPE_BOX:
8035 case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER:
8036 case (int)ScriptBaseClass.PRIM_TYPE_PRISM:
8037 if (remain < 6)
8038 return;
8039 idx += 6;
8040 break;
8041
8042 case (int)ScriptBaseClass.PRIM_TYPE_SPHERE:
8043 if (remain < 5)
8044 return;
8045 idx += 5;
8046 break;
8047
8048 case (int)ScriptBaseClass.PRIM_TYPE_TORUS:
8049 case (int)ScriptBaseClass.PRIM_TYPE_TUBE:
8050 case (int)ScriptBaseClass.PRIM_TYPE_RING:
8051 if (remain < 11)
8052 return;
8053 idx += 11;
8054 break;
8055
8056 case (int)ScriptBaseClass.PRIM_TYPE_SCULPT:
8057 if (remain < 2)
8058 return;
8059 idx += 2;
8060 break;
8061 }
8062 break;
8063
8064 case (int)ScriptBaseClass.PRIM_COLOR:
8065 case (int)ScriptBaseClass.PRIM_TEXT:
8066 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
8067 case (int)ScriptBaseClass.PRIM_OMEGA:
8068 if (remain < 3)
8069 return;
8070 idx += 3;
8071 break;
8072
8073 case (int)ScriptBaseClass.PRIM_TEXTURE:
8074 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
8075 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL:
8076 if (remain < 5)
8077 return;
8078 idx += 5;
8079 break;
8080
8081 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
8082 if (remain < 7)
8083 return;
8084
8085 idx += 7;
8086 break;
8087
8088 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8089 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
8090 return;
8091 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++);
8092 LSL_List new_rules = rules.GetSublist(idx, -1);
8093 setLinkPrimParams((int)new_linknumber, new_rules);
8094 return;
7972 } 8095 }
7973 } 8096 }
7974 } 8097 }
@@ -7980,6 +8103,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7980 8103
7981 int idx = 0; 8104 int idx = 0;
7982 8105
8106 SceneObjectGroup parentgrp = part.ParentGroup;
8107
7983 bool positionChanged = false; 8108 bool positionChanged = false;
7984 LSL_Vector currentPosition = GetPartLocalPos(part); 8109 LSL_Vector currentPosition = GetPartLocalPos(part);
7985 8110
@@ -8019,8 +8144,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8019 return; 8144 return;
8020 8145
8021 LSL_Rotation q = rules.GetQuaternionItem(idx++); 8146 LSL_Rotation q = rules.GetQuaternionItem(idx++);
8147 SceneObjectPart rootPart = parentgrp.RootPart;
8022 // try to let this work as in SL... 8148 // try to let this work as in SL...
8023 if (part.ParentID == 0) 8149 if (rootPart == part)
8024 { 8150 {
8025 // special case: If we are root, rotate complete SOG to new rotation 8151 // special case: If we are root, rotate complete SOG to new rotation
8026 SetRot(part, Rot2Quaternion(q)); 8152 SetRot(part, Rot2Quaternion(q));
@@ -8028,7 +8154,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8028 else 8154 else
8029 { 8155 {
8030 // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. 8156 // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask.
8031 SceneObjectPart rootPart = part.ParentGroup.RootPart; 8157 // sounds like sl bug that we need to replicate
8032 SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q)); 8158 SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q));
8033 } 8159 }
8034 8160
@@ -8281,7 +8407,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8281 return; 8407 return;
8282 8408
8283 string ph = rules.Data[idx++].ToString(); 8409 string ph = rules.Data[idx++].ToString();
8284 m_host.ParentGroup.ScriptSetPhantomStatus(ph.Equals("1")); 8410 parentgrp.ScriptSetPhantomStatus(ph.Equals("1"));
8285 8411
8286 break; 8412 break;
8287 8413
@@ -8334,7 +8460,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8334 return; 8460 return;
8335 string temp = rules.Data[idx++].ToString(); 8461 string temp = rules.Data[idx++].ToString();
8336 8462
8337 m_host.ParentGroup.ScriptSetTemporaryStatus(temp.Equals("1")); 8463 parentgrp.ScriptSetTemporaryStatus(temp.Equals("1"));
8338 8464
8339 break; 8465 break;
8340 8466
@@ -8387,16 +8513,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8387 case (int)ScriptBaseClass.PRIM_LINK_TARGET: 8513 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8388 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. 8514 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
8389 return; 8515 return;
8516
8517 // do a pending position change
8518 if (positionChanged)
8519 {
8520 if (parentgrp == null)
8521 return;
8522
8523 if (parentgrp.RootPart == part)
8524 {
8525
8526 Util.FireAndForget(delegate(object x)
8527 {
8528 parentgrp.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z));
8529 });
8530 }
8531 else
8532 {
8533 part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z);
8534 parentgrp.HasGroupChanged = true;
8535 parentgrp.ScheduleGroupForTerseUpdate();
8536 }
8537 }
8538
8390 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); 8539 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++);
8391 LSL_List new_rules = rules.GetSublist(idx, -1); 8540 LSL_List new_rules = rules.GetSublist(idx, -1);
8392 setLinkPrimParams((int)new_linknumber, new_rules); 8541 setLinkPrimParams((int)new_linknumber, new_rules);
8393
8394 return; 8542 return;
8395 } 8543 }
8396 } 8544 }
8397 } 8545 }
8398 finally 8546 finally
8399 { 8547 {
8548/*
8400 if (positionChanged) 8549 if (positionChanged)
8401 { 8550 {
8402 if (part.ParentGroup.RootPart == part) 8551 if (part.ParentGroup.RootPart == part)
@@ -8414,23 +8563,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8414 parent.ScheduleGroupForTerseUpdate(); 8563 parent.ScheduleGroupForTerseUpdate();
8415 } 8564 }
8416 } 8565 }
8566 */
8417 } 8567 }
8418 8568
8419 if (positionChanged) 8569 if (positionChanged)
8420 { 8570 {
8421 if (part.ParentGroup.RootPart == part) 8571 if (parentgrp == null)
8572 return;
8573
8574 if (parentgrp.RootPart == part)
8422 { 8575 {
8423 SceneObjectGroup parent = part.ParentGroup; 8576
8424 Util.FireAndForget(delegate(object x) { 8577 Util.FireAndForget(delegate(object x) {
8425 parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z)); 8578 parentgrp.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z));
8426 }); 8579 });
8427 } 8580 }
8428 else 8581 else
8429 { 8582 {
8430 part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z); 8583 part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z);
8431 SceneObjectGroup parent = part.ParentGroup; 8584 parentgrp.HasGroupChanged = true;
8432 parent.HasGroupChanged = true; 8585 parentgrp.ScheduleGroupForTerseUpdate();
8433 parent.ScheduleGroupForTerseUpdate();
8434 } 8586 }
8435 } 8587 }
8436 } 8588 }