ソラマメブログ

2007年08月23日

llGetOwnerとstate_entry()の罠

※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」。
llGetOwnerとstate_entry()の罠
問題は赤文字で書かれている「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」が最近普及しはじめているようですが、そちらがどういう処理になって
 いるのかはまだわかりません^^;


同じカテゴリー(LSL)の記事
 スクリプトの仕様変更:今後の方針 (2008-08-26 14:52)
 スクリプトの仕様変更 (2008-08-26 03:19)
 llResetScript()とか (2007-10-05 21:17)

Posted by VoidLing at 05:34│Comments(10)LSL
この記事へのコメント
これ?  なんですか?
Posted by ゆみ at 2007年08月23日 05:59
「これ」というと、「Choker01」のことでしょうか??
女性用の首につけるアクセ(チョーカー)です。

(という説明でよいのかな^^;??)
Posted by VoidLingVoidLing at 2007年08月23日 06:05
ちょっと調べてみたところ、「チョーカー」というのは
首にフィットするような「長さがもっとも短いネックレス」のことで
犬の首輪にも似ていることから別名「ドッグカラー」とも
呼ばれるようですね。
上のコメントで「女性用」と書きましたが、男女の区別はないようです。
Posted by VoidLingVoidLing at 2007年08月23日 06:26
正式にTitlerかも?これが有名だったからかもしれませんが。

state_entry()ですがそのstateが始まった時であって
rezした時ってわけじゃないです。rez時はon_rez()の時ですね。
takeしたら動くのは、takeする事で"新しく"invに入るため、
スクの最初から実行されstate_entry()が処理されるからですね。

 なのでオーナーキーの取得は、オーナーがchangeした時に
取得するのが一番だと思います。
 また、この例の品様に特定の段階になってからキーが必要なので
あればtouchイベント後にオーナーキーを取得しても問題は無いですね。
Posted by Maaya Yohkoh at 2007年08月23日 06:40
ただのアクセサリー? なら高いですね><
Posted by ゆみ at 2007年08月23日 06:54
Maaya Yohkohさんコメントありがとうございます!
まだまだ私はLSLもわからないことだらけなので
とても勉強になりました^^

そういえば、state_entry()は、ステートじゃなくてイベントでしたね^^;
defaultステートが動作するきっかけがまだよく理解できてないので
いろいろ勘違いしてることがあるかも・・・うむむ>私
Posted by VoidLingVoidLing at 2007年08月23日 06:56
高いですか、そうですか^^;>ゆみさん
今後の価格設定の際の判断材料とさせていただきますね。
Posted by VoidLingVoidLing at 2007年08月23日 06:58
おおー私もはまったこの罠。というかよくわかってなかったこの罠。
Voidさんの改訂前、改訂後のコメントとMaaya Yohkohさんのコメントを読んで、なんかすごおく分かった気がします。やったw。
今度何か作るときに試してみよう♡。ありがとうございまーす。

ちなみにチョーカーはvoidさんのはいつも激しくディーテールに手が混んでいるから高いとは思いませんよ。ただもっと安ければもっとたくさんの人は買うでしょうけれどね。
titlerだし。私は納得の金額だと思いますけど。
Posted by ちちら at 2007年08月23日 11:15
これだけの機能ならぜんぜん高くないですよ~。

すっごい欲しいけど01.1バージョンが出るまで待ちます~。
Posted by ゆいかゆいか at 2007年08月27日 18:20
ゆいかさん、コメントありがとう^^
Ver.01.1なんですが、解決方法がまだわからないので
リリースできるかどうかもわからない状況です^^;
この記事に書いた対処法をしていただければ、Titlerの機能も
満喫していただけますので、Ver.01でお許しいただけると幸いです。

※もしVer.01.1をリリースすることになったら、Ver.01購入者
 全員に無料バージョンアップしますね。
Posted by Void Ling at 2007年08月28日 18:21
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。