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

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

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

ご自由にどうぞ^^

code

item_camp.lsl
// 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);
        }
    }
}

 

設定方法

1. 基本設定

// 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の仕様です)がありますので注意してくださいね!

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

2. インターフェイス

// 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つは、お使いの環境によって編集してください。

使い方

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

こんな感じです〜^^

最終更新: 2010年11月08日 20 : 43 by arz Nitely
http://arzNitely.com/lsl/sample/itemcamp.html

Copyright 2007-2010 ©arzNitely.com all right reserved

www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0