<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:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" 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:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@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.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
span.EmailStyle19
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@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-AU link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span style='color:#1F497D'>Can you report this on mantis? <a
href="http://www.opensimulator.org/mantis">http://www.opensimulator.org/mantis</a>
- it is the appropriate place for bug reports.<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>Adam<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> opensim-users-bounces@lists.berlios.de
[mailto:opensim-users-bounces@lists.berlios.de] <b>On Behalf Of </b>Kevin
Buckley<br>
<b>Sent:</b> Sunday, 29 November 2009 8:30 AM<br>
<b>To:</b> opensim-users@lists.berlios.de<br>
<b>Subject:</b> [Opensim-users] llBreakLink silently fails or reorders linkset
in opensim<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal><span lang=EN-GB>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></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>I am trying to do the following with a
script inside a single prim:<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>- Rez an object (made from many prims) from
prim inventory: llRezObject()<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>- Get permission for the script to
link/unlink: llRequestPermissions()<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>- Link object to myself: llCreateLink()<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>- Do ‘some stuff’ with the linked parts<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>- Unlink myself from the object*:
llBreakLink()<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>(*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></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>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></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>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></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>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></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>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></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>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></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>It works just fine in 2L in both modes.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>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></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>========================================================================================<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>integer makeMeParent = FALSE;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>string objectName = "Rez Thing";<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>key objectKey;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>default<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>{<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    on_rez(integer channel)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llResetScript();<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    state_entry()<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llSay(0, "Rezzing object");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llRezObject(objectName, llGetPos() + <0,0,2>, ZERO_VECTOR, ZERO_ROTATION
, 0);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llSay(0, "Get link/unlink perms");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>        <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    object_rez(key _id)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llSay(0, "Object rezzed, key: " + (string)_id);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>        objectKey
= _id;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>        <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llSay(0, "Getting link/unlink
perms");        <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llRequestPermissions(llGetOwner(), PERMISSION_CHANGE_LINKS);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>   
run_time_permissions(integer _perm)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llSay(0, "run_time_permissions triggered with value: " +
(string)_perm);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>        <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
//Check we got permission<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
if (_perm == PERMISSION_CHANGE_LINKS)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
{<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>           
llSay(0, "Linking to me");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>           
llCreateLink(objectKey, makeMeParent);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
} else<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
{//No - permission to link/unlink was not granted - error message & halt<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>           
llSay(0, "Permission to link was denied");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>           
state halted;<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    changed(integer change)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llSay(0, "'changed' called with value: " + (string)change);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
if (change & CHANGED_INVENTORY )<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
{<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>           
llResetScript();<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
} else if (change & CHANGED_LINK)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
{<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>           
integer myLinkNumber = llGetLinkNumber();<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB> 
          llSay(0, "My
new link number is: "+(string)myLinkNumber);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>           
if (makeMeParent)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>           
{<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>               
if (myLinkNumber < 2)//Root<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>               
{<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>                   
llSay(0, "Delinking self");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>                   
llBreakLink(myLinkNumber);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>               
}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>           
} else<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>           
{<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>               
if (myLinkNumber > 1)//Rezzed object is root<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>               
{<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>                   
llSay(0, "Delinking self");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>                   
llBreakLink(myLinkNumber);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>               
}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>           
}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    touch_end(integer
num_detected)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llSay(0, "Rezzing new object");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llRezObject(objectName, llGetPos() + <0,0,2>, ZERO_VECTOR, ZERO_ROTATION
, 0);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>state halted<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>{<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    on_rez(integer channel)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llResetScript();<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    state_entry()<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llSay(0, "Halted");<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    changed(integer _change)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>       
llResetScript();<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>    }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB>}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB><o:p> </o:p></span></p>

<p class=MsoNormal style='margin-bottom:12.0pt'><span lang=EN-GB
style='font-size:12.0pt;font-family:"Times New Roman","serif"'><o:p> </o:p></span></p>

</div>

</div>

</body>

</html>