aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs344
1 files changed, 156 insertions, 188 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 5760b36..ec4f62f 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -7932,205 +7932,193 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7932 int idx = 0; 7932 int idx = 0;
7933 SceneObjectPart sitpart = World.GetSceneObjectPart(av.ParentID); // betting this will be used 7933 SceneObjectPart sitpart = World.GetSceneObjectPart(av.ParentID); // betting this will be used
7934 7934
7935 while (idx < rules.Length) 7935 bool positionChanged = false;
7936 Vector3 finalPos = Vector3.Zero;
7937
7938 try
7936 { 7939 {
7937 int code = rules.GetLSLIntegerItem(idx++); 7940 while (idx < rules.Length)
7941 {
7942 int code = rules.GetLSLIntegerItem(idx++);
7938 7943
7939 int remain = rules.Length - idx; 7944 int remain = rules.Length - idx;
7940 7945
7941 switch (code) 7946 switch (code)
7942 { 7947 {
7943 // a avatar is a child 7948 // a avatar is a child
7944 case (int)ScriptBaseClass.PRIM_POSITION: 7949 case (int)ScriptBaseClass.PRIM_POSITION:
7945 case (int)ScriptBaseClass.PRIM_POS_LOCAL: 7950 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
7946 {
7947 if (remain < 1)
7948 return;
7949 LSL_Vector v;
7950 v = rules.GetVector3Item(idx++);
7951
7952/* use the sitpart
7953 SceneObjectPart part = World.GetSceneObjectPart(av.ParentID);
7954 if (part == null)
7955 break;
7956
7957 LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION;
7958 LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR;
7959 if (llGetLinkNumber() > 1)
7960 { 7951 {
7961 localRot = llGetLocalRot(); 7952 if (remain < 1)
7962 localPos = llGetLocalPos(); 7953 return;
7963 } 7954 LSL_Vector v;
7955 v = rules.GetVector3Item(idx++);
7964 7956
7965 v -= localPos; 7957 if (sitpart == null)
7966 v /= localRot; 7958 break;
7967*/
7968 if (sitpart == null)
7969 break;
7970 7959
7971 Vector3 pos = new Vector3((float)v.x, (float)v.y, (float)v.z); // requested absolute position 7960 Vector3 pos = new Vector3((float)v.x, (float)v.y, (float)v.z); // requested absolute position
7972 7961
7973 pos -= sitpart.OffsetPosition; // remove sit part offset 7962 pos -= sitpart.OffsetPosition; // remove sit part offset
7974 7963
7975 Quaternion rot = sitpart.RotationOffset; 7964 Quaternion rot = sitpart.RotationOffset;
7976 pos *= Quaternion.Conjugate(rot); // removed sit part rotation 7965 pos *= Quaternion.Conjugate(rot); // removed sit part rotation
7977 7966
7978 Vector3 sitOffset = (Zrot(av.Rotation)) * (av.Appearance.AvatarHeight * 0.02638f); 7967 Vector3 sitOffset = (Zrot(av.Rotation)) * (av.Appearance.AvatarHeight * 0.02638f);
7968 pos += sitOffset;
7979 7969
7980 pos += sitOffset; 7970 finalPos = pos;
7971 positionChanged = true;
7972 }
7973 break;
7981 7974
7982 av.OffsetPosition = pos; 7975 case (int)ScriptBaseClass.PRIM_ROTATION:
7983 av.SendAvatarDataToAllAgents(); 7976 {
7984 } 7977 if (remain < 1)
7985 break; 7978 return;
7986 7979
7980 if (sitpart == null)
7981 break;
7987 7982
7988 case (int)ScriptBaseClass.PRIM_ROTATION: 7983 LSL_Rotation r = rules.GetQuaternionItem(idx++);
7989 { 7984 Quaternion rot = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s); // requested world rotation
7990 if (remain < 1) 7985
7991 return; 7986 Quaternion srot = sitpart.GetWorldRotation();
7992/* 7987 rot *= Quaternion.Conjugate(srot); // removed sit part world rotation
7993 LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION; 7988
7994 LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR; 7989 av.Rotation = rot;
7995 if (llGetLinkNumber() > 1) 7990 av.SendAvatarDataToAllAgents();
7996 {
7997 localRot = llGetLocalRot();
7998 localPos = llGetLocalPos();
7999 } 7991 }
7992 break;
8000 7993
8001 LSL_Rotation r; 7994 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
8002 r = rules.GetQuaternionItem(idx++); 7995 {
8003 r = r * llGetRootRotation() / localRot; 7996 if (remain < 1)
8004 av.Rotation = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s); 7997 return;
8005 */ 7998
8006 if (sitpart == null) 7999 if (sitpart == null)
8007 break; 8000 break;
8008 8001
8009 LSL_Rotation r = rules.GetQuaternionItem(idx++); 8002 LSL_Rotation r = rules.GetQuaternionItem(idx++);
8010 Quaternion rot = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s); // requested world rotation 8003 Quaternion rot = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s); // requested offset rotation
8011
8012 Quaternion srot = sitpart.GetWorldRotation();
8013 rot *= Quaternion.Conjugate(srot); // removed sit part world rotation
8014 8004
8015 av.Rotation = rot; 8005 Quaternion srot = sitpart.RotationOffset;
8016 av.SendAvatarDataToAllAgents(); 8006 rot *= Quaternion.Conjugate(srot); // remove sit part offset rotation
8017 }
8018 break;
8019 8007
8020 case (int)ScriptBaseClass.PRIM_ROT_LOCAL: 8008 av.Rotation = rot;
8021 { 8009 av.SendAvatarDataToAllAgents();
8010 }
8011 break;
8012
8013 // parse rest doing nothing but number of parameters error check
8014 case (int)ScriptBaseClass.PRIM_SIZE:
8015 case (int)ScriptBaseClass.PRIM_MATERIAL:
8016 case (int)ScriptBaseClass.PRIM_PHANTOM:
8017 case (int)ScriptBaseClass.PRIM_PHYSICS:
8018 case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE:
8019 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
8020 case (int)ScriptBaseClass.PRIM_NAME:
8021 case (int)ScriptBaseClass.PRIM_DESC:
8022 if (remain < 1) 8022 if (remain < 1)
8023 return; 8023 return;
8024/* 8024 idx++;
8025 LSL_Rotation r; 8025 break;
8026 r = rules.GetQuaternionItem(idx++);
8027 av.Rotation = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s);
8028 av.SendAvatarDataToAllAgents();
8029*/
8030 if (sitpart == null)
8031 break;
8032 8026
8033 LSL_Rotation r = rules.GetQuaternionItem(idx++); 8027 case (int)ScriptBaseClass.PRIM_GLOW:
8034 Quaternion rot = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s); // requested offset rotation 8028 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
8029 case (int)ScriptBaseClass.PRIM_TEXGEN:
8030 if (remain < 2)
8031 return;
8032 idx += 2;
8033 break;
8035 8034
8036 Quaternion srot = sitpart.RotationOffset; 8035 case (int)ScriptBaseClass.PRIM_TYPE:
8037 rot *= Quaternion.Conjugate(srot); // remove sit part offset rotation 8036 if (remain < 3)
8037 return;
8038 code = (int)rules.GetLSLIntegerItem(idx++);
8039 remain = rules.Length - idx;
8040 switch (code)
8041 {
8042 case (int)ScriptBaseClass.PRIM_TYPE_BOX:
8043 case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER:
8044 case (int)ScriptBaseClass.PRIM_TYPE_PRISM:
8045 if (remain < 6)
8046 return;
8047 idx += 6;
8048 break;
8038 8049
8039 av.Rotation = rot; 8050 case (int)ScriptBaseClass.PRIM_TYPE_SPHERE:
8040 av.SendAvatarDataToAllAgents(); 8051 if (remain < 5)
8041 } 8052 return;
8042 break; 8053 idx += 5;
8054 break;
8043 8055
8044 // parse rest doing nothing but number of parameters error check 8056 case (int)ScriptBaseClass.PRIM_TYPE_TORUS:
8045 case (int)ScriptBaseClass.PRIM_SIZE: 8057 case (int)ScriptBaseClass.PRIM_TYPE_TUBE:
8046 case (int)ScriptBaseClass.PRIM_MATERIAL: 8058 case (int)ScriptBaseClass.PRIM_TYPE_RING:
8047 case (int)ScriptBaseClass.PRIM_PHANTOM: 8059 if (remain < 11)
8048 case (int)ScriptBaseClass.PRIM_PHYSICS: 8060 return;
8049 case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE: 8061 idx += 11;
8050 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: 8062 break;
8051 case (int)ScriptBaseClass.PRIM_NAME:
8052 case (int)ScriptBaseClass.PRIM_DESC:
8053 if (remain < 1)
8054 return;
8055 idx++;
8056 break;
8057 8063
8058 case (int)ScriptBaseClass.PRIM_GLOW: 8064 case (int)ScriptBaseClass.PRIM_TYPE_SCULPT:
8059 case (int)ScriptBaseClass.PRIM_FULLBRIGHT: 8065 if (remain < 2)
8060 case (int)ScriptBaseClass.PRIM_TEXGEN: 8066 return;
8061 if (remain < 2) 8067 idx += 2;
8062 return; 8068 break;
8063 idx += 2; 8069 }
8064 break; 8070 break;
8065 8071
8066 case (int)ScriptBaseClass.PRIM_TYPE: 8072 case (int)ScriptBaseClass.PRIM_COLOR:
8067 if (remain < 3) 8073 case (int)ScriptBaseClass.PRIM_TEXT:
8068 return; 8074 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
8069 code = (int)rules.GetLSLIntegerItem(idx++); 8075 case (int)ScriptBaseClass.PRIM_OMEGA:
8070 remain = rules.Length - idx; 8076 if (remain < 3)
8071 switch (code) 8077 return;
8072 { 8078 idx += 3;
8073 case (int)ScriptBaseClass.PRIM_TYPE_BOX: 8079 break;
8074 case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER:
8075 case (int)ScriptBaseClass.PRIM_TYPE_PRISM:
8076 if (remain < 6)
8077 return;
8078 idx += 6;
8079 break;
8080 8080
8081 case (int)ScriptBaseClass.PRIM_TYPE_SPHERE: 8081 case (int)ScriptBaseClass.PRIM_TEXTURE:
8082 if (remain < 5) 8082 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
8083 return; 8083 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL:
8084 idx += 5; 8084 if (remain < 5)
8085 break; 8085 return;
8086 idx += 5;
8087 break;
8086 8088
8087 case (int)ScriptBaseClass.PRIM_TYPE_TORUS: 8089 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
8088 case (int)ScriptBaseClass.PRIM_TYPE_TUBE: 8090 if (remain < 7)
8089 case (int)ScriptBaseClass.PRIM_TYPE_RING: 8091 return;
8090 if (remain < 11)
8091 return;
8092 idx += 11;
8093 break;
8094 8092
8095 case (int)ScriptBaseClass.PRIM_TYPE_SCULPT: 8093 idx += 7;
8096 if (remain < 2) 8094 break;
8097 return;
8098 idx += 2;
8099 break;
8100 }
8101 break;
8102 8095
8103 case (int)ScriptBaseClass.PRIM_COLOR: 8096 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8104 case (int)ScriptBaseClass.PRIM_TEXT: 8097 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
8105 case (int)ScriptBaseClass.PRIM_BUMP_SHINY: 8098 return;
8106 case (int)ScriptBaseClass.PRIM_OMEGA:
8107 if (remain < 3)
8108 return;
8109 idx += 3;
8110 break;
8111 8099
8112 case (int)ScriptBaseClass.PRIM_TEXTURE: 8100 if (positionChanged)
8113 case (int)ScriptBaseClass.PRIM_POINT_LIGHT: 8101 {
8114 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL: 8102 positionChanged = false;
8115 if (remain < 5) 8103 av.OffsetPosition = finalPos;
8116 return; 8104 av.SendAvatarDataToAllAgents();
8117 idx += 5; 8105 }
8118 break;
8119 8106
8120 case (int)ScriptBaseClass.PRIM_FLEXIBLE: 8107 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++);
8121 if (remain < 7) 8108 LSL_List new_rules = rules.GetSublist(idx, -1);
8109 setLinkPrimParams((int)new_linknumber, new_rules);
8122 return; 8110 return;
8111 }
8112 }
8113 }
8123 8114
8124 idx += 7; 8115 finally
8125 break; 8116 {
8126 8117 if (positionChanged)
8127 case (int)ScriptBaseClass.PRIM_LINK_TARGET: 8118 {
8128 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. 8119 av.OffsetPosition = finalPos;
8129 return; 8120 av.SendAvatarDataToAllAgents();
8130 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); 8121 positionChanged = false;
8131 LSL_List new_rules = rules.GetSublist(idx, -1);
8132 setLinkPrimParams((int)new_linknumber, new_rules);
8133 return;
8134 } 8122 }
8135 } 8123 }
8136 } 8124 }
@@ -8166,8 +8154,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8166 return; 8154 return;
8167 8155
8168 v=rules.GetVector3Item(idx++); 8156 v=rules.GetVector3Item(idx++);
8169 positionChanged = true;
8170 currentPosition = GetSetPosTarget(part, v, currentPosition); 8157 currentPosition = GetSetPosTarget(part, v, currentPosition);
8158 positionChanged = true;
8171 8159
8172 break; 8160 break;
8173 case (int)ScriptBaseClass.PRIM_SIZE: 8161 case (int)ScriptBaseClass.PRIM_SIZE:
@@ -8549,13 +8537,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8549 LSL_Float gain = rules.GetLSLFloatItem(idx++); 8537 LSL_Float gain = rules.GetLSLFloatItem(idx++);
8550 TargetOmega(part, axis, (double)spinrate, (double)gain); 8538 TargetOmega(part, axis, (double)spinrate, (double)gain);
8551 break; 8539 break;
8540
8552 case (int)ScriptBaseClass.PRIM_LINK_TARGET: 8541 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8553 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. 8542 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
8554 return; 8543 return;
8555 8544
8556 // do a pending position change 8545 // do a pending position change before jumping to other part/avatar
8557 if (positionChanged) 8546 if (positionChanged)
8558 { 8547 {
8548 positionChanged = false;
8559 if (parentgrp == null) 8549 if (parentgrp == null)
8560 return; 8550 return;
8561 8551
@@ -8584,7 +8574,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8584 } 8574 }
8585 finally 8575 finally
8586 { 8576 {
8587/*
8588 if (positionChanged) 8577 if (positionChanged)
8589 { 8578 {
8590 if (part.ParentGroup.RootPart == part) 8579 if (part.ParentGroup.RootPart == part)
@@ -8602,27 +8591,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8602 parent.ScheduleGroupForTerseUpdate(); 8591 parent.ScheduleGroupForTerseUpdate();
8603 } 8592 }
8604 } 8593 }
8605 */
8606 }
8607
8608 if (positionChanged)
8609 {
8610 if (parentgrp == null)
8611 return;
8612
8613 if (parentgrp.RootPart == part)
8614 {
8615
8616 Util.FireAndForget(delegate(object x) {
8617 parentgrp.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z));
8618 });
8619 }
8620 else
8621 {
8622 part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z);
8623 parentgrp.HasGroupChanged = true;
8624 parentgrp.ScheduleGroupForTerseUpdate();
8625 }
8626 } 8594 }
8627 } 8595 }
8628 8596