ソラマメブログ
< 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年11月21日

ドリンクサーバー(リンデンスクリプト Tips)

ドリンクサーバのスクリプトです。
サーバをクリックするとダイアログを表示し、選んだドリンクを渡します。
ドリンクは、サーバのコンテンツの中にドラッグするだけでOKです。
最大12個までのドリンクに対応しています。


* メニューにはドリンク以外のものもありますが、オブジェクトならなんでもOKですww
「スクリプト内容」
//
//   Drink Server script   v1.0
//
//                   Created by Zero2000 Kid     2007/11/21
//

integer ItemType=INVENTORY_OBJECT;
integer input_ch = -1;
integer Itemct;
integer num;
integer handle;
list Itemlist;
string ItemName;


getItemlist() {
    Itemlist=[];
    integer i;
    Itemct = llGetInventoryNumber(ItemType);
    if (Itemct>12) Itemct=12;
    for (i = 0; i < Itemct; i++) {
        Itemlist+=llGetInventoryName(ItemType,i);
    }
}

default {

    state_entry() {
        llSetText("Drink Server\nClick me , Drink Gets !.", <1,1,1>, 1.0);
        getItemlist();
    }

    on_rez(integer int) {
        llResetScript(); 
    }

    touch_start(integer t) {
        if (Itemct!=0) {
            handle = llListen(input_ch,"",llDetectedKey(0),"");
            llDialog(llDetectedKey(0), "PLEASE SELECT DRINK MENU", Itemlist, input_ch);
        }
    }
    
    changed(integer change){
        if (change & CHANGED_INVENTORY){
            getItemlist();
        }
    }
    
    listen(integer ch, string name, key id, string message) {
        llGiveInventory(id,message);
        llWhisper(0,llKey2Name(id) + " got " + message + ".");
        llListenRemove(handle);
    }

}


「スクリプトの説明」
 1. state_entry発生時、またはコンテンツの中に変化があったとき関数getItemlist()を呼び出します。
 2. 関数getItemlist()では、llGetInventoryNumber及びllGetInventoryNameを使用し、コンテンツの中
   のオブジェクトを名前を取得し、リスト変数Itemlistに格納します。
 3. オブジェクトがクリックされるとtouchイベントの中で、リッスンコマンドを実行し、ドリンクのダイアログ
   メニューを表示します。
 4. ダイアログからメニューを選択するとリッスンイベントが発生し、llGiveInventoryでメニューで選択した
   名称のオブジェクトを渡します。



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




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

この記事へのコメント
はじめまして。スクリプト初心者です。
こちらのアイテムをフリーアイテムの配布に使いたいのですがこのスクリプトで12個以上のオブジェクトを配布するにはどうすればいいのでしょうか。
Posted by sata at 2008年03月01日 09:13
sataさん

はじめまして^^
お返事遅くなりました。

 ダイアログのボタンの数は、最大12個と決まっていますので、それ以上を
扱い時は、別に新しいダイアログをを出す等の工夫が必要です。例えばボタ
ンの1つを切り替え用のボタンとして用意し、そのボタンが押されれば次の
ダイアログを表示するような作りにすればOKです。
下記のスクリプトは、22個のアイテムに対応した内容です。

integer ItemType=INVENTORY_OBJECT;
integer input_ch = -1;
integer Itemct;
integer num;
integer handle;
list Itemlist1;
list Itemlist2;
string ItemName;


getItemlist() {
Itemlist1=[];
Itemlist2=[];
integer i;
Itemct = llGetInventoryNumber(ItemType);
if (Itemct>22) Itemct=22;
for (i = 0; i < Itemct; i++) {
if (i<11) {
Itemlist1+=llGetInventoryName(ItemType,i);
} else {
Itemlist2+=llGetInventoryName(ItemType,i);
}
}
Itemlist1+="NEXT";
Itemlist2+="BACK";
}

default {

state_entry() {
llSetText("Drink Server\nClick me , Drink Gets !.", <1,1,1>, 1.0);
getItemlist();
}

on_rez(integer int) {
llResetScript();
}

touch_start(integer t) {
if (Itemct!=0) {
handle = llListen(input_ch,"",llDetectedKey(0),"");
llDialog(llDetectedKey(0), "PLEASE SELECT DRINK MENU", Itemlist1, input_ch);
}
}

changed(integer change){
if (change & CHANGED_INVENTORY){
getItemlist();
}
}

listen(integer ch, string name, key id, string message) {
if (message=="NEXT") {
llDialog(id, "PLEASE SELECT DRINK MENU", Itemlist2, input_ch);
} else if (message=="BACK") {
llDialog(id, "PLEASE SELECT DRINK MENU", Itemlist1, input_ch);
} else {
llGiveInventory(id,message);
llWhisper(0,llKey2Name(id) + " got " + message + ".");
llListenRemove(handle);
}
}

}
Posted by ZEROZERO at 2008年03月16日 17:58
なるほど、次のダイアログが表示されるようにできるのですね。

ありがとうございますw
Posted by sata at 2008年03月25日 16:03
はじめましてSLName hiroy Boaと申します。スクリプト色々使わせていただきます。zeroさんのブログを観てすごくスクリプトに興味がわいてきました。頑張って勉強しようと思います。
貴重なスクリプトの掲載ありがとうございます。
Posted by h1r0 at 2008年07月21日 04:31
このブログでスクリプトに興味持って頂いてとても嬉しく思います。
困ったことがればいつでも相談してくださいね^^
Posted by ZEROZERO at 2008年07月21日 16:36