LSL Portal Wikiで、llMoveToTarget()をしらべてました。
http://wiki.secondlife.com/wiki/LlMoveToTarget
そのWikiページに、オーナーの周りにオブジェクトが寄って来るようにするというスクリプトのExampleがありました。
これを自分のオブジェクト(NeXTcube のテクスを貼った箱)にいれて動くようにしたものを人にあげました。
そうすると、あげた人ではなく私のほうに寄ってくるようになってしまいました...。
「やっぱり、オーナーになついてるのね...www」とは言われたんですが、意図している動作とは違うので、バグです。
で、このバグの原因が llGetOwner() の使い方にあると分ったので報告です。
llGetOwner()のWikiのCaveats(警告)には、
When the owner of an object changes, code that depends on this function's return value will not automatically update for the new owner or be automatically re-evaluated.
...
オブジェクトのオーナーが変わっても、この関数の戻り値に依存するコードは、新しい所有者に対して自動的に(値が)更新されたり、再評価されたりはしません。
...
とあります。つまり、llGetOwner()実行して、その値でlisten系、request系、permission系のイベントをまっているようなものは、オーナーが変わったからといって、自動的に新しいオーナーでイベントが発生したりと更新はされないということです (詳細はllGetOwner() のWikiをご覧ください)。
スクリプトのExampleも、これが引き起こすバグにハマってました。これを解決するには、現在のイベントステートに changed()イベントを追加し、オブジェクトのオーナーが変わったら、強制的にリセットし、再評価するようにすれば良いです。
default
{
...
changed(integer change)
{
if (change & CHANGED_OWNER) {
llResetScript();
}
}
}
コンパイルしなおせば動くようになるようなスクリプトは、この配慮がされてないのかもしれません。
私も、いままでに作ったものは見直したほうがいいなぁ...と思ってます。
まあ、割と、「あるある」かもしれないし、ハマる人が減るといいかもしれないので、報告いたします。