2009-06-24 3 views
3

Ich habe eine Notizkarte mit einem anderen Wort in jeder Zeile, und ich möchte in der Lage sein, aus den Zeilen zufällig auszuwählen. Wie kann ich das machen?Wie kann ich eine zufällige Zeile von einer Notecard in LSL lesen?

+0

Dies ist eine Antwort auf eine Frage in der Script Academy-Gruppe. Posted hier, um es für die Nachwelt zu bewahren. – btubbs

+0

Ich stimme das nur ab, weil es eine Frage über Linden Scripting Language für Second Life ist! :) –

Antwort

2

Zuerst, wie Sie erwähnen, benötigen Sie eine Notecard. Für dieses Beispiel verwende ich eine mit dem Namen „Farben“ mit folgendem Inhalt:

red 
blue 
green 
yellow 
orange 
purple 

Mit dieser Notecard vorhanden ist, wird das folgende Skript jedes Mal eine zufällige Zeile aus der Karte gelesen und Chat die prim berührt werden.

0

Es ist nicht klar, warum Sie solche unnötige Mathe mit einem hinzufügen und dann später in der Antwort subtrahieren, die Sie sich selbst oben geben. Wenn Sie wollen sicherstellen, dass Sie eine Zufallszahl haben, da es bekannte Probleme mit der Zufälligkeit der llFrand Sie tun können (ohne überprüfen, ob die Zahl gerade oder ungerade ist):

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

Das zweite Problem mit Ihrem Code oben ist, dass Sie nicht gegen CHANGED_INVENTORY überprüfen und ich bin nicht ganz sicher, warum Sie das nicht tun würden. Im Anschluss an diese zweite Frage, warum stellst du eine Frage, um eine zufällige Notecard-Zeilennummer zu bekommen und eine Antwort zu geben, die eine zufällige innerhalb eines Bereichs liefert? Und was wirst du tun, wenn sich die Notecard ändert? Ändern Sie den Code und die Notecard? Dies scheint mir überflüssig zu sein.

NOTECARD namens colors oder was auch immer Sie im Skript gesetzt:

blue 
red 
green 
yellow 
black 

SCRIPT im selben prim:

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

Weitere Informationen:

Die Notecard Du bist das Lesen von muss nicht unbedingt im selben Prim sein. Wenn Sie die UUID der Notecard kennen, können Sie davon lesen, solange es übertragbar (und nicht gelöscht) ist. Seien Sie gewarnt, dass das Ändern der Inhalte der Notecard und Speichern, speichert den neuen Inhalt unter anderenUUID. Aber wenn Sie so geschickt sind, können Sie den Text auch auf einem Web-Service speichern und von dort die Anzahl der Text-Snippets und Text-Snippets abrufen.

Mehr unter the official Second Life wiki.

Verwandte Themen