aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared
diff options
context:
space:
mode:
authorSignpostMarv2012-08-15 21:14:39 +0100
committerMelanie2012-08-15 23:51:43 +0100
commit8cd4042f9e87a483de396dba5fa842f17028cb95 (patch)
treee326338a5113f752cfeb6995cea15f08ba24f501 /OpenSim/Region/ScriptEngine/Shared
parentMerge branch 'master' into careminster (diff)
downloadopensim-SC-8cd4042f9e87a483de396dba5fa842f17028cb95.zip
opensim-SC-8cd4042f9e87a483de396dba5fa842f17028cb95.tar.gz
opensim-SC-8cd4042f9e87a483de396dba5fa842f17028cb95.tar.bz2
opensim-SC-8cd4042f9e87a483de396dba5fa842f17028cb95.tar.xz
Implementing PRIM_LINK_TARGET in a non-recursive fashion
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs222
1 files changed, 106 insertions, 116 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 1115542..42f77c6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -338,34 +338,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
338 338
339 public List<SceneObjectPart> GetLinkParts(int linkType) 339 public List<SceneObjectPart> GetLinkParts(int linkType)
340 { 340 {
341 return GetLinkParts(m_host, linkType);
342 }
343
344 private List<SceneObjectPart> GetLinkParts(SceneObjectPart part, int linkType)
345 {
341 List<SceneObjectPart> ret = new List<SceneObjectPart>(); 346 List<SceneObjectPart> ret = new List<SceneObjectPart>();
342 if (m_host == null || m_host.ParentGroup == null || m_host.ParentGroup.IsDeleted) 347 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
343 return ret; 348 return ret;
344 ret.Add(m_host); 349 ret.Add(part);
345 350
346 switch (linkType) 351 switch (linkType)
347 { 352 {
348 case ScriptBaseClass.LINK_SET: 353 case ScriptBaseClass.LINK_SET:
349 return new List<SceneObjectPart>(m_host.ParentGroup.Parts); 354 return new List<SceneObjectPart>(part.ParentGroup.Parts);
350 355
351 case ScriptBaseClass.LINK_ROOT: 356 case ScriptBaseClass.LINK_ROOT:
352 ret = new List<SceneObjectPart>(); 357 ret = new List<SceneObjectPart>();
353 ret.Add(m_host.ParentGroup.RootPart); 358 ret.Add(part.ParentGroup.RootPart);
354 return ret; 359 return ret;
355 360
356 case ScriptBaseClass.LINK_ALL_OTHERS: 361 case ScriptBaseClass.LINK_ALL_OTHERS:
357 ret = new List<SceneObjectPart>(m_host.ParentGroup.Parts); 362 ret = new List<SceneObjectPart>(part.ParentGroup.Parts);
358 363
359 if (ret.Contains(m_host)) 364 if (ret.Contains(part))
360 ret.Remove(m_host); 365 ret.Remove(part);
361 366
362 return ret; 367 return ret;
363 368
364 case ScriptBaseClass.LINK_ALL_CHILDREN: 369 case ScriptBaseClass.LINK_ALL_CHILDREN:
365 ret = new List<SceneObjectPart>(m_host.ParentGroup.Parts); 370 ret = new List<SceneObjectPart>(part.ParentGroup.Parts);
366 371
367 if (ret.Contains(m_host.ParentGroup.RootPart)) 372 if (ret.Contains(part.ParentGroup.RootPart))
368 ret.Remove(m_host.ParentGroup.RootPart); 373 ret.Remove(part.ParentGroup.RootPart);
369 return ret; 374 return ret;
370 375
371 case ScriptBaseClass.LINK_THIS: 376 case ScriptBaseClass.LINK_THIS:
@@ -375,7 +380,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
375 if (linkType < 0) 380 if (linkType < 0)
376 return new List<SceneObjectPart>(); 381 return new List<SceneObjectPart>();
377 382
378 SceneObjectPart target = m_host.ParentGroup.GetLinkNumPart(linkType); 383 SceneObjectPart target = part.ParentGroup.GetLinkNumPart(linkType);
379 if (target == null) 384 if (target == null)
380 return new List<SceneObjectPart>(); 385 return new List<SceneObjectPart>();
381 ret = new List<SceneObjectPart>(); 386 ret = new List<SceneObjectPart>();
@@ -7750,7 +7755,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7750 public void llSetPrimitiveParams(LSL_List rules) 7755 public void llSetPrimitiveParams(LSL_List rules)
7751 { 7756 {
7752 m_host.AddScriptLPS(1); 7757 m_host.AddScriptLPS(1);
7753 SetPrimParams(m_host, rules); 7758
7759 setLinkPrimParams(ScriptBaseClass.LINK_THIS, rules);
7754 7760
7755 ScriptSleep(200); 7761 ScriptSleep(200);
7756 } 7762 }
@@ -7764,26 +7770,37 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7764 7770
7765 private void setLinkPrimParams(int linknumber, LSL_List rules) 7771 private void setLinkPrimParams(int linknumber, LSL_List rules)
7766 { 7772 {
7767 List<SceneObjectPart> parts = GetLinkParts(linknumber); 7773 List<object> parts = new List<object>();
7774 List<SceneObjectPart> prims = GetLinkParts(linknumber);
7768 List<ScenePresence> avatars = GetLinkAvatars(linknumber); 7775 List<ScenePresence> avatars = GetLinkAvatars(linknumber);
7769 if (parts.Count>0) 7776 foreach (SceneObjectPart p in prims)
7777 parts.Add(p);
7778 foreach (ScenePresence p in avatars)
7779 parts.Add(p);
7780
7781 LSL_List remaining = null;
7782
7783 if (parts.Count > 0)
7770 { 7784 {
7771 try 7785 foreach (SceneObjectPart part in parts)
7786 remaining = SetPrimParams(part, rules);
7787
7788 while(remaining != null && remaining.Length > 2)
7772 { 7789 {
7773 parts[0].ParentGroup.areUpdatesSuspended = true; 7790 linknumber = remaining.GetLSLIntegerItem(0);
7791 rules = remaining.GetSublist(1,-1);
7792 parts.Clear();
7793 prims = GetLinkParts(linknumber);
7794 avatars = GetLinkAvatars(linknumber);
7795 foreach (SceneObjectPart p in prims)
7796 parts.Add(p);
7797 foreach (ScenePresence p in avatars)
7798 parts.Add(p);
7799
7774 foreach (SceneObjectPart part in parts) 7800 foreach (SceneObjectPart part in parts)
7775 SetPrimParams(part, rules); 7801 remaining = SetPrimParams(part, rules);
7776 }
7777 finally
7778 {
7779 parts[0].ParentGroup.areUpdatesSuspended = false;
7780 } 7802 }
7781 } 7803 }
7782 if (avatars.Count > 0)
7783 {
7784 foreach (ScenePresence avatar in avatars)
7785 SetPrimParams(avatar, rules);
7786 }
7787 } 7804 }
7788 7805
7789 private void SetPhysicsMaterial(SceneObjectPart part, int material_bits, 7806 private void SetPhysicsMaterial(SceneObjectPart part, int material_bits,
@@ -7845,7 +7862,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7845 return new Vector3((float)x, (float)y, (float)z); 7862 return new Vector3((float)x, (float)y, (float)z);
7846 } 7863 }
7847 7864
7848 protected void SetPrimParams(ScenePresence av, LSL_List rules) 7865 protected LSL_List SetPrimParams(ScenePresence av, LSL_List rules)
7849 { 7866 {
7850 //This is a special version of SetPrimParams to deal with avatars which are sat on the linkset. 7867 //This is a special version of SetPrimParams to deal with avatars which are sat on the linkset.
7851 7868
@@ -7868,7 +7885,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7868 case (int)ScriptBaseClass.PRIM_POS_LOCAL: 7885 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
7869 { 7886 {
7870 if (remain < 1) 7887 if (remain < 1)
7871 return; 7888 return null;
7872 7889
7873 LSL_Vector v; 7890 LSL_Vector v;
7874 v = rules.GetVector3Item(idx++); 7891 v = rules.GetVector3Item(idx++);
@@ -7902,7 +7919,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7902 case (int)ScriptBaseClass.PRIM_ROTATION: 7919 case (int)ScriptBaseClass.PRIM_ROTATION:
7903 { 7920 {
7904 if (remain < 1) 7921 if (remain < 1)
7905 return; 7922 return null;
7906 7923
7907 LSL_Rotation r; 7924 LSL_Rotation r;
7908 r = rules.GetQuaternionItem(idx++); 7925 r = rules.GetQuaternionItem(idx++);
@@ -7933,7 +7950,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7933 case (int)ScriptBaseClass.PRIM_NAME: 7950 case (int)ScriptBaseClass.PRIM_NAME:
7934 case (int)ScriptBaseClass.PRIM_DESC: 7951 case (int)ScriptBaseClass.PRIM_DESC:
7935 if (remain < 1) 7952 if (remain < 1)
7936 return; 7953 return null;
7937 idx++; 7954 idx++;
7938 break; 7955 break;
7939 7956
@@ -7941,13 +7958,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7941 case (int)ScriptBaseClass.PRIM_FULLBRIGHT: 7958 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
7942 case (int)ScriptBaseClass.PRIM_TEXGEN: 7959 case (int)ScriptBaseClass.PRIM_TEXGEN:
7943 if (remain < 2) 7960 if (remain < 2)
7944 return; 7961 return null;
7945 idx += 2; 7962 idx += 2;
7946 break; 7963 break;
7947 7964
7948 case (int)ScriptBaseClass.PRIM_TYPE: 7965 case (int)ScriptBaseClass.PRIM_TYPE:
7949 if (remain < 3) 7966 if (remain < 3)
7950 return; 7967 return null;
7951 code = (int)rules.GetLSLIntegerItem(idx++); 7968 code = (int)rules.GetLSLIntegerItem(idx++);
7952 remain = rules.Length - idx; 7969 remain = rules.Length - idx;
7953 switch (code) 7970 switch (code)
@@ -7956,13 +7973,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7956 case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER: 7973 case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER:
7957 case (int)ScriptBaseClass.PRIM_TYPE_PRISM: 7974 case (int)ScriptBaseClass.PRIM_TYPE_PRISM:
7958 if (remain < 6) 7975 if (remain < 6)
7959 return; 7976 return null;
7960 idx += 6; 7977 idx += 6;
7961 break; 7978 break;
7962 7979
7963 case (int)ScriptBaseClass.PRIM_TYPE_SPHERE: 7980 case (int)ScriptBaseClass.PRIM_TYPE_SPHERE:
7964 if (remain < 5) 7981 if (remain < 5)
7965 return; 7982 return null;
7966 idx += 5; 7983 idx += 5;
7967 break; 7984 break;
7968 7985
@@ -7970,13 +7987,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7970 case (int)ScriptBaseClass.PRIM_TYPE_TUBE: 7987 case (int)ScriptBaseClass.PRIM_TYPE_TUBE:
7971 case (int)ScriptBaseClass.PRIM_TYPE_RING: 7988 case (int)ScriptBaseClass.PRIM_TYPE_RING:
7972 if (remain < 11) 7989 if (remain < 11)
7973 return; 7990 return null;
7974 idx += 11; 7991 idx += 11;
7975 break; 7992 break;
7976 7993
7977 case (int)ScriptBaseClass.PRIM_TYPE_SCULPT: 7994 case (int)ScriptBaseClass.PRIM_TYPE_SCULPT:
7978 if (remain < 2) 7995 if (remain < 2)
7979 return; 7996 return null;
7980 idx += 2; 7997 idx += 2;
7981 break; 7998 break;
7982 } 7999 }
@@ -7987,7 +8004,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7987 case (int)ScriptBaseClass.PRIM_BUMP_SHINY: 8004 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
7988 case (int)ScriptBaseClass.PRIM_OMEGA: 8005 case (int)ScriptBaseClass.PRIM_OMEGA:
7989 if (remain < 3) 8006 if (remain < 3)
7990 return; 8007 return null;
7991 idx += 3; 8008 idx += 3;
7992 break; 8009 break;
7993 8010
@@ -7995,33 +8012,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7995 case (int)ScriptBaseClass.PRIM_POINT_LIGHT: 8012 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
7996 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL: 8013 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL:
7997 if (remain < 5) 8014 if (remain < 5)
7998 return; 8015 return null;
7999 idx += 5; 8016 idx += 5;
8000 break; 8017 break;
8001 8018
8002 case (int)ScriptBaseClass.PRIM_FLEXIBLE: 8019 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
8003 if (remain < 7) 8020 if (remain < 7)
8004 return; 8021 return null;
8005 8022
8006 idx += 7; 8023 idx += 7;
8007 break; 8024 break;
8008 8025
8009 case (int)ScriptBaseClass.PRIM_LINK_TARGET: 8026 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8010 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. 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.
8011 return; 8028 return null;
8012
8013 if (positionChanged)
8014 {
8015 positionChanged = false;
8016 av.OffsetPosition = finalPos;
8017// av.SendAvatarDataToAllAgents();
8018 av.SendTerseUpdateToAllClients();
8019 }
8020 8029
8021 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); 8030 return rules.GetSublist(idx, -1);
8022 LSL_List new_rules = rules.GetSublist(idx, -1);
8023 setLinkPrimParams((int)new_linknumber, new_rules);
8024 return;
8025 } 8031 }
8026 } 8032 }
8027 } 8033 }
@@ -8036,12 +8042,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8036 positionChanged = false; 8042 positionChanged = false;
8037 } 8043 }
8038 } 8044 }
8045 return null;
8039 } 8046 }
8040 8047
8041 protected void SetPrimParams(SceneObjectPart part, LSL_List rules) 8048 protected LSL_List SetPrimParams(SceneObjectPart part, LSL_List rules)
8042 { 8049 {
8043 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 8050 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
8044 return; 8051 return null;
8045 8052
8046 int idx = 0; 8053 int idx = 0;
8047 8054
@@ -8066,7 +8073,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8066 case (int)ScriptBaseClass.PRIM_POSITION: 8073 case (int)ScriptBaseClass.PRIM_POSITION:
8067 case (int)ScriptBaseClass.PRIM_POS_LOCAL: 8074 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
8068 if (remain < 1) 8075 if (remain < 1)
8069 return; 8076 return null;
8070 8077
8071 v=rules.GetVector3Item(idx++); 8078 v=rules.GetVector3Item(idx++);
8072 currentPosition = GetSetPosTarget(part, v, currentPosition); 8079 currentPosition = GetSetPosTarget(part, v, currentPosition);
@@ -8075,7 +8082,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8075 break; 8082 break;
8076 case (int)ScriptBaseClass.PRIM_SIZE: 8083 case (int)ScriptBaseClass.PRIM_SIZE:
8077 if (remain < 1) 8084 if (remain < 1)
8078 return; 8085 return null;
8079 8086
8080 v=rules.GetVector3Item(idx++); 8087 v=rules.GetVector3Item(idx++);
8081 SetScale(part, v); 8088 SetScale(part, v);
@@ -8083,7 +8090,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8083 break; 8090 break;
8084 case (int)ScriptBaseClass.PRIM_ROTATION: 8091 case (int)ScriptBaseClass.PRIM_ROTATION:
8085 if (remain < 1) 8092 if (remain < 1)
8086 return; 8093 return null;
8087 8094
8088 LSL_Rotation q = rules.GetQuaternionItem(idx++); 8095 LSL_Rotation q = rules.GetQuaternionItem(idx++);
8089 SceneObjectPart rootPart = parentgrp.RootPart; 8096 SceneObjectPart rootPart = parentgrp.RootPart;
@@ -8104,7 +8111,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8104 8111
8105 case (int)ScriptBaseClass.PRIM_TYPE: 8112 case (int)ScriptBaseClass.PRIM_TYPE:
8106 if (remain < 3) 8113 if (remain < 3)
8107 return; 8114 return null;
8108 8115
8109 code = (int)rules.GetLSLIntegerItem(idx++); 8116 code = (int)rules.GetLSLIntegerItem(idx++);
8110 8117
@@ -8123,7 +8130,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8123 { 8130 {
8124 case (int)ScriptBaseClass.PRIM_TYPE_BOX: 8131 case (int)ScriptBaseClass.PRIM_TYPE_BOX:
8125 if (remain < 6) 8132 if (remain < 6)
8126 return; 8133 return null;
8127 8134
8128 face = (int)rules.GetLSLIntegerItem(idx++); 8135 face = (int)rules.GetLSLIntegerItem(idx++);
8129 v = rules.GetVector3Item(idx++); // cut 8136 v = rules.GetVector3Item(idx++); // cut
@@ -8138,7 +8145,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8138 8145
8139 case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER: 8146 case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER:
8140 if (remain < 6) 8147 if (remain < 6)
8141 return; 8148 return null;
8142 8149
8143 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape 8150 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape
8144 v = rules.GetVector3Item(idx++); // cut 8151 v = rules.GetVector3Item(idx++); // cut
@@ -8152,7 +8159,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8152 8159
8153 case (int)ScriptBaseClass.PRIM_TYPE_PRISM: 8160 case (int)ScriptBaseClass.PRIM_TYPE_PRISM:
8154 if (remain < 6) 8161 if (remain < 6)
8155 return; 8162 return null;
8156 8163
8157 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape 8164 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape
8158 v = rules.GetVector3Item(idx++); //cut 8165 v = rules.GetVector3Item(idx++); //cut
@@ -8166,7 +8173,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8166 8173
8167 case (int)ScriptBaseClass.PRIM_TYPE_SPHERE: 8174 case (int)ScriptBaseClass.PRIM_TYPE_SPHERE:
8168 if (remain < 5) 8175 if (remain < 5)
8169 return; 8176 return null;
8170 8177
8171 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape 8178 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape
8172 v = rules.GetVector3Item(idx++); // cut 8179 v = rules.GetVector3Item(idx++); // cut
@@ -8179,7 +8186,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8179 8186
8180 case (int)ScriptBaseClass.PRIM_TYPE_TORUS: 8187 case (int)ScriptBaseClass.PRIM_TYPE_TORUS:
8181 if (remain < 11) 8188 if (remain < 11)
8182 return; 8189 return null;
8183 8190
8184 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape 8191 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape
8185 v = rules.GetVector3Item(idx++); //cut 8192 v = rules.GetVector3Item(idx++); //cut
@@ -8198,7 +8205,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8198 8205
8199 case (int)ScriptBaseClass.PRIM_TYPE_TUBE: 8206 case (int)ScriptBaseClass.PRIM_TYPE_TUBE:
8200 if (remain < 11) 8207 if (remain < 11)
8201 return; 8208 return null;
8202 8209
8203 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape 8210 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape
8204 v = rules.GetVector3Item(idx++); //cut 8211 v = rules.GetVector3Item(idx++); //cut
@@ -8217,7 +8224,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8217 8224
8218 case (int)ScriptBaseClass.PRIM_TYPE_RING: 8225 case (int)ScriptBaseClass.PRIM_TYPE_RING:
8219 if (remain < 11) 8226 if (remain < 11)
8220 return; 8227 return null;
8221 8228
8222 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape 8229 face = (int)rules.GetLSLIntegerItem(idx++); // holeshape
8223 v = rules.GetVector3Item(idx++); //cut 8230 v = rules.GetVector3Item(idx++); //cut
@@ -8236,7 +8243,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8236 8243
8237 case (int)ScriptBaseClass.PRIM_TYPE_SCULPT: 8244 case (int)ScriptBaseClass.PRIM_TYPE_SCULPT:
8238 if (remain < 2) 8245 if (remain < 2)
8239 return; 8246 return null;
8240 8247
8241 string map = rules.Data[idx++].ToString(); 8248 string map = rules.Data[idx++].ToString();
8242 face = (int)rules.GetLSLIntegerItem(idx++); // type 8249 face = (int)rules.GetLSLIntegerItem(idx++); // type
@@ -8248,7 +8255,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8248 8255
8249 case (int)ScriptBaseClass.PRIM_TEXTURE: 8256 case (int)ScriptBaseClass.PRIM_TEXTURE:
8250 if (remain < 5) 8257 if (remain < 5)
8251 return; 8258 return null;
8252 8259
8253 face=(int)rules.GetLSLIntegerItem(idx++); 8260 face=(int)rules.GetLSLIntegerItem(idx++);
8254 string tex=rules.Data[idx++].ToString(); 8261 string tex=rules.Data[idx++].ToString();
@@ -8265,7 +8272,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8265 8272
8266 case (int)ScriptBaseClass.PRIM_COLOR: 8273 case (int)ScriptBaseClass.PRIM_COLOR:
8267 if (remain < 3) 8274 if (remain < 3)
8268 return; 8275 return null;
8269 8276
8270 face=(int)rules.GetLSLIntegerItem(idx++); 8277 face=(int)rules.GetLSLIntegerItem(idx++);
8271 LSL_Vector color=rules.GetVector3Item(idx++); 8278 LSL_Vector color=rules.GetVector3Item(idx++);
@@ -8278,7 +8285,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8278 8285
8279 case (int)ScriptBaseClass.PRIM_FLEXIBLE: 8286 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
8280 if (remain < 7) 8287 if (remain < 7)
8281 return; 8288 return null;
8282 8289
8283 bool flexi = rules.GetLSLIntegerItem(idx++); 8290 bool flexi = rules.GetLSLIntegerItem(idx++);
8284 int softness = rules.GetLSLIntegerItem(idx++); 8291 int softness = rules.GetLSLIntegerItem(idx++);
@@ -8294,7 +8301,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8294 8301
8295 case (int)ScriptBaseClass.PRIM_POINT_LIGHT: 8302 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
8296 if (remain < 5) 8303 if (remain < 5)
8297 return; 8304 return null;
8298 bool light = rules.GetLSLIntegerItem(idx++); 8305 bool light = rules.GetLSLIntegerItem(idx++);
8299 LSL_Vector lightcolor = rules.GetVector3Item(idx++); 8306 LSL_Vector lightcolor = rules.GetVector3Item(idx++);
8300 float intensity = (float)rules.GetLSLFloatItem(idx++); 8307 float intensity = (float)rules.GetLSLFloatItem(idx++);
@@ -8307,7 +8314,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8307 8314
8308 case (int)ScriptBaseClass.PRIM_GLOW: 8315 case (int)ScriptBaseClass.PRIM_GLOW:
8309 if (remain < 2) 8316 if (remain < 2)
8310 return; 8317 return null;
8311 face = rules.GetLSLIntegerItem(idx++); 8318 face = rules.GetLSLIntegerItem(idx++);
8312 float glow = (float)rules.GetLSLFloatItem(idx++); 8319 float glow = (float)rules.GetLSLFloatItem(idx++);
8313 8320
@@ -8317,7 +8324,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8317 8324
8318 case (int)ScriptBaseClass.PRIM_BUMP_SHINY: 8325 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
8319 if (remain < 3) 8326 if (remain < 3)
8320 return; 8327 return null;
8321 face = (int)rules.GetLSLIntegerItem(idx++); 8328 face = (int)rules.GetLSLIntegerItem(idx++);
8322 int shiny = (int)rules.GetLSLIntegerItem(idx++); 8329 int shiny = (int)rules.GetLSLIntegerItem(idx++);
8323 Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++); 8330 Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++);
@@ -8328,7 +8335,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8328 8335
8329 case (int)ScriptBaseClass.PRIM_FULLBRIGHT: 8336 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
8330 if (remain < 2) 8337 if (remain < 2)
8331 return; 8338 return null;
8332 face = rules.GetLSLIntegerItem(idx++); 8339 face = rules.GetLSLIntegerItem(idx++);
8333 bool st = rules.GetLSLIntegerItem(idx++); 8340 bool st = rules.GetLSLIntegerItem(idx++);
8334 SetFullBright(part, face , st); 8341 SetFullBright(part, face , st);
@@ -8336,17 +8343,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8336 8343
8337 case (int)ScriptBaseClass.PRIM_MATERIAL: 8344 case (int)ScriptBaseClass.PRIM_MATERIAL:
8338 if (remain < 1) 8345 if (remain < 1)
8339 return; 8346 return null;
8340 int mat = rules.GetLSLIntegerItem(idx++); 8347 int mat = rules.GetLSLIntegerItem(idx++);
8341 if (mat < 0 || mat > 7) 8348 if (mat < 0 || mat > 7)
8342 return; 8349 return null;
8343 8350
8344 part.Material = Convert.ToByte(mat); 8351 part.Material = Convert.ToByte(mat);
8345 break; 8352 break;
8346 8353
8347 case (int)ScriptBaseClass.PRIM_PHANTOM: 8354 case (int)ScriptBaseClass.PRIM_PHANTOM:
8348 if (remain < 1) 8355 if (remain < 1)
8349 return; 8356 return null;
8350 8357
8351 string ph = rules.Data[idx++].ToString(); 8358 string ph = rules.Data[idx++].ToString();
8352 parentgrp.ScriptSetPhantomStatus(ph.Equals("1")); 8359 parentgrp.ScriptSetPhantomStatus(ph.Equals("1"));
@@ -8355,7 +8362,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8355 8362
8356 case (int)ScriptBaseClass.PRIM_PHYSICS: 8363 case (int)ScriptBaseClass.PRIM_PHYSICS:
8357 if (remain < 1) 8364 if (remain < 1)
8358 return; 8365 return null;
8359 string phy = rules.Data[idx++].ToString(); 8366 string phy = rules.Data[idx++].ToString();
8360 bool physics; 8367 bool physics;
8361 8368
@@ -8369,7 +8376,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8369 8376
8370 case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE: 8377 case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE:
8371 if (remain < 1) 8378 if (remain < 1)
8372 return; 8379 return null;
8373 8380
8374 int shape_type = rules.GetLSLIntegerItem(idx++); 8381 int shape_type = rules.GetLSLIntegerItem(idx++);
8375 8382
@@ -8385,7 +8392,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8385 8392
8386 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL: 8393 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL:
8387 if (remain < 5) 8394 if (remain < 5)
8388 return; 8395 return null;
8389 8396
8390 int material_bits = rules.GetLSLIntegerItem(idx++); 8397 int material_bits = rules.GetLSLIntegerItem(idx++);
8391 float material_density = (float)rules.GetLSLFloatItem(idx++); 8398 float material_density = (float)rules.GetLSLFloatItem(idx++);
@@ -8399,7 +8406,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8399 8406
8400 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: 8407 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
8401 if (remain < 1) 8408 if (remain < 1)
8402 return; 8409 return null;
8403 string temp = rules.Data[idx++].ToString(); 8410 string temp = rules.Data[idx++].ToString();
8404 8411
8405 parentgrp.ScriptSetTemporaryStatus(temp.Equals("1")); 8412 parentgrp.ScriptSetTemporaryStatus(temp.Equals("1"));
@@ -8408,7 +8415,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8408 8415
8409 case (int)ScriptBaseClass.PRIM_TEXGEN: 8416 case (int)ScriptBaseClass.PRIM_TEXGEN:
8410 if (remain < 2) 8417 if (remain < 2)
8411 return; 8418 return null;
8412 //face,type 8419 //face,type
8413 face = rules.GetLSLIntegerItem(idx++); 8420 face = rules.GetLSLIntegerItem(idx++);
8414 int style = rules.GetLSLIntegerItem(idx++); 8421 int style = rules.GetLSLIntegerItem(idx++);
@@ -8416,7 +8423,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8416 break; 8423 break;
8417 case (int)ScriptBaseClass.PRIM_TEXT: 8424 case (int)ScriptBaseClass.PRIM_TEXT:
8418 if (remain < 3) 8425 if (remain < 3)
8419 return; 8426 return null;
8420 string primText = rules.GetLSLStringItem(idx++); 8427 string primText = rules.GetLSLStringItem(idx++);
8421 LSL_Vector primTextColor = rules.GetVector3Item(idx++); 8428 LSL_Vector primTextColor = rules.GetVector3Item(idx++);
8422 LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++); 8429 LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++);
@@ -8428,26 +8435,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8428 break; 8435 break;
8429 case (int)ScriptBaseClass.PRIM_NAME: 8436 case (int)ScriptBaseClass.PRIM_NAME:
8430 if (remain < 1) 8437 if (remain < 1)
8431 return; 8438 return null;
8432 string primName = rules.GetLSLStringItem(idx++); 8439 string primName = rules.GetLSLStringItem(idx++);
8433 part.Name = primName; 8440 part.Name = primName;
8434 break; 8441 break;
8435 case (int)ScriptBaseClass.PRIM_DESC: 8442 case (int)ScriptBaseClass.PRIM_DESC:
8436 if (remain < 1) 8443 if (remain < 1)
8437 return; 8444 return null;
8438 string primDesc = rules.GetLSLStringItem(idx++); 8445 string primDesc = rules.GetLSLStringItem(idx++);
8439 part.Description = primDesc; 8446 part.Description = primDesc;
8440 break; 8447 break;
8441 case (int)ScriptBaseClass.PRIM_ROT_LOCAL: 8448 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
8442 if (remain < 1) 8449 if (remain < 1)
8443 return; 8450 return null;
8444
8445 LSL_Rotation lr = rules.GetQuaternionItem(idx++); 8451 LSL_Rotation lr = rules.GetQuaternionItem(idx++);
8446 SetRot(part, Rot2Quaternion(lr)); 8452 SetRot(part, Rot2Quaternion(lr));
8447 break; 8453 break;
8448 case (int)ScriptBaseClass.PRIM_OMEGA: 8454 case (int)ScriptBaseClass.PRIM_OMEGA:
8449 if (remain < 3) 8455 if (remain < 3)
8450 return; 8456 return null;
8451 LSL_Vector axis = rules.GetVector3Item(idx++); 8457 LSL_Vector axis = rules.GetVector3Item(idx++);
8452 LSL_Float spinrate = rules.GetLSLFloatItem(idx++); 8458 LSL_Float spinrate = rules.GetLSLFloatItem(idx++);
8453 LSL_Float gain = rules.GetLSLFloatItem(idx++); 8459 LSL_Float gain = rules.GetLSLFloatItem(idx++);
@@ -8456,35 +8462,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8456 8462
8457 case (int)ScriptBaseClass.PRIM_LINK_TARGET: 8463 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8458 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. 8464 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
8459 return; 8465 return null;
8460
8461 // do a pending position change before jumping to other part/avatar
8462 if (positionChanged)
8463 {
8464 positionChanged = false;
8465 if (parentgrp == null)
8466 return;
8467
8468 if (parentgrp.RootPart == part)
8469 {
8470
8471 Util.FireAndForget(delegate(object x)
8472 {
8473 parentgrp.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z));
8474 });
8475 }
8476 else
8477 {
8478 part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z);
8479 parentgrp.HasGroupChanged = true;
8480 parentgrp.ScheduleGroupForTerseUpdate();
8481 }
8482 }
8483 8466
8484 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); 8467 return rules.GetSublist(idx, -1);
8485 LSL_List new_rules = rules.GetSublist(idx, -1);
8486 setLinkPrimParams((int)new_linknumber, new_rules);
8487 return;
8488 } 8468 }
8489 } 8469 }
8490 } 8470 }
@@ -8508,6 +8488,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8508 } 8488 }
8509 } 8489 }
8510 } 8490 }
8491 return null;
8511 } 8492 }
8512 8493
8513 public LSL_String llStringToBase64(string str) 8494 public LSL_String llStringToBase64(string str)
@@ -12143,7 +12124,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12143 if (obj.OwnerID != m_host.OwnerID) 12124 if (obj.OwnerID != m_host.OwnerID)
12144 return; 12125 return;
12145 12126
12146 SetPrimParams(obj, rules); 12127 LSL_List remaining = SetPrimParams(obj, rules);
12128
12129 while (remaining != null && remaining.Length > 2)
12130 {
12131 LSL_Integer newLink = remaining.GetLSLIntegerItem(0);
12132 LSL_List newrules = remaining.GetSublist(1, -1);
12133 foreach(SceneObjectPart part in GetLinkParts(obj, newLink)){
12134 remaining = SetPrimParams(part, newrules);
12135 }
12136 }
12147 } 12137 }
12148 12138
12149 public LSL_List GetLinkPrimitiveParamsEx(LSL_Key prim, LSL_List rules) 12139 public LSL_List GetLinkPrimitiveParamsEx(LSL_Key prim, LSL_List rules)