如何在LSL中使用权限系统创建动画触摸附件?

时间:2014-07-09 06:12:25

标签: jquery-animate linden-scripting-language secondlife

我想创建一个对象,当被特定的人点击并且只有那个人点击时,它会为对象的佩戴者设置动画。再次单击时,动画停止。我已经有了一个触摸动画的脚本,但现在我需要实现某种权限系统。我实际上没有脚本编写经验所以我只是找到其他人制作的脚本或者随意修改脚本。在这种情况下,我找不到解决方案。

这是我目前拥有的剧本:

integer playing;

default
{
    state_entry()
    {
        playing = FALSE;
    }
    touch_start(integer start_param)
    {
        if(playing == FALSE)
        {
            llRequestPermissions(llDetectedKey(0),PERMISSION_TRIGGER_ANIMATION);
        }
        else if(playing == TRUE)
        {
            llStopAnimation(llGetInventoryName(INVENTORY_ANIMATION,0));
            playing = FALSE;
        }
    }
    run_time_permissions(integer perm)                                  
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION)
        {
            playing = TRUE;
            llStartAnimation(llGetInventoryName(INVENTORY_ANIMATION,0));
        }
    }    
}

如果我实施了权限系统,我该怎么做?我应该把代码放在哪里?此外,如果我希望对象在被允许的人点击时说出或窃窃私语,我该怎么办呢?我也愿意接触到更接近我想要的替代脚本,如果可用的话,最好是可修改的。

提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:2)

实际上,这很简单。

您提出的一个错误是您要求获得触摸该对象的动画的许可。这意味着,无论这个物体是否被某人佩戴,它都会被允许从 toucher 而不是佩戴者那里制作动画。因此,您的变体可以用作附加到某人的舞蹈机器。但是你只想让佩戴者动画,所以你需要使用llGetOwner()代替,因为佩戴者总是对象的拥有者。

仅制作' toucher'被听到"通过触摸事件,简单地将其中的任何内容放入if(llDetectedKey(0) == TOUCHER)语句中。并且不要忘记括号。

所以,工作代码是

    //specify the key of the agent that you want to be the 'TOUCHER'
key TOUCHER = "a6e50f98-cacf-4442-814b-cdf0a5554648";

integer playing;

default
{
    state_entry()
    {
        playing = FALSE;
    }
    touch_start(integer start_param)
    {
        if(llDetectedKey(0) == TOUCHER)
        {
            if(playing == FALSE)
            {
                llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
            }
            else if(playing == TRUE)
            {
                llStopAnimation(llGetInventoryName(INVENTORY_ANIMATION,0));
                playing = FALSE;
            }
        }
    }
    run_time_permissions(integer perm)                                  
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION)
        {
            playing = TRUE;
            llStartAnimation(llGetInventoryName(INVENTORY_ANIMATION,0));
        }
    }    
}

一般性建议。不需要写它

if(playing == FALSE)
            {
                llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
            }
            else if(playing == TRUE)
            {
                llStopAnimation(llGetInventoryName(INVENTORY_ANIMATION,0));
                playing = FALSE;
            }

因为"否则"已经意味着无论条件是什么,如果不是真的。因此,在这种情况下,否则已经意味着" if(play == TRUE)",因此无需再次指定它。此外,如果你正在使用所谓的" boolean"值(LSL没有真正的布尔值,只有整数。但是那些是你只给出TRUE(1)或FALSE(0)值的整数),这样做更容易也更短:

if(playing){}if(playing == TRUE)相同 if(!playing){}表示"如果没有播放"或与if(playing == FALSE)

相同

如果我走得更远,有一种方法可以摆脱playing变量并在任何地方手动设置它。脚本可以通过llGetAnimationList( llGetOwner() );检测佩戴者是否正在播放某个动画(带有某个键)。它返回正在佩戴者正在播放的所有动画(如键,而不是名字!)的列表。

然后,您只需通过if(llListFindList(anims, [llGetInventoryKey(animation)]) == -1)

检查您的动画是否在该列表中

最终代码是这样的。我不确定它是否完全有效,如果这是最好的方法,但对我有用。 8)

//specify the key of the agent that you want to be the 'TOUCHER'
key TOUCHER = "a6e50f98-cacf-4442-814b-cdf0a5554648";

//stores the key of an inventory animation to be played
string animation;

default
{
    state_entry()
    {        
        animation = llGetInventoryName(INVENTORY_ANIMATION,0);
    }

    touch_start(integer start_param)
    {
        //check if the allowed avatar touched the object
        if(llDetectedKey(0) == TOUCHER)
        {     
            llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
        }
    }

    run_time_permissions(integer perm)                                  
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION)
        {
            //get all animations being played on the owner of the object as keys
            list anims = llGetAnimationList( llGetOwner() );

            //if the animation is NOT being played, start it. Else, stop it
            if(llListFindList(anims, [llGetInventoryKey(animation)]) == -1)
            {
                llStartAnimation(animation);
            }
            else
            {
                llStopAnimation(animation);
            }
        }
    }    
}