Difference between revisions of "LlRezObject"

From Second Life Wiki
Jump to navigation Jump to search
m
m (Replaced <source> with <syntaxhighlight>)
 
(30 intermediate revisions by 15 users not shown)
Line 1: Line 1:
{{Issues/SVC-3145}}{{LSL_Function/inventory|inventory|uuid=false|type=object}}
{{LSL_Function
{{LSL_Function
|inject-2={{Issues/SVC-3145}}{{Issues/SVC-6578}}{{Issues/SVC-6686}}{{Issues/SCR-485}}
{{LSL_Function/inventory|inventory|uuid=false|type=object}}
{{LSL_Function/position|pos|region=*}}
|func_id=104|func_sleep=0.1|func_energy=200.0
|func_id=104|func_sleep=0.1|func_energy=200.0
|func=llRezObject|sort=RezObject
|func=llRezObject|sort=RezObject
|p1_type=string|p1_name=inventory
|p1_type=string|p1_name=inventory
|p2_type=vector|p2_name=pos|p2_desc=position (in [[Viewer coordinate frames#Region|region coordinates]])|p2_hover=position (in region coordinates)
|p2_type=vector|p2_name=pos
|p3_type=vector|p3_name=vel|p3_desc=velocity (max [[llVecMag|magnitude]] is 250)
|p3_type=vector|p3_name=vel|p3_desc=velocity (max [[llVecMag|magnitude]] is approximately 200m/s)
|p4_type=rotation|p4_name=rot|p4_desc=rotation
|p4_type=rotation|p4_name=rot|p4_desc=rotation
|p5_type=integer|p5_name=param|p5_desc=[[on_rez]] event parameter and value returned by [[llGetStartParameter]] in the rezzed object.|p5_hover=on_rez event parameter and value returned by llGetStartParameter in the rezzed object.
|p5_type=integer|p5_name=param|p5_desc=[[on_rez]] event parameter and value returned by [[llGetStartParameter]] in the rezzed object (or by each of the items in a coalesced object).|p5_hover=on_rez event parameter and value returned by llGetStartParameter in the rezzed object.
|func_footnote=The root of '''inventory''' is not at '''pos''' but the center of '''inventory''' is.<br/>To have the root prim at '''pos''' use [[llRezAtRoot]] instead.
|func_footnote=The root of {{LSLP|inventory}} is not at {{LSLP|pos}} but the [[llGetGeometricCenter|center]] of {{LSLP|inventory}} is.<br/>To have the root prim at {{LSLP|pos}} use [[llRezAtRoot]] instead.
|func_desc=Instantiate '''inventory''' object at '''pos''' with velocity '''vel''' and rotation '''rot''' with start parameter '''param'''
|func_desc=Instantiate {{LSLP|inventory}} object at {{LSLP|pos}} with velocity {{LSLP|vel}} and rotation {{LSLP|rot}} with start parameter {{LSLP|param}}
|return_text
|return_text
|spec
|spec
|caveats=
|caveats=
*In addition to the normal function delay, there is an additional delay based on the mass and velocity of the object rezzed.
*Silently fails to rez {{LSLP|inventory}} (to have it's geometric center at {{LSLP|pos}}) if {{LSLP|pos}} is too far from the geometric center of the object trying to rez {{LSLP|inventory}}.
**<code>rez_delay = mass * llVecMag(velocity) / 10;</code> [http://forums.secondlife.com/showthread.php?t=82659]
**If your script is mysteriously failing to rez things, make sure you haven't (say) written "<code><0.0,0.0,1.0></code>" for the {{LSLP|pos}} parameter rather than (say) <code>[[llGetPos]]() + <0.0,0.0,1.0></code>".
*Silently fails to rez '''inventory''' if '''pos''' is more than 10 meters away from the prim trying to rez '''inventory'''. So if your script is mysteriously failing to rez things, make sure you haven't (say) written "<0,0,1>" for the '''pos''' parameter rather than (say) "llGetPos() + <0,0,1>".
* When scripting attachments meant to rez objects, remember that when used in the root of an ([[attach|attached]]) [[attachment]] <code>[[llGetPos]]</code> doesn't return the position of the attachment but instead returns the position of the avatar's bounding box geometric center. Read [[llGetPos]] and [[llParticleSystem#Caveats | llParticleSystem Caveats]] for more information.
* When scripting attachments meant to rez objects, remember that attachments move. You will need to use <code>llGetPos()</code> and add it to '''pos''' to obtain a faithful position for your rezzed object. When used in the root of an (attached) attachment <code>llGetPos</code> doesn't return the position of the attachment but instead returns the position of the avatar's bounding box geometric center. Read [[llGetPos]] and [[llParticleSystem#Caveats]] for more information.
* If the object is unattached and the owner of the object does not have copy permission  on {{LSLP|inventory}}, the object will no longer be present in inventory after it is rezzed (so another attempt to rez (the same object) will fail); if the owner does have copy permission, then a copy is rezzed, and the original {{LSLP|inventory}} remains in inventory.
* If the owner of the object does not have copy permission  on '''inventory''', the object will no longer be present in inventory after it is rezzed (so another attempt to rez it is likely to fail); if the owner does have copy permission, then a copy is rezzed, and the original '''inventory''' remains in inventory.
* If the object is attached and the owner of the object does not have copy permission  on {{LSLP|inventory}}, an error is shouted on [[DEBUG_CHANNEL]]: "Cannot rez no copy objects from an attached object."
*Silently fails if you don't have offline building rights on the land.  
*Silently fails if you don't have offline building rights on the land. To have the right, your objects needs to ''either'':  
**Which means that you need to either:  
** Be on land you own yourself.
**#Own the land yourself.  
** Be on land where anyone is allowed to build, e.g. a sandbox.  
**#Be in the group that owns it, the allow group to build parcel flag has to be enabled and the object has to be set to group.  
** Be deeded to the group that owns the land.
**#Or everyone should be allowed to build.
** Be set to the same group that owns the land and the land have the parcel flag 'allow group to build' set.
**#You can also deed the object to the group that owns the land, this will always work.
** The group role "Always allow 'Create Objects'" will only work to override this when you are online, in the region, or have a child agent in the region. See [[#SVC-3145|SVC-3145]] in the Issues subsection of Deep Notes for more information.
**The group role "Always allow 'Create Objects'" will only work to override this when you are online. See [[#SVC-3145|SVC-3145]] in the Issues subsection of Deep Notes for more information.
* See [[object_rez]] for examples on how to establish communications between the rezzing object and the new prim.
|constants
|constants
|examples=<lsl>default
|examples=<syntaxhighlight lang="lsl2">default
{
{
     touch_start(integer param)
     touch_start(integer param)
Line 32: Line 34:
           llRezObject("Object", llGetPos() + <0.0,0.0,1.0>, <0.0,0.0,0.0>, <0.0,0.0,0.0,1.0>, 0);
           llRezObject("Object", llGetPos() + <0.0,0.0,1.0>, <0.0,0.0,0.0>, <0.0,0.0,0.0,1.0>, 0);
     }
     }
}</lsl>
}</syntaxhighlight>
<lsl>// Rez an object on touch, with relative position, rotation, and velocity all described in the rezzing prim's coordinate system.
<syntaxhighlight lang="lsl2">// Rez an object on touch, with relative position, rotation, and velocity all described in the rezzing prim's coordinate system.
string object = "Object"; // Name of object in inventory
string object = "Object"; // Name of object in inventory
vector relativePosOffset = <2.0, 0.0, 1.0>; // "Forward" and a little "above" this prim
vector relativePosOffset = <2.0, 0.0, 1.0>; // "Forward" and a little "above" this prim
Line 53: Line 55:
         llRezObject(object, rezPos, rezVel, rezRot, startParam);
         llRezObject(object, rezPos, rezVel, rezRot, startParam);
     }
     }
}</lsl>
}</syntaxhighlight>
|helpers
|helpers
|also_constants=
|also_constants=
Line 61: Line 63:
{{LSL DefineRow||[[llGetStartParameter]]|}}
{{LSL DefineRow||[[llGetStartParameter]]|}}
{{LSL DefineRow||[[llGodLikeRezObject]]|}}
{{LSL DefineRow||[[llGodLikeRezObject]]|}}
{{LSL DefineRow||[[LlGetParcelFlags#Examples]]|Test if the parcel allows this script to rez}}
|also_tests
|also_tests
|also_events=
|also_events=
{{LSL DefineRow||[[object_rez]]|triggered when this object rezzes an object from inventory}}
{{LSL DefineRow||[[object_rez]]|triggered when this object rezzes an object from inventory}}
|also_articles
|also_articles
|notes
|notes='''Maximum rez distance'''
*After tests on server 1.38, these figures were measured - (on some earlier server versions the same ''further-than-10-meter'' rezzes have been possible).
*The {{LSLP|distance}} measured is between the [[llGetPos|center]] of the rezzing {{LSLP|prim}} and the [[llGetPos|center]] of the {{LSLP|prim}} that is rezzed.
**The tests did not include rezzing from or the rezzing of link_set objects.
**A <code>10.0</code> meter cube could rez a <code>0.5</code> meter cube just beyond <code>18.6</code> meters away.
**A <code>0.01</code> cube could rez a <code>0.5</code> meter cube just beyond <code>10.0</code> meters away.
|permission
|permission
|inventory
|inventory

Latest revision as of 09:58, 1 October 2022

Summary

Function: llRezObject( string inventory, vector pos, vector vel, rotation rot, integer param );

Instantiate inventory object at pos with velocity vel and rotation rot with start parameter param

• string inventory an object in the inventory of the prim this script is in
• vector pos position in region coordinates
• vector vel velocity (max magnitude is approximately 200m/s)
• rotation rot rotation
• integer param on_rez event parameter and value returned by llGetStartParameter in the rezzed object (or by each of the items in a coalesced object).

The root of inventory is not at pos but the center of inventory is.
To have the root prim at pos use llRezAtRoot instead.

Caveats

  • This function causes the script to sleep for 0.1 seconds.
  • If inventory is missing from the prim's inventory or it is not an object then an error is shouted on DEBUG_CHANNEL.
  • Silently fails to rez inventory (to have it's geometric center at pos) if pos is too far from the geometric center of the object trying to rez inventory.
    • If your script is mysteriously failing to rez things, make sure you haven't (say) written "<0.0,0.0,1.0>" for the pos parameter rather than (say) llGetPos() + <0.0,0.0,1.0>".
  • When scripting attachments meant to rez objects, remember that when used in the root of an (attached) attachment llGetPos doesn't return the position of the attachment but instead returns the position of the avatar's bounding box geometric center. Read llGetPos and llParticleSystem Caveats for more information.
  • If the object is unattached and the owner of the object does not have copy permission on inventory, the object will no longer be present in inventory after it is rezzed (so another attempt to rez (the same object) will fail); if the owner does have copy permission, then a copy is rezzed, and the original inventory remains in inventory.
  • If the object is attached and the owner of the object does not have copy permission on inventory, an error is shouted on DEBUG_CHANNEL: "Cannot rez no copy objects from an attached object."
  • Silently fails if you don't have offline building rights on the land. To have the right, your objects needs to either:
    • Be on land you own yourself.
    • Be on land where anyone is allowed to build, e.g. a sandbox.
    • Be deeded to the group that owns the land.
    • Be set to the same group that owns the land and the land have the parcel flag 'allow group to build' set.
    • The group role "Always allow 'Create Objects'" will only work to override this when you are online, in the region, or have a child agent in the region. See SVC-3145 in the Issues subsection of Deep Notes for more information.
  • See object_rez for examples on how to establish communications between the rezzing object and the new prim.

Important Issues

~ All Issues ~ Search JIRA for related Bugs
   group ROLE permissions only work for scripted rez when owner is online
   llRezObject at wrong position when rezzing a linkset that was previously rotated in-world.

Examples

default
{
     touch_start(integer param)
     {
          llRezObject("Object", llGetPos() + <0.0,0.0,1.0>, <0.0,0.0,0.0>, <0.0,0.0,0.0,1.0>, 0);
     }
}
// Rez an object on touch, with relative position, rotation, and velocity all described in the rezzing prim's coordinate system.
string object = "Object"; // Name of object in inventory
vector relativePosOffset = <2.0, 0.0, 1.0>; // "Forward" and a little "above" this prim
vector relativeVel = <1.0, 0.0, 0.0>; // Traveling in this prim's "forward" direction at 1m/s
rotation relativeRot = <0.707107, 0.0, 0.0, 0.707107>; // Rotated 90 degrees on the x-axis compared to this prim
integer startParam = 10;

default
{
    touch_start(integer a)
    {
        vector myPos = llGetPos();
        rotation myRot = llGetRot();

        vector rezPos = myPos+relativePosOffset*myRot;
        vector rezVel = relativeVel*myRot;
        rotation rezRot = relativeRot*myRot;

        llRezObject(object, rezPos, rezVel, rezRot, startParam);
    }
}

Notes

Maximum rez distance

  • After tests on server 1.38, these figures were measured - (on some earlier server versions the same further-than-10-meter rezzes have been possible).
  • The distance measured is between the center of the rezzing prim and the center of the prim that is rezzed.
    • The tests did not include rezzing from or the rezzing of link_set objects.
    • A 10.0 meter cube could rez a 0.5 meter cube just beyond 18.6 meters away.
    • A 0.01 cube could rez a 0.5 meter cube just beyond 10.0 meters away.

See Also

Constants

•  PRIM_TEMP_ON_REZ

Events

•  object_rez triggered when this object rezzes an object from inventory

Functions

•  llRezAtRoot Rezzes the object at the requested position
•  llGetStartParameter
•  llGodLikeRezObject
•  LlGetParcelFlags#Examples Test if the parcel allows this script to rez

Deep Notes

All Issues

~ Search JIRA for related Issues
   group ROLE permissions only work for scripted rez when owner is online
   llRezObject at wrong position when rezzing a linkset that was previously rotated in-world.
   parcel build permissions needs whitelist
   llRezTempObject() - for temporarily rezzing objects

Signature

function void llRezObject( string inventory, vector pos, vector vel, rotation rot, integer param );