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 : Montag, 23. März 2015 12:20:03(UTC)
MartinRJ Fayray

Rang: Ehrenmitglied

Ansehen:

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

Dankte: 1 mal(e)
Dieses Vendor-Skript erfragt zunächst die PERMISSION_DEBIT vom Besitzer, damit im Fall der Einzahlung eines falschen Betrags die Summe zurückerstattet werden kann.
Sobald diese Permission erteilt wurde, begibt sich das Skript in den State "perm".

Wenn ein Nutzer das Objekt anklickt, geht das Skript in den State "inuse", es wird ein Hovertext (etwa: "Vendor in Benutzung") und ein Menü angezeigt.
Dort hat der User die Option "BUY NOW", "SEND AS GIFT" oder "INFORMATION" auszuwählen.
"Information" gibt dem Nutzer eine Notecard.
Bei einem Klick auf "Buy now" wird der Pay-Price des Objekts gesetzt (dieser steht in der Description/Beschreibung des Vendors), und auf die Bezahlung gewartet.
Bei Bezahlung wird der Betrag überprüft, und im positiven Fall das (erste) Objekt im Vendor übermittelt. Dazu erhält der Owner eine Benachrichtigung.

Nach 60 Sekunden ohne Bezahlung geht das Skript wieder in den state perm, und der Hovertext wird entfernt.

Bei "SEND AS GIFT" geht das Skript in den State "Name2Key", und fordert den Nutzer dazu auf, den Namen des zu Beschenkenden im Chat einzugeben.
Nach 30 Sekunden ohne erfolgreiche Eingabe erfolgt ein Timeout und das Skript geht in den State inuse.
Gibt der Benutzer einen Namen im Chat ein, wird der Name in der w-hat- Datenbank geprüft, und ein http-response wird erzeugt, in der entweder ein Key zu dem Namen, oder eine Fehlermeldung (leerer Body) übermittelt wird. In Fehlerfall erfolgt eine Fehlermeldung im Chat.
Wenn der Key gefunden wurde, wird die Bezahlung freigeschaltet, und der Nutzer wird aufgefordert zu bezahlen (wie oben).


Code:

//STRINGS
string sBUTTON_BUY = "BUY NOW";
string sBUTTON_GIFT = "SEND AS GIFT";
string sBUTTON_INFO = "INFORMATION";

string sMESSAGE_BUY = "Right click this vendor and click pay to buy this product.";
string sMESSAGE_BUY_SUCCESS = "Item successfully delivered!";
string sMESSAGE_GIFT = "Enter the full name of the recipient in local chat.";
string sMESSAGE_GIFT_SUCCESS = "Item successfully delivered to the recipient ";
string sMESSAGE_INFO = "Notecard is being sent.";
string sMESSAGE_BUY_FOR_GIFTED = "Avatar found. Right click this vendor and click pay to send this item now.";

string sDIALOGMESSAGE = "Please choose:";

string sERROR = "Name not found!"; //Name2key-error.

float fTIMEOUT_RESERVED = 60; //Seconds before time out.
float fTIMEOUT_NAME2KEY = 30; //Seconds before name2key times out.
string sTIMEOUT = "Timed out.";

vector vRESERVED_COLOR = <1.0, 1.0, 1.0>;
float fRESERVED_ALPHA = 1.0;
string sRESERVED = "Vendor is in use.";

integer iCHANNEL_NAME2KEY = PUBLIC_CHANNEL;
integer iCHANNEL_DIALOG = -4787644;

string sINVALID_AMOUNT = "Invalid amount!";

dialog(key kAvatar)
{
    llDialog(kAvatar, sDIALOGMESSAGE, [sBUTTON_BUY, sBUTTON_GIFT, sBUTTON_INFO], iCHANNEL_DIALOG);
}

