logo

Willkommen Gast! Um alle Funktionen zu aktivieren müssen Sie sich Anmelden.Neue Registrierungen sind deaktiviert.

Mitteilung

Icon
Error

Einloggen


Optionen
Ansicht
Gehe zum aktuellsten Beitrag Gehe zum letzten Ungelesenen
Offline MartinRJ Fayray  
#1 Geschrieben : Mittwoch, 1. Oktober 2014 23:03:47(UTC)
MartinRJ Fayray

Rang: Ehrenmitglied

Ansehen:

Mitglied seit: 05.09.2014(UTC)
Beiträge: 84
Germany
Wohnort: Tulln und Rostock

Dankte: 1 mal(e)
RLV bedeutet "Restrained Love Viewer", und steht für ein SL-Viewer-Protokoll, das hauptsächlich für BDSM-Möbel und ähnliches genutzt wird.
Es ist eine Erweiterung des Second Life Viewers (die im offiziellen Viewer nicht verfügbar ist), die es erlaubt, durch LSL-Skripts andere Avatare (oder auch den eigenen Avatar) zu kontrollieren, zum Beispiel das Inventar zu durchsuchen, oder andere Avatare zu bewegen (je nach Konfiguration ohne weitere Nachfrage).

Im Folgenden ein Beispiel für ein RLV-Kommando, in diesem Fall ein sogenanntes "Force Sit"- Skript.
Das funktioniert nur, wenn das "Opfer" einen RLV-Viewer verwendet, RLV aktiviert hat, und ein RLV-Relay trägt.

