Как я могу прочитать случайную строку из заметки в LSL? - PullRequest
3 голосов
/ 24 июня 2009

У меня есть карта заметок с разными словами в каждой строке, и я хотел бы иметь возможность выбирать из строк случайным образом. Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 24 июня 2009

Во-первых, как вы упоминаете, вам нужна карта для заметок. Для этого примера я использую один с именем "colors" со следующим содержанием:

red
blue
green
yellow
orange
purple

При наличии этой карты заметок следующий скрипт будет считывать и переписывать случайную строку с карточки при каждом прикосновении к приму.

//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);
        }
    }
}
0 голосов
/ 03 июня 2013

Непонятно, почему вы делаете такую ​​ненужную математику, добавляя ее, а затем вычитая ее снова в ответе, который вы даете себе выше. Если вы хотите убедиться, что у вас есть более случайное число, так как есть известные проблемы со случайностью llFrand, вы можете это сделать (не проверяя, является ли число четным или нечетным):

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

Вторая проблема с вашим кодом выше заключается в том, что вы не проверяете по CHANGED_INVENTORY, и я не совсем уверен, почему вы этого не сделаете. В связи с этим вторым вопросом, почему вы задаете вопрос, чтобы получить случайный номер строки заметки и дать ответ, который дает случайный в пределах диапазона? И что вы будете делать, если поменяется карта? Изменить код и записку? Это кажется мне излишним.

NOTECARD с именем colors или любым другим параметром, установленным в сценарии:

blue
red
green
yellow
black

СЦЕНАРИЙ в том же самом начале:

//  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. Но если вы настолько опытны, вы можете также сохранить текст в веб-сервисе и получить отсчет количества фрагментов текста и фрагментов текста оттуда.

Подробнее о официальной вики Second Life .

...