logo

Willkommen Gast! Um alle Funktionen zu aktivieren müssen Sie sich Anmelden.Neue Registrierungen sind deaktiviert.

Mitteilung

Icon
Error

Einloggen


Optionen
Ansicht
Gehe zum aktuellsten Beitrag Gehe zum letzten Ungelesenen
Offline MartinRJ Fayray  
#1 Geschrieben : Dienstag, 10. März 2015 01:56:57(UTC)
MartinRJ Fayray

Rang: Ehrenmitglied

Ansehen:

Mitglied seit: 05.09.2014(UTC)
Beiträge: 84
Germany
Wohnort: Tulln und Rostock

Dankte: 1 mal(e)
Mit folgendem Skript kann man eine Ostereier-Hunt veranstalten, bei der jeder Avatar nur ein Geschenk pro Tag erhält.

Das Server-Skript muss in ein Objekt in der selben Region wie die "Ostereier".

Und das Ostereier-Skript muss zusammen mit jeweils einem Preis (dieser muss kopierbar sein, sonst gibt es Fehlermeldungen ab dem zweiten Versuch) in das "Osterei".

Der Server 'merkt' sich einen Timestamp zusammen mit der Kurzform des Keys des jeweiligen Users in einer Liste, und entfernt den Eintrag nach 24 Stunden wieder.

Das "Ei" sendet den Avatar-Key (zusammen mit dem Channel des jeweiligen Eis) bei Berührung an den Server, dieser überprüft ob der Key bekannt ist, und gibt eine entsprechende Rückmeldung.
Wenn der Avatar-Key nicht gespeichert war (also in den letzten 24 Stunden nicht bereits einen Preis erhalten hat), sendet das Ei den Preis an den Avatar.
Andernfalls wird eine Fehlermeldung ausgegeben.

Server:
Code:

list PERSON_TIMESTAMP; //Stores (partial) uuid and timestamp.
integer iIndexPerson = 0;
integer iIndexTimestamp = 1;
integer iPersontimestamplength = 2;

integer iDay = 86400; //Seconds/day.
float fTimer = 1.0; //Timer.

integer iLengthFirstPartOfUUID = 8;
string sGetPartial(key kUUID)
{
    return llGetSubString((string)kUUID, 0, iLengthFirstPartOfUUID-1);
}

integer iCHANNEL = -239487;
integer iIndexChannel = 0;
integer iIndexUUID = 1;
string sMessageFound = "found";
string sMessageNotFound = "notfound";
default
{
    state_entry()
    {
        llSetTimerEvent(fTimer);
        llListen(iCHANNEL, "", "", "");
    }
    listen(integer channel, string name, key id, string message)
    {
        if (llList2Key(llGetObjectDetails(id, [OBJECT_OWNER]), 0) != llGetOwner())
        { //Only listens to objects of the same owner.
            return;
        }
        list lTemp = llCSV2List(message);
        if (llGetListLength(lTemp) != iPersontimestamplength)
        { //Invalid message.
            return;
        }
        string sReturn;
        key kPerson = (key)llList2String(lTemp, iIndexUUID);
        integer iChannelSender = (integer)llList2String(lTemp, iIndexChannel);
        if (llListFindList(PERSON_TIMESTAMP, [sGetPartial(kPerson)]) != -1)
        { //Found.
            sReturn = sMessageFound;
        }
        else
        { //Not found.
            sReturn = sMessageNotFound;
            PERSON_TIMESTAMP += [sGetPartial(kPerson), llGetUnixTime() + iDay];
        }
        llRegionSayTo(id, iChannelSender, sReturn); //Send message back.
    }
    timer()
    {
        if (llGetListLength(PERSON_TIMESTAMP) >= iPersontimestamplength)
        { //Clean up list.
            if (llList2Integer(PERSON_TIMESTAMP, iIndexTimestamp) < llGetUnixTime())
            {
                if (llGetListLength(PERSON_TIMESTAMP) == iPersontimestamplength)
                { //Only one entry left.
                    PERSON_TIMESTAMP = [];
                }
                else
                {
                    PERSON_TIMESTAMP = llList2List(PERSON_TIMESTAMP, iPersontimestamplength, -1);
                }
            }
        }
    }
    changed(integer change)
    {
        if (change & CHANGED_OWNER)
        {
            llResetScript();
        }
    }
}


