Difference between revisions of "MLPV2 RLV Capture Plugin"

From Second Life Wiki
Jump to navigation Jump to search
(Created page with 'This is another RLV plugin I wrote. It is used in a Ball. On touch it allows to choose an avatar within a range and tries to capture the selected avatar, forcing them to sit on t...')
 
m
 
(5 intermediate revisions by 4 users not shown)
Line 1: Line 1:
* [[MLPV2]]
* Back to [[MLPV2_Addons]]
This is another RLV plugin I wrote. It is used in a Ball. On touch it allows to choose an avatar within a range and tries to capture the selected avatar, forcing them to sit on the ball.
This is another RLV plugin I wrote. It is used in a Ball. On touch it allows to choose an avatar within a range and tries to capture the selected avatar, forcing them to sit on the ball.


<lsl>// ~capture Script V1.0
<source lang="lsl2">// ~capture Script V1.01
// drop into a ball
// drop into a ball
//
//
Line 32: Line 35:
log(string message)
log(string message)
{
{
    if (DEBUG) llOwnerSay("MENU: " + message);
if (DEBUG) llOwnerSay("MENU: " + message);
}
}


Line 38: Line 41:
out(string message)
out(string message)
{
{
    llSay(0, message);
llSay(0, message);
}
}


capture(key avatar)
capture(key avatar)
{
{
    relay(avatar, "@sit:" + (string)llGetKey() + "=force");
relay(avatar, "@sit:" + (string)llGetKey() + "=force");
}
}


lock(key avatar)
lock(key avatar)
{
{
    relay(avatar, "@unsit=n");
relay(avatar, "@unsit=n");
}
}


release(key avatar)
release(key avatar)
{
{
    relay(avatar, "@unsit=y");
relay(avatar, "@unsit=y");
    relay(avatar, "!release");
relay(avatar, "!release");
}
}


Line 60: Line 63:
relay(key avatar, string message)
relay(key avatar, string message)
{
{
    if (avatar != NULL_KEY)
if (avatar != NULL_KEY)
    {
{
        llSay(RELAY_CHANNEL, llGetObjectName() + "," + (string) avatar + "," + message);
llSay(RELAY_CHANNEL, llGetObjectName() + "," + (string) avatar + "," + message);
        log("RLV: " + llGetObjectName() + "," + (string) avatar + "," + message);
log("RLV: " + llGetObjectName() + "," + (string) avatar + "," + message);
    }
}
}
}


init()
init()
{
{
    dialog_channel= -(integer)(llFrand(100000 - 10000) + 10000);
dialog_channel= -(integer)(llFrand(100000 - 10000) + 10000);
    dialog_handle = llListen(dialog_channel, "", NULL_KEY, "");
dialog_handle = llListen(dialog_channel, "", NULL_KEY, "");
    llListenControl(dialog_handle, FALSE);
llListenControl(dialog_handle, FALSE);
    avatar_menu = NULL_KEY;
avatar_menu = NULL_KEY;
}
}


