Difference between revisions of "Object rez"

From Second Life Wiki
Jump to navigation Jump to search
 
m (Replaced <source> with <syntaxhighlight>)
(33 intermediate revisions by 12 users not shown)
Line 1: Line 1:
{{LSL_Event|event_id=28|event_delay|event=object_rez|p1_type=key|p1_name=id|p1_desc|event_desc=Triggered when task rezes in another task|constants|spec|caveats|examples|helpers|also_header|also_events|also_functions|also_articles|also_footer|notes|mode|deprecated}}[[Category:LSL_Events]][[Category:LSL_Stub]]
{{LSL_Event|event_id=28|event_delay|event=object_rez
|inject-2={{Issues/SVC-2926}}{{Issues/SVC-3421}}
|p1_type=key|p1_name=id|p1_desc=[[UUID]] of object rezzed.
|event_desc=Triggered when the object rezzes an object.
|constants
|spec
|caveats=
* Triggers in all running scripts with an [[object_rez]] event, AND in the same '''prim''' as the script calling [[llRezObject]] or [[llRezAtRoot]].
** Does NOT trigger in linked prims.
* A message sent to the rezzed object may arrive before the object has opened a channel and is ready to receive it unless you provide for a communication handshake between the rezzer and the new object.
|examples=
Script in the parent object "Rezzer.lsl"
<syntaxhighlight lang="lsl2">
////////////////////////
// Rezzer script.
// Rez' an object from inventory, establishes a communication channel and
//  gives the rezzed object inventory.
 
integer COM_CHANNEL=-17974594; // chat channel used to coordinate between rezzer and rezzee
string REZZEE_NAME="Rezzee";
 
string CMD_REZZEE_READY = "REZZEE_READY";
string CMD_REZZER_DONE = "REZZER_DONE";
 
key rezzee_key;
 
default
{
//...
touch_start(integer count)
{
state configure_child;
}
//...
}
 
// rez and configure a child
state configure_child
{
state_entry()
{
// where to rez
vector position = llGetPos() + <0.0, 0.0, 1.0>;
// establish rezzer's listen on the command channel
llListen( COM_CHANNEL, "", "", "" );
// rez the object from inventory.  Note that we are passing the
// communication channel as the rez parameter.
llRezObject(REZZEE_NAME, position, ZERO_VECTOR, ZERO_ROTATION, COM_CHANNEL);
}
 
object_rez(key id)
{ // the object has been rezzed in world.  It may not have successfully
// established its communication yet or done anything that it needs to
// in order to be ready for config. Don't do anything till we get the signal
rezzee_key = id;
}
listen(integer channel, string name, key id, string message)
{
if (message == CMD_REZZEE_READY)
{ // the rezzee has told us that they are ready to be configured.  We can
// we can sanity check id == rezzee_id, but in this trivial case that is
// not necessary.
integer count = llGetInventoryNumber(INVENTORY_NOTECARD);
// give all note cards in our inventory to the rezzee (we could do scripts or objects here too)
while(count)
{
string name = llGetInventoryName(INVENTORY_NOTECARD, --count);
llGiveInventory(id, name);
}
// And now tell the rezzee that we have finished giving it everything.
llRegionSayTo(id, COM_CHANNEL, CMD_REZZER_DONE);
// And we can leave configure child mode.
state default;
}
}
}
</syntaxhighlight>
Script in the child object "Rezzee.lsl"
<syntaxhighlight lang="lsl2">
// Rezzee
 
integer com_channel = 0;
key parent_key = NULL_KEY;
 
string CMD_REZZEE_READY = "REZZEE_READY";
string CMD_REZZER_DONE = "REZZER_DONE";
 
default
{
//...
on_rez(integer start_param)
{
com_channel = start_param;
state configure;
}
//...
}
 
state configure
{
state_entry()
{
// Get the key of the object that rezzed us
list details = llGetObjectDetails( llGetKey(), [ OBJECT_REZZER_KEY ] );
parent_key = llList2Key(details, 0);
// establish our command channel and only listen to the object that rezzed us
llListen(com_channel, "", parent_key, "");
// Our rezzer will be giving us inventory.
llAllowInventoryDrop(TRUE);
// finally tell our rezzer that we are ready
llRegionSayTo( parent_key, com_channel, CMD_REZZEE_READY );
}
listen( integer channel, string name, key id, string message )
{ // in a more complex example you could check that the id and channel
// match but for this example we can take it on faith.
if (message == CMD_REZZER_DONE)
{ // the parent has told this script that it is done we can go back to
// our normal state.
state default;
}
}
state_exit()
{ // turn off inventory drop. 
llAllowInventoryDrop(FALSE);
// We don't need to clean up the listen since that will be done automatically
// when we leave this state.
}
}
</syntaxhighlight>
|helpers
|also_header
|also_events=
{{LSL DefineRow||[[on_rez]]|Triggered when the object the script is in is rezzed}}
|also_functions=
{{LSL DefineRow||[[llRezObject]]|Used to rez an object at the center of mass}}
{{LSL DefineRow||[[llRezAtRoot]]|Used to rez an object at the root}}
|also_articles
|also_footer
|notes
|mode
|cat1=Rez
|cat2
|cat3
|cat4
}}

