アイテムキャンプスクリプト
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);
}
}
}
// 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);
}
}
}
んじゃ、説明します〜
基本的な設定に関する部分です
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
オーナーが椅子をタッチしてキャンプの設定をするための部分です。
integer d_ch = -777; ←ダイアログ用のチャンネル
integer c_ch = 777; ←チャットコマンド用のチャンネル
この2つは、お使いの環境によって編集してください。
使い方は至って簡単だと思いますw
とりあえず、椅子にスクリを入れる
↓
上の設定をがんばる(特にシットポジション)
↓
椅子に賞品を入れる
↓
椅子をタッチ→ダイアログから操作
こんな感じです〜^^