string sPURCHASE_IM = " just bought ";
string sPURCHASE_IM2 = " at a price of ";
string sPURCHASE_IM3 = " L$ in region ";
ownerPurchaseIM(string sItemname, string sAvatarname)
{ //Send IM to owner.
    string sPrice = (string)((integer)llGetObjectDesc());
    string sSLURL = llGetRegionName() + getSLURLPos(llGetPos());
    llInstantMessage(llGetOwner(), sAvatarname + sPURCHASE_IM + sItemname + sPURCHASE_IM2 + sPrice + 
    sPURCHASE_IM3 + sSLURL);
}
string getSLURLPos(vector v)
{ //Returns SL-url-pos.
    return " (" + (string)((integer)(v.x)) + "," + (string)((integer)(v.y)) + "," + (string)((integer)(v.z)) + ")";
}

string sURL   = "http://w-hat.com/name2key"; //Name2key url.
key reqid;

integer iMAXLEN = 100;
string sPARAM = "?terse=1&name=";
httpdb_load(string sNAME)
{ //Perform name2key search.
  reqid = llHTTPRequest(sURL + sPARAM + llEscapeURL(sNAME), [HTTP_BODY_MAXLENGTH, iMAXLEN], "" );
}

key kUSER; //Globals.
string sGIFTEDNAME;
integer iREADY_FOR_PAYMENT = FALSE;
key kGIFTED;
integer iLISTEN;
default
{
    state_entry()
    { //Request debit-permission from owner.
        llSetPayPrice(PAY_HIDE, [PAY_HIDE, PAY_HIDE, PAY_HIDE, PAY_HIDE]);
        llSetTimerEvent(0.0); //Stop timer.
        llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);
    }

    changed(integer change)
    { //Reset when changing owner.
        if (change & CHANGED_OWNER)
        {
            llResetScript();
        }
    }

    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_DEBIT)
        { //Permissions granted, go to state perm.
            state perm;
        }
    }

    on_rez(integer start_param)
    {
        if (!(llGetPermissions() & PERMISSION_DEBIT) || llGetPermissionsKey() != llGetOwner())
        { //Permissions invalid.
            llResetScript();
        }
    }
}
state perm
{
    state_entry()
    { //Permissions given.
        llSetTimerEvent(0.0); //Stop timer.
        kUSER = NULL_KEY; //Reset key.
        sGIFTEDNAME = ""; //Reset name.
        llSetPayPrice(PAY_HIDE, [PAY_HIDE, PAY_HIDE, PAY_HIDE, PAY_HIDE]);
        llSetText("", vRESERVED_COLOR, fRESERVED_ALPHA);
    }

    touch_start(integer total_number)
    {
        kUSER = llDetectedKey(0);
        state inuse;
    }

    changed(integer change)
    { //Reset when changing owner.
        if (change & CHANGED_OWNER)
        {
            llResetScript();
        }
    }
}
state inuse
{
    state_entry()
    { //Set up timeout for in-use-state.
        iREADY_FOR_PAYMENT = FALSE; //Reset ready-flag.
        kGIFTED = NULL_KEY; //Reset gifted-key.
        llSetPayPrice(PAY_HIDE, [(integer)llGetObjectDesc(), PAY_HIDE, PAY_HIDE, PAY_HIDE]);
        llSetTimerEvent(fTIMEOUT_RESERVED);
        llSetText(sRESERVED, vRESERVED_COLOR, fRESERVED_ALPHA);
        llListenRemove(iLISTEN);
        iLISTEN = llListen(iCHANNEL_DIALOG, "", kUSER, "");
        dialog(kUSER);
    }
    listen(integer channel, string name, key id, string message)
    {
        if (channel == iCHANNEL_DIALOG && id == kUSER)
        { //Correct channel and user.
            if (message == sBUTTON_BUY)
            { //Buy-option chosen.
                llSay(PUBLIC_CHANNEL, sMESSAGE_BUY);
            }
            else if (message == sBUTTON_GIFT)
            { //Gift-option chosen.
                state name2key;
            }
            else if (message == sBUTTON_INFO)
            { //Info-notecard-option chosen.
                if (llGetInventoryNumber(INVENTORY_NOTECARD) > 0)
                {
                    llGiveInventory(kUSER, llGetInventoryName(INVENTORY_NOTECARD, 0));
                    llSay(PUBLIC_CHANNEL, sMESSAGE_INFO);
                }
            }
        }
    }
    touch_start(integer num_detected)
    {
        if (llDetectedKey(0) != kUSER)
        { //Error message (non-user).
            llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, sRESERVED);
        }
        else
        { //Dialog.
            dialog(kUSER);
        }
    }
    money(key id, integer amount)
    {
        string sItem;
        if (amount != (integer)llGetObjectDesc())
        { //Invalid amount!
            llTransferLindenDollars(id, amount);
            llSay(PUBLIC_CHANNEL, sINVALID_AMOUNT);
            return;
        }
        else
        {
            if (llGetInventoryNumber(INVENTORY_OBJECT) > 0)
            { //Give item.
                sItem = llGetInventoryName(INVENTORY_OBJECT, 0);
                llGiveInventory(kUSER, sItem);
            }
            llSay(PUBLIC_CHANNEL, sMESSAGE_BUY_SUCCESS);
            ownerPurchaseIM(sItem, llKey2Name(kUSER));
            state perm; //Return to state perm.
        }
    }
    timer()
    { //Time's up for user. Go back to state perm.
        state perm;
    }
    changed(integer change)
    { //Reset when changing owner.
        if (change & CHANGED_OWNER)
        {
            llResetScript();
        }
    }
}