Line 78: Line 81:
default
default
{
{
    // on state entry: show dialog
// on state entry: show dialog
    state_entry()
state_entry()
    {
{
        init();
init();
    }
}
 
    on_rez(integer start_param)
    {
        channel = start_param;
        init();
    }
 
    // av touched me
    touch_start(integer total_number)
    {
        key id = llDetectedKey(0);


        // check if menu is in use
on_rez(integer start_param)
        if (avatar_menu != NULL_KEY && id != avatar_menu)
{
        {
channel = start_param;
            out(llKey2Name(avatar_menu) + MSG_MENU_IN_USE);
init();
            return;
}
        }


        avatar_menu = id;
// av touched me
        llSensor("", NULL_KEY, AGENT, RANGE_CAPTURE, PI);
touch_start(integer total_number)
    }
{
key id = llDetectedKey(0);


    // no av in sensor range
// check if menu is in use
    no_sensor()
if (avatar_menu != NULL_KEY && id != avatar_menu)
    {
{
        out(MSG_NO_SENSOR);
out(llKey2Name(avatar_menu) + MSG_MENU_IN_USE);
    }
return;
}


    // some av in sensor range
avatar_menu = id;
    sensor(integer total_number)
llSensor("", NULL_KEY, AGENT, RANGE_CAPTURE, PI);
    {
}
        sensor_keys = [];
        sensor_names = [];
        integer i;
        for(i=0; i < total_number; i++)
        {
            key id = llDetectedKey(i);
            string name = llKey2Name(id);


            sensor_keys += [id];
// no av in sensor range
            sensor_names += [name];
no_sensor()
            log("found: " + name);
{
out(MSG_NO_SENSOR);
}


        }
// some av in sensor range
sensor(integer total_number)
{
sensor_keys = [];
sensor_names = [];
integer i;
for(i=0; i < total_number; i++)
{
key id = llDetectedKey(i);
string name = llKey2Name(id);
if (llStringLength(name) > 24)
{
name = llGetSubString(name, 0, 23);
}
sensor_keys += [id];
sensor_names += [name];
log("found: " + name);
}


        // show dialog if list contains names
// show dialog if list contains names
        if (llGetListLength(sensor_names) > 0)
if (llGetListLength(sensor_names) > 0)
        {
{
            llListenControl(dialog_handle, TRUE);
llListenControl(dialog_handle, TRUE);
            llSetTimerEvent(TIMER_TIMEOUT);
llSetTimerEvent(TIMER_TIMEOUT);
            llDialog(avatar_menu, MSG_CHOOSE_AV, sensor_names, dialog_channel);
llDialog(avatar_menu, MSG_CHOOSE_AV, sensor_names, dialog_channel);
        }
}
    }
}


    // menu selected
// menu selected
    listen(integer channel, string name, key id, string message)
listen(integer channel, string name, key id, string message)
    {
{
        llListenControl(dialog_handle, FALSE);
llListenControl(dialog_handle, FALSE);
        integer index = llListFindList(sensor_names, [message]);
integer index = llListFindList(sensor_names, [message]);
        if (index != -1)
if (index != -1)
        {
{
            key selected = llList2Key(sensor_keys, index);
key selected = llList2Key(sensor_keys, index);
            log ("capture " + llKey2Name(selected));
log ("capture " + llKey2Name(selected));
            capture(selected);
capture(selected);
        }
}
        avatar_menu = NULL_KEY;
avatar_menu = NULL_KEY;
    }
}


    // dialog timeout
// dialog timeout
    timer()
timer()
    {
{
        if (avatar_menu != NULL_KEY)
if (avatar_menu != NULL_KEY)
        {
{
            out(MSG_TIMEOUT);
out(MSG_TIMEOUT);
            avatar_menu = NULL_KEY;
avatar_menu = NULL_KEY;
            llListenControl(dialog_handle, FALSE);
llListenControl(dialog_handle, FALSE);
        }
}


        llSetTimerEvent(0);
llSetTimerEvent(0);
    }
}


    changed(integer change) {
changed(integer change) {
        if(change & CHANGED_LINK)
if(change & CHANGED_LINK)
        {
{
            key id = llAvatarOnSitTarget();
key id = llAvatarOnSitTarget();
            if (id != NULL_KEY)
if (id != NULL_KEY)
            {
{
                avatar_victim = id;
avatar_victim = id;
                lock(avatar_victim);
lock(avatar_victim);
                log ("sitting: " + llKey2Name(avatar_victim));
log ("sitting: " + llKey2Name(avatar_victim));
                state locked;
state locked;
            }
}
        }
}
    }
}
}
}


state locked
state locked
{
{
    state_entry()
state_entry()
    {
{
        llListen(channel, "", NULL_KEY, "DIE");
llListen(channel, "", NULL_KEY, "DIE");
        llSetTimerEvent(TIMER_LOCKED);
llSetTimerEvent(TIMER_LOCKED);
    }
}
 
listen(integer channel, string name, key id, string message)
{
if (message == "DIE")
{
log ("DIE");
release(avatar_victim);
}
}
 
changed(integer change) {
if(change & CHANGED_LINK)
{
key id = llAvatarOnSitTarget();
if (id == NULL_KEY)
{
log ("unsitting " + llKey2Name(avatar_victim));
release(avatar_victim);
avatar_victim = id;
state default;
}
}
}
 
timer()
{
release(avatar_victim);
}
}</source>


    listen(integer channel, string name, key id, string message)
See also:
    {
* [[LSL Protocol/RestrainedLoveAPI]]
        if (message == "DIE")
* [[LSL_Protocol/Restrained_Life_Relay/Specification]]
        {
            log ("DIE");
            release(avatar_victim);
        }
    }


    changed(integer change) {
        if(change & CHANGED_LINK)
        {
            key id = llAvatarOnSitTarget();
            if (id == NULL_KEY)
            {
                log ("unsitting " + llKey2Name(avatar_victim));
                release(avatar_victim);
                avatar_victim = id;
                state default;
            }
        }
    }


    timer()
[[Category:MLPV2]]
    {
        release(avatar_victim);
    }
}</lsl>

Latest revision as of 08:05, 19 April 2016

This is another RLV plugin I wrote. It is used in a Ball. On touch it allows to choose an avatar within a range and tries to capture the selected avatar, forcing them to sit on the ball.

// ~capture Script V1.01
// drop into a ball
//
// constants
integer DEBUG           = FALSE;

float TIMER_TIMEOUT     = 60.0;
float TIMER_LOCKED      = 900.0;
integer RANGE_CAPTURE   = 20;

