<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://www21.atwiki.jp/mizcremorne/">
    <title>BlackSheep-LSL@Wiki</title>
    <link>http://www21.atwiki.jp/mizcremorne/</link>
    <description>BlackSheep-LSL@Wiki</description>

    <dc:language>ja</dc:language>
    <dc:date>2011-12-12T22:46:05+09:00</dc:date>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="http://www21.atwiki.jp/mizcremorne/pages/287.html" />
                <rdf:li rdf:resource="http://www21.atwiki.jp/mizcremorne/pages/311.html" />
                <rdf:li rdf:resource="http://www21.atwiki.jp/mizcremorne/pages/299.html" />
                <rdf:li rdf:resource="http://www21.atwiki.jp/mizcremorne/pages/165.html" />
                <rdf:li rdf:resource="http://www21.atwiki.jp/mizcremorne/pages/320.html" />
                <rdf:li rdf:resource="http://www21.atwiki.jp/mizcremorne/pages/169.html" />
                <rdf:li rdf:resource="http://www21.atwiki.jp/mizcremorne/pages/97.html" />
                <rdf:li rdf:resource="http://www21.atwiki.jp/mizcremorne/pages/73.html" />
                <rdf:li rdf:resource="http://www21.atwiki.jp/mizcremorne/pages/71.html" />
                <rdf:li rdf:resource="http://www21.atwiki.jp/mizcremorne/pages/54.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="http://www21.atwiki.jp/mizcremorne/pages/287.html">
    <title>初！スクリプト</title>
    <link>http://www21.atwiki.jp/mizcremorne/pages/287.html</link>
    <description>
      #contents

*はじめに

前回はスクリプトの構成について説明しました。
「状態（ステート）」
「きっかけ（イベント）」
「反応」
の３つで構成されているという点は基礎中の基礎ですので踏まえておいて下さい。

今回は実際にSLの中でスクリプトを動かしてみたいと思います。
だらだらと説明ばかりでは飽きるでしょうし（＾＾；

*スクリプトの作成

SLにログインし、実際に作ってみましょう。
スクリプトの作り方は、厳密には２つの方法があります。

primのコンテンツ内に作る方法と、アバターのインベントリ内に作る方法の二種類ですが、たいていの場合はprimのコンテンツ内に作成します。
何故ならスクリプトはprimのコンテンツ内に置かないと作動しないためです。
汎用的なスクリプトを作る場合などは、アバターのインベントリにスクリプトを作ったりもしますが、最初のうちはそういうこともあまりないでしょう。

適当にprimを作って下さい。
primの作り方がわからないという方は、「SL prim 初めて 作成」でGoogle検索して下さい（＾＾；
SecondLife Wiki JPのアイボリータワー翻訳プロジェクトなどがとても参考になると思います。

primを作ったら、editウインドウの下側に並んでいるタブの一番右、「コンテンツ」のタブをクリックします（editウインドウの下半分が表示されてない人は「more」ボタンで表示されます）。
「コンテンツ」タブには、primの中に入っているものの一覧が表示されています。
最初は「contents」というフォルダがあるのみで、空っぽになっているはずです。

この画面で「New Script」のボタンを押すと、新しいスクリプトが作成されます。
「New Script」という名称でコンテンツの中に表示されますので、今度は作られたスクリプトをダブルクリックします。

するとスクリプト編集用のウインドウが開き、なにやらコードが書かれているのが見れます。
以下のようなコードが表示されるところまで実際に試してみて下さい。

 default
 {
   state_entry()
   {
     llSay(0, &quot;Hello, Avatar!&quot;);
   } 
 
   touch_start(integer total_number)
   {
     llSay(0, &quot;Touched.&quot;);
   }
 }

*ハロー・アバター・スクリプト

作成されたスクリプトは、ハロー・アバター・スクリプトと呼ばれる初期スクリプトです。
前回のスクリプト構造についての話を思い出して、このスクリプトの構造を読み取って見ましょう。

 default    ・・・状態（ステート）
 {
   state_entry()    ・・・きっかけ（イベント）
   {
     llSay(0, &quot;Hello, Avatar!&quot;);    ・・・反応
   }
 
   touch_start(integer total_number)    ・・・きっかけ（イベント）
   {
     llSay(0, &quot;Touched.&quot;);    ・・・反応
   }
 }

読み取れたでしょうか。
「状態（ステート）」、「きっかけ（イベント）」、「反応」。
どこの部分が何に当たるのかをまずつかんで下さい。
それがわかると次には、
「defaultってのが状態なのはわかったけど、一体何のことやら？」
という疑問がわいてくるかと思います。

それぞれの英語の構文の意味について、簡単に説明しましょう。

・状態（ステート）
このスクリプトには状態（ステート）が一つしかありません。
defaultステートです。
このステートは特別なステートで、いわゆる「初期状態」です。
スクリプトは複数のステートを持つことができますが、このdefaultステートを無くすことはできません。
またdefaultステートは、スクリプトが開始されるときの最初のステートです。

・きっかけ（イベント）
きっかけ（イベント）は二つあります。
[[state_entry]]()というのと、[[touch_start]](integer total_number)です。
この二つは最も基本的なイベントです。
[[state_entry]]()は、ステートにエントリーしたとき、つまり「この状態になったとき」に実行されます。
[[touch_start]]()は、タッチをスタートしたとき、つまり「タッチしたとき」に実行されます。

・反応
それぞれのイベントに対して反応が書かれています。
このスクリプトではどちらも、[[llSay]](0, &quot;ほげほげ&quot;)という反応になっています。
[[llSay]]()は、「言う」すなわち&quot;ほげほげ&quot;の部分に書かれた内容をオブジェクトが発言する命令です。

さて、ここまでわかると、このスクリプトの動きがわかるはずです。
ステート、イベント、そして反応を踏まえながら考えてみましょう。

まずステートについては一つしかないので悩むことは何もありません。
このスクリプトは初期状態から変化することがなく、初期状態のまま完結しています。

イベントは２つ。
「この状態になったとき」と「タッチしたとき」です。

「この状態になったとき」の「この状態」とは何かと言うと、当然defaultステートのことです。
つまりこのイベントは、「defaultステートになったとき」のことです。
このスクリプトは初期状態のdefaultステートしかありませんから、このイベントが発生するのは「一番最初にスクリプトが動いた時」だけです。
そのときにどんな反応をするのか。
[[llSay]](0, &quot;Hello, Avatar!&quot;);と書いてあります。
この命令を正確に説明すると、
「チャットチャンネル0番で&quot;Hello, Avatar!&quot;と発言する」
ということになります。
チャットチャンネルについてはとりあえず省略しますが、0番チャンネルでの発言というのは通常チャットと同じ発言になるということだけ知っておいて下さい。

イベントと反応をあわせて考えると、
「一番最初にスクリプトが動いた時」＞「&quot;Hello, Avatar!&quot;と発言する」
ということになります。

次のイベントも見てみましょう。
「タッチしたとき」のほうは、文字通りアバターがオブジェクトをタッチしたときのことです。
[[touch_start]]()の()の中に書いてある「integer total_number」については今は気にしなくていいです。
こういう風に書くんだと覚えておきましょう。
反応は先ほどと同じく[[llSay]]です。
今度は[[llSay]](0, &quot;Touched.&quot;);と書いてありますので、
「チャットチャンネル0番で&quot;Touched.&quot;と発言する」
ということになります。

つまり2番目のイベントと反応は、
「アバターにタッチされたとき」＞「&quot;Touched.&quot;と発言する」
ということです。

*本当にそうなってるのか？

スクリプトがどういう動作をするのかわかったところで、実際に試してみましょう。
まずは、スクリプトの編集ウインドウの下のほうにある、「リセット」のボタンを押してください。
このボタンを押すとスクリプトがリセットされます。

