<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
{mso-style-priority:99;
mso-style-link:"Balloon Text Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:8.0pt;
font-family:"Tahoma","sans-serif";}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri","sans-serif";
color:windowtext;}
span.BalloonTextChar
{mso-style-name:"Balloon Text Char";
mso-style-priority:99;
mso-style-link:"Balloon Text";
font-family:"Tahoma","sans-serif";}
.MsoChpDefault
{mso-style-type:export-only;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.Section1
{page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=EN-GB link=blue vlink=purple>
<div class=Section1>
<p class=MsoNormal>I think there is a bug in llBreakLink() in Opensim (compared
with the 2L description, 2L actual behaviour and what would actually make
sense!).<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>I am trying to do the following with a script inside a
single prim:<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>- Rez an object (made from many prims) from prim inventory:
llRezObject()<o:p></o:p></p>
<p class=MsoNormal>- Get permission for the script to link/unlink: llRequestPermissions()<o:p></o:p></p>
<p class=MsoNormal>- Link object to myself: llCreateLink()<o:p></o:p></p>
<p class=MsoNormal>- Do ‘some stuff’ with the linked parts<o:p></o:p></p>
<p class=MsoNormal>- Unlink myself from the object*: llBreakLink()<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>(*The script is in a single prim, so I unlink myself rather
than trying to unlink all the prims in the rezzed linkset, or getting the
rezzed object to delink me - which would require each newly rezzed object to
call llRequestPermissions() each time)<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>If I set ‘parent’ to TRUE in llCreateLink() –
so the rezzer prim becomes the root prim of the new linkset, then the
subsequent llBreakLink() (used to unlink myself from the linkset) changes which
prim is the root prim in the original rezzed object in some seemingly random
way (this is no good! The root prim is also scripted and needs to remain the
root prim after this process is finished).<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>If I set ‘parent’ to FALSE in llCreateLink() –
so the root prim of the rezzed object becomes the root prim of the linkset,
then the subsequent llBreakLink() silently fails (it doesn’t unlink and
so also doesn’t trigger a ‘changed’ event).<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Below is a script you can use to test this – put it in
a single prim which also contains some multi-prim object called “Rez
Thing”.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Changing ‘makeMeParent’ determines the mode of
operation: either the rezzer prim is the root prim of the linked set (TRUE) or
not (FALSE).<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>It reports its progress as it carries out the above actions –
touching it causes it to run again (after you have manually disposed of the
rezzed object).<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>It works just fine in 2L in both modes.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Any suggestions on how to fix this in Opensim would be most
welcome (or if it IS a bug, can someone familiar with the process report if
officially?) – Thanks, Kevin<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>========================================================================================<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>integer makeMeParent = FALSE;<o:p></o:p></p>
<p class=MsoNormal>string objectName = "Rez Thing";<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>key objectKey;<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>default<o:p></o:p></p>
<p class=MsoNormal>{<o:p></o:p></p>
<p class=MsoNormal> on_rez(integer channel)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> llResetScript();<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> state_entry()<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> llSay(0,
"Rezzing object");<o:p></o:p></p>
<p class=MsoNormal>
llRezObject(objectName, llGetPos() + <0,0,2>, ZERO_VECTOR, ZERO_ROTATION
, 0);<o:p></o:p></p>
<p class=MsoNormal> llSay(0,
"Get link/unlink perms");<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> object_rez(key _id)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> llSay(0,
"Object rezzed, key: " + (string)_id);<o:p></o:p></p>
<p class=MsoNormal> objectKey = _id;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> llSay(0,
"Getting link/unlink
perms"); <o:p></o:p></p>
<p class=MsoNormal> llRequestPermissions(llGetOwner(),
PERMISSION_CHANGE_LINKS);<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> run_time_permissions(integer _perm)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> llSay(0,
"run_time_permissions triggered with value: " + (string)_perm);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> //Check we got
permission<o:p></o:p></p>
<p class=MsoNormal> if (_perm ==
PERMISSION_CHANGE_LINKS)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>
llSay(0, "Linking to me");<o:p></o:p></p>
<p class=MsoNormal>
llCreateLink(objectKey, makeMeParent);<o:p></o:p></p>
<p class=MsoNormal> } else<o:p></o:p></p>
<p class=MsoNormal> {//No -
permission to link/unlink was not granted - error message & halt<o:p></o:p></p>
<p class=MsoNormal>
llSay(0, "Permission to link was denied");<o:p></o:p></p>
<p class=MsoNormal>
state halted;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> changed(integer change)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> llSay(0,
"'changed' called with value: " + (string)change);<o:p></o:p></p>
<p class=MsoNormal> if (change &
CHANGED_INVENTORY )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>
llResetScript();<o:p></o:p></p>
<p class=MsoNormal> } else if (change
& CHANGED_LINK)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>
integer myLinkNumber = llGetLinkNumber();<o:p></o:p></p>
<p class=MsoNormal> llSay(0,
"My new link number is: "+(string)myLinkNumber);<o:p></o:p></p>
<p class=MsoNormal>
if (makeMeParent)<o:p></o:p></p>
<p class=MsoNormal>
{<o:p></o:p></p>
<p class=MsoNormal>
if (myLinkNumber < 2)//Root<o:p></o:p></p>
<p class=MsoNormal>
{<o:p></o:p></p>
<p class=MsoNormal>
llSay(0, "Delinking self");<o:p></o:p></p>
<p class=MsoNormal>
llBreakLink(myLinkNumber);<o:p></o:p></p>
<p class=MsoNormal>
}<o:p></o:p></p>
<p class=MsoNormal>
} else<o:p></o:p></p>
<p class=MsoNormal>
{<o:p></o:p></p>
<p class=MsoNormal>
if (myLinkNumber > 1)//Rezzed object is root<o:p></o:p></p>
<p class=MsoNormal>
{<o:p></o:p></p>
<p class=MsoNormal>
llSay(0, "Delinking self");<o:p></o:p></p>
<p class=MsoNormal>
llBreakLink(myLinkNumber);<o:p></o:p></p>
<p class=MsoNormal>
}<o:p></o:p></p>
<p class=MsoNormal>
}<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> touch_end(integer num_detected)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> llSay(0,
"Rezzing new object");<o:p></o:p></p>
<p class=MsoNormal>
llRezObject(objectName, llGetPos() + <0,0,2>, ZERO_VECTOR, ZERO_ROTATION
, 0);<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal>}<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>state halted<o:p></o:p></p>
<p class=MsoNormal>{<o:p></o:p></p>
<p class=MsoNormal> on_rez(integer channel)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> llResetScript();<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> state_entry()<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> llSay(0,
"Halted");<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> changed(integer _change)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> llResetScript();<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal>}<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
</div>
<br><br></body>
</html>