Difference between revisions of "User:Daemonika Nightfire/Scripts/Giver Tutorial"

From Second Life Wiki
Jump to navigation Jump to search
(Created page with "==Simple Giver== Der Landmark Giver ist eines der am haeufigsten verwendeten Scripte in SL, beinahe jeder Shop und Club verfuegt ueber so einen. Da es besonders in Malls in hohe…")
 
(Advanced Giver added)
Line 53: Line 53:
INVENTORY_NONE
INVENTORY_NONE


// Nicht zu empfehlen, wenn man nicht moechte, dass das Script mit ausgegeben wird.
// Als Simple Giver nicht zu empfehlen, wenn man nicht moechte, dass das Script mit ausgegeben wird.
INVENTORY_ALL
INVENTORY_ALL


Line 86: Line 86:
INVENTORY_ANIMATION
INVENTORY_ANIMATION
</lsl>
</lsl>
==Advanced Giver==
Wenn man nun den Kompletten Inhalt, mit Ausnahme des Scriptes ausgeben moechte, empfiehlt es sich folgendes Script zu verwenden. Ein weiterer Vorteil dieses Scripts ist, es vergibt den Inhalt in einem Ordner.  [[llGiveInventoryList]]( [[key]] target, [[string]] folder, [[list]] inventory );
<LSL>
/*
    *DS* Give Inventory ALL 2 All by Daemonika Nightfire
   
    Dieses Script gibt "jedem", der das Object klickt, den kompletten Inhalt, mit ausnahme des Scripts aus.
    Anders als bei den aelteren Scripten, wo der Inhalt bei jedem klicken neu ausgelesen wird,
    speichert dieses Script die Namen des Inhalts bereits im State_entry in eine Liste.
*/
list inventory = [];
string name;
integer num;
default
{
    state_entry()
    {
        num = llGetInventoryNumber(INVENTORY_ALL);
        integer    i;
        // ab hier wird das komplette Inventar des Objects ausgelesen
        for(i = 0; i < num; ++i)
        {
            // liesst die Inventar-Namen aus
            name = llGetInventoryName(INVENTORY_ALL, i);
            // Diese Funktion, sorgt dafuer, das das Script nicht zur Liste hinzu gefuegt wird
            if(name != llGetScriptName())
            {
                // fuegt die ausgelesenen Inventar-Namen in die Liste ein.
                inventory += name;
            }
        }
    }
   
    touch_start(integer total_number)
    {
        if(llGetListLength(inventory) < 1)
        {
            // bloed wenn die Box leer ist ;)
            llWhisper(0,"No items to offer.");
        }
        else
        {
            // gibt den gelisteten Inhalt aus (es dauert 3 secunden, bis das Script hier nach wieder reagiert)
            llGiveInventoryList(llDetectedKey(0), llGetObjectName(), inventory);
        }
    }
   
    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>

Revision as of 18:41, 18 May 2013

Simple Giver

Der Landmark Giver ist eines der am haeufigsten verwendeten Scripte in SL, beinahe jeder Shop und Club verfuegt ueber so einen. Da es besonders in Malls in hoher Anzahl vorkommt, sollte man darauf achten so wenig wie moeglich ins Script zu schreiben und nach moeglichkeit den Memory begrenzen, um nicht unnoetig Resourcen zu verschwenden. <lsl> /*

   *DS* Simple Landmark Giver by Daemonika Nightfire
   
   Da es sich hier um ein sehr sehr seeeehr kleines Script handelt, habe ich hier das Memory Limit vorgesehen.
   Der Grund liegt ganz einfach darin, den gesamten Region Memory auf diesem Weg so wenig wie moeglich zu belasten.
   
   Genauere Informationen ueber Script-Memory findest du hier:
   https://wiki.secondlife.com/wiki/User:Daemonika_Nightfire/Scripts/Memory_Walkthrough
  • /

default {

   state_entry()
   {
       // manuelles Script Limit (fuer einen simplen Giver voellig ausreichend)
       llSetMemoryLimit(10000);
   }
   
   touch_start(integer total_number)
   {
       // ueberprueft den Inhalt, ob eine Landmarke vorhanden ist und gibt diese aus
       if(llGetInventoryNumber(INVENTORY_LANDMARK) > 0)
       {
           llGiveInventory(llDetectedKey(0),llGetInventoryName(INVENTORY_LANDMARK, 0));
       }
   }
   
   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>

Natuerlich kann man ein und das selbe Script auch fuer andere Dinge als Landmarken verwenden. Ersetz dazu einfach die Konstanden in den Befehlen llGetInventoryNumber und llGetInventoryName. Die Konstanten beider Befehle sollten natuelrich identisch sein.

<LSL> // Ziemlich nutzlos, dann kann man sich auch das Script sparen. INVENTORY_NONE

// Als Simple Giver nicht zu empfehlen, wenn man nicht moechte, dass das Script mit ausgegeben wird. INVENTORY_ALL

// Ideal fuer jeden Shop und Club. INVENTORY_LANDMARK

// Wird oft im Roleplay verwendet um Regeln zu uebergeben. INVENTORY_NOTECARD

// INVENTORY_SOUND

// INVENTORY_OBJECT

// INVENTORY_GESTURE

// INVENTORY_TEXTURE

// INVENTORY_CLOTHING

// INVENTORY_BODYPART

// INVENTORY_SCRIPT

// INVENTORY_ANIMATION </lsl>

Advanced Giver

Wenn man nun den Kompletten Inhalt, mit Ausnahme des Scriptes ausgeben moechte, empfiehlt es sich folgendes Script zu verwenden. Ein weiterer Vorteil dieses Scripts ist, es vergibt den Inhalt in einem Ordner. llGiveInventoryList( key target, string folder, list inventory );

<LSL> /*

   *DS* Give Inventory ALL 2 All by Daemonika Nightfire
   
   Dieses Script gibt "jedem", der das Object klickt, den kompletten Inhalt, mit ausnahme des Scripts aus.
   Anders als bei den aelteren Scripten, wo der Inhalt bei jedem klicken neu ausgelesen wird,
   speichert dieses Script die Namen des Inhalts bereits im State_entry in eine Liste.
  • /

list inventory = []; string name; integer num;

default {

   state_entry()
   {
       num = llGetInventoryNumber(INVENTORY_ALL);
       integer     i;
       // ab hier wird das komplette Inventar des Objects ausgelesen
       for(i = 0; i < num; ++i)
       {
           // liesst die Inventar-Namen aus
           name = llGetInventoryName(INVENTORY_ALL, i);
           // Diese Funktion, sorgt dafuer, das das Script nicht zur Liste hinzu gefuegt wird
           if(name != llGetScriptName())
           {
               // fuegt die ausgelesenen Inventar-Namen in die Liste ein.
               inventory += name;
           }
       }
   }
   
   touch_start(integer total_number)
   {
       if(llGetListLength(inventory) < 1)
       {
           // bloed wenn die Box leer ist ;)
           llWhisper(0,"No items to offer.");
       }
       else
       {
           // gibt den gelisteten Inhalt aus (es dauert 3 secunden, bis das Script hier nach wieder reagiert)
           llGiveInventoryList(llDetectedKey(0), llGetObjectName(), inventory);
       }
   }
   
   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>