リセットされるということは、初期状態に戻りますので、一番目に書いてあったイベント、
「一番最初にスクリプトが動いた時」
が発動するはずです。
このイベントが発動すると、
「&quot;Hello, Avatar!&quot;と発言する」
はずですので、チャット欄をよく見ておきましょう。

リセットしたときに&quot;Hello, Avatar!&quot;とオブジェクトが言っていれば予想通りの動きです。

次に、オブジェクトにタッチしてみます。
editウインドウが開いたままだとうまくタッチできませんので、一度editモードを終了して下さい。
それからオブジェクトにタッチしてみます。
２番目に書いてあったイベントの「アバターにタッチされたとき」が発動して、「&quot;Touched.&quot;と発言する」はずです。

タッチしたときに&quot;Touched.&quot;とオブジェクトが言っていることを確認しましょう。

今回は実際にスクリプトのコードを見て、その構造を理解し、どんな動きをするのか考えてみました。
フリーのスクリプトなどを入手する機会もあるかと思いますが、その動きを理解するときも同様の思考手順を踏みます。

さて、具体的にスクリプトを作る方法がわかりましたので、次回はオリジナルのスクリプトを作成するところまで進んでみたいと思います。
何かご意見・ご感想などありましたら遠慮なくコメントして下さいませ（＾＾

……的外れじゃないかと不安でたまらなくなってくるのでｗ
----
- とても分かりやすいですね。  -- チョコ  (2011-12-12 22:46:05)
#comment    </description>
    <dc:date>2011-12-12T22:46:05+09:00</dc:date>
  </item>
    <item rdf:about="http://www21.atwiki.jp/mizcremorne/pages/311.html">
    <title>鍵をかける</title>
    <link>http://www21.atwiki.jp/mizcremorne/pages/311.html</link>
    <description>
      #contents

*はじめに

やもさんより質問いただいたスクリプトについて解説です。

 [やもさんからの質問]
 最近自分で服を作るようになり試着の為の更衣室を用意したのですが
 ドアに鍵をかけるか、自分にしか開けられないドアするにはどのようにしたら良いのでしょうか？

これって結構ニーズのある話だと思います。
着替えの最中は裸になることも多く、やはり人に見られたくない場合がありますので・・・。

