ソラマメブログ
< 2008年08>
S M T W T F S
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
アクセスカウンタ
オーナーへメッセージ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。 解除は→こちら
現在の読者数 4人

2007年12月23日

プリムセーバー(リンデンスクリプト Tips)

 プリムセーバーのスクリプトです。プリムセーバーとは、オブジェクトの臨時属性を
利用して土地のプリムカウントにカウントされないオブジェクトを作り出す装置です。
土地のプリム数を節約したい場合によく使われる手法です。難しそうに聞こえますが
基本は、臨時属性のオブジェクトをRezしているだけです。

「スクリプト内容」

「プリムセーバーメインスクリプト」
//
//   PrimSavar MainScript v1.0
//
//                   Created by Zero2000 Kid     2007/12/22
//

integer ItemType=INVENTORY_OBJECT;
integer input_ch=-1;
vector position=<0,0,0.1>;
string ItemName;

default {
    
    state_entry() {
        llSetTimerEvent(30.0);
        ItemName=llGetInventoryName(ItemType,0);
    }

    on_rez(integer int) {
        llResetScript(); 
    }

    timer(){
        if (ItemName!="") {
            llRezObject(ItemName , llGetPos() + position ,ZERO_VECTOR ,llGetRot() , input_ch);
        }
    }
    
    object_rez(key id){
        llSay(input_ch,"dellobject");
        if (input_ch==-1) {
            input_ch=-2;
        } else {
            input_ch=-1;
        }   
    }

    changed(integer change){
        if (change & CHANGED_INVENTORY){
            ItemName=llGetInventoryName(ItemType,0);
        }
    }
}

「プリムセーバーサブスクリプト」
//
//   PrimSavar SubScript v1.0
//
//                   Created by Zero2000 Kid     2007/12/22
//

integer input_ch=-1;
integer handle;
integer handle2;
integer num;

default {
    
    state_entry() {
        llSetPrimitiveParams([PRIM_TEMP_ON_REZ, TRUE]); 
    }
    
    on_rez(integer int) {
        num=int;
        handle = llListen(-1,"",NULL_KEY,"dellobject");
        handle2 = llListen(-2,"",NULL_KEY,"dellobject");
    }
    
    listen(integer ch, string name, key id, string message) {
        if (ch!=num) {
            llSleep(1);
            llDie();
        }
    }
}



「使用方法」
 例えばプリムセーバーを使用して、画像のような靴を出現させたいとします。
1. プリムセーバー本体となるオブジェクトを地面に置きます。(ボックスでも球形でも普通のプリムでOKです)
2. プリムセーバー本体にメインスクリプトをドラッグします。
3. 靴を地面に置きます。
4. 靴のコンテンツの中にサブスクリプトをドラッグします。
5. 靴を一度持ち物の中にTAKEします。
  *4を実行した後1分以内にTAKEして下さい。じゃないと靴が消えてしまいます・・w
6. 5でTAKEした靴をプリムセーバー本体のコンテンツの中にドラッグします。
7. 30秒後、プリムセーバー本体の上に靴が出現します。靴の出現角度の調整は、プリムセーバー本体の角度で
  調整しましょう。あとは本体を透明化でもすればOKでしょうかw

*注意 手順4のサブスクリプトのセットは、必ず行うようにしてください。でないと削除されないオブジェクトを30秒毎に
    永遠と作成し続けるとことになります。ご自分の土地でやられる場合は良いですが、砂漠等でやってしまうと他
    の方に迷惑を掛けてしまいます。この点は十分注意してください。

「スクリプトの説明」
 基本は、「臨時オブジェクトをRez」->「臨時オブジェクトを削除」->「臨時オブジェクトをRez」->」->「臨時オブジェクトを削除」・・・
の繰り返しです。スクリプトでは、この作業をtimerを利用して30秒サイクルで実行しています。

1. メインスクリプト(プリムセーバー本体側)
 コンテンツの中の臨時オブジェクトを30秒毎にRezします。30秒毎にRezするのは、臨時オブジェクトは、
ほっとくと1分後に自動消滅するからです。臨時オブジェクトをRezするとobject_rezイベントが発生し、
そのなかでllSayを利用して、dellobjectと発言します。これは、前回出現させた臨時オブジェクトを強制的
に削除するのが目的です。臨時オブジェクトは、ほっといても消えるのにわざわざ削除しているのは、後述
の切れ目をなくすためです。

2. サブスクリプト(靴側)
 llSetPrimitiveParamsを使用してオブジェクトの属性を臨時に設定します。
プリムセーバーからRezされるとon_rezイベントが発生し、llListenを実行し、メインスクリプトからの発言を
監視します。メインスクリプトからの発言を検知するとlistenイベントが発生し、llSleepで1秒待機した後に
llDieコマンドで自分自身を消滅させます。1秒待機するのは、プリムセーバーが次にオブジェクトを出現
させる際の、一瞬の切れ目をなくすためです。いわゆるのりしろですw


* ちなみにこのスクリプトは、プリムセーバー同士が20m以内に存在するとお互いに干渉して、正常に
オブジェクトが表示されません。近くで複数使用したい場合は、lllistenコマンドのチャンネル番号を変更
してあげればOKでしょうwでもあまり増やし過ぎると重くなるかも(^^ゞ  

「注意事項」
 本スクリプトのご利用の際は、以下の点を注意しましょう。
1. プリムセーバーは、無限にプリムを作成可能な魔法の箱ではありません。臨時プリムは、土地カウントにカウントは
  されませんが、SIMのサーバのリソースは消費してます。サーバのリソースには限界があります。つまり臨時プリム
  の生成にも限界があります。少数であれば、さほど影響はないかと思いますが、数百、数千というプリムを発生さ
  せればSIM自体に負荷をかけることになります。マナーとして多用は避けましょう。
2. 砂場等で本スクリプトをテストした場合は、必ず後片付けして帰りましょう。(本スクリプトに関わらず当然のマナーですねw)
3. SIMによっては、プリムセーバーの使用を禁止している場所もあります。使用の際は、この点を十分確認しましょう。
  

リンデンスクリプト Tips Intexへ




この記事へのトラックバックURL

この記事へのコメント
こんちにわ。 プリムセーバのスクリプトはある意味危険かと^^;
 土地に置くとしてもSIMオーナーさんの許可がいる場合や
不可のSIMがありますからね^^;
Posted by 通りすがり at 2007年12月23日 10:03
通りすがり さんへ

こんにちは^^貴重なご意見ありがとうございます。
確かにプリムセーバーは便利ではありますが使い方を誤ると問題になる
可能性もございます。この点を踏まえ「注意事項」という文章を追加させて
頂きました^^
Posted by ZEROZERO at 2007年12月24日 22:46
はじめまして(/∇\*)
以前、おっきい家を半月かけて
作ったものの、プリムセーバーを
使用しようとして一瞬で家を失った
おバカです(⊃Д⊂)

ど~もよく分からなくって。:゜(;´∩`;)゜:。

ちなみにZEROさんは、お願いしたら
そばで監督&指導とかしてくれるのでしょかwww

ちょと聞いてみたかっただけですが
ちょと期待もしてみたり・・?w
Posted by あくあ at 2008年08月04日 11:44