• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

Spardose

Daemonika Nightfire

Forumsgott/göttin
huhu,

anlaesslich der Nachfrage nach einer Spardose in SL im anderen Thread habe ich mich auch mal an so etwas versucht. ;)

Wie im anderen Thread schon erwaehnt wurde, ist fuer so etwas ein zweiter Account notwendig, andernfalls macht es absolut keinen Sinn, so ein Script zu nutzen.
Bei meiner Variante handelt es sich um eine Piggy-Bank getarnt als Donation-Box, ganz klassisch mit einem Hovertext fuer die aktuellen Spenden.

Ziemlich am Anfang findet ihr eine Liste mit Avatar-UUID'S welche lediglich durch ein Komma getrennt sind. Um Probleme zu vermeiden habe ich die Keys und die entsprechenden Abfragen explizit als string formatiert, weil verschiedene Befehle Keys auf unterschiedliche Weise mal mit und mal ohne Gaensefuesschen in eine Liste eintragen oder abfragen.
Ausschliesslich die eingetragenen Keys und der Besitzer koennen das Menue verwenden. Es ist nicht notwendig, den Besitzer des Objects ebenfalls in die Liste einzutragen, das macht das Script schon voll automatisch.

Ganz wichtig, fuer dieses Script ist die erlaubniss fuer die Permission Debit zwingend erforderlich, sonst funktioniert das Auszahlen nicht.
Desweiteren ist es erforderlich das der entsprechende ALT (Alternativ Account), der als Bank fungiert der Besitzer des Scriptes bzw. des ganzen Objects ist. Das script verfuegt ueber ein klassisches Menue, womit auch nur der Besitzer die Moeglichkeit zum resetten hat.
Warum nur der Besitzer? Ganz einfach, weil nur der Besitzer dazu in der Lage ist, erneut die Permission Debit zu bestaetigen.

Wenn du dazu noch die Click-Action des Objects auf "bezahlen" stellst, wird so schnell niemand merken, das die Box auch noch ein Menue hat. Allerdings kommst du dann selbst nur noch per Rechtsklick an das Menue.
Code:
// *DS* Donation-Box & Piggy-Bank by Daemonika Nightfire

// German
// Es ist erlaubt dieses Script fuer private Zwecke zu nutzen.
// Es ist verboten, dieses Script mit eingeschraenkten Rechten kommerziell zu verbreiten.

// English
// It is allowed to use this script for private purposes.
// It is forbidden to distribute this script with restricted rights commercially.

key Owner;
list Member = ["61ee201a-81cf-4322-b9a8-a5eb8da777c2", "00000000-0000-0000-0000-000000000000"];
key CurrentUser;

string Name = "Dein Wunschname";
Hovertext()
{
    llSetText("Donation-Box for " + Name + "\ntotal: " + (string)Total +"L$", <1.0,1.0,1.0>, 1.0);
}

integer Total = 0;
integer PayEvent = FALSE;

integer menu_handler;
integer menu_channel;
Menu(key agent, string text, list button)
{
    llListenRemove(menu_handler);
    menu_channel = (integer)(llFrand(99999999) * -1);
    menu_handler = llListen(menu_channel,"","","");
    
    llDialog(agent, text, button, menu_channel); //llOwnerSay((string)menu_channel);
    llSetTimerEvent(60.0);
}

ListenRemove()
{
    llListenRemove(menu_handler);
    PayEvent = FALSE;
    llSetTimerEvent(0.0);
}
 
default
{
    state_entry()
    {
        Owner = llGetOwner();
        llRequestPermissions(Owner, PERMISSION_DEBIT);
        
        Total = (integer)llGetObjectDesc();
        Member = llListInsertList(Member, [(string)Owner], 0); //llOwnerSay("\n" + llDumpList2String(Member, "\n"));
        
        llSetPayPrice(0, [5, 10, 20, 50]);
    }
    
    run_time_permissions (integer perm)
    {
        if(perm & PERMISSION_DEBIT)
        {
            Hovertext();
            llOwnerSay("Donation-Box ready...");
        }
        else
        {
            llOwnerSay("Sorry, it will not work without permission... resetting...");
            llResetScript();
        }
    }
    
    touch_start(integer num_detected)
    {
        key Agent = llDetectedKey(0);
        if(~llListFindList(Member, llCSV2List(Agent)))
        {
            CurrentUser = Agent;// llOwnerSay(llGetUsername(CurrentUser));
            
            if(CurrentUser == Owner)
            {
                Menu(CurrentUser, "Text", ["Payout","Reset","Close"]);
            }
            else if(CurrentUser != Owner)
            {
                Menu(CurrentUser, "Text", ["Payout","Close"]);
            }
        }
        else
        {
            llSay(0,"Sorry, you are not allowed to use the menu.");
        }
    }
    
    listen(integer chan, string name, key id, string message)
    {
        if(id == CurrentUser)
        {
            if(chan == menu_channel)
            {
                if(message == "Payout")
                {
                    PayEvent = TRUE;
                    Menu(CurrentUser, "\n\nPossible Values are:\n100%, 50%, 20%,\n10%, 1%, Close",
                    [(string)(Total/10),(string)(Total/100),"Close",(string)Total,(string)(Total/2),(string)(Total/5)]);
                }
                else if(message == "Reset")
                {
                    if(id == Owner)
                    {
                        llResetScript();
                    }
                }
                else if(message == "Close")
                {
                    ListenRemove();
                }
                else
                {
                    if(PayEvent == TRUE)
                    {
                        integer Amount = (integer)message;
                        if(Amount < 1)
                        {
                            llRegionSayTo(CurrentUser, 0, "Sorry, impossible to payout 0L$");
                            jump leave;
                        }
                        llGiveMoney(CurrentUser, Amount);
                        
                        Total -= Amount;
                        llSetObjectDesc((string)Total);
                        Hovertext();
                    }
                    
                    @leave; //llOwnerSay("leave");
                    ListenRemove();
                }
            }
        }
    }
 
    money(key id, integer payment)
    {
        Total += payment;
        llSetObjectDesc((string)Total);
        Hovertext();
        llRegionSayTo(id, 0, "Thank you for your donation.");
    }
    
    timer()
    {
        ListenRemove();
    }
 
    on_rez(integer Dae)
    {
        llResetScript();
    }
}