Oster-Ei:
Code:

integer iLengthFirstPartOfUUID = 8;
string sGetPartial(key kUUID)
{
    return llGetSubString((string)kUUID, 0, iLengthFirstPartOfUUID-1);
}

integer iCHANNEL = -239487;
integer iIndexChannel = 0;
integer iIndexUUID = 1;
string sMessageFound = "found";
string sMessageNotFound = "notfound";

integer iLOCALCHANNEL;

integer turn_key_into_channel(key ktktc)
{
    integer itktc; string sinputtktc = (string) ktktc; integer iindextktc; integer ccountertktc; string stktc;
    for (iindextktc = 0; iindextktc < 36; iindextktc++){if (iindextktc != 8 && iindextktc != 13 && iindextktc != 18 && iindextktc != 23 && ccountertktc < 9 && (integer) llGetSubString(sinputtktc,iindextktc,iindextktc) != 0 && llStringLength(stktc) < 10)
    {
    stktc = stktc + (string) ((integer) llGetSubString(sinputtktc,iindextktc,iindextktc)); ccountertktc = ccountertktc+1;}
    }
    stktc = "1" + stktc; itktc = (integer) stktc; if (itktc < 1000000000) { itktc = 1000000000 + itktc; }
    return itktc;
}
key kCLICKED;
string sNiceMessage = "You already received an item today! Please come back tomorrow!"; //Leave this empty ("") if you don't want to send a message.
default
{
    state_entry()
    {
        iLOCALCHANNEL = turn_key_into_channel(llGetKey());
        llListen(iLOCALCHANNEL, "", "", "");
    }
    on_rez(integer start_param)
    {
        llResetScript();
    }
    changed(integer change)
    {
        if (change & CHANGED_OWNER)
        {
            llResetScript();
        }
    }
    touch_start(integer num_detected)
    {
        kCLICKED = llDetectedKey(0);
        list lMessage = ["",""];
        lMessage = llListReplaceList(lMessage, [iLOCALCHANNEL], iIndexChannel, iIndexChannel);
        lMessage = llListReplaceList(lMessage, [kCLICKED], iIndexUUID, iIndexUUID);
        llRegionSay(iCHANNEL, llList2CSV(lMessage));
    }
    listen(integer channel, string name, key id, string message)
    {
        if (llList2Key(llGetObjectDetails(id, [OBJECT_OWNER]), 0) != llGetOwner())
        { //Only listens to objects of the same owner.
            return;
        }
        if (message == sMessageFound)
        { //Say nice error message.
            llRegionSayTo(kCLICKED, PUBLIC_CHANNEL, sNiceMessage);
        }
        else if (message == sMessageNotFound)
        { //Give item.
            if (llGetInventoryNumber(INVENTORY_OBJECT) > 0)
            {
                llGiveInventory(kCLICKED, llGetInventoryName(INVENTORY_OBJECT, 0));
            }
        }
    }
}
It is the mark of an educated mind to be able to entertain a thought without accepting it.

Wanna join the discussion?! Login to your forum account.Neue Registrierungen sind deaktiviert.

Rss Feed  Atom Feed
Benutzer, die gerade dieses Thema lesen
OceanSpiders 2.0
Das Forum wechseln  
Du kannst keine neue Themen in diesem Forum eröffnen.
Du kannst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge nicht löschen.
Du darfst deine Beiträge nicht editieren.
Du kannst keine Umfragen in diesem Forum erstellen.
Du kannst nicht an Umfragen teilnehmen.

Powered by YAF.NET | YAF.NET © 2003-2018, Yet Another Forum.NET
Diese Seite wurde in 0.034 Sekunden generiert.

Datenschutzrichtlinie
Haftungsausschluss
Impressum
Datenschutzerklärung
AGB, ToS
Kontakt