User:Daemonika Nightfire/Scripts/DynamischesLinkset
Jeder, der ein LINK_SET scripten moechte, kennt das Problem mit den Linknummern. Je nach Verwendungszweck muessen diese direkt in Befehle eingetragen oder beim Verlinken der Prims in der richtigen Reihenfolge beachtet werden, um eine fehlerfreie Funktion zu sichern. Mit den folgenden Beispielen ist das nicht mehr noetig, da wir einfach die individuellen Namen der einzelnen Links im LINK_SET verwenden und das Script die passenden Nummern automatisch ermittelt.
alle Links mit gleichem Namen aendern
Dieses Beispiel aendert alle Links im Linkset, die den gleichen Namen tragen. Die Schleife durchlaeuft dabei jede Linknummer einzeln und prueft den Namen. Wenn dieser uebereinstimmt, wird die entsprechende Funktion ausgefuehrt.
default
{
state_entry()
{
llSetLinkColor(LINK_SET, <1,1,1>, ALL_SIDES);
}
touch_start(integer num)
{
integer link_set = llGetNumberOfPrims();
integer i = 0;
do
{
string link_name = llGetLinkName(i);
if(link_name == "Prim_Name")
{
llSetLinkColor(i, <1,0,0>, ALL_SIDES);
}
}
while(++i <= link_set);
}
on_rez(integer Dae)
{
llResetScript();
}
}
unterschiedliche Linknummern speichern
Dieses Beispiel dient dazu, einzelne Linknummern in Variablen global zu speichern. Fuer jeden Link den man ansprechen moechte muss eine eigene Variable angelegt werden. Die global gespeicherten Linknummern koennen jetzt in jedem Event verwendet werden. Auch hier verwenden wir wieder eine Schleife, um alle Links einzeln nach den Namen zu fragen. Stimmt dieser ueberein, wird die entsprechende Linknummer in die dafuer vorgesehene Variable gespeichert.
integer link_01;
integer link_02;
integer link_03;
GetLinks()
{
integer link_set = llGetNumberOfPrims();
integer i = 0;
do
{
string link_name = llGetLinkName(i);
if(link_name == "Prim_Name")
{
link_01 = i;
}
else if(link_name == "Sculptie_Name")
{
link_02 = i;
}
else if(link_name == "Mesh_Name")
{
link_03 = i;
}
}
while(++i <= link_set);
}
default
{
state_entry()
{
llSetLinkColor(LINK_SET, <1,1,1>, ALL_SIDES);
GetLinks();
}
touch_start(integer num)
{
llSetLinkColor(link_01, <1,0,0>, ALL_SIDES);
llSetLinkColor(link_02, <0,1,0>, ALL_SIDES);
llSetLinkColor(link_03, <0,0,1>, ALL_SIDES);
}
changed(integer ch)
{
if(ch & CHANGED_LINK)
{
GetLinks();
}
}
on_rez(integer Dae)
{
// llResetScript();
// oder
GetLinks();
}
}
spezielle Linknamen erkennen & verwenden
Klein aber Oho, das folgende Beispiel eignet sich prima fuer Huds und andere Objekte, bei denen Avatare nur mit gewuenschten Links interagieren duerfen. Im Falle eines Huds kann man die Namen der einzelnen Button sogar direkt in den Channel senden um mit anderen gescripteten Objekten zu interagieren. Wir muessen also nicht erst ein aufwendiges Menue schreiben. Hier brauchen wir also keine Schleife um die einzelnen Links durch zu zaehlen, sondern koennen direkt die Linknummer verwenden die wir geklickt haben. Die Null in diesem Befehl llDetectedLinkNumber(0); bedeutet nicht die Linknummer, sondern der erste Link der geklickt wurde. Die else in diesem Beispiel ist eigentlich ueberfluessig, ich habe sie nur wegen der Vollstaendigkeit hinzugefuegt.
default
{
state_entry()
{
llSay(0, "Hello, Avatar!");
}
touch_start(integer total_number)
{
integer num = llDetectedLinkNumber(0);
string name = llGetLinkName(num);
if(name == "Prim_Name")
{
llSay(0, name + " touched.");
}
else if(name == "Link_Name")
{
llSay(0, name + " touched.");
}
else
{
llSay(0, name + " touched.");
}
}
on_rez(integer Dae)
{
llResetScript();
}
}