Difference between revisions of "User:Daemonika Nightfire/Scripts/rezday giver"

From Second Life Wiki
Jump to navigation Jump to search
m
m
 
Line 1: Line 1:
Fuer die funktionalitaet dieses Scripts muss man sich lediglich vor augen halten, dass die Befehle [[LlGetDate|llGetDate()]] & [[LlRequestAgentData|llRequestAgentData(key id, DATA_BORN)]] das gleiche Format YYYY-MM-DD ausgeben und das Datum in dieser Form rueckwaerts geschrieben eine vortlaufende Nummer darstellt. Damit laesst sich nun ganz leicht feststellen ob ein Datum als Zahl in der Zukunft oder Vergangenheit liegt.
Fuer die funktionalitaet dieses Scripts muss man sich lediglich vor augen halten, dass die Befehle [[LlGetDate|llGetDate()]] & [[LlRequestAgentData|llRequestAgentData(key id, DATA_BORN)]] das gleiche Format YYYY-MM-DD ausgeben und das Datum in dieser Form rueckwaerts geschrieben eine vortlaufende Nummer darstellt. Damit laesst sich nun ganz leicht feststellen ob ein Datum als Zahl (integer) in der Zukunft oder Vergangenheit liegt.
  Wenn du das Script ohne die ganzen Kommentare speicherst, wirst du sehen wie klein es eigentlich ist.  
  Wenn du das Script ohne die ganzen Kommentare speicherst, wirst du sehen wie klein es eigentlich ist.  



Latest revision as of 05:32, 18 March 2024

Fuer die funktionalitaet dieses Scripts muss man sich lediglich vor augen halten, dass die Befehle llGetDate() & llRequestAgentData(key id, DATA_BORN) das gleiche Format YYYY-MM-DD ausgeben und das Datum in dieser Form rueckwaerts geschrieben eine vortlaufende Nummer darstellt. Damit laesst sich nun ganz leicht feststellen ob ein Datum als Zahl (integer) in der Zukunft oder Vergangenheit liegt.

Wenn du das Script ohne die ganzen Kommentare speicherst, wirst du sehen wie klein es eigentlich ist. 

*DS* Rezday Giver (basic)

// Globale Variablen
// Speicherort / Variable fuer den Avatar-Key, der das Objekt klickt
key agent;

// Variable die Abfrage des Avatar-Geburtstags
key rezday_request;

// Speicherort / Variable fuer das gesplittete Datum
list today = []; // Liste [today]

// Speicherort / Variable fuer das gefundene Objekt im Inhalt
string obj = "";


