VoidLing
2007年08月23日
05:34
※GridDownも終わり、ログインして自作Titlerのスクリプトを見てみたら・・・
あれ?あれ?
touch_start(integer total_number){
handle = llListen(556, "", llGetOwner(), "");
llSetTimerEvent(30.0);
}
こうなってました・・・
でも、実際に知人のサファイアさんの協力で「一度REZしないと動作しない」という
ことは検証済みだったので、謎は深まるばかりです。
・・・という予備知識の元に以下の訂正前の記事をお読みくださいm(_ _)m
※解決策がわからない状態ですので、Ver.01.1をリリースできるかどうかかなり微妙です^^;
以下の記事にある対処法でTitlerの機能が使えるようになりますので、当面はそれで
お許しいただくしかなさそうです。本当に申し訳ない^^;
もし今後Ver.01.1がリリースできることになりましたら、Ver.01購入者全員に
無料バージョンアップをお約束します。
=================================
今回の記事を書くきっかけとなったのは、この「Choker01」。
問題は赤文字で書かれている「Titler」です。
このTitler(←私が勝手にそう言っているだけで正式にどう言うのかは不明)は、
たぶん一般的にもっとも普及している「FlipTitle」という、おそらくIIListenをつけっぱなしにしている
であろうTitlerよりも負荷の低いものを作ってみようということで、一から自分で書いたLSLです。
理屈は簡単で、LSLが埋め込まれた装着品をクリックするとIIListenが30秒ほどONになり
それ以外の状態のときは常にOFFになっているというもの。
で、頭上にタイトル(=フロートテキスト)を表示する機能自体はまったく問題なく動作するんですが、
販売品に添付した説明書に肝心なことを書くのを忘れてました^^;
一番最初に一度地面にREZ(インベントリからDROP)し、
それをTAKEすることでインベントリに増えたものを装着しないと、
このTitlerは機能しません!!(次からはこの作業は不要)
なんでこんなことになってしまったかというと・・・
llGetOwnerという関数は、「そのLSLが埋め込まれているアイテムの持ち主のUUID」を
取得するためのもので、持ち主以外がそのアイテムの機能をいじったりできないようにするために
よく利用されるものなんですが、私はこの関数をstate_entry()というステートに
書いちゃってたんですね^^;
このstate_entry()というステートは、そのオブジェクトをREZしたときに1回だけ
実行されるものなんですが・・・
私はこの関数をdefaultステートのstate_entry()イベントに書いちゃってたんですね^^;
このstate_entry()というイベントは、それが含まれるステートのスクリプトか読まれる際の
最初に一度だけ実行されるもの(←たぶんこの理解で間違いない・・はず^^;)なんですが・・・
アタッチなどの装着する行為は、REZ扱いにならない。
アタッチなどの装着する行為では、defaultステートのstate_entry()イベントは実行されない
というLSLの仕様が・・・orz
このことはすでに知っていて頭では理解していた(アミノさんが同様のトラブルを抱えていたときに
アドバイスした)んですが、まさか自分も同じ事をやらかしていたとは・・・
このことをすでに知っている(と思い込んで)頭では理解していた(つもり)だったのですが^^;
これまで購入してくださったみなさん、説明不足で本当に申し訳ありませんでしたm(_ _)m
次にIN出来次第修正版「Choker01.1」の準備を始めたいと思います。
※Maaya Yohkohさんからこの記事の間違いを教えていただきましたので、一部修正しました。
※ちなみにアタッチなどの装着する操作は基本的にはオブジェクトリンク扱いとなりますが
attach(key attached)でイベントが拾えます。
※「llGetOwnerとstate_entry()の罠」という記事タイトルですが、正直いって私のミスですorz
※低負荷版の「FlipTitle」が最近普及しはじめているようですが、そちらがどういう処理になって
いるのかはまだわかりません^^;