Eventuelle Fragen bezueglich bestimmter Funktionen, oder Verbesserungsvorschlaege koennen gerne hier diskutiert werden.
Nun fehlt nur noch deine Version Archon. ;)

LG
Dae
 
So, nun auch hier meine Version

Code:
//   HIER DIE KEYS FÜR DEN ZUGRIFF EINTRAGEN
list List_keys  =      ["3c9cc382-baae-4b18-89c8-a86904339237", //Archon
                        "8e635f6e-f4c5-42c5-a529-f78946a2e8f2", //Kosh
                        "d75e8602-20cc-4087-9ffb-96a53f2bac29"];//Mo

//  HIER DAS AKTUELLE GUTHABEN EINTRAGEN
integer         I_AMOUNT    =   0;
//######################################

integer         I_chan;
integer         I_handle;
string          toucher;
default
{
    state_entry()
    {
        llSetText("Waiting for debit permission...",<1,0,0>,1);
        llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);
    }
    on_rez(integer honk)
    {
        llResetScript();
    }
    touch_start(integer ii)
    {
        if(llDetectedKey(0) == llGetOwner())llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);
    }
    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_DEBIT)
        {
            state running;
        }
    }
}

state running
{
    state_entry()
    {
        llSetPayPrice(1, [PAY_HIDE ,PAY_HIDE, PAY_HIDE, PAY_HIDE]);
        llSetText("",<1,1,1>,1);
    }
    touch_start(integer ii)
    {
        string stoucher = llDetectedKey(0);
      
        if(llListFindList(List_keys,[stoucher]) == -1)return;
       llListenRemove(I_handle);
        I_chan=llFloor(llFrand(999999)-1111111);
        I_handle = llListen(I_chan,"","","");
      
        llTextBox(toucher,"Gib hier mal ein wieviel L$ Du haben willst.\nAktuelles Guthaben ist: "+(string)I_AMOUNT+" L$",I_chan);
        llSetTimerEvent(30);
        toucher = llDetectedKey(0);
    }
    timer()
    {
        llSetTimerEvent(0);
        llListenRemove(I_handle);
        llWhisper(0,"Timeout");
    }
    money(key id, integer amount)        // Some money has been received and has gone to this object's owner
    {
        llInstantMessage(id, "DANKE");
        I_AMOUNT = I_AMOUNT + amount;
    }
    listen(integer channel, string name, key id, string message)
    {
        //llRegionSayTo(toucher,0,message);
        integer i = (integer)message;
        if(i <= I_AMOUNT)
        {
            if(i > 0)
            {
                llGiveMoney(toucher,i);
                I_AMOUNT = I_AMOUNT-i;
            }
            else llRegionSayTo(toucher,0,"Fehlerhafte Eingabe...");
        }
        else
        {
            llRegionSayTo(toucher,0,"So viel Geld steht Dir nicht zur Verfügung");
        }
        llSetTimerEvent(0);
        llListenRemove(I_handle);
    }
    on_rez(integer honk)
    {
        llResetScript();
    }
    changed(integer change)
    {
        if (change & CHANGED_OWNER)
        {
            llResetScript();
        }
    }
}
 
Zuletzt bearbeitet:
Jupp, ich hab auch gern nen eigenen state für die Debit Abfrage.
Jeder Scripter hat wirklich seinen eigenen Stil dabei :)
Den "on_rez(integer honk)" hab ich mal von einer Bekannten übernommen als ich mit scripten angefangen habe.
 

Users who are viewing this thread

Zurück
Oben Unten