diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 661 |
1 files changed, 334 insertions, 327 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 20fe6c6..a51a88b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -7067,396 +7067,403 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7067 | bool positionChanged = false; | 7067 | bool positionChanged = false; |
7068 | LSL_Vector currentPosition = GetPartLocalPos(part); | 7068 | LSL_Vector currentPosition = GetPartLocalPos(part); |
7069 | 7069 | ||
7070 | while (idx < rules.Length) | 7070 | try |
7071 | { | 7071 | { |
7072 | int code = rules.GetLSLIntegerItem(idx++); | 7072 | while (idx < rules.Length) |
7073 | { | ||
7074 | int code = rules.GetLSLIntegerItem(idx++); | ||
7073 | 7075 | ||
7074 | int remain = rules.Length - idx; | 7076 | int remain = rules.Length - idx; |
7075 | 7077 | ||
7076 | int face; | 7078 | int face; |
7077 | LSL_Vector v; | 7079 | LSL_Vector v; |
7078 | 7080 | ||
7079 | switch (code) | 7081 | switch (code) |
7080 | { | 7082 | { |
7081 | case (int)ScriptBaseClass.PRIM_POSITION: | 7083 | case (int)ScriptBaseClass.PRIM_POSITION: |
7082 | if (remain < 1) | 7084 | if (remain < 1) |
7083 | return; | 7085 | return; |
7084 | 7086 | ||
7085 | v=rules.GetVector3Item(idx++); | 7087 | v=rules.GetVector3Item(idx++); |
7086 | positionChanged = true; | 7088 | positionChanged = true; |
7087 | currentPosition = GetSetPosTarget(part, v, currentPosition); | 7089 | currentPosition = GetSetPosTarget(part, v, currentPosition); |
7088 | 7090 | ||
7089 | break; | 7091 | break; |
7090 | case (int)ScriptBaseClass.PRIM_SIZE: | 7092 | case (int)ScriptBaseClass.PRIM_SIZE: |
7091 | if (remain < 1) | 7093 | if (remain < 1) |
7092 | return; | 7094 | return; |
7093 | 7095 | ||
7094 | v=rules.GetVector3Item(idx++); | 7096 | v=rules.GetVector3Item(idx++); |
7095 | SetScale(part, v); | 7097 | SetScale(part, v); |
7096 | 7098 | ||
7097 | break; | 7099 | break; |
7098 | case (int)ScriptBaseClass.PRIM_ROTATION: | 7100 | case (int)ScriptBaseClass.PRIM_ROTATION: |
7099 | if (remain < 1) | 7101 | if (remain < 1) |
7100 | return; | 7102 | return; |
7101 | 7103 | ||
7102 | LSL_Rotation q = rules.GetQuaternionItem(idx++); | 7104 | LSL_Rotation q = rules.GetQuaternionItem(idx++); |
7103 | // try to let this work as in SL... | 7105 | // try to let this work as in SL... |
7104 | if (part.ParentID == 0) | 7106 | if (part.ParentID == 0) |
7105 | { | 7107 | { |
7106 | // special case: If we are root, rotate complete SOG to new rotation | 7108 | // special case: If we are root, rotate complete SOG to new rotation |
7107 | SetRot(part, Rot2Quaternion(q)); | 7109 | SetRot(part, Rot2Quaternion(q)); |
7108 | } | 7110 | } |
7109 | else | 7111 | else |
7110 | { | 7112 | { |
7111 | // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. | 7113 | // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. |
7112 | SceneObjectPart rootPart = part.ParentGroup.RootPart; | 7114 | SceneObjectPart rootPart = part.ParentGroup.RootPart; |
7113 | SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q)); | 7115 | SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q)); |
7114 | } | 7116 | } |
7115 | 7117 | ||
7116 | break; | 7118 | break; |
7117 | 7119 | ||
7118 | case (int)ScriptBaseClass.PRIM_TYPE: | 7120 | case (int)ScriptBaseClass.PRIM_TYPE: |
7119 | if (remain < 3) | 7121 | if (remain < 3) |
7120 | return; | 7122 | return; |
7121 | 7123 | ||
7122 | code = (int)rules.GetLSLIntegerItem(idx++); | 7124 | code = (int)rules.GetLSLIntegerItem(idx++); |
7123 | 7125 | ||
7124 | remain = rules.Length - idx; | 7126 | remain = rules.Length - idx; |
7125 | float hollow; | 7127 | float hollow; |
7126 | LSL_Vector twist; | 7128 | LSL_Vector twist; |
7127 | LSL_Vector taper_b; | 7129 | LSL_Vector taper_b; |
7128 | LSL_Vector topshear; | 7130 | LSL_Vector topshear; |
7129 | float revolutions; | 7131 | float revolutions; |
7130 | float radiusoffset; | 7132 | float radiusoffset; |
7131 | float skew; | 7133 | float skew; |
7132 | LSL_Vector holesize; | 7134 | LSL_Vector holesize; |
7133 | LSL_Vector profilecut; | 7135 | LSL_Vector profilecut; |
7134 | 7136 | ||
7135 | switch (code) | 7137 | switch (code) |
7136 | { | 7138 | { |
7137 | case (int)ScriptBaseClass.PRIM_TYPE_BOX: | 7139 | case (int)ScriptBaseClass.PRIM_TYPE_BOX: |
7138 | if (remain < 6) | 7140 | if (remain < 6) |
7139 | return; | 7141 | return; |
7140 | 7142 | ||
7141 | face = (int)rules.GetLSLIntegerItem(idx++); | 7143 | face = (int)rules.GetLSLIntegerItem(idx++); |
7142 | v = rules.GetVector3Item(idx++); // cut | 7144 | v = rules.GetVector3Item(idx++); // cut |
7143 | hollow = (float)rules.GetLSLFloatItem(idx++); | 7145 | hollow = (float)rules.GetLSLFloatItem(idx++); |
7144 | twist = rules.GetVector3Item(idx++); | 7146 | twist = rules.GetVector3Item(idx++); |
7145 | taper_b = rules.GetVector3Item(idx++); | 7147 | taper_b = rules.GetVector3Item(idx++); |
7146 | topshear = rules.GetVector3Item(idx++); | 7148 | topshear = rules.GetVector3Item(idx++); |
7147 | 7149 | ||
7148 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, | 7150 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, |
7149 | (byte)ProfileShape.Square, (byte)Extrusion.Straight); | 7151 | (byte)ProfileShape.Square, (byte)Extrusion.Straight); |
7150 | break; | 7152 | break; |
7151 | 7153 | ||
7152 | case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER: | 7154 | case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER: |
7153 | if (remain < 6) | 7155 | if (remain < 6) |
7154 | return; | 7156 | return; |
7155 | 7157 | ||
7156 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | 7158 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape |
7157 | v = rules.GetVector3Item(idx++); // cut | 7159 | v = rules.GetVector3Item(idx++); // cut |
7158 | hollow = (float)rules.GetLSLFloatItem(idx++); | 7160 | hollow = (float)rules.GetLSLFloatItem(idx++); |
7159 | twist = rules.GetVector3Item(idx++); | 7161 | twist = rules.GetVector3Item(idx++); |
7160 | taper_b = rules.GetVector3Item(idx++); | 7162 | taper_b = rules.GetVector3Item(idx++); |
7161 | topshear = rules.GetVector3Item(idx++); | 7163 | topshear = rules.GetVector3Item(idx++); |
7162 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, | 7164 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, |
7163 | (byte)ProfileShape.Circle, (byte)Extrusion.Straight); | 7165 | (byte)ProfileShape.Circle, (byte)Extrusion.Straight); |
7164 | break; | 7166 | break; |
7165 | 7167 | ||
7166 | case (int)ScriptBaseClass.PRIM_TYPE_PRISM: | 7168 | case (int)ScriptBaseClass.PRIM_TYPE_PRISM: |
7167 | if (remain < 6) | 7169 | if (remain < 6) |
7168 | return; | 7170 | return; |
7169 | 7171 | ||
7170 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | 7172 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape |
7171 | v = rules.GetVector3Item(idx++); //cut | 7173 | v = rules.GetVector3Item(idx++); //cut |
7172 | hollow = (float)rules.GetLSLFloatItem(idx++); | 7174 | hollow = (float)rules.GetLSLFloatItem(idx++); |
7173 | twist = rules.GetVector3Item(idx++); | 7175 | twist = rules.GetVector3Item(idx++); |
7174 | taper_b = rules.GetVector3Item(idx++); | 7176 | taper_b = rules.GetVector3Item(idx++); |
7175 | topshear = rules.GetVector3Item(idx++); | 7177 | topshear = rules.GetVector3Item(idx++); |
7176 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, | 7178 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, |
7177 | (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Straight); | 7179 | (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Straight); |
7178 | break; | 7180 | break; |
7179 | 7181 | ||
7180 | case (int)ScriptBaseClass.PRIM_TYPE_SPHERE: | 7182 | case (int)ScriptBaseClass.PRIM_TYPE_SPHERE: |
7181 | if (remain < 5) | 7183 | if (remain < 5) |
7182 | return; | 7184 | return; |
7183 | 7185 | ||
7184 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | 7186 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape |
7185 | v = rules.GetVector3Item(idx++); // cut | 7187 | v = rules.GetVector3Item(idx++); // cut |
7186 | hollow = (float)rules.GetLSLFloatItem(idx++); | 7188 | hollow = (float)rules.GetLSLFloatItem(idx++); |
7187 | twist = rules.GetVector3Item(idx++); | 7189 | twist = rules.GetVector3Item(idx++); |
7188 | taper_b = rules.GetVector3Item(idx++); // dimple | 7190 | taper_b = rules.GetVector3Item(idx++); // dimple |
7189 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, | 7191 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, |
7190 | (byte)ProfileShape.HalfCircle, (byte)Extrusion.Curve1); | 7192 | (byte)ProfileShape.HalfCircle, (byte)Extrusion.Curve1); |
7191 | break; | 7193 | break; |
7192 | 7194 | ||
7193 | case (int)ScriptBaseClass.PRIM_TYPE_TORUS: | 7195 | case (int)ScriptBaseClass.PRIM_TYPE_TORUS: |
7194 | if (remain < 11) | 7196 | if (remain < 11) |
7195 | return; | 7197 | return; |
7196 | 7198 | ||
7197 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | 7199 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape |
7198 | v = rules.GetVector3Item(idx++); //cut | 7200 | v = rules.GetVector3Item(idx++); //cut |
7199 | hollow = (float)rules.GetLSLFloatItem(idx++); | 7201 | hollow = (float)rules.GetLSLFloatItem(idx++); |
7200 | twist = rules.GetVector3Item(idx++); | 7202 | twist = rules.GetVector3Item(idx++); |
7201 | holesize = rules.GetVector3Item(idx++); | 7203 | holesize = rules.GetVector3Item(idx++); |
7202 | topshear = rules.GetVector3Item(idx++); | 7204 | topshear = rules.GetVector3Item(idx++); |
7203 | profilecut = rules.GetVector3Item(idx++); | 7205 | profilecut = rules.GetVector3Item(idx++); |
7204 | taper_b = rules.GetVector3Item(idx++); // taper_a | 7206 | taper_b = rules.GetVector3Item(idx++); // taper_a |
7205 | revolutions = (float)rules.GetLSLFloatItem(idx++); | 7207 | revolutions = (float)rules.GetLSLFloatItem(idx++); |
7206 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); | 7208 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); |
7207 | skew = (float)rules.GetLSLFloatItem(idx++); | 7209 | skew = (float)rules.GetLSLFloatItem(idx++); |
7208 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, | 7210 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, |
7209 | revolutions, radiusoffset, skew, (byte)ProfileShape.Circle, (byte)Extrusion.Curve1); | 7211 | revolutions, radiusoffset, skew, (byte)ProfileShape.Circle, (byte)Extrusion.Curve1); |
7210 | break; | 7212 | break; |
7211 | 7213 | ||
7212 | case (int)ScriptBaseClass.PRIM_TYPE_TUBE: | 7214 | case (int)ScriptBaseClass.PRIM_TYPE_TUBE: |
7213 | if (remain < 11) | 7215 | if (remain < 11) |
7214 | return; | 7216 | return; |
7215 | 7217 | ||
7216 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | 7218 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape |
7217 | v = rules.GetVector3Item(idx++); //cut | 7219 | v = rules.GetVector3Item(idx++); //cut |
7218 | hollow = (float)rules.GetLSLFloatItem(idx++); | 7220 | hollow = (float)rules.GetLSLFloatItem(idx++); |
7219 | twist = rules.GetVector3Item(idx++); | 7221 | twist = rules.GetVector3Item(idx++); |
7220 | holesize = rules.GetVector3Item(idx++); | 7222 | holesize = rules.GetVector3Item(idx++); |
7221 | topshear = rules.GetVector3Item(idx++); | 7223 | topshear = rules.GetVector3Item(idx++); |
7222 | profilecut = rules.GetVector3Item(idx++); | 7224 | profilecut = rules.GetVector3Item(idx++); |
7223 | taper_b = rules.GetVector3Item(idx++); // taper_a | 7225 | taper_b = rules.GetVector3Item(idx++); // taper_a |
7224 | revolutions = (float)rules.GetLSLFloatItem(idx++); | 7226 | revolutions = (float)rules.GetLSLFloatItem(idx++); |
7225 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); | 7227 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); |
7226 | skew = (float)rules.GetLSLFloatItem(idx++); | 7228 | skew = (float)rules.GetLSLFloatItem(idx++); |
7227 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, | 7229 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, |
7228 | revolutions, radiusoffset, skew, (byte)ProfileShape.Square, (byte)Extrusion.Curve1); | 7230 | revolutions, radiusoffset, skew, (byte)ProfileShape.Square, (byte)Extrusion.Curve1); |
7229 | break; | 7231 | break; |
7230 | 7232 | ||
7231 | case (int)ScriptBaseClass.PRIM_TYPE_RING: | 7233 | case (int)ScriptBaseClass.PRIM_TYPE_RING: |
7232 | if (remain < 11) | 7234 | if (remain < 11) |
7233 | return; | 7235 | return; |
7234 | 7236 | ||
7235 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | 7237 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape |
7236 | v = rules.GetVector3Item(idx++); //cut | 7238 | v = rules.GetVector3Item(idx++); //cut |
7237 | hollow = (float)rules.GetLSLFloatItem(idx++); | 7239 | hollow = (float)rules.GetLSLFloatItem(idx++); |
7238 | twist = rules.GetVector3Item(idx++); | 7240 | twist = rules.GetVector3Item(idx++); |
7239 | holesize = rules.GetVector3Item(idx++); | 7241 | holesize = rules.GetVector3Item(idx++); |
7240 | topshear = rules.GetVector3Item(idx++); | 7242 | topshear = rules.GetVector3Item(idx++); |
7241 | profilecut = rules.GetVector3Item(idx++); | 7243 | profilecut = rules.GetVector3Item(idx++); |
7242 | taper_b = rules.GetVector3Item(idx++); // taper_a | 7244 | taper_b = rules.GetVector3Item(idx++); // taper_a |
7243 | revolutions = (float)rules.GetLSLFloatItem(idx++); | 7245 | revolutions = (float)rules.GetLSLFloatItem(idx++); |
7244 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); | 7246 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); |
7245 | skew = (float)rules.GetLSLFloatItem(idx++); | 7247 | skew = (float)rules.GetLSLFloatItem(idx++); |
7246 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, | 7248 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, |
7247 | revolutions, radiusoffset, skew, (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Curve1); | 7249 | revolutions, radiusoffset, skew, (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Curve1); |
7248 | break; | 7250 | break; |
7249 | 7251 | ||
7250 | case (int)ScriptBaseClass.PRIM_TYPE_SCULPT: | 7252 | case (int)ScriptBaseClass.PRIM_TYPE_SCULPT: |
7251 | if (remain < 2) | 7253 | if (remain < 2) |
7252 | return; | 7254 | return; |
7253 | 7255 | ||
7254 | string map = rules.Data[idx++].ToString(); | 7256 | string map = rules.Data[idx++].ToString(); |
7255 | face = (int)rules.GetLSLIntegerItem(idx++); // type | 7257 | face = (int)rules.GetLSLIntegerItem(idx++); // type |
7256 | SetPrimitiveShapeParams(part, map, face, (byte)Extrusion.Curve1); | 7258 | SetPrimitiveShapeParams(part, map, face, (byte)Extrusion.Curve1); |
7257 | break; | 7259 | break; |
7258 | } | 7260 | } |
7259 | 7261 | ||
7260 | break; | 7262 | break; |
7261 | 7263 | ||
7262 | case (int)ScriptBaseClass.PRIM_TEXTURE: | 7264 | case (int)ScriptBaseClass.PRIM_TEXTURE: |
7263 | if (remain < 5) | 7265 | if (remain < 5) |
7264 | return; | 7266 | return; |
7265 | 7267 | ||
7266 | face=(int)rules.GetLSLIntegerItem(idx++); | 7268 | face=(int)rules.GetLSLIntegerItem(idx++); |
7267 | string tex=rules.Data[idx++].ToString(); | 7269 | string tex=rules.Data[idx++].ToString(); |
7268 | LSL_Vector repeats=rules.GetVector3Item(idx++); | 7270 | LSL_Vector repeats=rules.GetVector3Item(idx++); |
7269 | LSL_Vector offsets=rules.GetVector3Item(idx++); | 7271 | LSL_Vector offsets=rules.GetVector3Item(idx++); |
7270 | double rotation=(double)rules.GetLSLFloatItem(idx++); | 7272 | double rotation=(double)rules.GetLSLFloatItem(idx++); |
7271 | 7273 | ||
7272 | SetTexture(part, tex, face); | 7274 | SetTexture(part, tex, face); |
7273 | ScaleTexture(part, repeats.x, repeats.y, face); | 7275 | ScaleTexture(part, repeats.x, repeats.y, face); |
7274 | OffsetTexture(part, offsets.x, offsets.y, face); | 7276 | OffsetTexture(part, offsets.x, offsets.y, face); |
7275 | RotateTexture(part, rotation, face); | 7277 | RotateTexture(part, rotation, face); |
7276 | 7278 | ||
7277 | break; | 7279 | break; |
7278 | 7280 | ||
7279 | case (int)ScriptBaseClass.PRIM_COLOR: | 7281 | case (int)ScriptBaseClass.PRIM_COLOR: |
7280 | if (remain < 3) | 7282 | if (remain < 3) |
7281 | return; | 7283 | return; |
7282 | 7284 | ||
7283 | face=(int)rules.GetLSLIntegerItem(idx++); | 7285 | face=(int)rules.GetLSLIntegerItem(idx++); |
7284 | LSL_Vector color=rules.GetVector3Item(idx++); | 7286 | LSL_Vector color=rules.GetVector3Item(idx++); |
7285 | double alpha=(double)rules.GetLSLFloatItem(idx++); | 7287 | double alpha=(double)rules.GetLSLFloatItem(idx++); |
7286 | 7288 | ||
7287 | part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); | 7289 | part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); |
7288 | SetAlpha(part, alpha, face); | 7290 | SetAlpha(part, alpha, face); |
7289 | 7291 | ||
7290 | break; | 7292 | break; |
7291 | 7293 | ||
7292 | case (int)ScriptBaseClass.PRIM_FLEXIBLE: | 7294 | case (int)ScriptBaseClass.PRIM_FLEXIBLE: |
7293 | if (remain < 7) | 7295 | if (remain < 7) |
7294 | return; | 7296 | return; |
7295 | 7297 | ||
7296 | bool flexi = rules.GetLSLIntegerItem(idx++); | 7298 | bool flexi = rules.GetLSLIntegerItem(idx++); |
7297 | int softness = rules.GetLSLIntegerItem(idx++); | 7299 | int softness = rules.GetLSLIntegerItem(idx++); |
7298 | float gravity = (float)rules.GetLSLFloatItem(idx++); | 7300 | float gravity = (float)rules.GetLSLFloatItem(idx++); |
7299 | float friction = (float)rules.GetLSLFloatItem(idx++); | 7301 | float friction = (float)rules.GetLSLFloatItem(idx++); |
7300 | float wind = (float)rules.GetLSLFloatItem(idx++); | 7302 | float wind = (float)rules.GetLSLFloatItem(idx++); |
7301 | float tension = (float)rules.GetLSLFloatItem(idx++); | 7303 | float tension = (float)rules.GetLSLFloatItem(idx++); |
7302 | LSL_Vector force = rules.GetVector3Item(idx++); | 7304 | LSL_Vector force = rules.GetVector3Item(idx++); |
7303 | 7305 | ||
7304 | SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force); | 7306 | SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force); |
7305 | 7307 | ||
7306 | break; | 7308 | break; |
7307 | 7309 | ||
7308 | case (int)ScriptBaseClass.PRIM_POINT_LIGHT: | 7310 | case (int)ScriptBaseClass.PRIM_POINT_LIGHT: |
7309 | if (remain < 5) | 7311 | if (remain < 5) |
7310 | return; | 7312 | return; |
7311 | bool light = rules.GetLSLIntegerItem(idx++); | 7313 | bool light = rules.GetLSLIntegerItem(idx++); |
7312 | LSL_Vector lightcolor = rules.GetVector3Item(idx++); | 7314 | LSL_Vector lightcolor = rules.GetVector3Item(idx++); |
7313 | float intensity = (float)rules.GetLSLFloatItem(idx++); | 7315 | float intensity = (float)rules.GetLSLFloatItem(idx++); |
7314 | float radius = (float)rules.GetLSLFloatItem(idx++); | 7316 | float radius = (float)rules.GetLSLFloatItem(idx++); |
7315 | float falloff = (float)rules.GetLSLFloatItem(idx++); | 7317 | float falloff = (float)rules.GetLSLFloatItem(idx++); |
7316 | 7318 | ||
7317 | SetPointLight(part, light, lightcolor, intensity, radius, falloff); | 7319 | SetPointLight(part, light, lightcolor, intensity, radius, falloff); |
7318 | 7320 | ||
7319 | break; | 7321 | break; |
7320 | 7322 | ||
7321 | case (int)ScriptBaseClass.PRIM_GLOW: | 7323 | case (int)ScriptBaseClass.PRIM_GLOW: |
7322 | if (remain < 2) | 7324 | if (remain < 2) |
7323 | return; | 7325 | return; |
7324 | face = rules.GetLSLIntegerItem(idx++); | 7326 | face = rules.GetLSLIntegerItem(idx++); |
7325 | float glow = (float)rules.GetLSLFloatItem(idx++); | 7327 | float glow = (float)rules.GetLSLFloatItem(idx++); |
7326 | 7328 | ||
7327 | SetGlow(part, face, glow); | 7329 | SetGlow(part, face, glow); |
7328 | 7330 | ||
7329 | break; | 7331 | break; |
7330 | 7332 | ||
7331 | case (int)ScriptBaseClass.PRIM_BUMP_SHINY: | 7333 | case (int)ScriptBaseClass.PRIM_BUMP_SHINY: |
7332 | if (remain < 3) | 7334 | if (remain < 3) |
7333 | return; | 7335 | return; |
7334 | face = (int)rules.GetLSLIntegerItem(idx++); | 7336 | face = (int)rules.GetLSLIntegerItem(idx++); |
7335 | int shiny = (int)rules.GetLSLIntegerItem(idx++); | 7337 | int shiny = (int)rules.GetLSLIntegerItem(idx++); |
7336 | Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); | 7338 | Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); |
7337 | 7339 | ||
7338 | SetShiny(part, face, shiny, bump); | 7340 | SetShiny(part, face, shiny, bump); |
7339 | 7341 | ||
7340 | break; | 7342 | break; |
7341 | 7343 | ||
7342 | case (int)ScriptBaseClass.PRIM_FULLBRIGHT: | 7344 | case (int)ScriptBaseClass.PRIM_FULLBRIGHT: |
7343 | if (remain < 2) | 7345 | if (remain < 2) |
7344 | return; | 7346 | return; |
7345 | face = rules.GetLSLIntegerItem(idx++); | 7347 | face = rules.GetLSLIntegerItem(idx++); |
7346 | bool st = rules.GetLSLIntegerItem(idx++); | 7348 | bool st = rules.GetLSLIntegerItem(idx++); |
7347 | SetFullBright(part, face , st); | 7349 | SetFullBright(part, face , st); |
7348 | break; | 7350 | break; |
7349 | 7351 | ||
7350 | case (int)ScriptBaseClass.PRIM_MATERIAL: | 7352 | case (int)ScriptBaseClass.PRIM_MATERIAL: |
7351 | if (remain < 1) | 7353 | if (remain < 1) |
7352 | return; | 7354 | return; |
7353 | int mat = rules.GetLSLIntegerItem(idx++); | 7355 | int mat = rules.GetLSLIntegerItem(idx++); |
7354 | if (mat < 0 || mat > 7) | 7356 | if (mat < 0 || mat > 7) |
7355 | return; | 7357 | return; |
7356 | 7358 | ||
7357 | part.Material = Convert.ToByte(mat); | 7359 | part.Material = Convert.ToByte(mat); |
7358 | break; | 7360 | break; |
7359 | 7361 | ||
7360 | case (int)ScriptBaseClass.PRIM_PHANTOM: | 7362 | case (int)ScriptBaseClass.PRIM_PHANTOM: |
7361 | if (remain < 1) | 7363 | if (remain < 1) |
7362 | return; | 7364 | return; |
7363 | 7365 | ||
7364 | string ph = rules.Data[idx++].ToString(); | 7366 | string ph = rules.Data[idx++].ToString(); |
7365 | m_host.ParentGroup.ScriptSetPhantomStatus(ph.Equals("1")); | 7367 | m_host.ParentGroup.ScriptSetPhantomStatus(ph.Equals("1")); |
7366 | 7368 | ||
7367 | break; | 7369 | break; |
7368 | 7370 | ||
7369 | case (int)ScriptBaseClass.PRIM_PHYSICS: | 7371 | case (int)ScriptBaseClass.PRIM_PHYSICS: |
7370 | if (remain < 1) | 7372 | if (remain < 1) |
7371 | return; | 7373 | return; |
7372 | string phy = rules.Data[idx++].ToString(); | 7374 | string phy = rules.Data[idx++].ToString(); |
7373 | bool physics; | 7375 | bool physics; |
7374 | 7376 | ||
7375 | if (phy.Equals("1")) | 7377 | if (phy.Equals("1")) |
7376 | physics = true; | 7378 | physics = true; |
7377 | else | 7379 | else |
7378 | physics = false; | 7380 | physics = false; |
7379 | 7381 | ||
7380 | part.ScriptSetPhysicsStatus(physics); | 7382 | part.ScriptSetPhysicsStatus(physics); |
7381 | break; | 7383 | break; |
7382 | 7384 | ||
7383 | case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: | 7385 | case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: |
7384 | if (remain < 1) | 7386 | if (remain < 1) |
7385 | return; | 7387 | return; |
7386 | string temp = rules.Data[idx++].ToString(); | 7388 | string temp = rules.Data[idx++].ToString(); |
7387 | 7389 | ||
7388 | m_host.ParentGroup.ScriptSetTemporaryStatus(temp.Equals("1")); | 7390 | m_host.ParentGroup.ScriptSetTemporaryStatus(temp.Equals("1")); |
7389 | 7391 | ||
7390 | break; | 7392 | break; |
7391 | 7393 | ||
7392 | case (int)ScriptBaseClass.PRIM_TEXGEN: | 7394 | case (int)ScriptBaseClass.PRIM_TEXGEN: |
7393 | if (remain < 2) | 7395 | if (remain < 2) |
7394 | return; | 7396 | return; |
7395 | //face,type | 7397 | //face,type |
7396 | face = rules.GetLSLIntegerItem(idx++); | 7398 | face = rules.GetLSLIntegerItem(idx++); |
7397 | int style = rules.GetLSLIntegerItem(idx++); | 7399 | int style = rules.GetLSLIntegerItem(idx++); |
7398 | SetTexGen(part, face, style); | 7400 | SetTexGen(part, face, style); |
7399 | break; | 7401 | break; |
7400 | case (int)ScriptBaseClass.PRIM_TEXT: | 7402 | case (int)ScriptBaseClass.PRIM_TEXT: |
7401 | if (remain < 3) | 7403 | if (remain < 3) |
7402 | return; | 7404 | return; |
7403 | string primText = rules.GetLSLStringItem(idx++); | 7405 | string primText = rules.GetLSLStringItem(idx++); |
7404 | LSL_Vector primTextColor = rules.GetVector3Item(idx++); | 7406 | LSL_Vector primTextColor = rules.GetVector3Item(idx++); |
7405 | LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++); | 7407 | LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++); |
7406 | Vector3 av3 = new Vector3(Util.Clip((float)primTextColor.x, 0.0f, 1.0f), | 7408 | Vector3 av3 = new Vector3(Util.Clip((float)primTextColor.x, 0.0f, 1.0f), |
7407 | Util.Clip((float)primTextColor.y, 0.0f, 1.0f), | 7409 | Util.Clip((float)primTextColor.y, 0.0f, 1.0f), |
7408 | Util.Clip((float)primTextColor.z, 0.0f, 1.0f)); | 7410 | Util.Clip((float)primTextColor.z, 0.0f, 1.0f)); |
7409 | part.SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f)); | 7411 | part.SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f)); |
7412 | |||
7413 | break; | ||
7414 | case (int)ScriptBaseClass.PRIM_NAME: | ||
7415 | if (remain < 1) | ||
7416 | return; | ||
7417 | string primName = rules.GetLSLStringItem(idx++); | ||
7418 | part.Name = primName; | ||
7419 | break; | ||
7420 | case (int)ScriptBaseClass.PRIM_DESC: | ||
7421 | if (remain < 1) | ||
7422 | return; | ||
7423 | string primDesc = rules.GetLSLStringItem(idx++); | ||
7424 | part.Description = primDesc; | ||
7425 | break; | ||
7426 | case (int)ScriptBaseClass.PRIM_ROT_LOCAL: | ||
7427 | if (remain < 1) | ||
7428 | return; | ||
7429 | LSL_Rotation lr = rules.GetQuaternionItem(idx++); | ||
7430 | SetRot(part, Rot2Quaternion(lr)); | ||
7431 | break; | ||
7432 | case (int)ScriptBaseClass.PRIM_OMEGA: | ||
7433 | if (remain < 3) | ||
7434 | return; | ||
7435 | LSL_Vector axis = rules.GetVector3Item(idx++); | ||
7436 | LSL_Float spinrate = rules.GetLSLFloatItem(idx++); | ||
7437 | LSL_Float gain = rules.GetLSLFloatItem(idx++); | ||
7438 | TargetOmega(part, axis, (double)spinrate, (double)gain); | ||
7439 | break; | ||
7440 | case (int)ScriptBaseClass.PRIM_LINK_TARGET: | ||
7441 | if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. | ||
7442 | return; | ||
7443 | LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); | ||
7444 | LSL_List new_rules = rules.GetSublist(idx, -1); | ||
7445 | setLinkPrimParams((int)new_linknumber, new_rules); | ||
7410 | 7446 | ||
7411 | break; | ||
7412 | case (int)ScriptBaseClass.PRIM_NAME: | ||
7413 | if (remain < 1) | ||
7414 | return; | ||
7415 | string primName = rules.GetLSLStringItem(idx++); | ||
7416 | part.Name = primName; | ||
7417 | break; | ||
7418 | case (int)ScriptBaseClass.PRIM_DESC: | ||
7419 | if (remain < 1) | ||
7420 | return; | ||
7421 | string primDesc = rules.GetLSLStringItem(idx++); | ||
7422 | part.Description = primDesc; | ||
7423 | break; | ||
7424 | case (int)ScriptBaseClass.PRIM_ROT_LOCAL: | ||
7425 | if (remain < 1) | ||
7426 | return; | ||
7427 | LSL_Rotation lr = rules.GetQuaternionItem(idx++); | ||
7428 | SetRot(part, Rot2Quaternion(lr)); | ||
7429 | break; | ||
7430 | case (int)ScriptBaseClass.PRIM_OMEGA: | ||
7431 | if (remain < 3) | ||
7432 | return; | ||
7433 | LSL_Vector axis = rules.GetVector3Item(idx++); | ||
7434 | LSL_Float spinrate = rules.GetLSLFloatItem(idx++); | ||
7435 | LSL_Float gain = rules.GetLSLFloatItem(idx++); | ||
7436 | TargetOmega(part, axis, (double)spinrate, (double)gain); | ||
7437 | break; | ||
7438 | case (int)ScriptBaseClass.PRIM_LINK_TARGET: | ||
7439 | if (remain < 1) | ||
7440 | return; | 7447 | return; |
7441 | LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); | 7448 | } |
7442 | part = part.ParentGroup.GetLinkNumPart((int)new_linknumber); | ||
7443 | break; | ||
7444 | } | 7449 | } |
7445 | } | 7450 | } |
7446 | 7451 | finally | |
7447 | if (positionChanged) | ||
7448 | { | 7452 | { |
7449 | if (part.ParentGroup.RootPart == part) | 7453 | if (positionChanged) |
7450 | { | 7454 | { |
7451 | SceneObjectGroup parent = part.ParentGroup; | 7455 | if (part.ParentGroup.RootPart == part) |
7452 | parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z)); | 7456 | { |
7453 | } | 7457 | SceneObjectGroup parent = part.ParentGroup; |
7454 | else | 7458 | parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z)); |
7455 | { | 7459 | } |
7456 | part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z); | 7460 | else |
7457 | SceneObjectGroup parent = part.ParentGroup; | 7461 | { |
7458 | parent.HasGroupChanged = true; | 7462 | part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z); |
7459 | parent.ScheduleGroupForTerseUpdate(); | 7463 | SceneObjectGroup parent = part.ParentGroup; |
7464 | parent.HasGroupChanged = true; | ||
7465 | parent.ScheduleGroupForTerseUpdate(); | ||
7466 | } | ||
7460 | } | 7467 | } |
7461 | } | 7468 | } |
7462 | } | 7469 | } |