Rang: Ehrenmitglied
Mitglied seit: 05.09.2014(UTC) Beiträge: 84  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. |