Revision as of 10:02, 1 October 2022

Description

Event: object_rez( key id ){ ; }

Triggered when the object rezzes an object.

• key id UUID of object rezzed.

Caveats

  • Triggers in all running scripts with an object_rez event, AND in the same prim as the script calling llRezObject or llRezAtRoot.
    • Does NOT trigger in linked prims.
  • A message sent to the rezzed object may arrive before the object has opened a channel and is ready to receive it unless you provide for a communication handshake between the rezzer and the new object.
All Issues ~ Search JIRA for related Bugs

Examples

Script in the parent object "Rezzer.lsl"

////////////////////////
// Rezzer script.
//	Rez' an object from inventory, establishes a communication channel and
//  gives the rezzed object inventory.

integer COM_CHANNEL=-17974594; // chat channel used to coordinate between rezzer and rezzee
string 	REZZEE_NAME="Rezzee";

string CMD_REZZEE_READY = "REZZEE_READY";
string CMD_REZZER_DONE = "REZZER_DONE";

key 			rezzee_key;

default 
{
	//...
	touch_start(integer count)
	{
		state configure_child;
	}
	//...
}

// rez and configure a child
state configure_child
{
	state_entry()
	{
		// where to rez
		vector position = llGetPos() + <0.0, 0.0, 1.0>;	
		// establish rezzer's listen on the command channel
		llListen( COM_CHANNEL, "", "", "" );	
		// rez the object from inventory.  Note that we are passing the 
		// communication channel as the rez parameter.
		llRezObject(REZZEE_NAME, position, ZERO_VECTOR, ZERO_ROTATION, COM_CHANNEL);	
	}

	object_rez(key id)
	{	// the object has been rezzed in world.  It may not have successfully 
		// established its communication yet or done anything that it needs to 
		// in order to be ready for config. Don't do anything till we get the signal
		rezzee_key = id;
	}
	
	listen(integer channel, string name, key id, string message)
	{
		if (message == CMD_REZZEE_READY)
		{	// the rezzee has told us that they are ready to be configured.  We can 
			// we can sanity check id == rezzee_id, but in this trivial case that is
			// not necessary.
			integer count = llGetInventoryNumber(INVENTORY_NOTECARD);
			// give all note cards in our inventory to the rezzee (we could do scripts or objects here too)
			while(count)
			{
				string name = llGetInventoryName(INVENTORY_NOTECARD, --count);
				llGiveInventory(id, name);
			}
			// And now tell the rezzee that we have finished giving it everything.
			llRegionSayTo(id, COM_CHANNEL, CMD_REZZER_DONE);
			// And we can leave configure child mode.
			state default;
		}
	}
}

Script in the child object "Rezzee.lsl"

// Rezzee

integer com_channel = 0;
key parent_key = NULL_KEY;

string CMD_REZZEE_READY = "REZZEE_READY";
string CMD_REZZER_DONE = "REZZER_DONE";

default 
{
	//...
	on_rez(integer start_param)
	{
		com_channel = start_param;
		state configure;
	}
	//...
}

state configure
{
	state_entry()
	{	
		// Get the key of the object that rezzed us
		list details = llGetObjectDetails( llGetKey(), [ OBJECT_REZZER_KEY ] );
		parent_key = llList2Key(details, 0);	
		
		// establish our command channel and only listen to the object that rezzed us
		llListen(com_channel, "", parent_key, "");
		// Our rezzer will be giving us inventory.
		llAllowInventoryDrop(TRUE);	
		// finally tell our rezzer that we are ready
		llRegionSayTo( parent_key, com_channel, CMD_REZZEE_READY );
	}
	
	 listen( integer channel, string name, key id, string message )
	 { // in a more complex example you could check that the id and channel 
		// match but for this example we can take it on faith.
		if (message == CMD_REZZER_DONE)
		{	// the parent has told this script that it is done we can go back to 
			// our normal state.
			state default;
		}
	 }
	 
	 state_exit()
	 {	// turn off inventory drop.  
		llAllowInventoryDrop(FALSE);	
		// We don't need to clean up the listen since that will be done automatically 
		// when we leave this state.
	 }
}

See Also

Events

•  on_rez Triggered when the object the script is in is rezzed

Functions

•  llRezObject Used to rez an object at the center of mass
•  llRezAtRoot Used to rez an object at the root

Deep Notes

Issues

All Issues

~ Search JIRA for related Issues
   object_rez() erroneously triggers on full parcel
   Possible Mono bug with object_rez

Signature

event void object_rez( key id );