User:Daemonika Nightfire/Scripts/DynamischesLinkset: Difference between revisions

From Second Life Wiki
Jump to navigation Jump to search
Daemonika Nightfire (talk | contribs)
Daemonika Nightfire (talk | contribs)
mNo edit summary
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
Jeder der ein LINK_SET scripten moechte kennt die Problematik mit den Linknummern. Je nach Verwendungszweck muessen die Linknummern in die Befehle direkt eintragen, oder die Reihenfolge beim verlinken von Prims beachtet werden, um eine einwandfreie Funktionalitaet zu gewaerleisten. Mit den nachfolgenden Beispielen ist das alles nicht noetig. Wir verwenden einfach die individuellen Namen der einzelnen Links im LINK_SET und das Script sucht sich die Nummern selbst heraus.
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 ==
== alle Links mit gleichem Namen aendern ==


Dieses Beispiel aendert alle Links im Linkset die den selben Namen tragen. Hierbei geht die Schleife jede Linknummer einzeln durch und fragt nach dem Namen. Stimmt dieser ueberein, wird die entsprechende Funktion ausgefuehrt.
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.


<source lang="lsl2">
<source lang="lsl2">
Line 40: Line 40:
== unterschiedliche Linknummern speichern ==
== 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.
Dieses Beispiel zeigt, wie man einzelne Linknummern dauerhaft in globalen Variablen speichert. Fuer jeden Link, der spaeter gezielt angesprochen werden soll, wird eine eigene Variable angelegt. Die gespeicherten Linknummern koennen danach in allen Events genutzt werden. Auch hier wird wieder eine Schleife verwendet, die alle Links nacheinander prueft. Wenn der Name eines Links uebereinstimmt, wird dessen Linknummer in die entsprechende Variable eingetragen.


<source lang="lsl2">
<source lang="lsl2">
Line 105: Line 105:
== spezielle Linknamen erkennen & verwenden ==
== 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.
Klein, aber wirkungsvoll: Dieses Beispiel eignet sich hervorragend fuer HUDs und andere Objekte, bei denen Avatare nur mit bestimmten Links interagieren sollen. Bei einem HUD koennen die Namen der einzelnen Buttons sogar direkt auf einen Channel gesendet werden, um mit anderen gescripteten Objekten zu kommunizieren. Dadurch entfaellt die Notwendigkeit, ein aufwendiges Menue zu erstellen.
 
In diesem Fall brauchen wir keine Schleife, da wir direkt die Linknummer des geklickten Prims verwenden koennen. Die Null in llDetectedLinkNumber(0); steht dabei nicht fuer die Linknummer selbst, sondern bezeichnet den ersten erkannten Klick. Die else-Abfrage ist in diesem Beispiel eigentlich ueberfluessig, wurde aber der Vollstaendigkeit halber hinzugefuegt.


<source lang="lsl2">
<source lang="lsl2">
Line 132: Line 134:
             llSay(0, name + " touched.");
             llSay(0, name + " touched.");
         }
         }
    }
   
    on_rez(integer Dae)
    {
        llResetScript();
    }
}
</source>
== Linknummer auf Abruf ==
Dieses Beispiel zeigt eine sehr flexible Methode, um gezielt mit bestimmten Links zu arbeiten, ohne fuer jeden eine eigene Variable anlegen zu muessen. Die Funktion LinkOnDemand sucht anhand des angegebenen Namens automatisch die passende Linknummer und gibt sie zurueck. Dadurch kann sie in beliebigen Events oder Funktionen verwendet werden, um gezielt auf einzelne Prims im Linkset zuzugreifen.
Diese Vorgehensweise ist besonders nuetzlich, wenn man mehrere Funktionen oder Events hat, die auf unterschiedliche Links reagieren sollen, aber den Code zum Ermitteln der Linknummer nicht mehrfach schreiben moechte. So bleibt das Script uebersichtlich und leicht erweiterbar.
<source lang="lsl2">
integer LinkOnDemand(string search)
{
    integer link_set = llGetNumberOfPrims();
    integer i = 0;
    while(++i <= link_set)
    {
        string link_name = llGetLinkName(i);
        if(link_name == search)
        {
            return i;
        }
    }
    return 0;
}
default
{
    state_entry()
    {
        llSetLinkColor(LINK_SET, <1,1,1>, ALL_SIDES);
    }
    touch_start(integer total_number)
    {
        llSetLinkColor(LinkOnDemand("Prim_Name"), <0,0,1>, ALL_SIDES);
     }
     }
      
      

Latest revision as of 16:01, 9 November 2025

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 zeigt, wie man einzelne Linknummern dauerhaft in globalen Variablen speichert. Fuer jeden Link, der spaeter gezielt angesprochen werden soll, wird eine eigene Variable angelegt. Die gespeicherten Linknummern koennen danach in allen Events genutzt werden. Auch hier wird wieder eine Schleife verwendet, die alle Links nacheinander prueft. Wenn der Name eines Links uebereinstimmt, wird dessen Linknummer in die entsprechende Variable eingetragen.

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 wirkungsvoll: Dieses Beispiel eignet sich hervorragend fuer HUDs und andere Objekte, bei denen Avatare nur mit bestimmten Links interagieren sollen. Bei einem HUD koennen die Namen der einzelnen Buttons sogar direkt auf einen Channel gesendet werden, um mit anderen gescripteten Objekten zu kommunizieren. Dadurch entfaellt die Notwendigkeit, ein aufwendiges Menue zu erstellen.

In diesem Fall brauchen wir keine Schleife, da wir direkt die Linknummer des geklickten Prims verwenden koennen. Die Null in llDetectedLinkNumber(0); steht dabei nicht fuer die Linknummer selbst, sondern bezeichnet den ersten erkannten Klick. Die else-Abfrage ist in diesem Beispiel eigentlich ueberfluessig, wurde aber der Vollstaendigkeit halber 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();
    }
}

Linknummer auf Abruf

Dieses Beispiel zeigt eine sehr flexible Methode, um gezielt mit bestimmten Links zu arbeiten, ohne fuer jeden eine eigene Variable anlegen zu muessen. Die Funktion LinkOnDemand sucht anhand des angegebenen Namens automatisch die passende Linknummer und gibt sie zurueck. Dadurch kann sie in beliebigen Events oder Funktionen verwendet werden, um gezielt auf einzelne Prims im Linkset zuzugreifen.

Diese Vorgehensweise ist besonders nuetzlich, wenn man mehrere Funktionen oder Events hat, die auf unterschiedliche Links reagieren sollen, aber den Code zum Ermitteln der Linknummer nicht mehrfach schreiben moechte. So bleibt das Script uebersichtlich und leicht erweiterbar.

integer LinkOnDemand(string search)
{
    integer link_set = llGetNumberOfPrims();
    integer i = 0;
    while(++i <= link_set)
    {
        string link_name = llGetLinkName(i);
        if(link_name == search)
        {
            return i;
        }
    }
    return 0;
}

default
{
    state_entry()
    {
        llSetLinkColor(LINK_SET, <1,1,1>, ALL_SIDES);
    }

    touch_start(integer total_number)
    {
        llSetLinkColor(LinkOnDemand("Prim_Name"), <0,0,1>, ALL_SIDES);
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}