Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ATM Money Skript LSL
#1
Dieses Skript erlaubt es einem Objekt in OpenSim, Geld an Benutzer zu überweisen. Dabei wird jedoch eine tägliche Grenze von 250 festgelegt. Jeder Benutzer kann innerhalb von 24 Stunden nur bis zu diesem Limit Geld anfordern. Wenn der Benutzer das Limit erreicht, erhält er eine Nachricht und kann erst am nächsten Tag erneut Geld anfordern.

ACHTUNG! Wem das Script gehört, ist der Banker. Der Banker kann sich natürlich nicht selber abheben.

Die Installation ist ganz einfach Script in ein Objekt einfügen und Resetten.

Das Script kann man auch so erweitern, dass nur bestimmte Personen Zugang zum Geld haben.

---

### Funktionsweise

Das Skript arbeitet in drei Hauptphasen:

1. **Tägliches Limit verfolgen**: Es speichert die tägliche Gesamtsumme des Geldbetrags, den jeder Benutzer erhalten hat.
2. **Limit erzwingen**: Wenn die vom Benutzer angeforderte Menge das tägliche Limit überschreitet, zeigt das Skript eine Nachricht an, anstatt das Geld zu geben.
3. **Zurücksetzen des Limits nach 24 Stunden**: Wenn seit der letzten Interaktion eines Benutzers 24 Stunden vergangen sind, wird sein Tageslimit zurückgesetzt.

---

### Code-Abschnitte

#### 1. Globale Variablen

- **`buttons`**: Eine Liste mit den Geldbeträgen, die der Benutzer auswählen kann (z.B. "150", "200", "250").
- **`dialogInfo`**: Nachricht, die im Dialogfenster angezeigt wird.
- **`ToucherID`**: Speichert die ID des Benutzers, der mit dem Objekt interagiert.
- **`dialogChannel`** und **`listenHandle`**: Steuerung des Kommunikationskanals und Handhabung der Dialogantworten.
- **`userTimes`**: Eine Liste, die für jeden Benutzer die letzte Interaktionszeit und die bereits erhaltene Gesamtsumme des Tages speichert.
- **`ONE_DAY`** und **`DAILY_LIMIT`**: Definition der Tageslänge (in Sekunden, hier 24 Stunden) und des Tageslimits (hier 250).

#### 2. Initialisierung: `state_entry`

Beim Start des Skripts:

- **Berechtigung anfordern**: Das Skript fordert eine Debit-Berechtigung an, damit das Objekt Geld senden kann.
- **Dialog-Kanal setzen**: Der Kommunikationskanal wird auf eine eindeutige ID gesetzt, die auf dem Objektschlüssel basiert.

#### 3. Benutzerinteraktion: `touch_start`

Wenn ein Benutzer das Objekt berührt:

1. **Benutzer-Details überprüfen**: Das Skript sucht die ID des Benutzers in der Liste `userTimes`, um die letzte Interaktionszeit und den aktuellen Betrag zu finden.
2. **Tageslimit zurücksetzen**: Falls seit der letzten Interaktion 24 Stunden vergangen sind, wird der kumulierte Betrag des Benutzers auf 0 zurückgesetzt.
3. **Limit prüfen**: Wenn der Benutzer das tägliche Limit bereits erreicht hat, zeigt das Skript eine Nachricht an und beendet den Vorgang.
4. **Dialog anzeigen**: Wenn das Limit nicht überschritten ist, wird ein Dialog mit den auswählbaren Beträgen angezeigt.

#### 4. Dialogantwort: `listen`

Sobald der Benutzer einen Betrag auswählt:

1. **Auswahl verarbeiten**: Der ausgewählte Betrag wird in einen Integer-Wert umgewandelt.
2. **Validierung**: Das Skript überprüft, ob der Betrag in der Liste `buttons` enthalten ist.
3. **Limit überprüfen**: Wenn die neue Auswahl das Tageslimit überschreiten würde, zeigt das Skript eine Warnung an und fordert den Benutzer auf, einen kleineren Betrag zu wählen.
4. **Betrag aktualisieren**: Der Betrag und die Zeit werden in der `userTimes`-Liste aktualisiert, und das Skript sendet den angegebenen Betrag an den Benutzer.
5. **Ungültige Auswahl behandeln**: Wenn der Benutzer eine ungültige Option auswählt, wird eine Fehlermeldung angezeigt.
6. **Listener entfernen**: Am Ende wird der Listener entfernt, um unnötige Listener zu vermeiden.

---

### Zusammenfassung der Hauptfunktionen

1. **Benutzerdaten speichern**: Speichert ID, Interaktionszeit und erhaltenen Betrag jedes Benutzers.
2. **Tageslimit prüfen und zurücksetzen**: Wenn 24 Stunden vergangen sind, wird der erhaltene Betrag auf null gesetzt. Bei Erreichen des Limits wird dem Benutzer eine Nachricht angezeigt.
3. **Geld überweisen**: Überweist den gewünschten Betrag an den Benutzer, wenn das Limit nicht überschritten wird.