integer RELAY_CHANNEL   = -1812221819;

// texts
string MSG_NO_SENSOR   = "No avatars in sensor range.";
string MSG_MENU_IN_USE = " is using the menu. Please try again in a while.";
string MSG_CHOOSE_AV   = "Choose avatar:";
string MSG_TIMEOUT     = "Dialog timeout. Please touch again to retry.";

// internal use
integer dialog_handle;
integer dialog_channel;
key avatar_victim = NULL_KEY;
integer channel;

list sensor_keys;
list sensor_names;
key avatar_menu;

// write a log message in DEBUG mode
log(string message)
{
	if (DEBUG) llOwnerSay("MENU: " + message);
}

// out a message to the user
out(string message)
{
	llSay(0, message);
}

capture(key avatar)
{
	relay(avatar, "@sit:" + (string)llGetKey() + "=force");
}

lock(key avatar)
{
	relay(avatar, "@unsit=n");
}

release(key avatar)
{
	relay(avatar, "@unsit=y");
	relay(avatar, "!release");
}

// write a message to the RLV Relay
relay(key avatar, string message)
{
	if (avatar != NULL_KEY)
	{
		llSay(RELAY_CHANNEL, llGetObjectName() + "," + (string) avatar + "," + message);
		log("RLV: " + llGetObjectName() + "," + (string) avatar + "," + message);
	}
}

init()
{
	dialog_channel= -(integer)(llFrand(100000 - 10000) + 10000);
	dialog_handle = llListen(dialog_channel, "", NULL_KEY, "");
	llListenControl(dialog_handle, FALSE);
	avatar_menu = NULL_KEY;
}

// default state
default
{
	// on state entry: show dialog
	state_entry()
	{
		init();
	}

	on_rez(integer start_param)
	{
		channel = start_param;
		init();
	}

	// av touched me
	touch_start(integer total_number)
	{
		key id = llDetectedKey(0);

		// check if menu is in use
		if (avatar_menu != NULL_KEY && id != avatar_menu)
		{
			out(llKey2Name(avatar_menu) + MSG_MENU_IN_USE);
			return;
		}

		avatar_menu = id;
		llSensor("", NULL_KEY, AGENT, RANGE_CAPTURE, PI);
	}

	// no av in sensor range
	no_sensor()
	{
		out(MSG_NO_SENSOR);
	}

	// some av in sensor range
	sensor(integer total_number)
	{
		sensor_keys = [];
		sensor_names = [];
		integer i;
		for(i=0; i < total_number; i++)
		{
			key id = llDetectedKey(i);
			string name = llKey2Name(id);
			if (llStringLength(name) > 24)
			{
				name = llGetSubString(name, 0, 23);
			}
			sensor_keys += [id];
			sensor_names += [name];
			log("found: " + name);
		}

		// show dialog if list contains names
		if (llGetListLength(sensor_names) > 0)
		{
			llListenControl(dialog_handle, TRUE);
			llSetTimerEvent(TIMER_TIMEOUT);
			llDialog(avatar_menu, MSG_CHOOSE_AV, sensor_names, dialog_channel);
		}
	}

	// menu selected
	listen(integer channel, string name, key id, string message)
	{
		llListenControl(dialog_handle, FALSE);
		integer index = llListFindList(sensor_names, [message]);
		if (index != -1)
		{
			key selected = llList2Key(sensor_keys, index);
			log ("capture " + llKey2Name(selected));
			capture(selected);
		}
		avatar_menu = NULL_KEY;
	}

	// dialog timeout
	timer()
	{
		if (avatar_menu != NULL_KEY)
		{
			out(MSG_TIMEOUT);
			avatar_menu = NULL_KEY;
			llListenControl(dialog_handle, FALSE);
		}

		llSetTimerEvent(0);
	}

	changed(integer change) {
		if(change & CHANGED_LINK)
		{
			key id = llAvatarOnSitTarget();
			if (id != NULL_KEY)
			{
				avatar_victim = id;
				lock(avatar_victim);
				log ("sitting: " + llKey2Name(avatar_victim));
				state locked;
			}
		}
	}
}

state locked
{
	state_entry()
	{
		llListen(channel, "", NULL_KEY, "DIE");
		llSetTimerEvent(TIMER_LOCKED);
	}

	listen(integer channel, string name, key id, string message)
	{
		if (message == "DIE")
		{
			log ("DIE");
			release(avatar_victim);
		}
	}

	changed(integer change) {
		if(change & CHANGED_LINK)
		{
			key id = llAvatarOnSitTarget();
			if (id == NULL_KEY)
			{
				log ("unsitting " + llKey2Name(avatar_victim));
				release(avatar_victim);
				avatar_victim = id;
				state default;
			}
		}
	}

	timer()
	{
		release(avatar_victim);
	}
}

See also: