aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs224
1 files changed, 194 insertions, 30 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index aab41f5..bf84b16 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -5924,8 +5924,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5924 } 5924 }
5925 else 5925 else
5926 { 5926 {
5927 agentSize = new LSL_Vector(0.45, 0.6, avatar.Appearance.AvatarHeight); 5927 agentSize = GetAgentSize(avatar);
5928 } 5928 }
5929
5929 return agentSize; 5930 return agentSize;
5930 } 5931 }
5931 5932
@@ -7949,61 +7950,224 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7949 return new LSL_Vector(m_host.GetGeometricCenter()); 7950 return new LSL_Vector(m_host.GetGeometricCenter());
7950 } 7951 }
7951 7952
7952 public LSL_List llGetPrimitiveParams(LSL_List rules) 7953 public LSL_List GetEntityParams(ISceneEntity entity, LSL_List rules)
7953 { 7954 {
7954 m_host.AddScriptLPS(1);
7955
7956 LSL_List result = new LSL_List(); 7955 LSL_List result = new LSL_List();
7956 LSL_List remaining = null;
7957 7957
7958 LSL_List remaining = GetPrimParams(m_host, rules, ref result); 7958 while (true)
7959 {
7960 if (entity is SceneObjectPart)
7961 remaining = GetPrimParams((SceneObjectPart)entity, rules, ref result);
7962 else
7963 remaining = GetAgentParams((ScenePresence)entity, rules, ref result);
7964
7965 if (remaining == null || remaining.Length <= 2)
7966 return result;
7959 7967
7960 while (remaining != null && remaining.Length > 2)
7961 {
7962 int linknumber = remaining.GetLSLIntegerItem(0); 7968 int linknumber = remaining.GetLSLIntegerItem(0);
7963 rules = remaining.GetSublist(1, -1); 7969 rules = remaining.GetSublist(1, -1);
7964 List<SceneObjectPart> parts = GetLinkParts(linknumber); 7970 entity = GetLinkEntity(linknumber);
7965
7966 foreach (SceneObjectPart part in parts)
7967 remaining = GetPrimParams(part, rules, ref result);
7968 } 7971 }
7972 }
7969 7973
7970 return result; 7974 public LSL_List llGetPrimitiveParams(LSL_List rules)
7975 {
7976 m_host.AddScriptLPS(1);
7977
7978 return GetEntityParams(m_host, rules);
7971 } 7979 }
7972 7980
7973 public LSL_List llGetLinkPrimitiveParams(int linknumber, LSL_List rules) 7981 public LSL_List llGetLinkPrimitiveParams(int linknumber, LSL_List rules)
7974 { 7982 {
7975 m_host.AddScriptLPS(1); 7983 m_host.AddScriptLPS(1);
7976 7984
7977 List<SceneObjectPart> parts = GetLinkParts(linknumber); 7985 return GetEntityParams(GetLinkEntity(linknumber), rules);
7986 }
7978 7987
7979 LSL_List res = new LSL_List(); 7988 public LSL_Vector GetAgentSize(ScenePresence sp)
7980 LSL_List remaining = null; 7989 {
7990 return new LSL_Vector(0.45, 0.6, sp.Appearance.AvatarHeight);
7991 }
7981 7992
7982 foreach (SceneObjectPart part in parts) 7993 /// <summary>
7994 /// Gets params for a seated avatar in a linkset.
7995 /// </summary>
7996 /// <returns></returns>
7997 /// <param name='sp'></param>
7998 /// <param name='rules'></param>
7999 /// <param name='res'></param>
8000 public LSL_List GetAgentParams(ScenePresence sp, LSL_List rules, ref LSL_List res)
8001 {
8002 int idx = 0;
8003 while (idx < rules.Length)
7983 { 8004 {
7984 remaining = GetPrimParams(part, rules, ref res); 8005 int code = (int)rules.GetLSLIntegerItem(idx++);
7985 } 8006 int remain = rules.Length-idx;
7986 8007
7987 while (remaining != null && remaining.Length > 2) 8008 switch (code)
7988 { 8009 {
7989 linknumber = remaining.GetLSLIntegerItem(0); 8010 case (int)ScriptBaseClass.PRIM_MATERIAL:
7990 rules = remaining.GetSublist(1, -1); 8011 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_MATERIAL_FLESH));
7991 parts = GetLinkParts(linknumber); 8012 break;
7992 8013
7993 foreach (SceneObjectPart part in parts) 8014 case (int)ScriptBaseClass.PRIM_PHYSICS:
7994 remaining = GetPrimParams(part, rules, ref res); 8015 res.Add(ScriptBaseClass.FALSE);
8016 break;
8017
8018 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
8019 res.Add(ScriptBaseClass.FALSE);
8020 break;
8021
8022 case (int)ScriptBaseClass.PRIM_PHANTOM:
8023 res.Add(ScriptBaseClass.FALSE);
8024 break;
8025
8026 case (int)ScriptBaseClass.PRIM_POSITION:
8027 res.Add(new LSL_Vector(sp.AbsolutePosition));
8028 break;
8029
8030 case (int)ScriptBaseClass.PRIM_SIZE:
8031 res.Add(GetAgentSize(sp));
8032 break;
8033
8034 case (int)ScriptBaseClass.PRIM_ROTATION:
8035 res.Add(sp.GetWorldRotation());
8036 break;
8037
8038 case (int)ScriptBaseClass.PRIM_TYPE:
8039 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TYPE_BOX));
8040 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_HOLE_DEFAULT));
8041 res.Add(new LSL_Vector(0, 1, 0));
8042 res.Add(new LSL_Float(0));
8043 res.Add(new LSL_Vector(0, 0, 0));
8044 res.Add(new LSL_Vector(1, 1, 0));
8045 res.Add(new LSL_Vector(0, 0, 0));
8046 break;
8047
8048 case (int)ScriptBaseClass.PRIM_TEXTURE:
8049 if (remain < 1)
8050 return null;
8051
8052 int face = (int)rules.GetLSLIntegerItem(idx++);
8053 if (face > 21)
8054 break;
8055
8056 res.Add(new LSL_String(""));
8057 res.Add(ScriptBaseClass.ZERO_VECTOR);
8058 res.Add(ScriptBaseClass.ZERO_VECTOR);
8059 res.Add(new LSL_Float(0));
8060 break;
8061
8062 case (int)ScriptBaseClass.PRIM_COLOR:
8063 if (remain < 1)
8064 return null;
8065
8066 face = (int)rules.GetLSLIntegerItem(idx++);
8067 if (face > 21)
8068 break;
8069
8070 res.Add(ScriptBaseClass.ZERO_VECTOR);
8071 res.Add(new LSL_Float(0));
8072 break;
8073
8074 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
8075 if (remain < 1)
8076 return null;
8077
8078 face = (int)rules.GetLSLIntegerItem(idx++);
8079 if (face > 21)
8080 break;
8081
8082 res.Add(ScriptBaseClass.PRIM_SHINY_NONE);
8083 res.Add(ScriptBaseClass.PRIM_BUMP_NONE);
8084 break;
8085
8086 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
8087 if (remain < 1)
8088 return null;
8089
8090 face = (int)rules.GetLSLIntegerItem(idx++);
8091 if (face > 21)
8092 break;
8093
8094 res.Add(ScriptBaseClass.FALSE);
8095 break;
8096
8097 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
8098 res.Add(ScriptBaseClass.FALSE);
8099 res.Add(new LSL_Integer(0));
8100 res.Add(new LSL_Float(0));
8101 res.Add(new LSL_Float(0));
8102 res.Add(new LSL_Float(0));
8103 res.Add(new LSL_Float(0));
8104 res.Add(ScriptBaseClass.ZERO_VECTOR);
8105 break;
8106
8107 case (int)ScriptBaseClass.PRIM_TEXGEN:
8108 if (remain < 1)
8109 return null;
8110
8111 face = (int)rules.GetLSLIntegerItem(idx++);
8112 if (face > 21)
8113 break;
8114
8115 res.Add(ScriptBaseClass.PRIM_TEXGEN_DEFAULT);
8116 break;
8117
8118 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
8119 res.Add(ScriptBaseClass.FALSE);
8120 res.Add(ScriptBaseClass.ZERO_VECTOR);
8121 res.Add(ScriptBaseClass.ZERO_VECTOR);
8122 break;
8123
8124 case (int)ScriptBaseClass.PRIM_GLOW:
8125 if (remain < 1)
8126 return null;
8127
8128 face = (int)rules.GetLSLIntegerItem(idx++);
8129 if (face > 21)
8130 break;
8131
8132 res.Add(new LSL_Float(0));
8133 break;
8134
8135 case (int)ScriptBaseClass.PRIM_TEXT:
8136 res.Add(new LSL_String(""));
8137 res.Add(ScriptBaseClass.ZERO_VECTOR);
8138 res.Add(new LSL_Float(1));
8139 break;
8140
8141 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
8142 res.Add(new LSL_Rotation(sp.Rotation));
8143 break;
8144
8145 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
8146 res.Add(new LSL_Vector(sp.OffsetPosition));
8147 break;
8148
8149 case (int)ScriptBaseClass.PRIM_SLICE:
8150 res.Add(new LSL_Vector(0, 1, 0));
8151 break;
8152
8153 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8154 if(remain < 3)
8155 return null;
8156
8157 return rules.GetSublist(idx, -1);
8158 }
7995 } 8159 }
7996 8160
7997 return res; 8161 return null;
7998 } 8162 }
7999 8163
8000 public LSL_List GetPrimParams(SceneObjectPart part, LSL_List rules, ref LSL_List res) 8164 public LSL_List GetPrimParams(SceneObjectPart part, LSL_List rules, ref LSL_List res)
8001 { 8165 {
8002 int idx=0; 8166 int idx = 0;
8003 while (idx < rules.Length) 8167 while (idx < rules.Length)
8004 { 8168 {
8005 int code=(int)rules.GetLSLIntegerItem(idx++); 8169 int code = (int)rules.GetLSLIntegerItem(idx++);
8006 int remain=rules.Length-idx; 8170 int remain = rules.Length-idx;
8007 8171
8008 switch (code) 8172 switch (code)
8009 { 8173 {
@@ -8246,7 +8410,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8246 if (remain < 1) 8410 if (remain < 1)
8247 return null; 8411 return null;
8248 8412
8249 face=(int)rules.GetLSLIntegerItem(idx++); 8413 face = (int)rules.GetLSLIntegerItem(idx++);
8250 8414
8251 tex = part.Shape.Textures; 8415 tex = part.Shape.Textures;
8252 if (face == ScriptBaseClass.ALL_SIDES) 8416 if (face == ScriptBaseClass.ALL_SIDES)