GridTalk.de
Ein Script fuer Mailbox mit NC funktion - Druckversion

+- GridTalk.de (https://www.gridtalk.de)
+-- Forum: Werkstatt (https://www.gridtalk.de/forumdisplay.php?fid=4)
+--- Forum: Scripting (https://www.gridtalk.de/forumdisplay.php?fid=23)
+--- Thema: Ein Script fuer Mailbox mit NC funktion (/showthread.php?tid=63)



Ein Script fuer Mailbox mit NC funktion - Ezry Aldrin - 06.08.2010

Hiu

Ich koennte jetzt im Netz suchen und wuerde sicher auch finden, aber hier ist es mir dann lieber, gibt es ein schon getestetes Script fuer OS, das es moeglich macht Briefe zu hinterlassen fuer eine Person in Form einer Notecard, also wahlweise fuer den Eigner des Briefkastens, oder halt um Namentlich einem anderen zuzuordnen, der per touchbefehl erkannt wird und die richtige NC bekommtWink

lg
Ezry

Edit: Ich hab mal die Überschrit ein wenig griffiger gemacht ;D //Bogus


Re: Ein Script fuer.... - Genie Fegte - 07.08.2010

Hallo Ezry Smile
ja es gibt ein Briefkasten Skript , das auch in OS funktioniert.
Es ist zwar nur für eine Person (den Owner) aber ansonsten funktioniert es gut.
Jeder kann eine Notecard darin ablegen und der Owner hat beim Anklicken ein Auswahl Menue.
Ungelesen Nachrichten, bereits gelesene Nachrichten oder löschen .
Code:
// --------------------------------------//
// This script transform a prim to a Mail Box.
// Folks can drop notecard to the box.
// Read/unread information is displayed as hovering text.
// You can copy/modify this script, it's totally free.
// --------------------------------------//
// Modified by dakar Muliaina, converted to The king's English
// and a few other enhancements.
//-------------------------------------------//

list lMail = [];
// column 1 = notecard name, column 2 = read by user
integer     MAIL_UNREADED = 0;
integer     MAIL_READED = 1;
integer     DIALOG_CHANNEL = 49383;
list        DIALOG_CHOICE =
                ["Ungelesene",
                 "Gelesene",
                 "Loeschen"];
integer nLastCardCount = 0;
integer nLastItemCount = 0;

TxtRefresh()
{
    // show the unreadable notecard
    integer nTotalCard = 0;
    integer nNotReaded = 0;
    integer nCount = 0;
    for (nCount = 0; nCount < llGetListLength(lMail); nCount += 2)
    {
        if (llList2Integer(lMail, nCount + 1) == MAIL_UNREADED)
            nNotReaded += 1;
        nTotalCard += 1;
    }

    // total string
    string cPost = (string)nTotalCard + " Brief(e)";
    if (nTotalCard > 1) cPost += "s";
    cPost += " eingeworfen";

       // unreaded string
    string cUnreaded = (string)nNotReaded + " ungelesen";
    llSetText("Briefkasten!\n" + cPost + "\n" + cUnreaded, <.95, .75, 0>, 1);
}

default
{
    state_entry()
    {
       // Allowing dropping of object
       llAllowInventoryDrop(TRUE);
       llListen(DIALOG_CHANNEL, "", NULL_KEY, "");
       nLastCardCount = llGetInventoryNumber(INVENTORY_ALL);
       nLastItemCount = llGetInventoryNumber(INVENTORY_NOTECARD);

       // Auto complete list
       integer nCardCount = llGetInventoryNumber(INVENTORY_NOTECARD);
       integer n_CurObj = 0;
       string c_Name = "NotEmpty";
       while (c_Name != "")
       {
            c_Name = llGetInventoryName(INVENTORY_NOTECARD, n_CurObj);
            n_CurObj += 1;
            if (c_Name != "")
            {
                lMail += [c_Name];
                lMail += MAIL_UNREADED;
            }
        }
        TxtRefresh();
    }

    touch_start(integer total_number)
    {
        llSay(0, "Drop a notecard to be sent to MY OWNER.\n ziehe eine Notecard
auf mich um sie meinem Besitzer zu hinterlassen.");
//---- Change MY OWNER above to suit your likes and needs.   //
        // if owner
        key id = llDetectedKey(0);
        if (id == llGetOwner())
        {
            // Show a dialog
            llDialog(id, "Welche Briefe soll ich oeffnen?", DIALOG_CHOICE,
              DIALOG_CHANNEL);
        }
    }

    listen(integer channel, string name, key id, string message)
    {
        if (llGetOwner() == id && llListFindList(DIALOG_CHOICE,
           [message]) != -1)
        {
            integer i;
            string cName;
            list lRemove;
            integer nStatus;
            for (i = 0; i < llGetListLength(lMail); i += 2)
            {
                cName = llList2String(lMail, i);
                nStatus = llList2Integer(lMail, i + 1);
                if (message == llList2String(DIALOG_CHOICE, 0)
                   && nStatus == MAIL_UNREADED)
                {
                    // open un-readed
                    llGiveInventory(id, cName);
                    // mark for readed
                    lMail = llListReplaceList(lMail, [MAIL_READED],
                        i + 1, i + 1);
                }
                if (message == llList2String(DIALOG_CHOICE, 1)
                   && nStatus == MAIL_READED)
                {
                    // open readed
                    llGiveInventory(id, cName);
                }
                if (message == llList2String(DIALOG_CHOICE, 2)
                   && nStatus == MAIL_READED)
                {
                    // delete readed
                    llSay(0, cName);
                    llRemoveInventory(cName);
                    lRemove += i;
                }
            }
            // remove from the list
            if (llGetListLength(lRemove) > 0)
            {
                integer k;
                for (k = 0; k < llGetListLength(lRemove); k++)
                {
                    i = llList2Integer(lRemove, k);
                    lMail = llDeleteSubList(lMail, i, i+1);
                }
            }
            TxtRefresh();
        }
    }

    changed(integer change)
    {
        // dont accept other than a notecard
        integer nItemCount = llGetInventoryNumber(INVENTORY_ALL);
        if (nItemCount < 2)
        {
            // clear the list
            lMail = [];
        }

        if (nItemCount != nLastItemCount)
        {
            // delete other item type than notecard
            string cName = "NotEmpty";
            integer nCurObj = 0;
            integer nObjType = INVENTORY_NONE;
            list lRemove = [];
            while (cName != "")
            {
                cName = llGetInventoryName(INVENTORY_ALL, nCurObj);
                nCurObj += 1;
                nObjType = llGetInventoryType(cName);
                if (nObjType != INVENTORY_NOTECARD)
                {
                    // add for deletion, its not a notecard
                    lRemove += cName;
                }
            }

            // delete other object than notecard
            integer nD = 0;
            for (nD = 0; nD < llGetListLength(lRemove); nD += 1)
            {
                // dont remove this script !
                cName = llList2String(lRemove, nD);
                if (cName != llGetScriptName() && cName != "")
                {
                    llSay(0, "Sorry but " + cName + " is not a notecard.");
                    llRemoveInventory(cName);
                }
            }

            // search for a new notecard
            integer n_CurObj = 0;
            string c_Name = "NotEmpty";
            while (c_Name != "")
            {
                c_Name = llGetInventoryName(INVENTORY_NOTECARD, n_CurObj);
                llSay(0, c_Name);
                n_CurObj += 1;
                // search for this card
                if (llListFindList(lMail, [c_Name]) == -1 && c_Name != "")
                {
                    // ok its a new card
                    lMail += [c_Name];
                    lMail += MAIL_UNREADED;
                    llSay(0, c_Name + " added to the mailbox.");
                }
            }
        }
        nLastItemCount = llGetInventoryNumber(INVENTORY_ALL);
        nLastCardCount = llGetInventoryNumber(INVENTORY_NOTECARD);
        // refresh the text
        TxtRefresh();
    }
}

viel Spass beim testen

greets

Genie


Re: Ein Script fuer.... - Bogus Curry - 07.08.2010

Hallo ;D

Bitte bei Scripts den BBC "code" benutzen nicht "quote", habs mal geändert ;D


Re: Ein Script fuer.... - Ezry Aldrin - 07.08.2010

hiu

Thx,fuer den Script den teste ich spaeter malWink denn ne andere Moeglichkeit haben wir ja derzeit nicht in OS, um jemand was zu schreiben,da sonst immer die Meldung kommt user´s not logged in, Message is not savedWink

und manchmal kommt ja auch mich jemand besuchen und so kann man mir dann die Meinung in einer NC in den Briefkasten wuerfelnWink

lg
Ezry


Re: Ein Script fuer.... - Ezry Aldrin - 10.08.2010

Huhu

Habe den Script getestet, wer ein Briefkasten baut, sollte diesen vorher ohne Script als Kopie im Inventar haben, da das Script irgendwo hakt Kein Plan wieso, kann auch nichts finden, bin ja auch nur laie bei ScriptsWink
Jedenfalls anschliessend wenn man das Object,das man fuers Script vorgesehen hat gerezzt hat, kann man es einsetzen, es funktioniert dann auch. Ihr solltet es aber tunlichst sein lassen das teil samt script ins Inventar packen zu wollen, denn dort taucht es nie auf, es verschwindet im Nirvana, nichtmal im Trash ist es dann zu finden, und ohne neustart hoert die Sanduhr, oder kreis bei vista und win7 nicht auf zu drehen, weil er es versucht wegzuraeumen.Wink ohne Relog hoert das dann nicht auf. Vieleicht kann sich das ja mal einer genauer ansehen und den fehler findenWink

lg
Ezry



Re: Ein Script fuer.... - Masajo - 10.08.2010

Moin zusammen Smile

Ich habe hier noch ein ganz einfaches Skript, dass es möglich macht, eine Notecard zu hinterlassen. Dem Besitzer wird per Hovertext angezeigt, ob und wie viele Nachrichten im Kasten sind, durch touch auf selbigen "nimmt" man die NC heraus ...

Code:
string owner;
key g_quary_owner;
integer count = 0;
default
{
    state_entry()
    {
        g_quary_owner = llRequestAgentData( llGetOwner(), DATA_NAME);
        
    }

    changed(integer mask)
    {
        if(mask & (CHANGED_ALLOWED_DROP | CHANGED_INVENTORY))
        {
            count = llGetInventoryNumber(INVENTORY_ALL) - 1;
            llSetText(owner +"'s Postbox \n " + count + " messages \n \n Drop Inventory with message in here" ,<1,1,1>,1.0);
        }
    }
    touch_start(integer egal)
    {
        if (llDetectedKey(0) == llGetOwner())
        {
             integer number = llGetInventoryNumber(INVENTORY_ALL);
             integer x;
             for (x = 0; x < number; x++)
             {
                 string name = llGetInventoryName(INVENTORY_ALL,x);
                 if (name != llGetScriptName())
                 {
                    llGiveInventory(llGetOwner(),name);
                 }
             }
             llSleep(2.5);
             number = llGetInventoryNumber(INVENTORY_ALL);
             for (x = 1; x < (number+1); x++)
             {
                 string name = llGetInventoryName(INVENTORY_ALL,number-x);
                 if (name != llGetScriptName())
                 {
                    llRemoveInventory(name);
                 }
             }
             llResetScript();
        }
    }
    dataserver(key queryid, string data)
    {
        if(queryid == g_quary_owner)
        {
            owner = data;
            count = llGetInventoryNumber(INVENTORY_ALL) - 1;
            llSetText(owner +"'s Postbox \n " + count + " messages \n \n Drop Inventory with message in here" ,<1,1,1>,1.0);
            llAllowInventoryDrop(TRUE); // erlaubt das Hineinlegen ins Prim
        }
    }
}

Funktioniert einwandfrei, hab's grad noch mal probiert ... Viel Spaß damit Smile


Re: Ein Script fuer Mailbox mit NC funktion - Klarabella Karamell - 10.08.2010

Hab das Script mal zum Anlass genommen, endlich meine "Briefkästen" auf Freebie-Heaven aufzustellen.
Mal gucken, ob mir nu einer schreibt ;D