---

### Hinweise

- Achten Sie darauf, dass das Objekt die notwendigen Berechtigungen besitzt, um Geld zu überweisen.
- Die Liste `userTimes` speichert alle Benutzerinformationen, und sie wird täglich für jeden Benutzer zurückgesetzt.

---

Das Skript gewährleistet eine kontrollierte Ausgabe von Geld und verhindert, dass Benutzer über das festgelegte Limit hinaus an einem Tag Geld erhalten.

PHP-Code:
/* Money Giver Script with Daily Limit by Manfred Aabye.
Track the User’s Total Daily Amount: Keep track of the cumulative amount received by each user within a 24-hour period.
Enforce the Limit: If the user’s total for the day would exceed 250 with the requested amount, display a message instead of giving them more money.
Reset the Daily Total After 24 Hours: If 24 hours have passed since their last interaction, reset their total.
*/
list buttons = ["150""200""250""50""75""100""1""5""10"];
string dialogInfo "\nPlease choose an amount:";

key ToucherID;                  // Stores the key of the user interacting with the object
integer dialogChannel;          // Channel for dialog communication
integer listenHandle;           // Handle for the llListen function to capture dialog choices

// List to store user keys, last interaction times, and cumulative amounts received
list userTimes;

// Define the number of seconds in a day (24 hours) and daily limit
integer ONE_DAY 86400;
integer DAILY_LIMIT 250;

default
{
    
state_entry()
    {
        
// Request debit permissions from the object owner to allow giving money
        
llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);

        
// Set a unique dialog channel based on the object's key
        
dialogChannel = -- (integer)("0x" llGetSubString((string)llGetKey(), -7, -1));
    }

    
touch_start(integer num_detected)
    {
        
ToucherID llDetectedKey(0); // Get the key of the person who touched the object

        
integer idx llListFindList(userTimes, [ToucherID]); // Find user's index in userTimes list
        
integer currentTime llGetUnixTime(); // Get the current Unix timestamp

        
if (idx != -1)
        {
            
// User has interacted before; get their last time and cumulative amount
            
integer lastTime llList2Integer(userTimesidx 1);
            
integer cumulativeAmount llList2Integer(userTimesidx 2);

            
// Check if 24 hours have passed since the last interaction
            
if (currentTime lastTime >= ONE_DAY)
            {
                
// Reset daily count if 24 hours have passed
                
cumulativeAmount 0;
                
userTimes llListReplaceList(userTimes, [ToucherIDcurrentTimecumulativeAmount], idxidx 2);
            }
            else if (
cumulativeAmount >= DAILY_LIMIT)
            {
                
// If user has already reached the daily limit
                
llSay(0"You have reached your daily limit of 250. Please try again tomorrow.");
                return;
            }
        }
        else
        {
            
// If the user is new, add them to the list with a zero cumulative amount
            
userTimes += [ToucherIDcurrentTime0];
        }

        
// Display dialog for amount selection
        
llDialog(ToucherIDdialogInfobuttonsdialogChannel);
        
        
// Start listening on the dialog channel for this user’s response
        
listenHandle llListen(dialogChannel""ToucherID"");
    }

    
listen(integer channelstring namekey idstring message)
    {
        
integer amount = (integer)message// Convert the dialog choice to an integer for amount

        // Validate that the selected amount is in the buttons list
        
if (llListFindList(buttons, [message]) != -1)
        {
            
integer idx llListFindList(userTimes, [ToucherID]);
            
integer currentTime llGetUnixTime();
            
integer cumulativeAmount llList2Integer(userTimesidx 2); // Retrieve user's current cumulative amount

            // Check if the new request would exceed the daily limit
            
if (cumulativeAmount amount DAILY_LIMIT)
            {
                
llSay(0"This amount would exceed your daily limit of 250. Please choose a smaller amount.");
                
llListenRemove(listenHandle); // Remove listener to avoid unused listeners
                
return;
            }

            
// Update cumulative amount and timestamp in the list
            
cumulativeAmount += amount;
            
userTimes llListReplaceList(userTimes, [ToucherIDcurrentTimecumulativeAmount], idxidx 2);

            
// Inform in chat about the money given and transfer the specified amount
            
llSay(0"Give " message " Money");
            
llGiveMoney(ToucherIDamount);
        }
        else if (
message == "-")
        {
            
// Redisplay the dialog if the user selects the "-" option
            
llDialog(ToucherIDdialogInfobuttonsdialogChannel);
        }
        else
        {
            
// Handle any invalid selection
            
llSay(0"Invalid selection.");
        }

        
// Remove the listen handle to avoid accumulating unnecessary listeners
        
llListenRemove(listenHandle);
    }

Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.



Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Secure Skript Manfred Aabye 6 2.826 26.04.2022, 18:51
Letzter Beitrag: Manfred Aabye
  YEngine Skript Restart Manfred Aabye 6 2.741 15.03.2022, 12:43
Letzter Beitrag: Manfred Aabye

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste