03.11.2024, 14:29
(Dieser Beitrag wurde zuletzt bearbeitet: 06.11.2024, 10:21 von Manfred Aabye.)
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.
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 = -1 - (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(userTimes, idx + 1);
integer cumulativeAmount = llList2Integer(userTimes, idx + 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, [ToucherID, currentTime, cumulativeAmount], idx, idx + 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 += [ToucherID, currentTime, 0];
}
// Display dialog for amount selection
llDialog(ToucherID, dialogInfo, buttons, dialogChannel);
// Start listening on the dialog channel for this user’s response
listenHandle = llListen(dialogChannel, "", ToucherID, "");
}
listen(integer channel, string name, key id, string 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(userTimes, idx + 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, [ToucherID, currentTime, cumulativeAmount], idx, idx + 2);
// Inform in chat about the money given and transfer the specified amount
llSay(0, "Give " + message + " Money");
llGiveMoney(ToucherID, amount);
}
else if (message == "-")
{
// Redisplay the dialog if the user selects the "-" option
llDialog(ToucherID, dialogInfo, buttons, dialogChannel);
}
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.
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.