protected void SetPrimParams(SceneObjectPart part, LSL_List rules) { int idx = 0; while (idx < rules.Length) { int code = rules.GetLSLIntegerItem(idx++); int remain = rules.Length - idx; int face; LSL_Vector v; switch (code) { case (int)ScriptBaseClass.PRIM_POSITION: if (remain < 1) return; v=rules.GetVector3Item(idx++); SetPos(part, v); break; case (int)ScriptBaseClass.PRIM_SIZE: if (remain < 1) return; v=rules.GetVector3Item(idx++); SetScale(part, v); break; case (int)ScriptBaseClass.PRIM_ROTATION: if (remain < 1) return; LSL_Rotation q = rules.GetQuaternionItem(idx++); // try to let this work as in SL... if (part.ParentID == 0) { // special case: If we are root, rotate complete SOG to new rotation SetRot(part, Rot2Quaternion(q)); } else { // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. SceneObjectGroup group = part.ParentGroup; if (group != null) // a bit paranoid, maybe { SceneObjectPart rootPart = group.RootPart; if (rootPart != null) // again, better safe than sorry { SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q)); } } } break; case (int)ScriptBaseClass.PRIM_TYPE: if (remain < 3) return; code = (int)rules.GetLSLIntegerItem(idx++); remain = rules.Length - idx; float hollow; LSL_Vector twist; LSL_Vector taper_b; LSL_Vector topshear; float revolutions; float radiusoffset; float skew; LSL_Vector holesize; LSL_Vector profilecut; switch (code) { case (int)ScriptBaseClass.PRIM_TYPE_BOX: if (remain < 6) return; face = (int)rules.GetLSLIntegerItem(idx++); v = rules.GetVector3Item(idx++); // cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); part.Shape.PathCurve = (byte)Extrusion.Straight; SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, 1); break; case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER: if (remain < 6) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); // cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); part.Shape.ProfileShape = ProfileShape.Circle; part.Shape.PathCurve = (byte)Extrusion.Straight; SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, 0); break; case (int)ScriptBaseClass.PRIM_TYPE_PRISM: if (remain < 6) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); part.Shape.PathCurve = (byte)Extrusion.Straight; SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, 3); break; case (int)ScriptBaseClass.PRIM_TYPE_SPHERE: if (remain < 5) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); // cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // dimple part.Shape.PathCurve = (byte)Extrusion.Curve1; SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, 5); break; case (int)ScriptBaseClass.PRIM_TYPE_TORUS: if (remain < 11) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); holesize = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); profilecut = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // taper_a revolutions = (float)rules.GetLSLFloatItem(idx++); radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); part.Shape.PathCurve = (byte)Extrusion.Curve1; SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, 0); break; case (int)ScriptBaseClass.PRIM_TYPE_TUBE: if (remain < 11) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); holesize = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); profilecut = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // taper_a revolutions = (float)rules.GetLSLFloatItem(idx++); radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); part.Shape.PathCurve = (byte)Extrusion.Curve1; SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, 1); break; case (int)ScriptBaseClass.PRIM_TYPE_RING: if (remain < 11) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); holesize = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); profilecut = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // taper_a revolutions = (float)rules.GetLSLFloatItem(idx++); radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); part.Shape.PathCurve = (byte)Extrusion.Curve1; SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, 3); break; case (int)ScriptBaseClass.PRIM_TYPE_SCULPT: if (remain < 2) return; string map = rules.Data[idx++].ToString(); face = (int)rules.GetLSLIntegerItem(idx++); // type part.Shape.PathCurve = (byte)Extrusion.Curve1; SetPrimitiveShapeParams(part, map, face); break; } break; case (int)ScriptBaseClass.PRIM_TEXTURE: if (remain < 5) return; face=(int)rules.GetLSLIntegerItem(idx++); string tex=rules.Data[idx++].ToString(); LSL_Vector repeats=rules.GetVector3Item(idx++); LSL_Vector offsets=rules.GetVector3Item(idx++); double rotation=(double)rules.GetLSLFloatItem(idx++); SetTexture(part, tex, face); ScaleTexture(part, repeats.x, repeats.y, face); OffsetTexture(part, offsets.x, offsets.y, face); RotateTexture(part, rotation, face); break; case (int)ScriptBaseClass.PRIM_COLOR: if (remain < 3) return; face=(int)rules.GetLSLIntegerItem(idx++); LSL_Vector color=rules.GetVector3Item(idx++); double alpha=(double)rules.GetLSLFloatItem(idx++); part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); SetAlpha(part, alpha, face); break; case (int)ScriptBaseClass.PRIM_FLEXIBLE: if (remain < 7) return; bool flexi = rules.GetLSLIntegerItem(idx++); int softness = rules.GetLSLIntegerItem(idx++); float gravity = (float)rules.GetLSLFloatItem(idx++); float friction = (float)rules.GetLSLFloatItem(idx++); float wind = (float)rules.GetLSLFloatItem(idx++); float tension = (float)rules.GetLSLFloatItem(idx++); LSL_Vector force = rules.GetVector3Item(idx++); SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force); break; case (int)ScriptBaseClass.PRIM_POINT_LIGHT: if (remain < 5) return; bool light = rules.GetLSLIntegerItem(idx++); LSL_Vector lightcolor = rules.GetVector3Item(idx++); float intensity = (float)rules.GetLSLFloatItem(idx++); float radius = (float)rules.GetLSLFloatItem(idx++); float falloff = (float)rules.GetLSLFloatItem(idx++); SetPointLight(part, light, lightcolor, intensity, radius, falloff); break; case (int)ScriptBaseClass.PRIM_GLOW: if (remain < 2) return; face = rules.GetLSLIntegerItem(idx++); float glow = (float)rules.GetLSLFloatItem(idx++); SetGlow(part, face, glow); break; case (int)ScriptBaseClass.PRIM_BUMP_SHINY: if (remain < 3) return; face = (int)rules.GetLSLIntegerItem(idx++); int shiny = (int)rules.GetLSLIntegerItem(idx++); Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); SetShiny(part, face, shiny, bump); break; case (int)ScriptBaseClass.PRIM_FULLBRIGHT: if (remain < 2) return; face = rules.GetLSLIntegerItem(idx++); bool st = rules.GetLSLIntegerItem(idx++); SetFullBright(part, face , st); break; case (int)ScriptBaseClass.PRIM_MATERIAL: if (remain < 1) return; int mat = rules.GetLSLIntegerItem(idx++); if (mat < 0 || mat > 7) return; part.Material = Convert.ToByte(mat); break; case (int)ScriptBaseClass.PRIM_PHANTOM: if (remain < 1) return; string ph = rules.Data[idx++].ToString(); bool phantom; if (ph.Equals("1")) phantom = true; else phantom = false; part.ScriptSetPhantomStatus(phantom); break; case (int)ScriptBaseClass.PRIM_PHYSICS: if (remain < 1) return; string phy = rules.Data[idx++].ToString(); bool physics; if (phy.Equals("1")) physics = true; else physics = false; part.ScriptSetPhysicsStatus(physics); break; case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: if (remain < 1) return; string temp = rules.Data[idx++].ToString(); bool tempOnRez; if (temp.Equals("1")) tempOnRez = true; else tempOnRez = false; part.ScriptSetTemporaryStatus(tempOnRez); break; case (int)ScriptBaseClass.PRIM_TEXGEN: if (remain < 2) return; //face,type face = rules.GetLSLIntegerItem(idx++); int style = rules.GetLSLIntegerItem(idx++); SetTexGen(part, face, style); break; case (int)ScriptBaseClass.PRIM_TEXT: if (remain < 3) return; string primText = rules.GetLSLStringItem(idx++); LSL_Vector primTextColor = rules.GetVector3Item(idx++); LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++); Vector3 av3 = new Vector3(Util.Clip((float)primTextColor.x, 0.0f, 1.0f), Util.Clip((float)primTextColor.y, 0.0f, 1.0f), Util.Clip((float)primTextColor.z, 0.0f, 1.0f)); part.SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f)); break; case (int)ScriptBaseClass.PRIM_NAME: if (remain < 1) return; string primName = rules.GetLSLStringItem(idx++); part.Name = primName; break; case (int)ScriptBaseClass.PRIM_DESC: if (remain < 1) return; string primDesc = rules.GetLSLStringItem(idx++); part.Description = primDesc; break; case (int)ScriptBaseClass.PRIM_ROT_LOCAL: if (remain < 1) return; LSL_Rotation lr = rules.GetQuaternionItem(idx++); SetRot(part, Rot2Quaternion(lr)); break; } } }
protected void SetPrimParams(SceneObjectPart part, LSL_List rules) { int idx = 0; bool positionChanged = false; LSL_Vector currentPosition = GetPartLocalPos(part); try { while (idx < rules.Length) { int code = rules.GetLSLIntegerItem(idx++); int remain = rules.Length - idx; int face; LSL_Vector v; switch (code) { case (int)ScriptBaseClass.PRIM_POSITION: case (int)ScriptBaseClass.PRIM_POS_LOCAL: if (remain < 1) return; v=rules.GetVector3Item(idx++); positionChanged = true; currentPosition = GetSetPosTarget(part, v, currentPosition); break; case (int)ScriptBaseClass.PRIM_SIZE: if (remain < 1) return; v=rules.GetVector3Item(idx++); SetScale(part, v); break; case (int)ScriptBaseClass.PRIM_ROTATION: if (remain < 1) return; LSL_Rotation q = rules.GetQuaternionItem(idx++); // try to let this work as in SL... if (part.ParentID == 0) { // special case: If we are root, rotate complete SOG to new rotation SetRot(part, Rot2Quaternion(q)); } else { // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. SceneObjectPart rootPart = part.ParentGroup.RootPart; SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q)); } break; case (int)ScriptBaseClass.PRIM_TYPE: if (remain < 3) return; code = (int)rules.GetLSLIntegerItem(idx++); remain = rules.Length - idx; float hollow; LSL_Vector twist; LSL_Vector taper_b; LSL_Vector topshear; float revolutions; float radiusoffset; float skew; LSL_Vector holesize; LSL_Vector profilecut; switch (code) { case (int)ScriptBaseClass.PRIM_TYPE_BOX: if (remain < 6) return; face = (int)rules.GetLSLIntegerItem(idx++); v = rules.GetVector3Item(idx++); // cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, (byte)ProfileShape.Square, (byte)Extrusion.Straight); break; case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER: if (remain < 6) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); // cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, (byte)ProfileShape.Circle, (byte)Extrusion.Straight); break; case (int)ScriptBaseClass.PRIM_TYPE_PRISM: if (remain < 6) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Straight); break; case (int)ScriptBaseClass.PRIM_TYPE_SPHERE: if (remain < 5) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); // cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // dimple SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, (byte)ProfileShape.HalfCircle, (byte)Extrusion.Curve1); break; case (int)ScriptBaseClass.PRIM_TYPE_TORUS: if (remain < 11) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); holesize = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); profilecut = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // taper_a revolutions = (float)rules.GetLSLFloatItem(idx++); radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, (byte)ProfileShape.Circle, (byte)Extrusion.Curve1); break; case (int)ScriptBaseClass.PRIM_TYPE_TUBE: if (remain < 11) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); holesize = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); profilecut = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // taper_a revolutions = (float)rules.GetLSLFloatItem(idx++); radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, (byte)ProfileShape.Square, (byte)Extrusion.Curve1); break; case (int)ScriptBaseClass.PRIM_TYPE_RING: if (remain < 11) return; face = (int)rules.GetLSLIntegerItem(idx++); // holeshape v = rules.GetVector3Item(idx++); //cut hollow = (float)rules.GetLSLFloatItem(idx++); twist = rules.GetVector3Item(idx++); holesize = rules.GetVector3Item(idx++); topshear = rules.GetVector3Item(idx++); profilecut = rules.GetVector3Item(idx++); taper_b = rules.GetVector3Item(idx++); // taper_a revolutions = (float)rules.GetLSLFloatItem(idx++); radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Curve1); break; case (int)ScriptBaseClass.PRIM_TYPE_SCULPT: if (remain < 2) return; string map = rules.Data[idx++].ToString(); face = (int)rules.GetLSLIntegerItem(idx++); // type SetPrimitiveShapeParams(part, map, face, (byte)Extrusion.Curve1); break; } break; case (int)ScriptBaseClass.PRIM_TEXTURE: if (remain < 5) return; face=(int)rules.GetLSLIntegerItem(idx++); string tex=rules.Data[idx++].ToString(); LSL_Vector repeats=rules.GetVector3Item(idx++); LSL_Vector offsets=rules.GetVector3Item(idx++); double rotation=(double)rules.GetLSLFloatItem(idx++); SetTexture(part, tex, face); ScaleTexture(part, repeats.x, repeats.y, face); OffsetTexture(part, offsets.x, offsets.y, face); RotateTexture(part, rotation, face); break; case (int)ScriptBaseClass.PRIM_COLOR: if (remain < 3) return; face=(int)rules.GetLSLIntegerItem(idx++); LSL_Vector color=rules.GetVector3Item(idx++); double alpha=(double)rules.GetLSLFloatItem(idx++); part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); SetAlpha(part, alpha, face); break; case (int)ScriptBaseClass.PRIM_FLEXIBLE: if (remain < 7) return; bool flexi = rules.GetLSLIntegerItem(idx++); int softness = rules.GetLSLIntegerItem(idx++); float gravity = (float)rules.GetLSLFloatItem(idx++); float friction = (float)rules.GetLSLFloatItem(idx++); float wind = (float)rules.GetLSLFloatItem(idx++); float tension = (float)rules.GetLSLFloatItem(idx++); LSL_Vector force = rules.GetVector3Item(idx++); SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force); break; case (int)ScriptBaseClass.PRIM_POINT_LIGHT: if (remain < 5) return; bool light = rules.GetLSLIntegerItem(idx++); LSL_Vector lightcolor = rules.GetVector3Item(idx++); float intensity = (float)rules.GetLSLFloatItem(idx++); float radius = (float)rules.GetLSLFloatItem(idx++); float falloff = (float)rules.GetLSLFloatItem(idx++); SetPointLight(part, light, lightcolor, intensity, radius, falloff); break; case (int)ScriptBaseClass.PRIM_GLOW: if (remain < 2) return; face = rules.GetLSLIntegerItem(idx++); float glow = (float)rules.GetLSLFloatItem(idx++); SetGlow(part, face, glow); break; case (int)ScriptBaseClass.PRIM_BUMP_SHINY: if (remain < 3) return; face = (int)rules.GetLSLIntegerItem(idx++); int shiny = (int)rules.GetLSLIntegerItem(idx++); Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++); SetShiny(part, face, shiny, bump); break; case (int)ScriptBaseClass.PRIM_FULLBRIGHT: if (remain < 2) return; face = rules.GetLSLIntegerItem(idx++); bool st = rules.GetLSLIntegerItem(idx++); SetFullBright(part, face , st); break; case (int)ScriptBaseClass.PRIM_MATERIAL: if (remain < 1) return; int mat = rules.GetLSLIntegerItem(idx++); if (mat < 0 || mat > 7) return; part.Material = Convert.ToByte(mat); break; case (int)ScriptBaseClass.PRIM_PHANTOM: if (remain < 1) return; string ph = rules.Data[idx++].ToString(); m_host.ParentGroup.ScriptSetPhantomStatus(ph.Equals("1")); break; case (int)ScriptBaseClass.PRIM_PHYSICS: if (remain < 1) return; string phy = rules.Data[idx++].ToString(); bool physics; if (phy.Equals("1")) physics = true; else physics = false; part.ScriptSetPhysicsStatus(physics); break; case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: if (remain < 1) return; string temp = rules.Data[idx++].ToString(); m_host.ParentGroup.ScriptSetTemporaryStatus(temp.Equals("1")); break; case (int)ScriptBaseClass.PRIM_TEXGEN: if (remain < 2) return; //face,type face = rules.GetLSLIntegerItem(idx++); int style = rules.GetLSLIntegerItem(idx++); SetTexGen(part, face, style); break; case (int)ScriptBaseClass.PRIM_TEXT: if (remain < 3) return; string primText = rules.GetLSLStringItem(idx++); LSL_Vector primTextColor = rules.GetVector3Item(idx++); LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++); Vector3 av3 = new Vector3(Util.Clip((float)primTextColor.x, 0.0f, 1.0f), Util.Clip((float)primTextColor.y, 0.0f, 1.0f), Util.Clip((float)primTextColor.z, 0.0f, 1.0f)); part.SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f)); break; case (int)ScriptBaseClass.PRIM_NAME: if (remain < 1) return; string primName = rules.GetLSLStringItem(idx++); part.Name = primName; break; case (int)ScriptBaseClass.PRIM_DESC: if (remain < 1) return; string primDesc = rules.GetLSLStringItem(idx++); part.Description = primDesc; break; case (int)ScriptBaseClass.PRIM_ROT_LOCAL: if (remain < 1) return; LSL_Rotation lr = rules.GetQuaternionItem(idx++); SetRot(part, Rot2Quaternion(lr)); break; case (int)ScriptBaseClass.PRIM_OMEGA: if (remain < 3) return; LSL_Vector axis = rules.GetVector3Item(idx++); LSL_Float spinrate = rules.GetLSLFloatItem(idx++); LSL_Float gain = rules.GetLSLFloatItem(idx++); TargetOmega(part, axis, (double)spinrate, (double)gain); break; case (int)ScriptBaseClass.PRIM_LINK_TARGET: if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. return; LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); LSL_List new_rules = rules.GetSublist(idx, -1); setLinkPrimParams((int)new_linknumber, new_rules); return; } } } finally { if (positionChanged) { if (part.ParentGroup.RootPart == part) { SceneObjectGroup parent = part.ParentGroup; parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z)); } else { part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z); SceneObjectGroup parent = part.ParentGroup; parent.HasGroupChanged = true; parent.ScheduleGroupForTerseUpdate(); } } } }
protected LSL_List SetPrimParams(SceneObjectPart part, LSL_List rules, string originFunc, ref uint rulesParsed) { int idx = 0; int idxStart = 0; bool positionChanged = false; LSL_Vector currentPosition = GetPartLocalPos(part); try { while (idx < rules.Length) { ++rulesParsed; int code = rules.GetLSLIntegerItem(idx++); int remain = rules.Length - idx; idxStart = idx; int face; LSL_Vector v; switch (code) { case ScriptBaseClass.PRIM_POSITION: case ScriptBaseClass.PRIM_POS_LOCAL: if (remain < 1) return new LSL_List(); try { v = rules.GetVector3Item(idx++); } catch(InvalidCastException) { if(code == ScriptBaseClass.PRIM_POSITION) Error(originFunc, string.Format("Error running rule #{0} -> PRIM_POSITION: arg #{1} - parameter 1 must be vector", rulesParsed, idx - idxStart - 1)); else Error(originFunc, string.Format("Error running rule #{0} -> PRIM_POS_LOCAL: arg #{1} - parameter 1 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } positionChanged = true; currentPosition = GetSetPosTarget(part, v, currentPosition); break; case ScriptBaseClass.PRIM_SIZE: if (remain < 1) return new LSL_List(); v=rules.GetVector3Item(idx++); SetScale(part, v); break; case ScriptBaseClass.PRIM_ROTATION: if (remain < 1) return new LSL_List(); LSL_Rotation q; try { q = rules.GetQuaternionItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_ROTATION: arg #{1} - parameter 1 must be rotation", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } // try to let this work as in SL... if (part.ParentID == 0) { // special case: If we are root, rotate complete SOG to new rotation SetRot(part, q); } else { // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. SceneObjectPart rootPart = part.ParentGroup.RootPart; SetRot(part, rootPart.RotationOffset * (Quaternion)q); } break; case ScriptBaseClass.PRIM_TYPE: if (remain < 3) return new LSL_List(); try { code = (int)rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE: arg #{1} - parameter 1 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } remain = rules.Length - idx; float hollow; LSL_Vector twist; LSL_Vector taper_b; LSL_Vector topshear; float revolutions; float radiusoffset; float skew; LSL_Vector holesize; LSL_Vector profilecut; switch (code) { case ScriptBaseClass.PRIM_TYPE_BOX: if (remain < 6) return new LSL_List(); try { face = (int)rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_BOX: arg #{1} - parameter 2 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { v = rules.GetVector3Item(idx++); // cut } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_BOX: arg #{1} - parameter 3 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { hollow = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_BOX: arg #{1} - parameter 4 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { twist = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_BOX: arg #{1} - parameter 5 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { taper_b = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_BOX: arg #{1} - parameter 6 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { topshear = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_BOX: arg #{1} - parameter 7 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, (byte)ProfileShape.Square, (byte)Extrusion.Straight); break; case ScriptBaseClass.PRIM_TYPE_CYLINDER: if (remain < 6) return new LSL_List(); try { face = (int)rules.GetLSLIntegerItem(idx++); // holeshape } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_CYLINDER: arg #{1} - parameter 3 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { v = rules.GetVector3Item(idx++); // cut } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_CYLINDER: arg #{1} - parameter 4 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { hollow = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_CYLINDER: arg #{1} - parameter 5 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { twist = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_CYLINDER: arg #{1} - parameter 6 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { taper_b = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_CYLINDER: arg #{1} - parameter 7 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { topshear = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_CYLINDER: arg #{1} - parameter 8 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, (byte)ProfileShape.Circle, (byte)Extrusion.Straight); break; case ScriptBaseClass.PRIM_TYPE_PRISM: if (remain < 6) return new LSL_List(); try { face = (int)rules.GetLSLIntegerItem(idx++); // holeshape } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_PRISM: arg #{1} - parameter 3 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { v = rules.GetVector3Item(idx++); //cut } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_PRISM: arg #{1} - parameter 4 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { hollow = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_PRISM: arg #{1} - parameter 5 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { twist = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_PRISM: arg #{1} - parameter 6 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { taper_b = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_PRISM: arg #{1} - parameter 7 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { topshear = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_PRISM: arg #{1} - parameter 8 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Straight); break; case ScriptBaseClass.PRIM_TYPE_SPHERE: if (remain < 5) return new LSL_List(); try { face = (int)rules.GetLSLIntegerItem(idx++); // holeshape } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_SPHERE: arg #{1} - parameter 3 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { v = rules.GetVector3Item(idx++); // cut } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_SPHERE: arg #{1} - parameter 4 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { hollow = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_SPHERE: arg #{1} - parameter 5 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { twist = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_SPHERE: arg #{1} - parameter 6 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { taper_b = rules.GetVector3Item(idx++); // dimple } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_SPHERE: arg #{1} - parameter 7 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, (byte)ProfileShape.HalfCircle, (byte)Extrusion.Curve1); break; case ScriptBaseClass.PRIM_TYPE_TORUS: if (remain < 11) return new LSL_List(); try { face = (int)rules.GetLSLIntegerItem(idx++); // holeshape } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TORUS: arg #{1} - parameter 3 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { v = rules.GetVector3Item(idx++); //cut } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TORUS: arg #{1} - parameter 4 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { hollow = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TORUS: arg #{1} - parameter 5 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { twist = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TORUS: arg #{1} - parameter 6 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { holesize = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TORUS: arg #{1} - parameter 7 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { topshear = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TORUS: arg #{1} - parameter 8 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { profilecut = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TORUS: arg #{1} - parameter 9 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { taper_b = rules.GetVector3Item(idx++); // taper_a } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TORUS: arg #{1} - parameter 10 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { revolutions = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TORUS: arg #{1} - parameter 11 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { radiusoffset = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TORUS: arg #{1} - parameter 12 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { skew = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TORUS: arg #{1} - parameter 13 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, (byte)ProfileShape.Circle, (byte)Extrusion.Curve1); break; case ScriptBaseClass.PRIM_TYPE_TUBE: if (remain < 11) return new LSL_List(); try { face = (int)rules.GetLSLIntegerItem(idx++); // holeshape } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TUBE: arg #{1} - parameter 3 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { v = rules.GetVector3Item(idx++); //cut } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TUBE: arg #{1} - parameter 4 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { hollow = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TUBE: arg #{1} - parameter 5 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { twist = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TUBE: arg #{1} - parameter 6 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { holesize = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TUBE: arg #{1} - parameter 7 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { topshear = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TUBE: arg #{1} - parameter 8 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { profilecut = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TUBE: arg #{1} - parameter 9 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { taper_b = rules.GetVector3Item(idx++); // taper_a } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TUBE: arg #{1} - parameter 10 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { revolutions = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TUBE: arg #{1} - parameter 11 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { radiusoffset = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TUBE: arg #{1} - parameter 12 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { skew = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_TUBE: arg #{1} - parameter 13 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, (byte)ProfileShape.Square, (byte)Extrusion.Curve1); break; case ScriptBaseClass.PRIM_TYPE_RING: if (remain < 11) return new LSL_List(); try { face = (int)rules.GetLSLIntegerItem(idx++); // holeshape } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_RING: arg #{1} - parameter 3 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { v = rules.GetVector3Item(idx++); //cut } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_RING: arg #{1} - parameter 4 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { hollow = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_RING: arg #{1} - parameter 5 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { twist = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_RING: arg #{1} - parameter 6 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { holesize = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_RING: arg #{1} - parameter 7 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { topshear = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_RING: arg #{1} - parameter 8 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { profilecut = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_RING: arg #{1} - parameter 9 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { taper_b = rules.GetVector3Item(idx++); // taper_a } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_RING: arg #{1} - parameter 10 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { revolutions = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_RING: arg #{1} - parameter 11 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { radiusoffset = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_RING: arg #{1} - parameter 12 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { skew = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_RING: arg #{1} - parameter 13 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Curve1); break; case ScriptBaseClass.PRIM_TYPE_SCULPT: if (remain < 2) return new LSL_List(); string map = rules.Data[idx++].ToString(); try { face = (int)rules.GetLSLIntegerItem(idx++); // type } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TYPE, PRIM_TYPE_SCULPT: arg #{1} - parameter 4 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetPrimitiveShapeParams(part, map, face, (byte)Extrusion.Curve1); break; } break; case ScriptBaseClass.PRIM_TEXTURE: if (remain < 5) return new LSL_List(); face=(int)rules.GetLSLIntegerItem(idx++); string tex; LSL_Vector repeats; LSL_Vector offsets; double rotation; tex = rules.Data[idx++].ToString(); try { repeats = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TEXTURE: arg #{1} - parameter 3 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { offsets = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TEXTURE: arg #{1} - parameter 4 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { rotation = (double)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TEXTURE: arg #{1} - parameter 5 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetTexture(part, tex, face); ScaleTexture(part, repeats.x, repeats.y, face); OffsetTexture(part, offsets.x, offsets.y, face); RotateTexture(part, rotation, face); break; case ScriptBaseClass.PRIM_COLOR: if (remain < 3) return new LSL_List(); LSL_Vector color; double alpha; try { face = (int)rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_COLOR: arg #{1} - parameter 2 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { color = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_COLOR: arg #{1} - parameter 3 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { alpha = (double)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_COLOR: arg #{1} - parameter 4 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } part.SetFaceColorAlpha(face, color, alpha); break; case ScriptBaseClass.PRIM_FLEXIBLE: if (remain < 7) return new LSL_List(); bool flexi; int softness; float gravity; float friction; float wind; float tension; LSL_Vector force; try { flexi = rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_FLEXIBLE: arg #{1} - parameter 2 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { softness = rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_FLEXIBLE: arg #{1} - parameter 3 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { gravity = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_FLEXIBLE: arg #{1} - parameter 4 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { friction = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_FLEXIBLE: arg #{1} - parameter 5 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { wind = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_FLEXIBLE: arg #{1} - parameter 6 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { tension = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_FLEXIBLE: arg #{1} - parameter 7 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { force = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_FLEXIBLE: arg #{1} - parameter 8 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force); break; case ScriptBaseClass.PRIM_POINT_LIGHT: if (remain < 5) return new LSL_List(); bool light; LSL_Vector lightcolor; float intensity; float radius; float falloff; try { light = rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_POINT_LIGHT: arg #{1} - parameter 2 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { lightcolor = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_POINT_LIGHT: arg #{1} - parameter 3 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { intensity = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_POINT_LIGHT: arg #{1} - parameter 4 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { radius = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_POINT_LIGHT: arg #{1} - parameter 5 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { falloff = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_POINT_LIGHT: arg #{1} - parameter 6 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetPointLight(part, light, lightcolor, intensity, radius, falloff); break; case ScriptBaseClass.PRIM_GLOW: if (remain < 2) return new LSL_List(); float glow; try { face = rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_GLOW: arg #{1} - parameter 2 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { glow = (float)rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_GLOW: arg #{1} - parameter 3 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetGlow(part, face, glow); break; case ScriptBaseClass.PRIM_BUMP_SHINY: if (remain < 3) return new LSL_List(); int shiny; Bumpiness bump; try { face = (int)rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_BUMP_SHINY: arg #{1} - parameter 2 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { shiny = (int)rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_BUMP_SHINY: arg #{1} - parameter 3 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_BUMP_SHINY: arg #{1} - parameter 4 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetShiny(part, face, shiny, bump); break; case ScriptBaseClass.PRIM_FULLBRIGHT: if (remain < 2) return new LSL_List(); bool st; try { face = rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_FULLBRIGHT: arg #{1} - parameter 2 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { st = rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_FULLBRIGHT: arg #{1} - parameter 4 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetFullBright(part, face , st); break; case ScriptBaseClass.PRIM_MATERIAL: if (remain < 1) return new LSL_List(); int mat; try { mat = rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_MATERIAL: arg #{1} - parameter 2 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } if (mat < 0 || mat > 7) return new LSL_List(); part.Material = Convert.ToByte(mat); break; case ScriptBaseClass.PRIM_PHANTOM: if (remain < 1) return new LSL_List(); string ph = rules.Data[idx++].ToString(); part.ParentGroup.ScriptSetPhantomStatus(ph.Equals("1")); break; case ScriptBaseClass.PRIM_PHYSICS: if (remain < 1) return new LSL_List(); string phy = rules.Data[idx++].ToString(); part.ScriptSetPhysicsStatus(phy.Equals("1")); break; case ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE: if (remain < 1) return new LSL_List(); int shape_type; try { shape_type = rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_PHYSICS_SHAPE_TYPE: arg #{1} - parameter 2 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } ExtraPhysicsData physdata = new ExtraPhysicsData(); physdata.Density = part.Density; physdata.Bounce = part.Restitution; physdata.GravitationModifier = part.GravityModifier; physdata.PhysShapeType = (PhysShapeType)shape_type; part.UpdateExtraPhysics(physdata); break; case ScriptBaseClass.PRIM_TEMP_ON_REZ: if (remain < 1) return new LSL_List(); string temp = rules.Data[idx++].ToString(); part.ParentGroup.ScriptSetTemporaryStatus(temp.Equals("1")); break; case ScriptBaseClass.PRIM_TEXGEN: if (remain < 2) return new LSL_List(); //face,type int style; try { face = rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TEXGEN: arg #{1} - parameter 2 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { style = rules.GetLSLIntegerItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TEXGEN: arg #{1} - parameter 3 must be integer", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetTexGen(part, face, style); break; case ScriptBaseClass.PRIM_TEXT: if (remain < 3) return new LSL_List(); string primText; LSL_Vector primTextColor; LSL_Float primTextAlpha; try { primText = rules.GetLSLStringItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TEXT: arg #{1} - parameter 2 must be string", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { primTextColor = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TEXT: arg #{1} - parameter 3 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { primTextAlpha = rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_TEXT: arg #{1} - parameter 4 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } Vector3 av3 = Util.Clip(primTextColor, 0.0f, 1.0f); part.SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f)); break; case ScriptBaseClass.PRIM_NAME: if (remain < 1) return new LSL_List(); try { string primName = rules.GetLSLStringItem(idx++); part.Name = primName; } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_NAME: arg #{1} - parameter 2 must be string", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } break; case ScriptBaseClass.PRIM_DESC: if (remain < 1) return new LSL_List(); try { string primDesc = rules.GetLSLStringItem(idx++); part.Description = primDesc; } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_DESC: arg #{1} - parameter 2 must be string", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } break; case ScriptBaseClass.PRIM_ROT_LOCAL: if (remain < 1) return new LSL_List(); LSL_Rotation rot; try { rot = rules.GetQuaternionItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_ROT_LOCAL: arg #{1} - parameter 2 must be rotation", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } SetRot(part, rot); break; case ScriptBaseClass.PRIM_OMEGA: if (remain < 3) return new LSL_List(); LSL_Vector axis; LSL_Float spinrate; LSL_Float gain; try { axis = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_OMEGA: arg #{1} - parameter 2 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { spinrate = rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_OMEGA: arg #{1} - parameter 3 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } try { gain = rules.GetLSLFloatItem(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_OMEGA: arg #{1} - parameter 4 must be float", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } TargetOmega(part, axis, (double)spinrate, (double)gain); break; case ScriptBaseClass.PRIM_SLICE: if (remain < 1) return new LSL_List(); LSL_Vector slice; try { slice = rules.GetVector3Item(idx++); } catch(InvalidCastException) { Error(originFunc, string.Format("Error running rule #{0} -> PRIM_SLICE: arg #{1} - parameter 2 must be vector", rulesParsed, idx - idxStart - 1)); return new LSL_List(); } part.UpdateSlice((float)slice.x, (float)slice.y); break; case ScriptBaseClass.PRIM_LINK_TARGET: if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. return new LSL_List(); return rules.GetSublist(idx, -1); default: Error(originFunc, string.Format("Error running rule #{0}: arg #{1} - unsupported parameter", rulesParsed, idx - idxStart)); return new LSL_List(); } } } catch (InvalidCastException e) { Error(originFunc, string.Format("Error running rule #{0}: arg #{1} - ", rulesParsed, idx - idxStart) + e.Message); } finally { if (positionChanged) { if (part.ParentGroup.RootPart == part) { SceneObjectGroup parent = part.ParentGroup; parent.UpdateGroupPosition(currentPosition); } else { part.OffsetPosition = currentPosition; SceneObjectGroup parent = part.ParentGroup; parent.HasGroupChanged = true; parent.ScheduleGroupForTerseUpdate(); } } } return new LSL_List(); }