LlDialog/de

From Second Life Wiki
Jump to navigation Jump to search

Beschreibung

Funktion: llDialog( key avatar, string message, list buttons, integer chat_channel );

Zeigt eine blaube Dialogbox in der oberen rechten ecke von avatars Bildschirm mit message als nachricht und buttons, sowie ein Ignore Button. Dies hat viele Anwendungsmöglichkeiten von einfacher Nachrichtenübermittlung zu komplexen Menu-Systemen.

• key avatar avatar UUID der in der gleichen Region ist
• string message Nachricht die Angezeigt werden soll
• list buttons Beschriftung der Knöpfe (Buttons)
• integer chat_channel Ausgabechannel, jeder Integerwert

Wenn ein Button gedrückt wird, sagt der avatar den text des Buttons auf dem chat_channel.
Die Position wo der Chat erzeugt wird, ist die Position wo der Dialog erzeugende Prim war, als der Dialog-Button gedrückt wurde.

Button Anordnung
9   10 11
6 7 8  
3 4 5
0 1 2
Channel Konstante Beschreibung
DEBUG_CHANNEL 0x7FFFFFFF Chat Channel der für Debug und Error Nachrichten von Scripten reserviert ist.
PUBLIC_CHANNEL 0x0 Chat Channel der an alle nahestehende User sendet.

Warnungen

  • Diese Funktion lässt das Script 1.0 Sekunden schlafen.
  • Es gibt keine Möglichkeit eine Dialogbox via Script zu entfernen.
  • Es gibt keine Möglichkeit für ein Script herauszufinden, ob der User den kleinen "Ignore" Button gedrückt hat (durch das drücken dieses Buttons wird kein Chat erzeugt).
  • Es gibt keine Möglichkeit die Eingaben über die Dialogbox vom regulären Chat des selben Nutzers zu unterscheiden.
    • Es ist wichtig anzunehmen, dass die Antwort nicht eine der Buttons ist.
  • Wenn der hörende Prim außerhalb der 20 Meter Reichweite des sendenden Prims ist, wenn der Button gedrückt wird, wird er die Antwort nicht hören.
    • Diese Beschränkung betrifft ebenfalls Attachments, wenn der Träger mehr als 20 Meter vom listener entfernt ist.

message Beschränkungen

  • message muss weniger als 512 bytes lang und darf nicht leer sein. llDialog wird "llDialog: must supply a message" auf dem DEBUG_CHANNEL rufen. Falls die Nachricht größer oder gleich 512 bytes ist, wird es (ebenfalls auf dem debug channel) "llDialog: message too long, must be less than 512 characters" rufen; in beiden Fällen wird die Dialogbox nicht für den avatar erstellt werden.
  • Der Client zeigt lediglich 8 Zeilen der message und erstellt eine Scroll Leiste falls sie länger ist. Siehe #Darstellung.

buttons Beschränkungen

  • Falls buttons leer ist, wird es den Vorgabewert ["OK"] senden.
  • Ein Error wird auf dem DEBUG_CHANNEL gerufen, falls...
    • mehr als 12 Buttons da sind.
    • eines der list items kein string ist.
    • eines der list items eine Länge (in Bytes) von null oder größer als 24 aufweißt.
Alle Issues ~ Nach JIRA-Issues suchen, die sich hierauf beziehen

Beispiele

<lsl>integer channel = 1000;

default {

   state_entry()
   {
       llListen(channel,"", "","");
   }
   touch_start(integer count)
   {
       llDialog(llDetectedKey(0), "This is a test dialog.\n\nPlease choose one of the below options.",
                ["Yes", "No", "0", "1"], channel);
   }
   
   listen(integer chan, string name, key id, string mes)
   {
       if(id == llGetOwnerKey(id))//won't listen to objects unless they aren't in the region.
           llSay(0,name + " (" + (string)llGetObjectDetails(id, (list)OBJECT_POS) + ") chose option " + mes);
   }
}</lsl>

Hilfreiche Code-Schnippsel

<lsl>//Compact function to put buttons in "correct" human-readable order integer channel;

list order_buttons(list buttons) {

   return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)
        + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);

}

default {

   state_entry()
   {   // Create random channel within range [-1000000000,-2000000000]

channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);

llListen(channel,"", "","");

   }
   touch_start(integer total_number)
   {
       llDialog(llDetectedKey(0),"\nPlease choose an option:\n",

order_buttons(["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]),channel);

   }
   listen(integer _chan, string _name, key _id, string _option)
   {
       llSay(0, _name + " chose option " + _option);
   }

}</lsl>

Notizen

Um Dialogboxen zu nutzen um Menu-Systeme zu erstellen, siehe Dialog Menus: Eine Schritt für Schritt Anleitung (Richtet sich an Beginner).

Tipps

Es ist eine gute Idee einen sehr negativen Channel zu nutzen (aber niemals negativer als die negativste 32-bit Integer, welche -2.147.483.648 ist), z.B., <lsl>// Erzeuge einen zufälligen Channel zwischen [-1000000000,-2000000000] integer channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);

llDialog(llDetectedKey(0), "Please choose one of the below options:",

   ["Yes", "No", "0", "1"], channel);</lsl>

Negative Channels sind für Script Kommunikation beliebt, da der Client nicht direkt auf diesen Channels chatten kann ("/-xxxx message" wird nicht "message" auf dem channel "-xxxx" senden, sondern "/-xxxx message" auf dem Channel Null ausgeben). Die einzige Möglichkeit, dies vor llTextBox zu bewerkstelligen war, llDialog zu nutzen, was auf 24 Bytes beschränkt ist.

Man kann ziemlich sicher sein, dass jedes der eigenen gescripteten Objekte einen einmaligen Chat Channel hat, mit Hilfe dieser Funktion:

<lsl>integer dialog_channel; // top of script in variables

integer channel() { // top of script in functions

   return (integer)("0x"+llGetSubString((string)llGetKey(),-8,-1));

}

dialog_channel = channel(); // somewhere in actual script execution, such as state_entry()</lsl>

Darstellung

Wenn message mehr als 8 Zeilen benötigt, wird eine vertikale Scroll-Leiste in der Dialogbox erscheinen.

Der text in der Nachricht kann mit "\n" (für neue Zeile) und "\t" (für tab) formattiert werden. Die Schriftart und -größe zu beeinflußen.

Es gibt keinen Weg die Größe oder Farbe der Dialogbox zu verändern.

Siehe auch

Ereignisse

•  listen

Funktionen

•  llListen
•  llTextBox
•  llRegionSay
•  llWhisper Sendet Chat in einem 10 Meter Radius
•  llSay Sendet Chat in einem 20 Meter Radius
•  llShout Sendet Chat in einem 100 Meter Radius
•  llInstantMessage Sendet Chat an einen bestimmten User
•  llOwnerSay Sendet Chat lediglich zum Besitzer

Weiterführende Anmerkungen

Nach JIRA-Issues suchen, die sich hierauf beziehen

Signature

function void llDialog( key avatar, string message, list buttons, integer chat_channel );
Dieser Artikel war nicht hilfreich für Dich? Vielleicht bringt der zugehörige Artikel im SLinfo Wiki Erleuchtung.