Непонятно, почему вы делаете такую ненужную математику, добавляя ее, а затем вычитая ее снова в ответе, который вы даете себе выше.
Если вы хотите убедиться, что у вас есть более случайное число, так как есть известные проблемы со случайностью 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 .