如何从LSL中的记录卡中读取随机行?

时间:2009-06-24 19:36:06

标签: linden-scripting-language

我有一张记录卡,每行都有不同的单词,我希望能够随机选择这些行。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

首先,正如您所提到的,您需要一张记录卡。对于这个例子,我使用了一个名为“colors”的内容:

red
blue
green
yellow
orange
purple

当存在该记录卡时,每次触摸prim时,以下脚本将读取并聊天卡中的随机行。

//this script will grab and chat a random line from the "colors" notecard each time the prim is touched.

string card = "colors";
key linecountid;
key lineid;
integer linemax;

integer random_integer( integer min, integer max )
{
  return min + (integer)( llFrand( max - min + 1 ) );
}


default
{
    state_entry()
    {
        //get the number of notecard lines
        linecountid = llGetNumberOfNotecardLines(card);
    }

    touch_start(integer total_number)
    {
        lineid = llGetNotecardLine(card, random_integer(0, linemax));
    }

    dataserver(key id, string data)
    {
        if (id == linecountid)
        {
            linemax = (integer)data - 1;
        }
        else if (id == lineid)
        {
            llSay(0, data);
        }
    }
}

答案 1 :(得分:0)

目前尚不清楚你为什么要加上一个这样的不必要的数学运算,然后在上面给出的答案中再次对它进行减法。 如果你想确保你有一个更随机的数字,因为你可以做llFrand随机性的已知问题(不检查数字是偶数还是奇数):

integer max;
integer random = llFrand((integer)(max/2)) + llFrand((integer)(max/2));

上面代码的第二个问题是你没有检查CHANGED_INVENTORY,我不太清楚为什么你不这样做。继续第二个问题,你为什么要问一个问题来获得一个随机的记录卡行号并给出一个在一个范围内随机提供的答案?如果记录卡改变了你会怎么做?更改代码和记录卡?这似乎对我来说是多余的。

NOTECARD命名为colors或您在脚本中设置的任何内容:

blue
red
green
yellow
black

SCRIPT在同一个原文中:

//  this script reads from a notecard which is named whatever you set in init
//  in this example from a notecard named "colors"

string ncName;
key ncNumOfLinesReqId;
key ncReqId;
integer numOfLines;

init()
{
//  Put the name of your notecard as in the prim's inventory here.
    ncName = "colors";
}

default
{
    changed(integer change)
    {
//      reset script to make sure you have the current number of lines
//      CHANGED_OWNER has the integer value 0x80 (128)
//      CHANGED_INVENTORY has the integer value 0x01 (1)
        if (change & (CHANGED_OWNER | CHANGED_INVENTORY))
        {
            llResetScript();
        }
    }

    state_entry()
    {
        init();

//      get the number of notecard lines
        ncNumOfLinesReqId = llGetNumberOfNotecardLines(ncName);
    }

    touch_start(integer num_detected)
    {
//      if the number of lines is 0
        if (!numOfLines)
        {
//          PUBLIC_CHANNEL has the integer value 0
            llSay(PUBLIC_CHANNEL, "~!~ Unconfigured, check notecard ~!~");
        }
        else // if number of lines not 0
        {
            ncReqId = llGetNotecardLine(ncName, (integer)llFrand(numOfLines));
        }
    }

    dataserver(key reqId, string data)
    {
        if (reqId == ncNumOfLinesReqId)
        {
//          make sure you typecast!
            numOfLines = (integer)data;
        }
        else if (reqId == ncReqId)
        {
//          PUBLIC_CHANNEL has the integer value 0
            llSay(PUBLIC_CHANNEL, data);
        }
    }
}

更多信息:

您正在阅读的记录卡不一定必须是同一个原子。如果您知道记事卡的UUID,只要它可以转让(而不是删除),您就可以从中读取。请注意,更改记录卡的内容并保存,将新内容存储在不同 UUID下。但是,如果你熟练,你可以将文本存储在Web服务上,并从那里获取文本片段和文本片段。

更多关于the official Second Life wiki