Dynamisches LINK_SET

In unserem Beispiel heisst der gesuchte Prim im Objectnamen kleingeschrieben test.
 
 
 
integer Gesuchte_Link_Nummer;
Suchen()
{
    integer Anzahl_Links = llGetNumberOfPrims();
    integer i = 1;
    
    do
    {
        string Link_Name = llGetLinkName(i);
        if(Link_Name == "test")
        {
            Gesuchte_Link_Nummer = i;
        }
    }
    while(++i <= Anzahl_Links);
}

default
{
    state_entry()
    {
        Suchen();
        llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" \nhat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
    }

    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            Suchen();
            llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" hat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
        }
    }
}
 
 

Nun das selbe Script inclusive Erklaerungen der einzelnen Funktionen:
Das Script ist leserlicher, wenn ihr es Inworld in ein Script kopiert.

Code:
integer Gesuchte_Link_Nummer;   // leerer integer fuer unsere unbekannte Link_Nummer
Suchen()    // start unserer globalen Such-Funktion
{
    integer Anzahl_Links = llGetNumberOfPrims();    // Speicherort fuer die Gesamt_Anzahl Links im LINK_SET
    integer i = 1;  // Startpunkt fuer den Counter in der "do while" Schleife (0 waere Sinnlos, da ein LINK_SET mit mehr als 1 Link immer mit 1 beginnt)
    
    do  // Anfang der "do while" Schleife
    {
        string Link_Name = llGetLinkName(i); // Fragt den Namen des aktuell gewaehlten Links nach (i wird mit jedem Durchlauf um 1 erhoeht)
        if(Link_Name == "test") // Vergleicht den Link_Namen mit dem hier festgelegten Namen
        {
            Gesuchte_Link_Nummer = i;   // Fuellt die globale Variable mit der Link_Nummer (i) wenn der Name ueberein stimmt
        }
    }
    while(++i <= Anzahl_Links); // wiederholt hier den gesamten Vorgang, bis die letzte Link_Nummer erreicht wurde
}

default
{
    state_entry()   // loest aus, sobald das Script gespeichert oder resettet wird
    {
        Suchen();   // Startet die globale Such-Funktion (beachte das Semicolon am Ende)
        
        // Chat-Meldung zum ueberpruefen, ob das Script alles richtig macht
        llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" \nhat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
    }

    changed(integer change) // loest immer dann aus, wenn sich am Object irgend etwas aendert
    {
        if(change & CHANGED_LINK)   // loest nur dann aus, wenn sich das LINK_SET aendert ( Link hinzufuegen, entfehrnen oder drauf setzen)
        {
            Suchen();   // Startet die globale Such-Funktion (beachte das Semicolon am Ende)
            
            // Chat-Meldung zum ueberpruefen, ob das Script alles richtig macht
            llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" hat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
        }
    }
}

Nun wollten wir nicht nur eine bloede Chat-Meldung, sondern auch sehen das es funktioniert wie es soll. Zu diesem Zweck haben wird den Touch Event mit einem Schalter hinzugefuegt.

Wenn wir nun das Object anklicken, wird genau der eine Link namens test eingefaerbt.
Dazu haben wir im Befehl llSetLinkColor keine Link_Nummer angegeben, sondern den Namen der globalen Variable, welcher fuer die Link_Nummer steht.

Das Script mit Touch event, aber wieder ohne Kommentare:

Code:
integer Schalter = 0;

integer Gesuchte_Link_Nummer;
Suchen()
{
    integer Anzahl_Links = llGetNumberOfPrims();
    integer i = 1;
    
    do
    {
        string Link_Name = llGetLinkName(i);
        if(Link_Name == "test")
        {
            Gesuchte_Link_Nummer = i;
        }
    }
    while(++i <= Anzahl_Links);
}

default
{
    state_entry()
    {
        Suchen();
        llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" \nhat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
        
        llSetLinkColor(Gesuchte_Link_Nummer, <1,0,0>, ALL_SIDES);
    }
    
    touch_start(integer NumberOfTouches)
    {
        if(Schalter == 0)
        {
            Schalter = 1;
            llSetLinkColor(Gesuchte_Link_Nummer, <0,1,0>, ALL_SIDES);
        }
        else if(Schalter == 1)
        {
            Schalter = 0;
            llSetLinkColor(Gesuchte_Link_Nummer, <1,0,0>, ALL_SIDES);
        }
    }

    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            Suchen();
            llSay(0,"Dein Link namens \"" + llGetLinkName(Gesuchte_Link_Nummer) + "\" hat die Link-Nummer (" + (string)Gesuchte_Link_Nummer + ")");
        }
    }
}
 

Kommentare