User:Daemonika Nightfire/Scripts/Vendor

From Second Life Wiki
Jump to navigation Jump to search

Default Vendor

Fuer jeden der in Second Life einen SHop eroeffnen und seine Kreationen verkaufen moechte, aber noch nicht so viel Geld fuer ein professionelles Vendoren-System ausgeben kann oder will, ist das folgende Scripte ideal. Natuerlich kann man auch alles lose in eine Box packen und die Verkaufs-Option des Baumenues einstellen, wenn man aber beruecksichtigt, dass Copybots diesen sichtbaren Inhalt dann heraus kopieren koennnen, ist die gescriptete Methode die bessere.

<LSL> /*

   *DS* Vendor by Daemonika Nightfire
   
   Bei diesem Vendor Script handelt es sich um die reinen Grundlagen, die in keinem Vendor fehlen duerfen.
   
   Warum habe ich mich dazu entschlossen die Produkte mit dem Vendor in einer Box zu verkaufen?
   Das hat folgenden Grund:
   Ein Copybot kann nur das klauen was er sieht. Wenn nun ein Copybot in den Vendor rein sieht, findet er nur eine Box.
   Der inhalt dieser Box ist fuer den Copybot unsichtbar und kann nicht kopiert werden, weil er es nicht sieht.
   Bei normalen Verkaufs-Boxen mit losem Inhalt, besteht die gefahr, das ein Copybot sich alles heraus kopiert.
   
   Zusaetzlich habe ich eine Abfrage eingebaut, die verhindert, das jemand das Zahlfeld mit einem gehackten Viewer ueberlistet.
  • /

integer prize = 10; // hier wird der Preis fuer das Produkt eingegeben. string object;

default {

   state_entry()
   {
       // Solange der Vendor leer ist, sind aus sicherheitsgruenden die Zahlungsmethoden und das Zahlfeld deaktiviert.
       llSetClickAction(CLICK_ACTION_NONE);
       llSetPayPrice(PAY_HIDE, [PAY_HIDE, PAY_HIDE, PAY_HIDE, PAY_HIDE]);
       
       if(llGetInventoryNumber(INVENTORY_OBJECT) > 0)
       {
           object = llGetInventoryName(INVENTORY_OBJECT, 0);
           
           // Erst hier wird die Zahlungsmethode und das Zahlfeld aktiviert.
           llSetClickAction(CLICK_ACTION_PAY);
           // Im Zahlfeld sollte zum einzahlen nur ein einziger Button angezeigt werden.
           llSetPayPrice(PAY_HIDE, [prize, PAY_HIDE, PAY_HIDE, PAY_HIDE]);
           
           llOwnerSay("Ready, the prize of this product is " + (string)prize + "L$.");
       }
   }
   money(key id, integer payment)
   {
       // Absolut wichtig! Nur wenn die Zahlung mit dem Preis ueberein stimmt, sollte das Produkt ausgegeben werden!
       if(payment == prize)
       {
           llGiveInventory(id, object);
       }
       else if(payment != prize) // <--- *** Anti Hacker Option ***
       {
           // Sollte es dennoch jemand mit einem gehackten Viewer schaffen sich das manuelle Zahlfeld anzeigen zu lassen,
           // bedankt sich der Vendor hoeflich fuer die Spende und gibt kein Produkt aus.
           llShout(0,"Thanks for your donation, " + llKey2Name(id) + "!");
       }
   }
   
   changed(integer change)
   {
       if(change & CHANGED_INVENTORY)
       {
           // resettet das Script, sobald sich der Inhalt des Objects aendert.
           llResetScript();
       }
   }
   
   on_rez(integer Dae)
   {
       // resettet das Script, sobald es gerezzt wird.
       llResetScript();
   }

} </LSL>

Split-pay Vendor

Dieses Script funktioniert im prinzip genau so wie das obere, jedoch verfuegt diese Version ueber einen Split-Pay, der es dir ermoeglich den Umsatz mit einem Partner zu teilen.

KBcaution.png Important: Fuer dieses Script ist eine Bestaetigung der Permission Debit erforderlich sobald ein Partner eingetragen wird. Es erfolgt eine Abfrage, um auf das Benutzerkonto zugreifen zu duerfen. Wenn man die mit JA bestaetigt, wird dem Object die Erlaubniss erteilt Linden Dollar vom Benutzer Konto abzuziehen und an einen anderen Avatar zu ueberweisen.

<LSL> /*

   *DS* Vendor by Daemonika Nightfire
   
   Dieser Vendor verfuegt ueber die selben Grundlagen wie die (v1.0.00) Version, jedoch besitz dieses Script einen Partner-Split.
   
   Sobald in diesem Script ein PartnerKey eingetragen wird, fordert das Script die bestaetigung der Permission Debit.
   Das bedeutet, das Script benoetigt die Erlaubnis Geld von deinem Konto ab zu ziehen und an den eingetragenen PartnerKey zu ueberweisen.
   
   Warum habe ich mich dazu entschlossen die Produkte mit dem Vendor in einer Box zu verkaufen?
   Das hat folgenden Grund:
   Ein Copybot kann nur das klauen was er sieht. Wenn nun ein Copybot in den Vendor rein sieht, findet er nur eine Box.
   Der inhalt dieser Box ist fuer den Copybot unsichtbar und kann nicht kopiert werden, weil er es nicht sieht.
   Bei normalen Verkaufs-Boxen mit losem Inhalt, besteht die gefahr, das ein Copybot sich alles heraus kopiert.
   
   Zusaetzlich habe ich eine Abfrage eingebaut, die verhindert, das jemand das Zahlfeld mit einem gehackten Viewer ueberlistet.
  • /

key owner;

integer prize = 10; // hier wird der Preis fuer das Produkt eingegeben.

key partner = ""; // trage hier den AvatarKey (UUID "00000000-0000-0000-0000-000000000000") ein, mit dem du den Umsatz teilen willst. integer percent = 50; // trage hier die Prozente fuer deinen Partner ohne Prozent-Zeichen % ein

string object;

// Diesmal habe ich mich dazu entschlossen, die Zahlungsmethoden als Funktion zu verwenden, weil sie 2x benoetigt wird. Payment_Option() // <--- Funktion {

   // Erst hier wird die Zahlungsmethode und das Zahlfeld aktiviert.
   llSetClickAction(CLICK_ACTION_PAY);
   // Im Zahlfeld sollte zum einzahlen nur ein einziger Button angezeigt werden.
   llSetPayPrice(PAY_HIDE, [prize, PAY_HIDE, PAY_HIDE, PAY_HIDE]);

}

default {

   state_entry()
   {
       // speichert den OwnerKey (UUID)
       owner = llGetOwner();
       
       // Solange der Vendor leer ist, sind aus sicherheitsgruenden die Zahlungsmethoden und das Zahlfeld deaktiviert.
       llSetClickAction(CLICK_ACTION_NONE);
       llSetPayPrice(PAY_HIDE, [PAY_HIDE, PAY_HIDE, PAY_HIDE, PAY_HIDE]);
       
       if(llGetInventoryNumber(INVENTORY_OBJECT) > 0)
       {
           object = llGetInventoryName(INVENTORY_OBJECT, 0);
           
           // wird nur ausgefuehrt, wenn ein PartnerKey angegeben ist.
           if(partner != "")
           {
               // Diese Funktion fordert die Bestaetigung der Permission Debit Abfrage.
               llRequestPermissions(owner,PERMISSION_DEBIT);
               
               // Wichtig!
               // Das Fenster was dabei aufgerufen wird, sollte sorgfaeltig gelesen und nur dann bestaetigt werden,
               // wenn man genau weiss wofuer die Abfrage benoetigt wird.
               // Wenn dich also ein Stuhl, ein Attachment oder was weiss ich nicht danach fragt,
               // solltest du den Ersteller des Objects sofort bei Linden Lab mit einem Abuse Report melden.
           }
           else
           {
               Payment_Option(); // <--- Funktion
               llOwnerSay("Ready, the prize of this product is " + (string)prize + "L$.");
           }
       }
   }
   
   run_time_permissions(integer permissions)
   {
       if(permissions & PERMISSION_DEBIT)
       {
           Payment_Option(); // <--- Funktion
           llOwnerSay("Ready, the prize of this product is " + (string)prize + "L$ your Partner will receive " + (string)percent + "%.");
       }
       else
       {
           llOwnerSay("Permission debit required to share amount!");
           llResetScript();
       }
   }
   money(key id, integer payment)
   {
       // Absolut wichtig! Nur wenn die Zahlung mit dem Preis ueberein stimmt, sollte das Produkt ausgegeben werden!
       if(payment == prize)
       {
           llGiveInventory(id, object);
           
           if(partner != "" & payment != 1 && percent <= 100)
           {
               integer split = llRound(payment * percent / 100);
               if(split <= 1)
               {
                   split = 1;
               }
               llGiveMoney(partner, split);
           }
           if(llGetInventoryNumber(INVENTORY_OBJECT) < 1)
           {
               // Solange der Vendor leer ist, sind aus sicherheitsgruenden die Zahlungsmethoden und das Zahlfeld deaktiviert.
               llSetClickAction(CLICK_ACTION_NONE);
               llSetPayPrice(PAY_HIDE, [PAY_HIDE, PAY_HIDE, PAY_HIDE, PAY_HIDE]);
           }
       }
       else if(payment != prize) // <--- *** Anti Hacker Option ***
       {
           // Sollte es dennoch jemand mit einem gehackten Viewer schaffen sich das manuelle Zahlfeld anzeigen zu lassen,
           // bedankt sich der Vendor hoeflich fuer die Spende und gibt kein Produkt aus.
           llShout(0,"Thanks for your donation, " + llKey2Name(id) + "!");
       }
   }
   
   changed(integer change)
   {
       if(change & CHANGED_INVENTORY)
       {
           // resettet das Script, sobald sich der Inhalt des Objects aendert.
           llResetScript();
       }
   }
   
   on_rez(integer Dae)
   {
       // resettet das Script, sobald es gerezzt wird.
       llResetScript();
   }

} </LSL>

Donation Box

Warum habe ich die Donation Box und den Tipjar bei den Vendoren einsortiert? Der Grund ist eigentlich recht einfach, da die folgenden beiden Scripte auf dem gleichen Prinzip basieren wie die Vendoren und beim Einzahlen lediglich keine Produkte ausgeben.

<LSL> /*

   *DS* Donation Box by Daemonika Nightfire
   
   Bei dieser Donation Box Script handelt es sich wirklich nur um die reine Grundfunktion, worauf alle Donation Boxen basieren.
   Witzig, hier steht im Grunde nichts anderes drin, als im Tipjar Script.
  • /

// Die Beschriftung zwischen den Gaensefuessen, wird ueberall dort angezeigt wo das Script den string aufruft. string clubname = "Dein Club";

// integer fuer das gesamte guthaben integer total = 0;

default {

   state_entry()
   {
       // hier bestimmst du die Beschriftung der Button im Zahlfeld
       llSetPayPrice(00, [100, 200, 500, 1000]);
       
       llSetText("Spende fuer " + clubname, <1.0,1.0,1.0>, 1.0);
       llOwnerSay("Donation Box fuer " + clubname + ", ready...");
   }
   
   money(key id, integer payment)
   {
       // rechnet hier das gesamte guthaben mit der neuen zahlung zusammen
       total = total + payment;
       llSetText("Spenden fuer " + clubname + "\nGesamt: " + (string)total +"L$", <1.0,1.0,1.0>, 1.0);
       
       string name = llKey2Name(id);
       // diesen llKey2Name Befehl sollte man immer nur dann verwenden, wenn man sich absolut sicher ist,
       // das sich die betreffende Person bei der abfrage auch wirklich in der selben Region befindet.
       
       llSay(0, name + " spendete " + clubname + " " + (string)payment + "L$");
   }
   
   on_rez(integer Dae)
   {
       // resettet das Script, sobald es gerezzt wird
       llResetScript();
   }

} </LSL>

Tipjar

Technisch ist das Tipjar Script mit dem Donation Script vollkommen identisch. Die beiden Scripte unterscheiden sich lediglich in dem, was im Hovertext, im Zahlfeld und im Chat erscheint.

<LSL> /*

   *DS* Tipjar by Daemonika Nightfire
   
   Bei diesem Tipjar Script handelt es sich wirklich nur um die reine Grundfunktion, worauf alle Tipjars basieren.
   Witzig, hier steht im Grunde nichts anderes drin, als im Donation Box Script.
  • /

// Die Beschriftung zwischen den Gaensefuessen, wird ueberall dort angezeigt wo das Script den string aufruft. string ownername = "Dein Name";

// integer fuer das gesamte guthaben integer total = 0;

default {

   state_entry()
   {
       // hier bestimmst du die Beschriftung der Button im Zahlfeld
       llSetPayPrice(00, [10, 20, 50, 100]);
       
       llSetText("Tips fuer " + ownername, <1.0,1.0,1.0>, 1.0);
       llOwnerSay("Tipjar fuer " + ownername + ", ready...");
   }
   
   money(key id, integer payment)
   {
       // rechnet hier das gesamte guthaben mit der neuen zahlung zusammen
       total = total + payment;
       llSetText("Tips fuer " + ownername + "\nGesamt: " + (string)total +"L$", <1.0,1.0,1.0>, 1.0);
       
       string name = llKey2Name(id);
       // diesen llKey2Name Befehl sollte man immer nur dann verwenden, wenn man sich absolut sicher ist,
       // das sich die betreffende Person bei der abfrage auch wirklich in der selben Region befindet.
       
       llSay(0, name + " tipte " + ownername + " mit " + (string)payment + "L$");
   }
   
   on_rez(integer Dae)
   {
       // resettet das Script, sobald es gerezzt wird
       llResetScript();
   }

} </LSL>