また、Kirさんからも関連のある質問をいただきました。

 [Kirさんからの質問]
 なんとか、オーナー限定にて動作するように改良したいのですが、
 
  if (llDetectedKey(0) == llGetOwner()){
    handle=llListen(channel, &quot;&quot;, llGetOwner(), &quot;&quot;);
 
 これでしょうか？

あわせて見ていきましょう。

*鍵をかけることの意味

実際には「人に見られることのない場所」を作るのは結構大変だったりします。
というのも、SLではかなり自由なカメラのコントロールが利きますので、建物をALT押しながら左クリックしてドラッグすると、簡単に内部を覗けてしまうんですね（＾＾；
たとえドアに鍵をかけたとしても、これを防ぐことはできません。

覗き見だけでなく、内部に侵入することも可能です。
カメラを動かして建物内部を見て、中の家具などにsitすると、強引に室内に押し入ることができたりします。
これを防ぐにはsitしたときの強制排除の仕組みを建物や家具に組み込んでおくしかありません。
[[llSitTaeget]]でsit位置を屋外に設定してしまうとかですね（＾＾；

完璧なセキュリティを考え始めると、かなり頭を使うことになります。
どこかのSIMに、セキュリティを売りにしているラブホテルがあるとか聞きましたが、そこも相当工夫をしているはずです。
現物を見てないのでどこまでセキュリティを実現しているのかはわかりませんが・・・。

個人的には「絶対に誰にも覗かれない場所」というのは不可能に近いと思っています。
コンピュータの世界に「完璧なセキュリティ」が存在しないのと一緒です。
あくまでも「悪意を持って故意に覗こうとしない限りは、覗かれずに済む」程度のプライバシーであれば確保できます。

以上のようなことを前提とした上で、他の人には開けられないドア及び鍵のかかるドアについて見てみましょう。

**操作できる人を限定する方法

自分にしか開けられないドアを作るのは簡単です。
前にタッチして開くドアを作りましたが、そのスクリプトのタッチイベントにコードを追加し、オーナーがタッチしたときだけ反応するようにすればOKです。

 rotation rot;
 vector open_rot = &lt;0.0, 0.0, 90.0&gt;;
 
 default {
   state_entry()
   {
     rot = llGetRot();
     state close;
   }
 }
 
 state open {
   state_entry()
   {
     llSetRot(rot * llEuler2Rot(open_rot * DEG_TO_RAD));
     llSetTimerEvent(30.0);
   }
   
   touch_start(integer total_number){
     if (llDetectedKey(0) == llGetOwner()) { // タッチしたのがオーナーの場合のみ
       state close;
     }
   }
 
   timer(){
     llSetTimerEvent(0);
     state close;
   }
 }
 
 state close {
   state_entry(){
     llSetRot(rot);
   }
 
   touch_start(integer total_number){
     if (llDetectedKey(0) == llGetOwner()) { // タッチしたのがオーナーの場合のみ
       state open;
     }
   }
 }

[[llDetectedKey]](0)は「タッチした人のUUID」を得る関数です。
[[llGetOwner]]()のほうは「オーナーのUUID」を得る関数ですので、これが等しい場合だけ反応するようにしておけば、オーナー以外には操作ができません。

ドアに限らず、「オーナーがタッチしたときにだけ動作するスクリプト」は、

 touch_start(integer total_number){
   if (llDetectedKey(0) == llGetOwner()) {
     // オーナーがタッチしたときの処理
   } else {
     // オーナー以外がタッチしたときの処理
   }
 }

このような書き方になります。
しばしば使う表現ですので、これはもう丸暗記でもいいかと思います。

この手法をもうちょい応用してみましょう。
オーナーだけでなく、同じグループの人が操作できるようにするには？

 touch_start(integer total_number){
   if (llDetectedGroup(0) ) {
     // オブジェクトと同じグループの人がタッチした場合の処理
   } else {
     // オブジェクトと同じグループ以外の人がタッチした場合の処理
   }
 }

[[llDetectedGroup]]関数は、オブジェクトのグループと同じアクティブグループかどうかを調べる関数です。

さらに応用して、スクリプトに操作を許可する人の名前を定義しておいて、その人以外には使えないようにするには、

 list agents=[&quot;Miz Cremorne&quot;, &quot;Hoge Hogera&quot;, &quot;Honya Honyara&quot;];
 rotation rot;
 vector open_rot = &lt;0.0, 0.0, 90.0&gt;;
 
 （中略）
 
 state open {
 （中略）
   touch_start(integer total_number){
     if (llListFindList(agents, [llDetectedName(0)]) != -1) { // リストagentsに名前のある人のみ
       state close;
     }
   }
 （以下略）

list型変数agentsに、タッチを許可する人の名前を列挙しておきます。
[[llListFindList]]関数はリストの中から指定した要素を探してそのインデックスを返す関数ですが、リストに無かった場合は-1を返します。
つまりリストに名前があるなら、-1以外の数字が返ってきます。
ですので-1以外が返ってきた場合だけ、動作させればOKですね。

ここのところを逆に-1のときだけ動作するようにすると、

 if (llListFindList(agents, [llDetectedName(0)]) == -1) { // リストagentsに名前のない人のみ
   // 処理
 }

BANのように、リストに名前のある人には動かすことのできないスクリプトになります。

**鍵をかける

鍵をかける仕組みは「操作できる人を限定する方法」の応用に過ぎません。
上で紹介したものはどれも「操作できる人」をあらかじめ限定していましたが、ロックしていないときは誰でも操作できて、ロックしたときだけ「操作できる人」が限定されれば良いですね。

 rotation rot;
 vector open_rot = &lt;0.0, 0.0, 90.0&gt;;
 key lock=NULL_KEY;
 integer counter=0;
 
 default {
   state_entry()
   {
     rot = llGetRot();
     state close;
   }
 }
 
 state open {
   state_entry()
   {
     llSetRot(rot * llEuler2Rot(open_rot * DEG_TO_RAD));
     llSetTimerEvent(30.0);
     lock = NULL_KEY; // ロック解除
   }
   
   touch_start(integer total_number){
     state close;
   }
 
   timer(){
     llSetTimerEvent(0);
     state close;
   }
 }
 
 state close {
   state_entry(){
     llSetRot(rot);
   }
 
   touch_start(integer detected){
     counter=0;
   }
 
   touch(integer detected){
     if (llDetectedKey(0) == llGetOwner()){ // ロックできるのはオーナーだけ
       if (counter &lt; 50){
         counter ++;
       }else if (counter == 50){
         counter ++;
         if (lock == NULL_KEY){
           lock = llDetectedKey(0); // ロック
         } else {
           lock = NULL_KEY; // アンロック
         }
       }
     }
   }
 
   touch_end(integer total_number){
     if (lock == NULL_KEY){ // ロックがかかっていない場合
       state open;
     } else if (llDetectedKey(0) == lock) { // ロックをかけた人がタッチした場合
       if (counter &lt; 50){
         state open;
       }
     }
   }
 }

ステートopenのときには誰もが操作可能です。開いてるのですから、閉じるのはいくらでもできるわけです。
ステートcloseのときにロックの仕組みを追加しました。

しばらくドアをクリックしっ放しにするとロックがかかります。
[[touch]]イベントを使って「しばらくマウスボタンを押し続けたとき」の処理の仕方は色の変わるカツラを作ったときに使いました。
今回は「しばらくマウスボタンを押し続けたとき」に、ロックがかかっていなければロックし、ロックがかかっていればアンロックしています。

ロックがかかっているかどうかはkey型変数lockの中身で判断します。
lockがNULL_KEYの場合はロックがかかっていない状態です。
ロックがかかったときには、ロックした人のUUIDが変数lockに入ります。

ドアを開けることができるのは、
（１）ロックがかかっていない場合＝lockがNULL_KEY
（２）ロックした人がタッチした場合＝lockが[[llDetectedKey]](0)と同じ
の２通りですので、touch_endイベントの中でそのように判断しています。

このスクリプトではロックできるのはオーナーだけにしていますが、[[touch]]イベントの中の最初のif文に手を加えてやれば、グループメンバーが自由にロック／アンロックできるドアなども出来ます。

*強制排除スクリプト

ついでに、sitによる侵入を防ぐコードも考えてみます。
せっかくドアには鍵かかかっているのに、sitで侵入されては無念ですので（＾＾；

 vector exit_pos = &lt;128.0, 128.0, 128.0&gt;;
 
 default {
   state_entry(){
     vector p = exit_pos - llGetPos();
     p /= llGetRot();
     llSitTarget(p, ZERO_ROTATION);
   }
   
   on_rez(integer parm){
     llResetScript();
   }
   
   moving_end(){
     llResetScript();
   }
   
   changed(integer change){
     if (change &amp; CHANGED_LINK){
       key avatar = llAvatarOnSitTarget();
       if (avatar != NULL_KEY){
         llUnSit(avatar);
       }
     }
   }  
 }  

変数exit_posには強制退去される先の座標を設定します。
上記のコードでしたら、sitした人は全員&lt;128.0, 128.0, 128.0&gt;へ飛ばされます。
ただし飛ばせる距離は300m程度ですので、あまり離れたところに退去させるのは無理です。

オブジェクトがrezされたとき、あるいは動かされたときにはスクリプトをリセットし、退去位置を再設定します。

誰かがこのスクリプトの入ったオブジェクトに座ると、退去位置に移動しますので、即座に[[llUnSit]]で排除します。

このコードは全primに入れておく必要はありません。
例えば建物がリンクされているのであれば、ルートにさえ入れておくだけで済みます。
----
- 親切丁寧な解説で、初心者の私にも解りやすく、ありがたく思っています。しかし、強制排除スクリプトi  -- Zephyr Whitfield  (2011-05-15 21:33:04)
- 投稿ミスをしました。済みません。もう一度書き直します。親切丁寧な解説で、初心者の私にも解りやすく、ありがたく思っています。しかし、強制排除スクリプトにllDetectedKey()を使用して10m以内に近付いたAvatarを排除するスクリプトを作ろうとしましたが、その組み合わせ方が分かりません。サンプルを掲載して頂ければ嬉しいのですが、お願いできませんでしょうか? m(_ _)m  -- Zephyr Whitfield  (2011-05-15 21:39:05)
#comment    </description>
    <dc:date>2011-05-15T21:39:05+09:00</dc:date>
  </item>
    <item rdf:about="http://www21.atwiki.jp/mizcremorne/pages/299.html">
    <title>llParseString2List</title>
    <link>http://www21.atwiki.jp/mizcremorne/pages/299.html</link>
    <description>
      *llParseString2List
list llParseString2List(string src, list separators, list spacers)
----
文字列srcをseparators／spacersを区切りとしてリスト型データに展開する。

separatorsとspacersの違いは、区切り文字自体を結果のリストに含めるかどうかである。
separatorsは結果リストに含まれず、spacersは含まれる。

具体的に見るのが手っ取り早いと思うのでいくつか例を示す。

 llParseString2List(&quot;A,B,C,D,E&quot;, [&quot;,&quot;], []);
 結果:[&quot;A&quot;,&quot;B&quot;,&quot;C&quot;,&quot;D&quot;,&quot;E&quot;];

 llParseString2List(&quot;A/B/C/D/E&quot;, [&quot;/&quot;], []);
 結果:[&quot;A&quot;,&quot;B&quot;,&quot;C&quot;,&quot;D&quot;,&quot;E&quot;];

 llParseString2List(&quot;A,B/C,D/E&quot;, [&quot;/&quot;,&quot;,&quot;], []);
 結果:[&quot;A&quot;,&quot;B&quot;,&quot;C&quot;,&quot;D&quot;,&quot;E&quot;];

 llParseString2List(&quot;A:B::C:D::&quot;, [&quot;:&quot;], []);
 結果:[&quot;A&quot;,&quot;B&quot;,&quot;C&quot;,&quot;D&quot;];

 llParseString2List(&quot;I am a pen.&quot;, [&quot; &quot;], []);
 結果:[&quot;I&quot;,&quot;am&quot;,&quot;a&quot;,&quot;pen.&quot;];

 llParseString2List(&quot;A1B2C3&quot;, [&quot;1&quot;,&quot;2&quot;,&quot;3&quot;], []); // セパレータ
 結果:[&quot;A&quot;,&quot;B&quot;,&quot;C&quot;]; // セパレータは結果に含まれない

 llParseString2List(&quot;A1B2C3&quot;, [], [&quot;1&quot;,&quot;2&quot;,&quot;3&quot;]); // スペーサー
 結果:[&quot;A&quot;,&quot;1&quot;,&quot;B&quot;,&quot;2&quot;,&quot;C&quot;,&quot;3&quot;]; // スペーサーは結果に含まれる

[[llCSV2List]]関数はllParseString2List(src, [&quot;,&quot;], [])と同等である。
また、リストから逆に文字列への変換には[[llDumpList2String]]関数を使用する。

----
- 実験したところ、llCSV2List(src)とllParseString2List(src, [&amp;quot;,&amp;quot;], [])は若干動作が違うようです。CSV2Listの場合だけ、元の文字列にカンマの連続があった場合でも間に要素があるとみなされます。  -- RoyalTurkey Markstein  (2009-07-06 04:47:37)
- １年前のコメントに補足ですｗ つまりllCSV2List(src)の場合は、llParseStringKeepNulls(src,[&amp;quot;,&amp;quot;],[])を使えばまったく同じ結果になりますね。  http://www21.atwiki.jp/mizcremorne/pages/300.html  -- RoyalTurkey Markstein  (2010-07-30 22:52:34)
#comment    </description>
    <dc:date>2010-07-30T22:52:34+09:00</dc:date>
  </item>
    <item rdf:about="http://www21.atwiki.jp/mizcremorne/pages/165.html">
    <title>llGetGMTclock</title>
    <link>http://www21.atwiki.jp/mizcremorne/pages/165.html</link>
    <description>
      *llGetGMTclock
float llGetGMTclock()
----
グリニッジ標準時（GMT）0時からの秒数を返す。

日本の標準時刻はGMT+9時間なので、
  llGetGMTclock() + 9 * 3600
とすると日本時間を計算することができる（3600 = 1時間の秒数）。

 integer jp_time = llGetGMTclock() + 9 * 3600;
 時：(integer)((jp_time / 3600) % 24) 
 分：(integer)((jp_time % 3600) / 60)
 秒：(integer)(jp_time % 60)
----
- あれ？\ninteger jp_time = llGetGMTclock() + 9 * 3600;じゃなくてｎ\nfloat jp_time = llGetGMTclock() + 9 * 3600;じゃ…？？  -- 名無しさん  (2009-12-20 16:55:52)
#comment    </description>
    <dc:date>2009-12-20T16:55:52+09:00</dc:date>
  </item>
    <item rdf:about="http://www21.atwiki.jp/mizcremorne/pages/320.html">
    <title>llRegionSay</title>
    <link>http://www21.atwiki.jp/mizcremorne/pages/320.html</link>
    <description>
      *llRegionSay
llRegionSay(integer channel, string text)
----
土地全域に聞こえるチャットメッセージtextをチャンネルchannelで送信する。

LSLではチャットメッセージを[[listen]]して処理を行うことが多く、不用意にllRegionSayを多用すると負荷が高くなる可能性がある。
チャットメッセージの送信範囲は必要に応じて使い分けるべき。

他のチャット関連関数も参照のこと。

[[llWhisper]]・・・範囲10m
[[llSay]]・・・範囲20m
[[llShout]]・・・範囲100m
[[llOwnerSay]]・・・オーナーにのみ送信
[[llInstantMessage]]・・・特定アバターのみ（ＩＭ）
[[llMessageLinked]]・・・リンクprim間の通信。listenに影響なし。

----
- チャンネル0（パブリックチャンネル）は使えないことを記述してはどうでしょうか  -- 名無しさん  (2009-10-06 09:46:38)
#comment    </description>
    <dc:date>2009-10-06T09:46:38+09:00</dc:date>
  </item>
    <item rdf:about="http://www21.atwiki.jp/mizcremorne/pages/169.html">
    <title>llGetInventoryNumber</title>
    <link>http://www21.atwiki.jp/mizcremorne/pages/169.html</link>
    <description>
      *llGetInventoryNumber
integer llGetInventoryNumber(integer type)
----
指定したtypeのアイテムがコンテンツ内にいくつあるかを返す。

アイテムのタイプには以下の値を使用する。

|定数|値|説明|
|INVENTORY_ALL |-1 |全種類|
|INVENTORY_ANIMATION |20 |アニメーション|
|INVENTORY_BODYPART |13 |ボディパーツ|
|INVENTORY_CLOTHING |5 |服|
|INVENTORY_GESTURE |21 |ジェスチャー|
|INVENTORY_LANDMARK |3 |ランドマーク|
|INVENTORY_NOTECARD |7 |ノートカード|
|INVENTORY_OBJECT |6 |オブジェクト|
|INVENTORY_SCRIPT |10 |スクリプト|
|INVENTORY_SOUND |1 |サウンド|
|INVENTORY_TEXTURE |0 |テクスチャ|

例えば、以下の例はコンテンツに含まれるアイテムの数を返す。
 default {
   state_entry(){
     integer item_number = llGetInventoryNumber(INVENTORY_ALL);
     if (item_number == 0){
       llSay(0, &quot;There is no item.&quot;);
     }else{
       llSay(0, &quot;There is &quot; + (string)item_number + &quot; items.&quot;);
     }
   }
 }
----
- この例では、コンテンツを数えるスクリプト自身を数えるから、item_number==0は機能しないですよね・・・・。  -- 通りすがっちゃう人  (2009-07-15 18:59:22)
#comment    </description>
    <dc:date>2009-07-15T18:59:22+09:00</dc:date>
  </item>
    <item rdf:about="http://www21.atwiki.jp/mizcremorne/pages/97.html">
    <title>llCeil</title>
    <link>http://www21.atwiki.jp/mizcremorne/pages/97.html</link>
    <description>
      *llCeil
integer llCeil(float val)
----
引数val以上の最も小さい整数を返す。
つまり小数以下を切り上げる。

  llCeil(1.5) → 2
  llCeil(0.1) → 1
  llCeil(4.02) → 5
  llCeil(2.82) → 3

小数以下の切り捨てには[[llFloor]]、四捨五入には[[llRound]]を使う。
----
#comment    </description>
    <dc:date>2009-06-07T14:12:25+09:00</dc:date>
  </item>
    <item rdf:about="http://www21.atwiki.jp/mizcremorne/pages/73.html">
    <title>基礎知識/変数とは？</title>
    <link>http://www21.atwiki.jp/mizcremorne/pages/73.html</link>
    <description>
      *変数

「変数」とは、しばしばプログラミング解説書では「データを入れておく箱のようなもの」と説明されます。
プログラミングに特有の概念ですので、今までプログラムなんて見たことも聞いたことも食べたこともない人にとっては意味不明な存在でしょう。
まずは喩えを使って簡単に変数について説明してみたいと思います。

子供にお使いを頼むことを考えてみて下さい。

「肉屋さんへ行って、このメモに書いてあるものを買ってきて」

こんな指示を出したとしましょう。このときの「メモ」というのが変数に当たります。

メモには、「ひき肉」と書いてあるかもしれないし、「レバ刺し」と書いてあるかもしれません。
意表をついて「カボチャ」とか書いてある可能性だってあります・・・。
同じメモでも、書いてある内容によっていろいろと意味が変わってくるように、変数というのは中にいろいろなデータを書き込んでおくことができます。
中身が変わるから「変」数というわけです。

　もちろん、メモを渡さずに具体的な品物を指示することもできます。

「肉屋さんへ行って、ひき肉を買ってきて」
「肉屋さんへ行って、レバ刺しを買ってきて」

この二つの指示でも問題はありませんが、いろいろなものを書ける「変数」＝メモがあるなら、

「肉屋さんへ行って、このメモに書いてあるものを買ってきて」

指示はこの一つだけで良いのです。
あとは買ってきて欲しいものに応じてメモの中身を書き換えてやるだけです。
ひき肉だろうとレバ刺しだろうと、カボチャだろうと牛乳だろうと、あくまでも指示は、

「肉屋さんへ行って、このメモに書いてあるものを買ってきて」

この一つだけで済みます。これが変数を使うメリットです。

**変数の種類

さて、メモであればそこに何を書いてもかまわないのですが、LSLにおける変数の場合はそこまで便利ではありません。
変数の場合は中に書けるデータの種類が決まっています。

どういうことかと言うと、

「肉屋さんへ行って、このメモに書いてあるものを買ってきて」

この指示の場合、実際にはメモに書くのは「肉屋に売っているもの」でなければ任務を遂行することが出来ません。
指示を受けるのが人間であれば、メモを開いて、
「ニンジン」
とか書いてあったら、肉屋ではなく八百屋に行くくらいの機転が利きますが、コンピュータの場合はそうはいきません。
あくまでも肉屋に出かけていき、
「ニンジン下さい・・・」
肉屋の親父に哀れみの目で見つめられながらも、そう繰り返す他ありません。
コンピュータをそんな可哀想な状況に追いやらないために、変数には種類があるのです。

もちろん、「種類」と言っても、「肉」とか「野菜」とかではありません。

例えば、「種類」の一つには「整数」があります。
0とか1とか15321とか-798とか、小数部の無い数字です。
「整数」用の変数には、整数しか入れることができません。

また、「文字」を扱う変数もあります。
このタイプの変数には「文字」しか入れられません。

種類によって中身のタイプが決まっているので、コンピュータは正しく指示を実行できるのです。
どういうことかと言うと、例えば、LSLには「お金を支払う」という動作があります。
この動作を実行するときには「整数」タイプのデータを指示してやらなければいけません。
つまり、

「このメモに書いてある金額を支払いなさい」

という指示だということです。
指示できるのは「整数」タイプのデータだけですので、メモに書けるのは「整数」だけということになります。
もしもこの「メモ」に、整数以外のものが書けたとしたら・・・。

「&quot;豚肉&quot;を支払いなさい」

とか

「150.57L$を支払いなさい」

などの無茶な指示が出せますので、コンピュータは途方に暮れてしまいます。
そういうことの無いよう、「変数」には中に入れられるデータのタイプが決まっているのです。

今覚えなくてもいいですが、参考までにデータのタイプを示しておきます。
このタイプのことを、変数の「型」と言います（直訳ですが）。

【型の一覧】
|型名|説明|具体例|
|integer|整数|1,5,8,0,-13など|
|string|文字列|&quot;hoge&quot;,&quot;huge&quot;,&quot;hage&quot;など|
|float|小数|1.23, 0.02, -5.24など|
|vector|ベクタ|X,Y,Zの3つの小数値のセット、位置座標などに使用する &lt;1.0, 2.4, -3.5&gt;など|
|rotation|ローテーション|X,Y,Z,Sの4つの小数値のセット、回転のデータ &lt;4.6, -3.2, 4.2, 1.0&gt;など|
|key|キーまたはUUID|SL内のアバター／オブジェクトの識別番号、&quot;66864f3c-e095-d9c8-058d-d6575e6ed1b8&quot;など|
|list|リスト|複数の変数のセット、[1, &quot;hoge&quot;, 3.56]など|

これが変数の型の全てです。
変数を使うときには、用途に合わせてどの型を使うか考えなければいけません。

**変数の用意

変数は自由に用意して使うことができますが、使うときにはやはりルールがあります。
何も言わずにいきなり、

「このメモのさぁ・・・」

と言っても、「このメモって・・・どのメモ？」と困惑されてしまいますので、あらかじめどのようなメモがあるのかをコンピュータに伝えておかなければいけません。
これを変数の「宣言」と言います。
変数を使用する前には、必ず「宣言」が必要になります。

つまり、変数を使うときには以下の2段階の手順を踏みます。

「ここに整数が書いてあるメモがあります」・・・宣言
「メモに書いてある金額を支払いなさい」・・・変数の使用

文章にするとなんだか回りくどいですが、このように書いてやらないと理解できないのがコンピュータです。

「宣言」をするときには、以下のように書きます。
　
 integer money = 100;
　
　
先頭に書いてあるのは「型」です。
ここではinteger型、つまり整数型です。

次に半角スペースを開けて、変数の名前を書きます。
ここではmoneyという名前にしてみました。
この名前は英数字で自由につけられますが、何のための変数なのか、わかりやすい名前をつけておくと混乱せずに済みます。

「=」は変数に中身を入れるよ、という意味です。一般的な「等しい」ではありませんので注意して下さい。
ここでは、100という数値をmoneyという変数に入れているということになります。

最後の「;」は処理の区切りを意味します。
日本語でいうところの「。」みたいなものです。
「;」が無いと、コンピュータは次の行も一続きだと解釈してしまいます。
文章の区切りを明確にするためのものだと思ってください。

「=」の後ろは省略することもできます。
　
 integer money;

この場合、moneyの中身にはデフォルト値が入ります。
整数型のデフェルト値は0です。
すなわち、

 integer money = 0;

こう書くのとまったく同じです。

このようにして宣言をした後は、「money」と出てくれば、
「あぁ、整数が書いてあるメモのことね」
コンピューターはそう理解してくれます。
そして「money」に書いてある数値を自由に読み取ったり、別の数値を書き込んだりできるようになるのです。

**変数の中身

では次に、変数の中身を入れる方法について詳しく見てみましょう。
先ほどすでに、「=」で変数の中身を入れられることは述べました。
この「=」を使って中身を指定することを「代入」と言います。

 integer money;
 money = 100;
 money = -200;
 money = 10;
 money = 1000;

こんなふうに、変数の中身は好きなだけ書き換えることができます。
あくまでも「書き換え」です。「追加」ではありません。
リスト型以外の変数は、常に一つだけしか値を書いておくことができません。
やたら小さいメモだと思ってください（＾＾；
新しい値を書こうと思ったら、前の値を消しゴムで消して、新しい値を書かないといけないのです。
上記の例ですと、moneyという変数には最終的に1000という数値が書いてあることになります。

他の型ではどうでしょうか。
例えばfloat型（小数型）の場合ですと、

 float speed;
 speed = 0.0;
 speed = -2.8;
 speed = 10.5;

中に入れる数字が小数になるだけで、使い方は一緒です。
では、string型（文字列型）はどうでしょうか。

 string name;
 name = &quot;taro&quot;;
 name = &quot;jiro&quot;;
 name = &quot;saburo&quot;;

このようになります。
文字列の場合は、代入するデータを&quot;&quot;でくくります。
もしも&quot;&quot;を忘れてしまうと、

 string name = shiro;

これはnameという変数に、shiroという「変数」の中身を代入する、と解釈されます。
shiroという変数が宣言されていなければ、当然エラーになります。

他の型についても書き方を列挙しておきます。

-ベクタ型：
 vector position = &lt;10.5, 1.0, -5.6&gt;;
ベクタ型は３つの小数値を&lt; &gt;でくくります。小数値は「,」で区切られています。

-ローテーション型：
 rotation kakudo = &lt;1.4, -3.8, 0.2, 1.0&gt;;
ローテーション型は４つの小数値を&lt; &gt;でくくります。小数値は「,」で区切られています。
ベクタ型とは小数値の数が違うだけです。

-キー／UUID型：
 key avatar = &quot;66864f3c-e095-d9c8-058d-d6575e6ed1b8&quot;;
キー/UUID型は文字列を同じように、&quot;&quot;でくくります。
何やら意味不明の英数字が並んでいますが、これはセカンドライフ内のアバターやオブジェクトを識別するための番号です。

-リスト型：
 list colors = [&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;];
リスト型は[ ]でくくり、中身のデータは「,」で区切られています。

このように、型によって値の指定の仕方が違います。
間違った書き方をすると正しく値を代入することができません。

 integer money = &quot;hikiniku&quot;; ・・・整数型に文字列を代入しようとしている
 string name = 4.58;・・・文字列型に小数を代入しようとしている
 vector positin = &lt;1.4, -3.8, 0.2, 1.0&gt;・・・ベクタ型にローテーション型を代入しようとしている
 list items = &quot;book&quot;;・・・リスト型に文字列を代入しようとしている
　
これらはエラーになります。
扱っている変数の型が何なのか、きちんと意識してコードを書く必要があるということですね。

**変数から変数へ

変数の型が同じであれば、変数から変数への代入が可能です。

 string name1;
 string name2;
 name1 = &quot;taro&quot;;
 name2 = name1;

文字列型の変数、name1とname2を宣言しました。
name1に&quot;taro&quot;を代入します。
そして最後の行、

 name2 = name1;

これは「name2にname1の中身を代入する」ということになります。
name1には&quot;taro&quot;が代入されていますので、name2にも同じく&quot;taro&quot;が代入されます。

他の型でも同様のことができます。

 integer money1;
 integer money2;
 money1 = 100;
 money2 = money1;

整数型の変数money1とmoney2があって、money1に100という数値を代入します。
さらにmoney2にmoney1の中身を代入しますので、money2も100になります。

**まとめ

LSLの「処理」の中で、「何を」「誰に」「どのくらい」「どのように」を扱うときに「変数」を使うと言いました。
そして「変数」には「型」があり、扱える値が決まっているという説明もしました。

例えばLSLの中で「誰に」を扱うときにはどんな変数を使えば良いでしょうか。
普段はあまり意識することがありませんが、セカンドライフのアバターには、固有の識別番号が付けられています。
これをUUID（Universal Unique Identifier）と言います。
UUIDを使えば特定のアバターを指定することができますので、「誰に」を扱うときには、UUID用の変数＝key型変数を使うのが正解です。

では、「どのくらい」はどうでしょうか。
例えばお金を払う処理を行うときには、「どのくらい」払うのかを指定できます。
金額というのは整数ですので、これには整数型の変数、つまりinteger型を使うことになります。

このように、LSLで「何を」「誰に」「どのくらい」「どのように」を指定するには、指定したいものに適した変数を使うのです。

あくまでも大雑把にですが、以下にまとめてみました。

【型の用途】
|変数の型|扱える値|用途|
|integer型|金額、番号などの整数|「どのくらい」「何番目」など|
|String型|名前やメッセージなどの文字|「何を」（表示する内容など）|
|float型|小数、速度、割合|「どのくらい」（0.0～1.0の範囲で「割合」を示す場合もある）|
|vector型|位置座標、サイズ、力加減、方向、色データ|「どこへ」「どのくらい」など。色の場合は&lt;赤,緑,青&gt;の割合を指定する|
|rotation型|回転値|「どのくらい」（回転させる角度）|
|key型|アバターやオブジェクト等のUUID|「誰に」「何を」など|
|list型|値のセット|「何と何と何と何」のように値を並べて扱いたいときに使う|

もちろん、ここに挙げた用途が全てではありません。
どの型をどんな用途に使うのか、あくまでも参考です。

----
#comment    </description>
    <dc:date>2009-06-07T14:11:58+09:00</dc:date>
  </item>
    <item rdf:about="http://www21.atwiki.jp/mizcremorne/pages/71.html">
    <title>基礎知識/LSLの構成要素は？</title>
    <link>http://www21.atwiki.jp/mizcremorne/pages/71.html</link>
    <description>
      *LSLを構成する３つの要素

通常の台本は、シーンやカット、台詞、動作などから構成されています。
一般的にはまずシーンがあり、そのシーンに含まれるカットごとに、台詞や動作が書かれています。シーンもカットも無しに、いきなり台詞だけがポツン・・・と書かれることはありません。

【一般的な台本の構成要素】
-シーン：町外れの空き地
--カット：楽しそうに騒いでいる猫たち
---台詞：にゃー
---動作：笑顔で尻尾を振る
--カット：肩を叩かれて振り向く猫 
---台詞：にゃ？
---動作：何気ない様子で振り向く

シーン、カット、台詞・動作が階層構造になっているのがわかるかと思います。
この階層構造が崩れてしまうと台本として成り立たなくなります。

同じように、LSLにも構成要素があり、各要素は階層構造になっています。
LSLの場合は「シーン」「カット」「台詞」ではなく、「状態」「きっかけ」「処理」が構成要素です。
「状態」「きっかけ」「処理」とは、以下のように考えてください。

&gt;「○○の状態で」　・・・　状態
&gt;「△△されたとき」　・・・　きっかけ
&gt;「××をする」　・・・　処理

LSLという台本は必ず上記のような３要素を使って書かなければいけません。
かつ、この３つの要素は階層構造になっており、
「状態」の下に「きっかけ」
「きっかけ」の下に「処理」
を必ず書きます。

前章で例として示した台本を「状態」「きっかけ」「処理」の階層構造に展開してみましょう。

&gt;アバターが閉じたドアにタッチした時、ドアは手前に向かって90度開く。
&gt;30秒が経過した時、ドアは自動的に閉じる。
&gt;アバターが開いたドアにタッチした時、ドアは閉じる。

【一般的なLSLの構成要素（ドアのLSL）】
-状態：閉じた状態
--きっかけ：アバターにタッチされたとき 
---処理：90度回転する（開いた状態になる）
-状態：開いた状態　
--きっかけ：30秒経過したとき 
---処理：もとの角度に戻る（閉じた状態になる）
--きっかけ：アバターにタッチされたとき
---処理：もとの角度に戻る（閉じた状態になる）

状態に対して、起こり得るきっかけを書き、きっかけの中には処理を書きます。
「処理」は必ず「きっかけ」の中に書かなければいけませんし、「きっかけ」は必ず「状態」の中に書かなければいけません。

ではこの３つの要素、「状態」「きっかけ」「処理」について、簡単にどんなものなのかを見てみましょう。

**状態

「状態」のことをLSLでは「state（ステート）」と言います。

前章で「LSLは状況に応じて動きを変えることができる」と説明しました。
ステートはこれを実現する方法の一つです。

例えばテレビの動きについて考えて見て下さい。
テレビの「状態」というのは、大雑把に考えると、以下の二つがあります。

-電源がOFFになっている
-電源がONになっている

OFFの状態とONの状態では、テレビの動きに違いがありますよね。

例えばOFFの状態のときには、リモコンからチャンネルボタンを押したとしても、何も起きませんが、ONの状態のときにはボタンに応じてチャンネルが変わります。
同じように、LSLでは状態に応じて処理のきっかけを変えることができます。

例えば、ドアのLSLでは以下の二つの「ステート」を想定しています。
-閉じた状態
-開いた状態

閉じた状態でドアにタッチすると、ドアが開きます。
一方、開いた状態でドアにタッチすると、ドアが閉じます。
同じ「タッチ」という「きっかけ」にも関わらず、ドアの動作が異なるわけです。

また、閉じた状態で30秒経過しても、何も起きません。
ですが開いた状態で30秒経過すると、ドアが閉じます。
状態に応じて、扱うべき「きっかけ」が異なるということです。

以降は「ステート」という言葉を使いますが、LSLの状態のことだと理解して下さい。

**きっかけ

「きっかけ」はLSLでは「Event（イベント）」と言います。
イベントと聞くと何か催し物を想像してしまいますが、そんなに大それたものではなく、「タッチされた」とか「30秒が経過した」など、ごく些細な何らかの「きっかけ」のことです。

イベントはLSLが動き出すきっかけです。
動き出すきっかけ（タイミング）が来ることを、「イベントが起きる」「イベントが発生する」と言います。
これもまた何やら大層なことが始まりそうな表現ですが、ごくごくささやかな出来事ですので興奮したりしないで下さい。
以降、イベントという言葉を使います。イベントとはLSLの動き出す「きっかけ」だということをしっかりと覚えて置いて下さい。

前章で「LSLは必ずしも時間的な流れに沿って書かれているわけではない」と説明しました。
では一体どのような順番で処理が行われるのでしょうか。
その答えは「イベントが起きた順番で処理が行われる」です。

例えば、ドアのLSLでは、「開いた状態」のステート内に、
「30秒が経過したとき」
「タッチされたとき」
この二つのイベントがあります。
これらはどちらが先に書いてあるかに関係なく、あくまでも「イベントが発生したとき」に動くのです。

このような仕組みのことを「イベント・ドリブン」と言うことがあります。
これはイベントによって動かされるという意味で、まさにLSLはイベントありきのプログラミング言語です。

**処理

「処理」はオブジェクトの詳細な動作を書く部分です。
先ほどから例示しているドアのLSLで言うと、
「90度回転する」
「もとの角度に戻る」
これらが「処理」に当たります。

ステートとイベントがLSLの動くタイミングを示しているのに対し、「処理」の部分は「何を」「どのくらい」「何に対して」「どうするのか」という細かい内容になります。

**３つの要素の書き方

「ステート」「イベント」「処理」は階層構造になっていると説明しましたが、実際にLSLのコードでどのように書くのかを見ておきましょう。

「ステート」「イベント」「処理」はLSLの最も基本的な構造です。
人間で言うなら手・足・頭・胴体みたいなものです。
どれが頭でどれが足なのか、それを見極めることができなかったら、人間の姿が理解できないのと同じように、LSLの中のどこがステートでどこがイベントか、それを見極めることはとても重要です。

以下はLSLの一例です。

【LSLコードの例】
 default
 {
   state_entry()
   {
     llSay(0, &quot;Hello, Avatar!&quot;);
   }
 
   touch_start(integer total_number)
   {
     llSay(0, &quot;Touched.&quot;);
   }
 }

拒絶反応を起こさないで下さい！ここではまだ、細かい部分については理解しなくても構いません。このコードが3段構造になっていることさえ解ればOKです。

ステートとイベントは{ }で範囲が区切られています。ステートの{ }の中にはイベントがあり、イベントの{ }の中には処理が書かれているのです。

*まとめ

LSLという台本には以下のような内容を書きます。
「どのような状態で」・・・ステート
「何が起こったとき」・・・イベント
「何を」「どのくらい」「何に対して」「どうする」・・・処理
どんなLSLでも必ずこの３つの要素を書かなければいけません。
ですからLSLを作るときにはまずこの３つの要素について考えるべきです。

オブジェクトの状態には、どんなものがあるのか・・・。
例えばテレビの電源がON／OFFで変わるように、オブジェクトの状態が変わるのなら、それぞれにステートを用意すべきでしょう。

LSLの動き出すきっかけは、どんなときなのか・・・。
タッチされたときに動くのか、それとも時間が経つと動き出すのか・・・。
動き出すきっかけに応じて、イベントを書いてやらなければいけません。

動き出したLSLはどんな処理を行うのか・・・。
回転するのか、移動するのか、はたまた色が変わったり、サイズが変わったりするのか・・・。
また、回転するにしてもどのくらい回転するのか？
色が変わるのなら何色に変わるのか？
オブジェクトにはいくつかの面があったりしますので、その全ての面の色を変えるのか、それともどこか1面だけを変えるのか・・・などなど。

----
#comment    </description>
    <dc:date>2009-06-07T14:11:36+09:00</dc:date>
  </item>
    <item rdf:about="http://www21.atwiki.jp/mizcremorne/pages/54.html">
    <title>アバター／オブジェクト系</title>
    <link>http://www21.atwiki.jp/mizcremorne/pages/54.html</link>
    <description>
      *アバター／オブジェクト系

**アバター
|関数・イベント名|区分|概要|定義|
|[[llGetAgentInfo&gt;http://miz.slmame.com/e14668.html#llGetAgentInfo]]|関数|指定アバターの状態を得る（飛行・ＡＷＡＹなどの動作及びアタッチメントの有無等）|integer llGetAgentInfo(key id)|
|[[llGetAgentSize&gt;http://miz.slmame.com/e14668.html#llGetAgentSize]]|関数|指定アバターのサイズを得る|vector llGetAgentSize(key id)|
|[[llPointAt&gt;http://rpgstats.com/wiki/index.php?title=llPointAt]]|関数|現在動作せず| llPointAt(vector pos)|
|[[llRequestAgentData&gt;http://rpgstats.com/wiki/index.php?title=llRequestAgentData]]|関数|アバターデータの取得を要求する|key llRequestAgentData(key id, integer data)|
|[[llStopPointAt&gt;http://rpgstats.com/wiki/index.php?title=llStopPointAt]]|関数|現在動作せず| llStopPointAt()|

**グループ
|関数・イベント名|区分|概要|定義|
|[[llDetectedGroup&gt;http://miz.slmame.com/e12418.html#llDetectedGroup]]|関数|検出されたアバター／オブジェクトのアクティブグループが現在のオブジェクトのグループと一致するかどうかを調べる|integer llDetectedGroup(integer number)|
|[[llSameGroup&gt;http://rpgstats.com/wiki/index.php?title=llSameGroup]]|関数|指定したものがオブジェクトのグループと同じかどうか判定する|integer llSameGroup(key id)|

**オブジェクト
|関数・イベント名|区分|概要|定義|
|[[changed &gt;http://rpgstats.com/wiki/index.php?title=Changed ]]|イベント|オブジェクトの状態が変化（link等）したとき[参考][[初級lsl-14&gt;http://miz.slmame.com/e2814.html]]| changed(integer change)|
|[[llDie&gt;http://miz.slmame.com/e12418.html#llDie]]|関数|オブジェクトを消滅させる[参考][[初級lsl-21&gt;http://miz.slmame.com/e4053.html]]| llDie()|
|[[llGetBoundingBox&gt;http://miz.slmame.com/e14668.html#llGetBoundingBox]]|関数|オブジェクト／アバターのバウンディングボックス座標を得る|list llGetBoundingBox(key object)|
|[[llGetCreator&gt;http://miz.slmame.com/e14668.html#llGetCreator]]|関数|オブジェクトのクリエイターのUUIDを得る|key llGetCreator()|
|[[llGetGeometricCenter&gt;http://miz.slmame.com/e14880.html#llGetGeometricCenter]]|関数|オブジェクトの中心点を得る|vector llGetGeometricCenter()|
|[[llGetObjectDesc&gt;http://miz.slmame.com/e15701.html#llGetObjectDesc]]|関数|オブジェクトの説明（ディスクリプション）を得る|string llGetObjectDesc()|
|[[llGetObjectMass&gt;http://miz.slmame.com/e15701.html#llGetObjectMass]]|関数|指定したオブジェクトの質量を得る|float llGetObjectMass(key id)|
|[[llGetObjectName&gt;http://miz.slmame.com/e15701.html#llGetObjectName]]|関数|指定したオブジェクトの名前を得る|string llGetObjectName()|
|[[llGetObjectPermMask&gt;http://miz.slmame.com/e15701.html#llGetObjectPermMask]]|関数|オブジェクトのパーミッションを得る|integer llGetObjectPermMask(integer mask)|
|[[llGetOwner&gt;http://miz.slmame.com/e15701.html#llGetOwner]]|関数|オブジェクトのオーナーのUUIDを得る|key llGetOwner()|
|[[llGetPrimitiveParams&gt;http://miz.slmame.com/e17224.html#llGetPrimitiveParams]]|関数|オブジェクトのパラメータを得る|list llGetPrimitiveParams(list params)|
|[[llGetScale&gt;http://miz.slmame.com/e24460.html#llGetScale]]|関数|オブジェクトのサイズを得る|vector llGetScale()|
|[[llGetStatus&gt;http://miz.slmame.com/e24460.html#llGetStatus]]|関数|オブジェクトのステータス（物理／ファントム等）を得る|integer llGetStatus(integer status)|
|[[llRezAtRoot&gt;http://rpgstats.com/wiki/index.php?title=llRezAtRoot]]|関数|オブジェクトをrezする（ルートプリムの中心座標基準）| llRezAtRoot(string inventory, vector pos, vector vel, rotation rot, integer param)|
|[[llRezObject&gt;http://rpgstats.com/wiki/index.php?title=llRezObject]]|関数|オブジェクトをrezする（オブジェクトの重心基準）[参考][[初級lsl-18&gt;http://miz.slmame.com/e3286.html]]| llRezObject(string inventory, vector pos, vector vel, rotation rot, integer param)|
|[[llSetObjectDesc&gt;http://rpgstats.com/wiki/index.php?title=llSetObjectDesc]]|関数|オブジェクトの説明文を設定する| llSetObjectDesc(string name)|
|[[llSetObjectName&gt;http://rpgstats.com/wiki/index.php?title=llSetObjectName]]|関数|オブジェクトの名称を設定する| llSetObjectName(string name)|
|[[llSetObjectPermMask&gt;http://rpgstats.com/wiki/index.php?title=llSetObjectPermMask]]|関数|オブジェクトのパーミッションを設定する| llSetObjectPermMask(integer mask, integer value)|
|[[llSetPrimitiveParams&gt;http://rpgstats.com/wiki/index.php?title=llSetPrimitiveParams]]|関数|オブジェクトのパラメータを設定する| llSetPrimitiveParams(list rule)|
|[[llSetScale&gt;http://rpgstats.com/wiki/index.php?title=llSetScale]]|関数|オブジェクトのサイズを変更する| llSetScale(vector scale)|
|[[llSetStatus&gt;http://rpgstats.com/wiki/index.php?title=llSetStatus]]|関数|オブジェクトのステータス（物理／ファントム等）を設定する| llSetStatus(integer status, integer value)|

**UUID
|関数・イベント名|区分|概要|定義|
|[[llDetectedKey&gt;http://miz.slmame.com/e12418.html#llDetectedKey]]|関数|検出されたアバター／オブジェクトのUUIDを得る|key llDetectedKey(integer number)|
|[[llGetInventoryKey&gt;http://miz.slmame.com/e14880.html#llGetInventoryKey]]|関数|コンテンツ内のオブジェクトのUUIDを得る[参考][[初級lsl-13&gt;http://miz.slmame.com/e2514.html]]|key llGetInventoryKey(string name)|
|[[llGetKey&gt;http://miz.slmame.com/e14880.html#llGetKey]]|関数|オブジェのUUIDを得る|key llGetKey()|
|[[llGetOwnerKey&gt;http://miz.slmame.com/e15701.html#llGetOwnerKey]]|関数|指定したオブジェクトのオーナーUUIDを得る|key llGetOwnerKey(key id)|
|[[llKey2Name&gt;http://miz.slmame.com/e28137.html#llKey2Name]]|関数|UUIDを名前に変換する|string llKey2Name(key id)|

**リンク
|関数・イベント名|区分|概要|定義|
|[[link_message &gt;http://rpgstats.com/wiki/index.php?title=Link_message ]]|イベント|リンクメッセージを受信したとき[参考][[初級lsl-15&gt;http://miz.slmame.com/e3076.html]]| link_message(integer sender_num, integer num, string str, key id)|
|[[llBreakAllLinks&gt;http://miz.slmame.com/e12068.html#llBreakAllLinks]]|関数|オブジェクトの全リンクを解除する| llBreakAllLinks()|
|[[llBreakLink&gt;http://miz.slmame.com/e12068.html#llBreakLink]]|関数|オブジェクトから特定のprimのリンクを解除する| llBreakLink(integer linknum)|
|[[llCreateLink&gt;http://miz.slmame.com/e12068.html#llCreateLink]]|関数|オブジェクトにprimをリンクする| llCreateLink(key target, integer parent)|
|[[llDetectedLinkNumber&gt;http://miz.slmame.com/e12418.html#llDetectedLinkNumber]]|関数|検出されたprimのリンクナンバーを得る[参考][[初級lsl-10&gt;http://miz.slmame.com/e2019.html]]|integer llDetectedLinkNumber(integer number)|
|[[llGetLinkKey&gt;http://miz.slmame.com/e14880.html#llGetLinkKey]]|関数|指定子プリムのUUIDを得る|key llGetLinkKey(integer linknum)|
|[[llGetLinkName&gt;http://miz.slmame.com/e14880.html#llGetLinkName]]|関数|指定子プリムの名前を得る|string llGetLinkName(integer linknum)|
|[[llGetLinkNumber&gt;http://miz.slmame.com/e14880.html#llGetLinkNumber]]|関数|オブジェクトのリンクナンバーを得る|integer llGetLinkNumber()|
|[[llGetNumberOfPrims&gt;http://miz.slmame.com/e15701.html#llGetNumberOfPrims]]|関数|リンクされているprim数を得る|integer llGetNumberOfPrims()|
|[[llGetObjectPrimCount&gt;http://miz.slmame.com/e15701.html#llGetObjectPrimCount]]|関数|指定UUIDのオブジェクトのprim数を得る|integer llGetObjectPrimCount(key id)|
|[[llGetRootPosition&gt;http://miz.slmame.com/e17224.html#llGetRootPosition]]|関数|ルートprimの位置を得る|vector llGetRootPosition()|
|[[llMessageLinked&gt;http://rpgstats.com/wiki/index.php?title=llMessageLinked]]|関数|リンクメッセージの送信を行う[参考][[初級lsl-15&gt;http://miz.slmame.com/e3076.html]]| llMessageLinked(integer linknum, integer num, string str, key id)|
|[[llPassCollisions&gt;http://rpgstats.com/wiki/index.php?title=llPassCollisions]]|関数|子プリムからルートプリムへ衝突イベントを通知する| llPassCollisions(integer pass)|
|[[llPassTouches&gt;http://rpgstats.com/wiki/index.php?title=llPassTouches]]|関数|子プリムからルートプリムへタッチイベントを通知する| llPassTouches(integer pass)|
|[[llSetLinkAlpha&gt;http://rpgstats.com/wiki/index.php?title=llSetLinkAlpha]]|関数|リンクプリムの透明度を設定する[参考][[初級lsl-14&gt;http://miz.slmame.com/e2814.html]]| llSetLinkAlpha(integer linknumber, float alpha, integer face)|
|[[llSetLinkColor&gt;http://rpgstats.com/wiki/index.php?title=llSetLinkColor]]|関数|リンクプリムの色を設定する[参考][[初級lsl-15&gt;http://miz.slmame.com/e3076.html]]| llSetLinkColor(integer linknumber, vector color, integer face)|
|[[llSetLinkPrimitiveParams&gt;http://www.lslwiki.net/lslwiki/wakka.php?wakka=llSetLinkPrimitiveParams]]|関数|リンクprimのパラメータを設定する| llSetLinkPrimitiveParams(integer linknumber, list rules)|
|[[llSetLinkTexture&gt;http://www.lslwiki.net/lslwiki/wakka.php?wakka=llSetLinkTexture]]|関数|リンクprimにテクスチャを設定する| llSetLinkTexture(integer link_pos, string texture, integer face)|

----
#comment    </description>
    <dc:date>2009-06-07T14:11:11+09:00</dc:date>
  </item>
  </rdf:RDF>