// Script-Anfang
default
{
    // Aufrufen/setzen der Werkseinstellung
    /*
        Der folgende Event wird nur dann ausgefuehrt, wenn das Script gespeichert oder resettet wird.
        Im aktuellen Beispiel wird lediglich geprueft ob sich ein Object im Inhalt befindet und der Name global gespeichert.
    */
    state_entry()
    {
        if(llGetInventoryNumber(INVENTORY_OBJECT) > 0)
        {
            obj = llGetInventoryName(INVENTORY_OBJECT, 0);
            llOwnerSay(obj);
        }
    }
    
    // klicken erkennen
    /*
        Als erstes wird geprueft, wer das object klickt.
        Im Anschluss wird das aktuelle Datum abgefragt und gleich als Liste aufgespalten.
        
        Zum Schluss uebergeben wir den agent-key an den dataserver-request um das Geburtsdatum des Avatars abzufragen.
    */
    touch_start(integer total_number)
    {
        agent = llDetectedKey(0);
        today = llParseString2List(llGetDate(), ["-"], []);
        
        rezday_request = llRequestAgentData(agent, DATA_BORN);
    }
    
    // Dataserver interne Server Rueckfragen wie Notecard-Inhalte, Avatar-Info und vieles mehr
    /*
        Dieser Event ist hier mal der aufwaendigste und hier passiert ne ganze menge.
        Darum befinden sich die Kommentare mal da drin.        
    */
    dataserver(key queryid, string data)
    {
        // Prueft ob der richtige Request gestartet wurde
        if(queryid == rezday_request) 
        {
            // Wie im touch wird hier das rezday Datum aufgesplittet
            list rezday = llParseString2List(data, ["-"], []); // Liste [rezday]
            
            // Das Jahr muessen wir zwar nicht vergleichen, benoetigen den Eintrag von [today] jedoch noch fuer spaeter.
            // Im Anschluss benoetigen wir die Eintraege Monat & Tag aus der lokalen [rezday] Liste.
            string y = llList2String(today, 0);
            string m = llList2String(rezday, 1);
            string d = llList2String(rezday, 2);
            
            // Mit dieser if wird geprueft ob die beiden Eintrage fuer Monat und Tag in beiden Listen vorhanden sind.
            if(~llListFindList(today, [m,d]))
            {
                // Ist das der Fall bekommt der Avatar der geklickt hat eine Message und das Geschenk aus dem inhalt.
                llRegionSayTo(agent, 0, "Happy Rezday");
                if(obj != "")
                {
                    llGiveInventory(agent, obj);
                }
            }
            else
            {
                // Hier landen wir, wenn die Daten nicht ueberein stimmen.
                // Nun setzen wir die gesplitteten Datums-Eintraege als fortlaufende Zahl wieder zusammen.
                integer today2compare = (integer)llDumpList2String(today, "");
                
                // An dieser Stelle setzen wir das Jahr von [today] mit dem Monat und Tag von [rezday] zusammen.
                integer rezday2compare = (integer)(y + m + d);
                
                // Jetzt koennen wir beide Zahlen miteinander vergleichen und pruefen ob der Rezday in der Zukunft oder vergangenheit liegt.
                // if(jjjjmmdd > jjjjmmdd)
                if(rezday2compare > today2compare)
                {
                    llRegionSayTo(agent, 0, "I'm sorry, today is not your rezday, please come back on " + y +  "-" + m + "-" + d);
                }
                else
                {
                    // Wenn jemand schon Rezday hatte, muessen wir hier fuer das naechste Jahr einfach 1 drauf rechnen.
                    integer nextyear = (integer)y+1;
                    
                    llRegionSayTo(agent, 0, "I'm sorry, you already had a rezday this year, please come back on " + (string)nextyear +  "-" + m + "-" + d );
                }
            }
        }
    }
    
    // Veraenderungen erkennen
    /*
        Der changed Event erkennt automatisch jede Veraenderung des Objects.
        In diesem aktuellen Beispiel befindet sich lediglich eine Funktion, Veraenderungen im Inhalt zu pruefen.
        Sollte sich der Inhalt aendern, wird das Script einfach resettet um die globalen Variablen zu aktuallisieren.
    */
    changed(integer ch)
    {
        if(ch & CHANGED_INVENTORY)
        {
            llResetScript();
        }
    }
    
    // Hallo Welt
    /*
        Ja, die Ueberschrift habe ich mit absicht so gewaehlt.
        Der on_rez Event wird naemlich immer dann ausgeloest, sobald das Object das Licht der Welt erblickt.
        Dazu gehoeren:
        ➤ Vom Inventar auf den Boden ziehen.
        ➤ Inworld kopieren (Kopie ziehen).
        ➤ Mittels Tools rezzen (Rezzer).
        ➤ Am Avatar anziehen.
        ➤ Du traegst es beim Einloggen.
        
        Selbstverstaendlich kann man in diesem Event vielseitige Funktionen ausfuehren.
        Einen Reset sollte man an dieser Stelle jedoch nur dann ausfuehren,
        wenn keine anderen Funktionen davon abhaengig sind vorherige Aufgaben auszufuehren oder temporaere Variablen bei zu behalt
    */
    on_rez(integer Dae)
    {
        llResetScript();
    }
}