OpenSim.Region.ScriptEngine.Shared.Api.LSL_Api.llGetLinkPrimitiveParams C# (CSharp) Method

llGetLinkPrimitiveParams() public method

public llGetLinkPrimitiveParams ( int linknumber, OpenSim.Region.ScriptEngine.Shared.LSL_Types.list rules ) : OpenSim.Region.ScriptEngine.Shared.LSL_Types.list
linknumber int
rules OpenSim.Region.ScriptEngine.Shared.LSL_Types.list
return OpenSim.Region.ScriptEngine.Shared.LSL_Types.list
        public LSL_List llGetLinkPrimitiveParams(int linknumber, LSL_List rules)
        {
            m_host.AddScriptLPS(1);

            // acording to SL wiki this must indicate a single link number or link_root or link_this.
            // keep other options as before

            List<SceneObjectPart> parts;
            List<ScenePresence> avatars;
            
            LSL_List res = new LSL_List();
            LSL_List remaining = new LSL_List();

            while (rules.Length > 0)
            {
                parts = GetLinkParts(linknumber);
                avatars = GetLinkAvatars(linknumber);

                remaining = new LSL_List();
                foreach (SceneObjectPart part in parts)
                {
                    remaining = GetPrimParams(part, rules, ref res);
                }
                foreach (ScenePresence avatar in avatars)
                {
                    remaining = GetPrimParams(avatar, rules, ref res);
                }

                if (remaining.Length > 0)
                {
                    linknumber = remaining.GetLSLIntegerItem(0);
                    rules = remaining.GetSublist(1, -1);
                }
                else
                    break;
            }

            return res;
        }

Usage Example

Example #1
0
        public void TestllGetLinkPrimitiveParams()
        {
            TestHelpers.InMethod();
            TestHelpers.EnableLogging();

            UUID ownerId = TestHelpers.ParseTail(0x1);

            SceneObjectGroup grp1 = SceneHelpers.CreateSceneObject(2, ownerId, "grp1-", 0x10);
            grp1.AbsolutePosition = new Vector3(10, 11, 12);
            m_scene.AddSceneObject(grp1);

            LSL_Api apiGrp1 = new LSL_Api();
            apiGrp1.Initialize(m_engine, grp1.RootPart, null, null);

            // Check simple 1 prim case
            {
                LSL_List resList 
                    = apiGrp1.llGetLinkPrimitiveParams(1, new LSL_List(new LSL_Integer(ScriptBaseClass.PRIM_ROTATION)));

                Assert.That(resList.Length, Is.EqualTo(1));
            }

            // Check 2 prim case
            {
                LSL_List resList 
                    = apiGrp1.llGetLinkPrimitiveParams(
                        1, 
                        new LSL_List(
                            new LSL_Integer(ScriptBaseClass.PRIM_ROTATION), 
                            new LSL_Integer(ScriptBaseClass.PRIM_LINK_TARGET),
                            new LSL_Integer(2),
                            new LSL_Integer(ScriptBaseClass.PRIM_ROTATION)));

                Assert.That(resList.Length, Is.EqualTo(2));
            }

            // Check invalid parameters are ignored
            {
                LSL_List resList 
                    = apiGrp1.llGetLinkPrimitiveParams(3, new LSL_List(new LSL_Integer(ScriptBaseClass.PRIM_ROTATION)));

                Assert.That(resList.Length, Is.EqualTo(0));
            }

            // Check all parameters are ignored if an initial bad link is given
            {
                LSL_List resList 
                    = apiGrp1.llGetLinkPrimitiveParams(
                        3, 
                        new LSL_List(
                            new LSL_Integer(ScriptBaseClass.PRIM_ROTATION), 
                            new LSL_Integer(ScriptBaseClass.PRIM_LINK_TARGET),
                            new LSL_Integer(1),
                            new LSL_Integer(ScriptBaseClass.PRIM_ROTATION)));

                Assert.That(resList.Length, Is.EqualTo(0));
            }

            // Check only subsequent parameters are ignored when we hit the first bad link number
            {
                LSL_List resList 
                    = apiGrp1.llGetLinkPrimitiveParams(
                        1, 
                        new LSL_List(
                            new LSL_Integer(ScriptBaseClass.PRIM_ROTATION), 
                            new LSL_Integer(ScriptBaseClass.PRIM_LINK_TARGET),
                            new LSL_Integer(3),
                            new LSL_Integer(ScriptBaseClass.PRIM_ROTATION)));

                Assert.That(resList.Length, Is.EqualTo(1));
            }
        }
LSL_Api