(Für Details über RLV siehe https://wiki.secondlife.com/wiki/LSL_Protocol/RestrainedLoveAPI/de)

Wenn man (der Besitzer, um genau zu sein) auf das Objekt mit diesem Skript klickt, öffnet sich ein Menü mit einer Liste der Avatare in der Region, wählt der Besitzer einen davon aus, wird diesem ein RLV-Befehl an den Client gesendet, und falls RLV aktiviert ist, wird der Avatar 'eingefangen' und wird automatisch auf das Objekt gesetzt (je nach Konfiguration des RLV-Relays kann noch eine Sicherheits-Abfrage erscheinen, bevor das Kommando tatsächlich ausgeführt wird).
Falls in dem Prim neben dem Skript auch eine Animation vorhanden ist, wird diese dann abgespielt.
Außerdem wird der sitzende Avatar daran gehindert, wieder aufzustehen.

Wenn der Besitzer dann "unsit" (ohne Anführungszeichen) im Chat sagt, wird der Avatar wieder freigelassen.

Code:

string sCMD_NAME = "rlv sit unsit"; //arbitrary name, useful at times so you can identify commands
string sCMD_SIT = ",@sit:"; //sit command start
string sCMD_SIT_END = "=force"; //sit command end
string sCMD_PREVENT_UNSIT = ",@unsit=n"; //disallow unsit
string sCMD_ALLOW_UNSIT = ",@unsit=y"; //allow unsit
string sCMD_UNSIT = ",@unsit=force"; //unsit command
string sCOMMA = ",";
key kVICTIM = NULL_KEY;
string sDIALOG_TEXT = "Choose avatar:";
integer iCHAT_CHANNEL = 0; //chat channel to say unsit command
string sCHAT_COMMAND = "unsit"; //chat command to unsit
integer iBUTTONS = 12;

vector vSIT_TARGET = <0.25,0.0,0.5>;
rotation rSIT_TARGET = ZERO_ROTATION;

integer iCHANNEL_DIALOG;
integer iCHANNEL_DIALOG_MIN = -100000;
integer iCHANNEL_DIALOG_MAG = 100000;

integer iRLVC = -1812221819; //RLV-channel
integer iMAXLEN = 24;

rlv_sit(key kVictim)
{
    llRegionSayTo(kVictim, iRLVC, sCMD_NAME+sCOMMA+(string)kVictim+sCMD_SIT+(string)llGetKey()+sCMD_SIT_END);
    llRegionSayTo(kVictim, iRLVC, sCMD_NAME+sCOMMA+(string)kVictim+sCMD_PREVENT_UNSIT);
}
rlv_unsit(key kVictim)
{
    llRegionSayTo(kVictim, iRLVC, sCMD_NAME+sCOMMA+(string)kVictim+sCMD_ALLOW_UNSIT);
    llRegionSayTo(kVictim, iRLVC, sCMD_NAME+sCOMMA+(string)kVictim+sCMD_UNSIT);
}
default
{
    state_entry()
    {
        llListen(iCHAT_CHANNEL, "", llGetOwner(), sCHAT_COMMAND);
        iCHANNEL_DIALOG = iCHANNEL_DIALOG_MIN - (integer)llFrand((float)iCHANNEL_DIALOG_MAG);
        llListen(iCHANNEL_DIALOG, "", llGetOwner(), "");
        llSitTarget(vSIT_TARGET, rSIT_TARGET);
    }
    listen(integer channel, string name, key id, string message)
    {
        string sAVATAR;
        key kAvatar;
        list lAvatars;
        integer iCount;
        string sTempName;
        if (channel == iCHAT_CHANNEL && message == sCHAT_COMMAND)
        {
            if (kVICTIM != NULL_KEY)
            {
                rlv_unsit(kVICTIM);
                kVICTIM = NULL_KEY;
            }
        }
        else if (channel == iCHANNEL_DIALOG)
        {
            sAVATAR = message;
            lAvatars = llGetAgentList(AGENT_LIST_REGION, []); //retrieve agent list in the region
            for (iCount = 0; iCount < llGetListLength(lAvatars); iCount++)
            {
                sTempName = llKey2Name(llList2Key(lAvatars, iCount));
                if (llStringLength(sTempName) > iMAXLEN)
                { //long name
                    sTempName = llGetSubString(sTempName, 0, iMAXLEN-1);
                }
                if (sTempName == sAVATAR)
                {
                    kVICTIM = llList2Key(lAvatars, iCount);
                    rlv_sit(kVICTIM);
                }
            }
            
        }
    }
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        {
            if (llAvatarOnSitTarget() != NULL_KEY && llGetInventoryNumber(INVENTORY_ANIMATION) > 0)
            { //sitting and there's an animation
                llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION);
            }
        }
    }
    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION && llGetInventoryNumber(INVENTORY_ANIMATION) > 0)
        { //sitting and there's an animation and permission given
            llStartAnimation(llGetInventoryName(INVENTORY_ANIMATION, 0));
        }
    }
    touch_start(integer total_number)
    {
        integer iCount;
        list lAvatars = llGetAgentList(AGENT_LIST_REGION, []); //retrieve agent list in the region
        list lAvatarNames;
        if (llGetListLength(lAvatars) > 0)
        {
            if (llGetListLength(lAvatars) > iBUTTONS)
            {
                lAvatars = llList2List(lAvatars, 0, iBUTTONS-1);
            }
            for (iCount = 0; iCount < llGetListLength(lAvatars); iCount++)
            {
                if (llList2Key(lAvatars, iCount) != llGetOwner())
                {
                    if (llStringLength(llKey2Name(llList2Key(lAvatars, iCount))) > iMAXLEN)
                    { //long name
                        lAvatarNames += llGetSubString(llKey2Name(llList2Key(lAvatars, iCount)), 0, iMAXLEN-1);
                    }
                    else
                    {
                        lAvatarNames += llKey2Name(llList2Key(lAvatars, iCount));
                    }
                }
            }
            if (llGetListLength(lAvatarNames) > 0)
            {
                llDialog(llGetOwner(), sDIALOG_TEXT, lAvatarNames, iCHANNEL_DIALOG);
            }
        }
    }
}
It is the mark of an educated mind to be able to entertain a thought without accepting it.

Wanna join the discussion?! Login to your forum account.Neue Registrierungen sind deaktiviert.

Rss Feed  Atom Feed
Benutzer, die gerade dieses Thema lesen
OceanSpiders 2.0
Das Forum wechseln  
Du kannst keine neue Themen in diesem Forum eröffnen.
Du kannst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge nicht löschen.
Du darfst deine Beiträge nicht editieren.
Du kannst keine Umfragen in diesem Forum erstellen.
Du kannst nicht an Umfragen teilnehmen.

Powered by YAF.NET | YAF.NET © 2003-2021, Yet Another Forum.NET
Diese Seite wurde in 0.185 Sekunden generiert.

Datenschutzrichtlinie
Haftungsausschluss
Impressum
Datenschutzerklärung
AGB, ToS
Kontakt