2

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

这是我目前拥有的脚本:

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));
        }
    }    
}

如果我实施权限系统,我会怎么做?我应该把它放在代码的什么地方?另外,如果我希望对象在被允许的人单击时说出或耳语,我该怎么做?我也愿意被引导到更接近我想要的替代脚本,如果可用并且最好是可修改的。

提前感谢您的任何帮助。

4

1 回答 1

2

这其实很简单。

您犯的一个错误是,您向触摸该对象的人请求允许制作动画。这意味着,无论这个对象是否被某人佩戴,它都会请求触摸者的许可,而不是佩戴者。因此,您的变体可以用作附在某人身上的舞蹈机器。但是你只希望穿戴者有动画,所以你需要使用llGetOwner()来代替,因为穿戴者始终是对象的所有者。

要使触摸事件仅“听到”“触摸者”,只需将其中的任何内容放入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;
            }

因为“else”已经意味着 if 中的任何条件都不为真。所以,在这种情况下,else 已经意味着“if(playing == TRUE)”,所以不需要再次指定。此外,如果您正在使用所谓的“布尔”值(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);
            }
        }
    }    
}
于 2014-08-13T06:06:36.530 回答