diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 672 |
1 files changed, 350 insertions, 322 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index ebe276b..652fa7e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2168,7 +2168,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2168 | return fromPos; | 2168 | return fromPos; |
2169 | 2169 | ||
2170 | // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) | 2170 | // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) |
2171 | 2171 | ||
2172 | 2172 | ||
2173 | float ground = World.GetGroundHeight((float)targetPos.x, (float)targetPos.y); | 2173 | float ground = World.GetGroundHeight((float)targetPos.x, (float)targetPos.y); |
2174 | bool disable_underground_movement = m_ScriptEngine.Config.GetBoolean("DisableUndergroundMovement", true); | 2174 | bool disable_underground_movement = m_ScriptEngine.Config.GetBoolean("DisableUndergroundMovement", true); |
@@ -7504,6 +7504,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7504 | { | 7504 | { |
7505 | m_host.AddScriptLPS(1); | 7505 | m_host.AddScriptLPS(1); |
7506 | 7506 | ||
7507 | setLinkPrimParams(linknumber, rules); | ||
7508 | } | ||
7509 | |||
7510 | private void setLinkPrimParams(int linknumber, LSL_List rules) | ||
7511 | { | ||
7507 | List<SceneObjectPart> parts = GetLinkParts(linknumber); | 7512 | List<SceneObjectPart> parts = GetLinkParts(linknumber); |
7508 | List<ScenePresence> avatars = GetLinkAvatars(linknumber); | 7513 | List<ScenePresence> avatars = GetLinkAvatars(linknumber); |
7509 | if (parts.Count>0) | 7514 | if (parts.Count>0) |
@@ -7581,380 +7586,403 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7581 | bool positionChanged = false; | 7586 | bool positionChanged = false; |
7582 | LSL_Vector currentPosition = GetPartLocalPos(part); | 7587 | LSL_Vector currentPosition = GetPartLocalPos(part); |
7583 | 7588 | ||
7584 | while (idx < rules.Length) | 7589 | try |
7585 | { | 7590 | { |
7586 | int code = rules.GetLSLIntegerItem(idx++); | 7591 | while (idx < rules.Length) |
7587 | |||
7588 | int remain = rules.Length - idx; | ||
7589 | |||
7590 | int face; | ||
7591 | LSL_Vector v; | ||
7592 | |||
7593 | switch (code) | ||
7594 | { | 7592 | { |
7595 | case (int)ScriptBaseClass.PRIM_POSITION: | 7593 | int code = rules.GetLSLIntegerItem(idx++); |
7596 | if (remain < 1) | ||
7597 | return; | ||
7598 | 7594 | ||
7599 | v=rules.GetVector3Item(idx++); | 7595 | int remain = rules.Length - idx; |
7600 | positionChanged = true; | ||
7601 | currentPosition = GetSetPosTarget(part, v, currentPosition); | ||
7602 | 7596 | ||
7603 | break; | 7597 | int face; |
7604 | case (int)ScriptBaseClass.PRIM_SIZE: | 7598 | LSL_Vector v; |
7605 | if (remain < 1) | ||
7606 | return; | ||
7607 | |||
7608 | v=rules.GetVector3Item(idx++); | ||
7609 | SetScale(part, v); | ||
7610 | 7599 | ||
7611 | break; | 7600 | switch (code) |
7612 | case (int)ScriptBaseClass.PRIM_ROTATION: | 7601 | { |
7613 | if (remain < 1) | 7602 | case (int)ScriptBaseClass.PRIM_POSITION: |
7614 | return; | 7603 | if (remain < 1) |
7615 | 7604 | return; | |
7616 | LSL_Rotation q = rules.GetQuaternionItem(idx++); | ||
7617 | // try to let this work as in SL... | ||
7618 | if (part.ParentID == 0) | ||
7619 | { | ||
7620 | // special case: If we are root, rotate complete SOG to new rotation | ||
7621 | SetRot(part, Rot2Quaternion(q)); | ||
7622 | } | ||
7623 | else | ||
7624 | { | ||
7625 | // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. | ||
7626 | SceneObjectPart rootPart = part.ParentGroup.RootPart; | ||
7627 | SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q)); | ||
7628 | } | ||
7629 | |||
7630 | break; | ||
7631 | |||
7632 | case (int)ScriptBaseClass.PRIM_TYPE: | ||
7633 | if (remain < 3) | ||
7634 | return; | ||
7635 | 7605 | ||
7636 | code = (int)rules.GetLSLIntegerItem(idx++); | 7606 | v=rules.GetVector3Item(idx++); |
7607 | positionChanged = true; | ||
7608 | currentPosition = GetSetPosTarget(part, v, currentPosition); | ||
7637 | 7609 | ||
7638 | remain = rules.Length - idx; | 7610 | break; |
7639 | float hollow; | 7611 | case (int)ScriptBaseClass.PRIM_SIZE: |
7640 | LSL_Vector twist; | 7612 | if (remain < 1) |
7641 | LSL_Vector taper_b; | 7613 | return; |
7642 | LSL_Vector topshear; | ||
7643 | float revolutions; | ||
7644 | float radiusoffset; | ||
7645 | float skew; | ||
7646 | LSL_Vector holesize; | ||
7647 | LSL_Vector profilecut; | ||
7648 | 7614 | ||
7649 | switch (code) | 7615 | v=rules.GetVector3Item(idx++); |
7650 | { | 7616 | SetScale(part, v); |
7651 | case (int)ScriptBaseClass.PRIM_TYPE_BOX: | ||
7652 | if (remain < 6) | ||
7653 | return; | ||
7654 | |||
7655 | face = (int)rules.GetLSLIntegerItem(idx++); | ||
7656 | v = rules.GetVector3Item(idx++); // cut | ||
7657 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7658 | twist = rules.GetVector3Item(idx++); | ||
7659 | taper_b = rules.GetVector3Item(idx++); | ||
7660 | topshear = rules.GetVector3Item(idx++); | ||
7661 | |||
7662 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, | ||
7663 | (byte)ProfileShape.Square, (byte)Extrusion.Straight); | ||
7664 | break; | ||
7665 | 7617 | ||
7666 | case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER: | 7618 | break; |
7667 | if (remain < 6) | 7619 | case (int)ScriptBaseClass.PRIM_ROTATION: |
7668 | return; | 7620 | if (remain < 1) |
7669 | 7621 | return; | |
7670 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | ||
7671 | v = rules.GetVector3Item(idx++); // cut | ||
7672 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7673 | twist = rules.GetVector3Item(idx++); | ||
7674 | taper_b = rules.GetVector3Item(idx++); | ||
7675 | topshear = rules.GetVector3Item(idx++); | ||
7676 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, | ||
7677 | (byte)ProfileShape.Circle, (byte)Extrusion.Straight); | ||
7678 | break; | ||
7679 | 7622 | ||
7680 | case (int)ScriptBaseClass.PRIM_TYPE_PRISM: | 7623 | LSL_Rotation q = rules.GetQuaternionItem(idx++); |
7681 | if (remain < 6) | 7624 | // try to let this work as in SL... |
7682 | return; | 7625 | if (part.ParentID == 0) |
7683 | 7626 | { | |
7684 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | 7627 | // special case: If we are root, rotate complete SOG to new rotation |
7685 | v = rules.GetVector3Item(idx++); //cut | 7628 | SetRot(part, Rot2Quaternion(q)); |
7686 | hollow = (float)rules.GetLSLFloatItem(idx++); | 7629 | } |
7687 | twist = rules.GetVector3Item(idx++); | 7630 | else |
7688 | taper_b = rules.GetVector3Item(idx++); | 7631 | { |
7689 | topshear = rules.GetVector3Item(idx++); | 7632 | // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. |
7690 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, | 7633 | SceneObjectPart rootPart = part.ParentGroup.RootPart; |
7691 | (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Straight); | 7634 | SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q)); |
7692 | break; | 7635 | } |
7693 | 7636 | ||
7694 | case (int)ScriptBaseClass.PRIM_TYPE_SPHERE: | 7637 | break; |
7695 | if (remain < 5) | ||
7696 | return; | ||
7697 | |||
7698 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | ||
7699 | v = rules.GetVector3Item(idx++); // cut | ||
7700 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7701 | twist = rules.GetVector3Item(idx++); | ||
7702 | taper_b = rules.GetVector3Item(idx++); // dimple | ||
7703 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, | ||
7704 | (byte)ProfileShape.HalfCircle, (byte)Extrusion.Curve1); | ||
7705 | break; | ||
7706 | 7638 | ||
7707 | case (int)ScriptBaseClass.PRIM_TYPE_TORUS: | 7639 | case (int)ScriptBaseClass.PRIM_TYPE: |
7708 | if (remain < 11) | 7640 | if (remain < 3) |
7709 | return; | 7641 | return; |
7710 | |||
7711 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | ||
7712 | v = rules.GetVector3Item(idx++); //cut | ||
7713 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7714 | twist = rules.GetVector3Item(idx++); | ||
7715 | holesize = rules.GetVector3Item(idx++); | ||
7716 | topshear = rules.GetVector3Item(idx++); | ||
7717 | profilecut = rules.GetVector3Item(idx++); | ||
7718 | taper_b = rules.GetVector3Item(idx++); // taper_a | ||
7719 | revolutions = (float)rules.GetLSLFloatItem(idx++); | ||
7720 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); | ||
7721 | skew = (float)rules.GetLSLFloatItem(idx++); | ||
7722 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, | ||
7723 | revolutions, radiusoffset, skew, (byte)ProfileShape.Circle, (byte)Extrusion.Curve1); | ||
7724 | break; | ||
7725 | 7642 | ||
7726 | case (int)ScriptBaseClass.PRIM_TYPE_TUBE: | 7643 | code = (int)rules.GetLSLIntegerItem(idx++); |
7727 | if (remain < 11) | ||
7728 | return; | ||
7729 | |||
7730 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | ||
7731 | v = rules.GetVector3Item(idx++); //cut | ||
7732 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7733 | twist = rules.GetVector3Item(idx++); | ||
7734 | holesize = rules.GetVector3Item(idx++); | ||
7735 | topshear = rules.GetVector3Item(idx++); | ||
7736 | profilecut = rules.GetVector3Item(idx++); | ||
7737 | taper_b = rules.GetVector3Item(idx++); // taper_a | ||
7738 | revolutions = (float)rules.GetLSLFloatItem(idx++); | ||
7739 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); | ||
7740 | skew = (float)rules.GetLSLFloatItem(idx++); | ||
7741 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, | ||
7742 | revolutions, radiusoffset, skew, (byte)ProfileShape.Square, (byte)Extrusion.Curve1); | ||
7743 | break; | ||
7744 | 7644 | ||
7745 | case (int)ScriptBaseClass.PRIM_TYPE_RING: | 7645 | remain = rules.Length - idx; |
7746 | if (remain < 11) | 7646 | float hollow; |
7747 | return; | 7647 | LSL_Vector twist; |
7748 | 7648 | LSL_Vector taper_b; | |
7749 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | 7649 | LSL_Vector topshear; |
7750 | v = rules.GetVector3Item(idx++); //cut | 7650 | float revolutions; |
7751 | hollow = (float)rules.GetLSLFloatItem(idx++); | 7651 | float radiusoffset; |
7752 | twist = rules.GetVector3Item(idx++); | 7652 | float skew; |
7753 | holesize = rules.GetVector3Item(idx++); | 7653 | LSL_Vector holesize; |
7754 | topshear = rules.GetVector3Item(idx++); | 7654 | LSL_Vector profilecut; |
7755 | profilecut = rules.GetVector3Item(idx++); | ||
7756 | taper_b = rules.GetVector3Item(idx++); // taper_a | ||
7757 | revolutions = (float)rules.GetLSLFloatItem(idx++); | ||
7758 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); | ||
7759 | skew = (float)rules.GetLSLFloatItem(idx++); | ||
7760 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, | ||
7761 | revolutions, radiusoffset, skew, (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Curve1); | ||
7762 | break; | ||
7763 | 7655 | ||
7764 | case (int)ScriptBaseClass.PRIM_TYPE_SCULPT: | 7656 | switch (code) |
7765 | if (remain < 2) | 7657 | { |
7766 | return; | 7658 | case (int)ScriptBaseClass.PRIM_TYPE_BOX: |
7659 | if (remain < 6) | ||
7660 | return; | ||
7661 | |||
7662 | face = (int)rules.GetLSLIntegerItem(idx++); | ||
7663 | v = rules.GetVector3Item(idx++); // cut | ||
7664 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7665 | twist = rules.GetVector3Item(idx++); | ||
7666 | taper_b = rules.GetVector3Item(idx++); | ||
7667 | topshear = rules.GetVector3Item(idx++); | ||
7668 | |||
7669 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, | ||
7670 | (byte)ProfileShape.Square, (byte)Extrusion.Straight); | ||
7671 | break; | ||
7672 | |||
7673 | case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER: | ||
7674 | if (remain < 6) | ||
7675 | return; | ||
7676 | |||
7677 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | ||
7678 | v = rules.GetVector3Item(idx++); // cut | ||
7679 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7680 | twist = rules.GetVector3Item(idx++); | ||
7681 | taper_b = rules.GetVector3Item(idx++); | ||
7682 | topshear = rules.GetVector3Item(idx++); | ||
7683 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, | ||
7684 | (byte)ProfileShape.Circle, (byte)Extrusion.Straight); | ||
7685 | break; | ||
7686 | |||
7687 | case (int)ScriptBaseClass.PRIM_TYPE_PRISM: | ||
7688 | if (remain < 6) | ||
7689 | return; | ||
7690 | |||
7691 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | ||
7692 | v = rules.GetVector3Item(idx++); //cut | ||
7693 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7694 | twist = rules.GetVector3Item(idx++); | ||
7695 | taper_b = rules.GetVector3Item(idx++); | ||
7696 | topshear = rules.GetVector3Item(idx++); | ||
7697 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, topshear, | ||
7698 | (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Straight); | ||
7699 | break; | ||
7700 | |||
7701 | case (int)ScriptBaseClass.PRIM_TYPE_SPHERE: | ||
7702 | if (remain < 5) | ||
7703 | return; | ||
7704 | |||
7705 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | ||
7706 | v = rules.GetVector3Item(idx++); // cut | ||
7707 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7708 | twist = rules.GetVector3Item(idx++); | ||
7709 | taper_b = rules.GetVector3Item(idx++); // dimple | ||
7710 | SetPrimitiveShapeParams(part, face, v, hollow, twist, taper_b, | ||
7711 | (byte)ProfileShape.HalfCircle, (byte)Extrusion.Curve1); | ||
7712 | break; | ||
7713 | |||
7714 | case (int)ScriptBaseClass.PRIM_TYPE_TORUS: | ||
7715 | if (remain < 11) | ||
7716 | return; | ||
7717 | |||
7718 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | ||
7719 | v = rules.GetVector3Item(idx++); //cut | ||
7720 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7721 | twist = rules.GetVector3Item(idx++); | ||
7722 | holesize = rules.GetVector3Item(idx++); | ||
7723 | topshear = rules.GetVector3Item(idx++); | ||
7724 | profilecut = rules.GetVector3Item(idx++); | ||
7725 | taper_b = rules.GetVector3Item(idx++); // taper_a | ||
7726 | revolutions = (float)rules.GetLSLFloatItem(idx++); | ||
7727 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); | ||
7728 | skew = (float)rules.GetLSLFloatItem(idx++); | ||
7729 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, | ||
7730 | revolutions, radiusoffset, skew, (byte)ProfileShape.Circle, (byte)Extrusion.Curve1); | ||
7731 | break; | ||
7732 | |||
7733 | case (int)ScriptBaseClass.PRIM_TYPE_TUBE: | ||
7734 | if (remain < 11) | ||
7735 | return; | ||
7736 | |||
7737 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | ||
7738 | v = rules.GetVector3Item(idx++); //cut | ||
7739 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7740 | twist = rules.GetVector3Item(idx++); | ||
7741 | holesize = rules.GetVector3Item(idx++); | ||
7742 | topshear = rules.GetVector3Item(idx++); | ||
7743 | profilecut = rules.GetVector3Item(idx++); | ||
7744 | taper_b = rules.GetVector3Item(idx++); // taper_a | ||
7745 | revolutions = (float)rules.GetLSLFloatItem(idx++); | ||
7746 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); | ||
7747 | skew = (float)rules.GetLSLFloatItem(idx++); | ||
7748 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, | ||
7749 | revolutions, radiusoffset, skew, (byte)ProfileShape.Square, (byte)Extrusion.Curve1); | ||
7750 | break; | ||
7751 | |||
7752 | case (int)ScriptBaseClass.PRIM_TYPE_RING: | ||
7753 | if (remain < 11) | ||
7754 | return; | ||
7755 | |||
7756 | face = (int)rules.GetLSLIntegerItem(idx++); // holeshape | ||
7757 | v = rules.GetVector3Item(idx++); //cut | ||
7758 | hollow = (float)rules.GetLSLFloatItem(idx++); | ||
7759 | twist = rules.GetVector3Item(idx++); | ||
7760 | holesize = rules.GetVector3Item(idx++); | ||
7761 | topshear = rules.GetVector3Item(idx++); | ||
7762 | profilecut = rules.GetVector3Item(idx++); | ||
7763 | taper_b = rules.GetVector3Item(idx++); // taper_a | ||
7764 | revolutions = (float)rules.GetLSLFloatItem(idx++); | ||
7765 | radiusoffset = (float)rules.GetLSLFloatItem(idx++); | ||
7766 | skew = (float)rules.GetLSLFloatItem(idx++); | ||
7767 | SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, | ||
7768 | revolutions, radiusoffset, skew, (byte)ProfileShape.EquilateralTriangle, (byte)Extrusion.Curve1); | ||
7769 | break; | ||
7770 | |||
7771 | case (int)ScriptBaseClass.PRIM_TYPE_SCULPT: | ||
7772 | if (remain < 2) | ||
7773 | return; | ||
7774 | |||
7775 | string map = rules.Data[idx++].ToString(); | ||
7776 | face = (int)rules.GetLSLIntegerItem(idx++); // type | ||
7777 | SetPrimitiveShapeParams(part, map, face, (byte)Extrusion.Curve1); | ||
7778 | break; | ||
7779 | } | ||
7767 | 7780 | ||
7768 | string map = rules.Data[idx++].ToString(); | 7781 | break; |
7769 | face = (int)rules.GetLSLIntegerItem(idx++); // type | ||
7770 | SetPrimitiveShapeParams(part, map, face, (byte)Extrusion.Curve1); | ||
7771 | break; | ||
7772 | } | ||
7773 | 7782 | ||
7774 | break; | 7783 | case (int)ScriptBaseClass.PRIM_TEXTURE: |
7784 | if (remain < 5) | ||
7785 | return; | ||
7775 | 7786 | ||
7776 | case (int)ScriptBaseClass.PRIM_TEXTURE: | 7787 | face=(int)rules.GetLSLIntegerItem(idx++); |
7777 | if (remain < 5) | 7788 | string tex=rules.Data[idx++].ToString(); |
7778 | return; | 7789 | LSL_Vector repeats=rules.GetVector3Item(idx++); |
7790 | LSL_Vector offsets=rules.GetVector3Item(idx++); | ||
7791 | double rotation=(double)rules.GetLSLFloatItem(idx++); | ||
7779 | 7792 | ||
7780 | face=(int)rules.GetLSLIntegerItem(idx++); | 7793 | SetTexture(part, tex, face); |
7781 | string tex=rules.Data[idx++].ToString(); | 7794 | ScaleTexture(part, repeats.x, repeats.y, face); |
7782 | LSL_Vector repeats=rules.GetVector3Item(idx++); | 7795 | OffsetTexture(part, offsets.x, offsets.y, face); |
7783 | LSL_Vector offsets=rules.GetVector3Item(idx++); | 7796 | RotateTexture(part, rotation, face); |
7784 | double rotation=(double)rules.GetLSLFloatItem(idx++); | ||
7785 | 7797 | ||
7786 | SetTexture(part, tex, face); | 7798 | break; |
7787 | ScaleTexture(part, repeats.x, repeats.y, face); | ||
7788 | OffsetTexture(part, offsets.x, offsets.y, face); | ||
7789 | RotateTexture(part, rotation, face); | ||
7790 | 7799 | ||
7791 | break; | 7800 | case (int)ScriptBaseClass.PRIM_COLOR: |
7801 | if (remain < 3) | ||
7802 | return; | ||
7792 | 7803 | ||
7793 | case (int)ScriptBaseClass.PRIM_COLOR: | 7804 | face=(int)rules.GetLSLIntegerItem(idx++); |
7794 | if (remain < 3) | 7805 | LSL_Vector color=rules.GetVector3Item(idx++); |
7795 | return; | 7806 | double alpha=(double)rules.GetLSLFloatItem(idx++); |
7796 | 7807 | ||
7797 | face=(int)rules.GetLSLIntegerItem(idx++); | 7808 | part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); |
7798 | LSL_Vector color=rules.GetVector3Item(idx++); | 7809 | SetAlpha(part, alpha, face); |
7799 | double alpha=(double)rules.GetLSLFloatItem(idx++); | ||
7800 | 7810 | ||
7801 | part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); | 7811 | break; |
7802 | SetAlpha(part, alpha, face); | ||
7803 | 7812 | ||
7804 | break; | 7813 | case (int)ScriptBaseClass.PRIM_FLEXIBLE: |
7814 | if (remain < 7) | ||
7815 | return; | ||
7805 | 7816 | ||
7806 | case (int)ScriptBaseClass.PRIM_FLEXIBLE: | 7817 | bool flexi = rules.GetLSLIntegerItem(idx++); |
7807 | if (remain < 7) | 7818 | int softness = rules.GetLSLIntegerItem(idx++); |
7808 | return; | 7819 | float gravity = (float)rules.GetLSLFloatItem(idx++); |
7820 | float friction = (float)rules.GetLSLFloatItem(idx++); | ||
7821 | float wind = (float)rules.GetLSLFloatItem(idx++); | ||
7822 | float tension = (float)rules.GetLSLFloatItem(idx++); | ||
7823 | LSL_Vector force = rules.GetVector3Item(idx++); | ||
7809 | 7824 | ||
7810 | bool flexi = rules.GetLSLIntegerItem(idx++); | 7825 | SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force); |
7811 | int softness = rules.GetLSLIntegerItem(idx++); | ||
7812 | float gravity = (float)rules.GetLSLFloatItem(idx++); | ||
7813 | float friction = (float)rules.GetLSLFloatItem(idx++); | ||
7814 | float wind = (float)rules.GetLSLFloatItem(idx++); | ||
7815 | float tension = (float)rules.GetLSLFloatItem(idx++); | ||
7816 | LSL_Vector force = rules.GetVector3Item(idx++); | ||
7817 | 7826 | ||
7818 | SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force); | 7827 | break; |
7819 | 7828 | ||
7820 | break; | 7829 | case (int)ScriptBaseClass.PRIM_POINT_LIGHT: |
7830 | if (remain < 5) | ||
7831 | return; | ||
7832 | bool light = rules.GetLSLIntegerItem(idx++); | ||
7833 | LSL_Vector lightcolor = rules.GetVector3Item(idx++); | ||
7834 | float intensity = (float)rules.GetLSLFloatItem(idx++); | ||
7835 | float radius = (float)rules.GetLSLFloatItem(idx++); | ||
7836 | float falloff = (float)rules.GetLSLFloatItem(idx++); | ||
7821 | 7837 | ||
7822 | case (int)ScriptBaseClass.PRIM_POINT_LIGHT: | 7838 | SetPointLight(part, light, lightcolor, intensity, radius, falloff); |
7823 | if (remain < 5) | ||
7824 | return; | ||
7825 | bool light = rules.GetLSLIntegerItem(idx++); | ||
7826 | LSL_Vector lightcolor = rules.GetVector3Item(idx++); | ||
7827 | float intensity = (float)rules.GetLSLFloatItem(idx++); | ||
7828 | float radius = (float)rules.GetLSLFloatItem(idx++); | ||
7829 | float falloff = (float)rules.GetLSLFloatItem(idx++); | ||
7830 | 7839 | ||
7831 | SetPointLight(part, light, lightcolor, intensity, radius, falloff); | 7840 | break; |
7832 | 7841 | ||
7833 | break; | 7842 | case (int)ScriptBaseClass.PRIM_GLOW: |
7843 | if (remain < 2) | ||
7844 | return; | ||
7845 | face = rules.GetLSLIntegerItem(idx++); | ||
7846 | float glow = (float)rules.GetLSLFloatItem(idx++); | ||
7834 | 7847 | ||
7835 | case (int)ScriptBaseClass.PRIM_GLOW: | 7848 | SetGlow(part, face, glow); |
7836 | if (remain < 2) | ||
7837 | return; | ||
7838 | face = rules.GetLSLIntegerItem(idx++); | ||
7839 | float glow = (float)rules.GetLSLFloatItem(idx++); | ||
7840 | 7849 | ||
7841 | SetGlow(part, face, glow); | 7850 | break; |
7842 | 7851 | ||
7843 | break; | 7852 | case (int)ScriptBaseClass.PRIM_BUMP_SHINY: |
7853 | if (remain < 3) | ||
7854 | return; | ||
7855 | face = (int)rules.GetLSLIntegerItem(idx++); | ||
7856 | int shiny = (int)rules.GetLSLIntegerItem(idx++); | ||
7857 | Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); | ||
7844 | 7858 | ||
7845 | case (int)ScriptBaseClass.PRIM_BUMP_SHINY: | 7859 | SetShiny(part, face, shiny, bump); |
7846 | if (remain < 3) | ||
7847 | return; | ||
7848 | face = (int)rules.GetLSLIntegerItem(idx++); | ||
7849 | int shiny = (int)rules.GetLSLIntegerItem(idx++); | ||
7850 | Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); | ||
7851 | 7860 | ||
7852 | SetShiny(part, face, shiny, bump); | 7861 | break; |
7853 | 7862 | ||
7854 | break; | 7863 | case (int)ScriptBaseClass.PRIM_FULLBRIGHT: |
7864 | if (remain < 2) | ||
7865 | return; | ||
7866 | face = rules.GetLSLIntegerItem(idx++); | ||
7867 | bool st = rules.GetLSLIntegerItem(idx++); | ||
7868 | SetFullBright(part, face , st); | ||
7869 | break; | ||
7855 | 7870 | ||
7856 | case (int)ScriptBaseClass.PRIM_FULLBRIGHT: | 7871 | case (int)ScriptBaseClass.PRIM_MATERIAL: |
7857 | if (remain < 2) | 7872 | if (remain < 1) |
7858 | return; | 7873 | return; |
7859 | face = rules.GetLSLIntegerItem(idx++); | 7874 | int mat = rules.GetLSLIntegerItem(idx++); |
7860 | bool st = rules.GetLSLIntegerItem(idx++); | 7875 | if (mat < 0 || mat > 7) |
7861 | SetFullBright(part, face , st); | 7876 | return; |
7862 | break; | ||
7863 | 7877 | ||
7864 | case (int)ScriptBaseClass.PRIM_MATERIAL: | 7878 | part.Material = Convert.ToByte(mat); |
7865 | if (remain < 1) | 7879 | break; |
7866 | return; | ||
7867 | int mat = rules.GetLSLIntegerItem(idx++); | ||
7868 | if (mat < 0 || mat > 7) | ||
7869 | return; | ||
7870 | 7880 | ||
7871 | part.Material = Convert.ToByte(mat); | 7881 | case (int)ScriptBaseClass.PRIM_PHANTOM: |
7872 | break; | 7882 | if (remain < 1) |
7883 | return; | ||
7873 | 7884 | ||
7874 | case (int)ScriptBaseClass.PRIM_PHANTOM: | 7885 | string ph = rules.Data[idx++].ToString(); |
7875 | if (remain < 1) | 7886 | m_host.ParentGroup.ScriptSetPhantomStatus(ph.Equals("1")); |
7876 | return; | ||
7877 | 7887 | ||
7878 | string ph = rules.Data[idx++].ToString(); | 7888 | break; |
7879 | m_host.ParentGroup.ScriptSetPhantomStatus(ph.Equals("1")); | ||
7880 | 7889 | ||
7881 | break; | 7890 | case (int)ScriptBaseClass.PRIM_PHYSICS: |
7891 | if (remain < 1) | ||
7892 | return; | ||
7893 | string phy = rules.Data[idx++].ToString(); | ||
7894 | bool physics; | ||
7882 | 7895 | ||
7883 | case (int)ScriptBaseClass.PRIM_PHYSICS: | 7896 | if (phy.Equals("1")) |
7884 | if (remain < 1) | 7897 | physics = true; |
7885 | return; | 7898 | else |
7886 | string phy = rules.Data[idx++].ToString(); | 7899 | physics = false; |
7887 | bool physics; | ||
7888 | 7900 | ||
7889 | if (phy.Equals("1")) | 7901 | part.ScriptSetPhysicsStatus(physics); |
7890 | physics = true; | 7902 | break; |
7891 | else | ||
7892 | physics = false; | ||
7893 | 7903 | ||
7894 | part.ScriptSetPhysicsStatus(physics); | 7904 | case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: |
7895 | break; | 7905 | if (remain < 1) |
7906 | return; | ||
7907 | string temp = rules.Data[idx++].ToString(); | ||
7896 | 7908 | ||
7897 | case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: | 7909 | m_host.ParentGroup.ScriptSetTemporaryStatus(temp.Equals("1")); |
7898 | if (remain < 1) | ||
7899 | return; | ||
7900 | string temp = rules.Data[idx++].ToString(); | ||
7901 | 7910 | ||
7902 | m_host.ParentGroup.ScriptSetTemporaryStatus(temp.Equals("1")); | 7911 | break; |
7903 | 7912 | ||
7904 | break; | 7913 | case (int)ScriptBaseClass.PRIM_TEXGEN: |
7914 | if (remain < 2) | ||
7915 | return; | ||
7916 | //face,type | ||
7917 | face = rules.GetLSLIntegerItem(idx++); | ||
7918 | int style = rules.GetLSLIntegerItem(idx++); | ||
7919 | SetTexGen(part, face, style); | ||
7920 | break; | ||
7921 | case (int)ScriptBaseClass.PRIM_TEXT: | ||
7922 | if (remain < 3) | ||
7923 | return; | ||
7924 | string primText = rules.GetLSLStringItem(idx++); | ||
7925 | LSL_Vector primTextColor = rules.GetVector3Item(idx++); | ||
7926 | LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++); | ||
7927 | Vector3 av3 = new Vector3(Util.Clip((float)primTextColor.x, 0.0f, 1.0f), | ||
7928 | Util.Clip((float)primTextColor.y, 0.0f, 1.0f), | ||
7929 | Util.Clip((float)primTextColor.z, 0.0f, 1.0f)); | ||
7930 | part.SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f)); | ||
7905 | 7931 | ||
7906 | case (int)ScriptBaseClass.PRIM_TEXGEN: | 7932 | break; |
7907 | if (remain < 2) | 7933 | case (int)ScriptBaseClass.PRIM_NAME: |
7908 | return; | 7934 | if (remain < 1) |
7909 | //face,type | 7935 | return; |
7910 | face = rules.GetLSLIntegerItem(idx++); | 7936 | string primName = rules.GetLSLStringItem(idx++); |
7911 | int style = rules.GetLSLIntegerItem(idx++); | 7937 | part.Name = primName; |
7912 | SetTexGen(part, face, style); | 7938 | break; |
7913 | break; | 7939 | case (int)ScriptBaseClass.PRIM_DESC: |
7914 | case (int)ScriptBaseClass.PRIM_TEXT: | 7940 | if (remain < 1) |
7915 | if (remain < 3) | 7941 | return; |
7916 | return; | 7942 | string primDesc = rules.GetLSLStringItem(idx++); |
7917 | string primText = rules.GetLSLStringItem(idx++); | 7943 | part.Description = primDesc; |
7918 | LSL_Vector primTextColor = rules.GetVector3Item(idx++); | 7944 | break; |
7919 | LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++); | 7945 | case (int)ScriptBaseClass.PRIM_ROT_LOCAL: |
7920 | Vector3 av3 = new Vector3(Util.Clip((float)primTextColor.x, 0.0f, 1.0f), | 7946 | if (remain < 1) |
7921 | Util.Clip((float)primTextColor.y, 0.0f, 1.0f), | 7947 | return; |
7922 | Util.Clip((float)primTextColor.z, 0.0f, 1.0f)); | 7948 | LSL_Rotation lr = rules.GetQuaternionItem(idx++); |
7923 | part.SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f)); | 7949 | SetRot(part, Rot2Quaternion(lr)); |
7950 | break; | ||
7951 | case (int)ScriptBaseClass.PRIM_OMEGA: | ||
7952 | if (remain < 3) | ||
7953 | return; | ||
7954 | LSL_Vector axis = rules.GetVector3Item(idx++); | ||
7955 | LSL_Float spinrate = rules.GetLSLFloatItem(idx++); | ||
7956 | LSL_Float gain = rules.GetLSLFloatItem(idx++); | ||
7957 | TargetOmega(part, axis, (double)spinrate, (double)gain); | ||
7958 | break; | ||
7959 | case (int)ScriptBaseClass.PRIM_LINK_TARGET: | ||
7960 | if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. | ||
7961 | return; | ||
7962 | LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); | ||
7963 | LSL_List new_rules = rules.GetSublist(idx, -1); | ||
7964 | setLinkPrimParams((int)new_linknumber, new_rules); | ||
7924 | 7965 | ||
7925 | break; | ||
7926 | case (int)ScriptBaseClass.PRIM_NAME: | ||
7927 | if (remain < 1) | ||
7928 | return; | ||
7929 | string primName = rules.GetLSLStringItem(idx++); | ||
7930 | part.Name = primName; | ||
7931 | break; | ||
7932 | case (int)ScriptBaseClass.PRIM_DESC: | ||
7933 | if (remain < 1) | ||
7934 | return; | ||
7935 | string primDesc = rules.GetLSLStringItem(idx++); | ||
7936 | part.Description = primDesc; | ||
7937 | break; | ||
7938 | case (int)ScriptBaseClass.PRIM_ROT_LOCAL: | ||
7939 | if (remain < 1) | ||
7940 | return; | 7966 | return; |
7941 | LSL_Rotation lr = rules.GetQuaternionItem(idx++); | 7967 | } |
7942 | SetRot(part, Rot2Quaternion(lr)); | 7968 | } |
7943 | break; | 7969 | } |
7944 | case (int)ScriptBaseClass.PRIM_OMEGA: | 7970 | finally |
7945 | if (remain < 3) | 7971 | { |
7946 | return; | 7972 | if (positionChanged) |
7947 | LSL_Vector axis = rules.GetVector3Item(idx++); | 7973 | { |
7948 | LSL_Float spinrate = rules.GetLSLFloatItem(idx++); | 7974 | if (part.ParentGroup.RootPart == part) |
7949 | LSL_Float gain = rules.GetLSLFloatItem(idx++); | 7975 | { |
7950 | TargetOmega(part, axis, (double)spinrate, (double)gain); | 7976 | SceneObjectGroup parent = part.ParentGroup; |
7951 | break; | 7977 | parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z)); |
7952 | case (int)ScriptBaseClass.PRIM_LINK_TARGET: | 7978 | } |
7953 | if (remain < 1) | 7979 | else |
7954 | return; | 7980 | { |
7955 | LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); | 7981 | part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z); |
7956 | part = part.ParentGroup.GetLinkNumPart((int)new_linknumber); | 7982 | SceneObjectGroup parent = part.ParentGroup; |
7957 | break; | 7983 | parent.HasGroupChanged = true; |
7984 | parent.ScheduleGroupForTerseUpdate(); | ||
7985 | } | ||
7958 | } | 7986 | } |
7959 | } | 7987 | } |
7960 | 7988 | ||