アイテムキャンプスクリプト
むかし書いたアイテムキャンプ用スクリプトが出てきました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つは、お使いの環境によって編集してください。
使い方
- とりあえず、椅子にスクリを入れる
- 上の設定をがんばる(特にシットポジション)
- 椅子に賞品を入れる
- 椅子をタッチ→ダイアログから操作
こんな感じです〜^^