arz Nitelyってシステム屋どうよ?

SecondLifeとWebとの融合を模索するセミプロWeb屋の挑戦

アイテムキャンプスクリプト

2008年05月21日 – 18:12

むかし書いたアイテムキャンプ用スクリプトが出てきましたw

もう使うこともないでしょうし
もったいないのでソースを公開しちゃいますw

ご自由にどうぞ^^

// Item Camp System :: 2008-07-05

// General
string my_name;
string ver = "ver.1.20.03";

// Setup
list items;
integer item_num = 0;
string now_item;
string folder_name;
vector sit_target = <0.5, 0.0, 0.0>;
vector sit_rot = <0, 0, 0>;

uuSetup(){
    my_name = llGetScriptName();
    llSitTarget(sit_target, llEuler2Rot(sit_rot * DEG_TO_RAD));
    llSetText("::: Item Camp System ::: \n " + ver, <1.0,1.0,1.0>, 1.0);
    item_num = llGetInventoryNumber(INVENTORY_ALL);
    integer i;
    items = [];
    if (item_num > 1){
        for (i = 0; i < item_num; i++){
            now_item = llGetInventoryName(INVENTORY_ALL, i);
            if (now_item != my_name){
                items += [now_item];
                llOwnerSay("次のアイテムをセットしました:" + now_item);
            }
        }
    }else{
        llOwnerSay("配布するアイテムをコンテンツに入れてください。");
    }
}

// Interface for Owner
integer d_ch = -999;
integer c_ch = 999;
list main_dialog = ["OPEN", "CLOSE", "TIME", "RESET"];
string now_mode = "CLOSE";
integer minutes = 10;
integer handle;

uuMainDialog(){
    llSetTimerEvent(20.0);
    handle = llListen(d_ch, "", llGetOwner(), "");
    llDialog(llGetOwner(), "現在の設定 \n \n 状態:" + now_mode + " \n 時間:" + (string)minutes + "分", main_dialog, d_ch);
}

uuListenMinutes(){
    llSetTimerEvent(20.0);
    handle = llListen(c_ch, "", llGetOwner(), "");
    llOwnerSay("「/" + (string)c_ch + "」に続けてキャンプの時間(分)を入力してください");
}

uuSetTime(integer num){
    if (num > 0){
        minutes = num;
        llOwnerSay((string)minutes + "分に設定しました");
    }else{
        llOwnerSay("無効な数値です。もう一度やり直してください");
        uuListenMinutes();
    }
}

// Camp System
string camping_av_name;
key camping_av_key;
integer rem;

uuOpenCamp(){
    folder_name = llGetObjectDesc();
    if (item_num != 0){
        if (folder_name != "" || folder_name != "(No Description)"){
            llOwnerSay("アイテムキャンプを開始しました");
            uuResetCamp(FALSE);
        }else{
            llOwnerSay("このオブジェクトの「説明」の欄に「フォルダ名」を入力してください");
        }
    }else{
        llOwnerSay("アイテムないんですけど?");
    }
}

uuCloseCamp(){
    llOwnerSay("アイテムキャンプを休止しました");
    now_mode = "CLOSE";
    llSetText("", <1.0,1.0,1.0>,0.0);
}

uuStartCamp(key id){
    now_mode = "CAMPING";
    camping_av_key = id;
    camping_av_name = llKey2Name(id);
    llSetTimerEvent(60.0);
    llSetText("Camping : " + camping_av_name + " \n Rem : " + (string)rem + "min(s)", <1.0,1.0,1.0>, 1.0);
}

uuResetCamp(integer unsit_flug){
    if (unsit_flug){
        llUnSit(camping_av_key);
    }
    now_mode = "OPEN";
    rem = minutes;
    camping_av_name = "";
    camping_av_key = NULL_KEY;
    llSetTimerEvent(0.0);
    llSetText("::: Item Camp ::: \n " + folder_name + " (" + (string)minutes + "mins)", <1.0,1.0,1.0>, 1.0);
}

// Give Inventories
uuGiveInventories(){
    llSay(0, "Thanx " + camping_av_name + " !");
    llGiveInventoryList(camping_av_key, folder_name, items);
    uuResetCamp(TRUE);
}

// Flow
default{
    state_entry(){
        uuSetup();
    }

    changed (integer change){
        if (change & CHANGED_INVENTORY){
            llResetScript();
        }else if (change & CHANGED_LINK && llAvatarOnSitTarget() != NULL_KEY && now_mode == "OPEN"){
            uuStartCamp(llAvatarOnSitTarget());
        }else if (change & CHANGED_LINK && llAvatarOnSitTarget() == NULL_KEY && now_mode == "CAMPING"){
            uuResetCamp(FALSE);
        }
    }

    touch_start(integer total_number){
        if (llDetectedKey(0) == llGetOwner() && now_mode != "CAMPING"){
            uuMainDialog();
        }
    }

    listen(integer channel, string name, key id, string message){
        llSetTimerEvent(0.0);
        llListenRemove(handle);
        if (channel == d_ch && message == "OPEN"){
            uuOpenCamp();
        }else if (channel == d_ch && message == "CLOSE"){
            uuCloseCamp();
        }else if (channel == d_ch && message == "RESET"){
            llResetScript();
        }else if (channel == d_ch && message == "TIME"){
            uuListenMinutes();
        }else if (channel == c_ch){
            uuSetTime((integer)message);
        }
    }

    timer(){
        if (now_mode == "CAMPING"){
            rem --;
            llSetText("Camping : " + camping_av_name + " \n Rem : " + (string)rem + "min(s)", <1.0,1.0,1.0>, 1.0);
            if (rem == 0){
                uuGiveInventories();
            }
        }else{
            llListenRemove(handle);
            llSetTimerEvent(0.0);
        }
    }
}

 

んじゃ、説明します〜

// Setup
list items;
integer item_num = 0;
string now_item;
string folder_name;
vector sit_target = <0.0, 0.5, -0.1>;
vector sit_rot = <270, 0, 270>;
 

基本的な設定に関する部分です
vector sit_target = <0.0, 0.5, -0.1>;
vector sit_rot = <270, 0, 270>;
 ↑
この2つは椅子に合わせて編集しなおしてください。

面倒な人はポーズボールを使えばイイんですが
vector sit_target = <0.0, 0.0, 0.0>; みたいに全ての値を0にしてしまうと
「llAvatarOnSitTarget()」で椅子に座っている人のUUIDが取得できないという
変な仕様(LSLの仕様です)がありますので注意してくださいね!

それと、このアイテムキャンプスクリプトは「フォルダ渡し」するんですが
そのときのフォルダ名は、キャンプ椅子のルートプリムの「説明」欄に入れた文字列となります


 ↑
コレねw

 

// Interface for Owner
integer d_ch = -777;
integer c_ch = 777;
list main_dialog = ["OPEN", "CLOSE", "TIME", "RESET"];
string now_mode = "CLOSE";
integer minutes = 10;
 

オーナーが椅子をタッチしてキャンプの設定をするための部分です。

integer d_ch = -777; ←ダイアログ用のチャンネル
integer c_ch = 777; ←チャットコマンド用のチャンネル

この2つは、お使いの環境によって編集してください。

 

使い方は至って簡単だと思いますw

 

とりあえず、椅子にスクリを入れる
 ↓
上の設定をがんばる(特にシットポジション)
 ↓
椅子に賞品を入れる
 ↓
椅子をタッチ→ダイアログから操作

 

こんな感じです〜^^

Comment

TB: http://arznitely.com/wp-trackback.php?p=41