state name2key
{
    state_entry()
    { //Setting up listener for name2key-query.
        iREADY_FOR_PAYMENT = FALSE; //Reset ready-flag.
        kGIFTED = NULL_KEY; //Reset gifted-key.
        llListen(iCHANNEL_NAME2KEY, "", kUSER, "");
        llSetPayPrice(PAY_HIDE, [PAY_HIDE, PAY_HIDE, PAY_HIDE, PAY_HIDE]);
        llSetTimerEvent(fTIMEOUT_NAME2KEY);
        llSay(PUBLIC_CHANNEL, sMESSAGE_GIFT);
    }
    listen(integer channel, string name, key id, string message)
    {
        if (channel == iCHANNEL_NAME2KEY && id == kUSER)
        { //User said name.
            sGIFTEDNAME = message;
            httpdb_load(sGIFTEDNAME);
        }
    }
    money(key id, integer amount)
    {
        string sItem;
        if (!iREADY_FOR_PAYMENT)
        { //Not ready for payment.
            return;
        }
        else
        {
            if (amount != (integer)llGetObjectDesc())
            { //Invalid amount!
                llTransferLindenDollars(id, amount);
                llSay(PUBLIC_CHANNEL, sINVALID_AMOUNT);
                return;
            }
            else
            {
                if (llGetInventoryNumber(INVENTORY_OBJECT) > 0)
                { //Give item.
                    sItem = llGetInventoryName(INVENTORY_OBJECT, 0);
                    llGiveInventory(kGIFTED, sItem);
                }
                llSay(PUBLIC_CHANNEL, sMESSAGE_GIFT_SUCCESS + sGIFTEDNAME);
                ownerPurchaseIM(sItem, llKey2Name(kUSER));
                state perm; //Return to state perm.
            }
        }
    }
    timer()
    { //Timeout of name2key (user did not enter name in chat, or name2key did not return a result).
        llSay(PUBLIC_CHANNEL, sTIMEOUT);
        state inuse;
    }
    changed(integer change)
    { //Reset when changing owner.
        if (change & CHANGED_OWNER)
        {
            llResetScript();
        }
    }
    http_response(key id, integer status, list meta, string body)
    { //Response from Name2Key-request.
        if (id == reqid)
        {
            reqid = NULL_KEY;
            if((key)body == NULL_KEY)
            { //No key found.
                llSay(PUBLIC_CHANNEL, sERROR);
            }
            else
            { //Key found.
                llSetPayPrice(PAY_HIDE, [(integer)llGetObjectDesc(), PAY_HIDE, PAY_HIDE, PAY_HIDE]);
                llSay(PUBLIC_CHANNEL, sMESSAGE_BUY_FOR_GIFTED);
                kGIFTED = (key)body;
                iREADY_FOR_PAYMENT = TRUE;
            }
        }
    }
}

Bearbeitet vom Benutzer Mittwoch, 25. März 2015 01:37:51(UTC)  | Grund: Nicht angegeben

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.058 Sekunden generiert.

Datenschutzrichtlinie
Haftungsausschluss
Impressum
Datenschutzerklärung
AGB, ToS
Kontakt