User:Daemonika Nightfire/Scripts/Dynamic Menu

From Second Life Wiki
< User:Daemonika Nightfire
Revision as of 07:10, 3 August 2024 by Daemonika Nightfire (talk | contribs) (Created page with "== Dynamisches Menue == Ein dynamisches Menue ist ein Menue, das sich anhand der verfuegbaren Daten aus einer Liste selbst generiert. In diesem Basis-Beispiel haben wir ein Me...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Dynamisches Menue

Ein dynamisches Menue ist ein Menue, das sich anhand der verfuegbaren Daten aus einer Liste selbst generiert. In diesem Basis-Beispiel haben wir ein Menue mit einer vordefinierten Liste, in der lediglich schriftlich auf Englisch von 1 bis 10 gezaehlt wird. Wenn wir nun im Menue einen stellvertretenden Button druecken, wird das entsprechende Wort im Chat ausgegeben.

// Liste mit Eintraegen
integer qty = 0;
list entrys = ["One","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten"];

// Generiert ein menue aus der Liste
list menubutton = [];
list navigation = [];
string menudesc = "";
integer index_start = 0;
integer index_end = 5;
integer selection = 6;
BuildMenu()
{
    menubutton = [];
    navigation = [];
    menudesc = "";
    
    // Startpunkt befindet sich unter 0.
    if(index_start < 0)
    {
        // Der Startpunkt ist das Maximum abzueglich des unteilbaren Rests von Maximum/selection.
        index_start = qty - (qty%selection);
        if(index_start == qty)
        {
            index_start = qty - selection;
        }
    }
    
    // The Startpunkt liegt ueber dem Maximum
    if(index_start > qty-1)
    {
        // Damit fangen wir dann einfach wieder bei 0 an.
        index_start = 0;
    }
    
    // Das anzuzeigende Ende wird vom endgueltigen Startpunkt aus bestimmt.
    index_end = index_start + selection-1;
    if(index_end >= qty)
    {
        index_end = qty-1;
    }
    
    navigation = ["<<<", "Close", ">>>"];
    if(qty <= selection)
    {
        index_end = qty-1;
        navigation = [] + ["...", "Close", "..."];
    }
    
    menudesc = "\nChoose your options.\n\n";
    integer i = index_start;
    do
    {
        string number = (string)(i+1);
        menudesc += number + ") " + llGetSubString(llList2String(entrys, i), 0, 39) + "\n";
        menubutton += number;
    }
    while(++i <= index_end);
}

// Generiert einen zufaelligen Menue-Channel
integer menu_handler;
integer menu_channel;
OpenMenu(key user, string title, list buttons)
{
    llListenRemove(menu_handler);
    menu_channel = (integer)(llFrand(1) * -DEBUG_CHANNEL);
    menu_handler = llListen(menu_channel, "", "", "");
    llDialog(user, title, buttons, menu_channel);
    llSetTimerEvent(60.0);
}

default
{
    state_entry()
    {
        qty = llGetListLength(entrys);
        llSay(0, "\n" + (string)qty + " entrys loaded.\n" + (string)llGetUsedMemory() + " bytes memory in use.");
    }

    touch_start(integer total_number)
    {
        key agent = llDetectedKey(0);
        index_start = 0;
        index_end = selection-1;
        BuildMenu();
        OpenMenu(agent, menudesc, navigation + menubutton);
    }
    
    listen(integer chan, string name, key id, string msg)
    {
        list parsed = llParseString2List(msg, [" "], []);
        string cmd = llList2String(parsed, 0);
        //string data = llList2String(parsed, 1); // Falls wir zweiteilige Commandos nutzen
        
        if(chan == menu_channel)
        {            
            if(cmd == "Close" || cmd == "...")
            {
                llListenRemove(menu_handler);
                llSetTimerEvent(0.0);
            }
            else if(cmd == ">>>")
            {
                index_start += selection;
                
                BuildMenu();
                OpenMenu(id, menudesc, navigation + menubutton);
            }
            else if(cmd == "<<<")
            {
                index_start -= selection;
                
                BuildMenu();
                OpenMenu(id, menudesc, navigation + menubutton);
            }
            else if(~llListFindList(menubutton, [cmd]))
            {
                string choice = llList2String(entrys, (integer)cmd-1);
                llOwnerSay("entry: " + choice);
                
                BuildMenu();
                OpenMenu(id, menudesc, navigation + menubutton);
            }
        }
    }
    
    timer()
    {
        llListenRemove(menu_handler);
        llSetTimerEvent(0.0);
    }
    
    changed(integer ch)
    {
        if(ch & CHANGED_INVENTORY)
        {
            llResetScript();
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}