ソラマメブログ
< 2025年05月 >
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

2008年04月29日

メッセージ送信箱(リンデンスクリプト Tips)

 送信箱にノートカードをドラッグすると、ノードカードの内容を指定したメールアドレス宛てに送信し
ます。伝言等に利用されてはいかがでしょうw オブジェクトのオーナーでなくても誰でもメッセージ
の送信か可能です。難点として、日本語だと文字化けするところです・・・

メッセージ送信箱(リンデンスクリプト Tips)
「スクリプト内容」

//
//    SHOP ZERO Tips26 MessageBox v1.0
//
//                   Created by Zero2000 Kid     2008/04/29
// 


string emailaddress="zero_seven@hotmail.co.jp";
string subject="email from sl";
string ftext="**MessageBox** \n Please drag NoteCard.";
integer ItemType=INVENTORY_NOTECARD;
integer read_line;
key note_req;
string notename;
string message;


ClearInvetory () {
    integer i;
    integer Itemct = llGetInventoryNumber(INVENTORY_ALL);
    for (i = 0; i < Itemct-1; i++) {
        string ItemName=llGetInventoryName(INVENTORY_ALL,i);
        if (ItemName!=llGetScriptName()) {
            llRemoveInventory(ItemName);
        }
    }
}

default {
    
    state_entry() {
        llSetText(ftext,<1,1,1>, 1.0);
        ClearInvetory();
        llAllowInventoryDrop(TRUE);
    }

    on_rez(integer int) {
        llResetScript(); 
    }

    changed(integer change){
        if(change & (CHANGED_INVENTORY | CHANGED_ALLOWED_DROP)) {
            state active_mode;
        }
    }

}


state active_mode {
    
    state_entry() {
        read_line = 0;
        message="";
        llAllowInventoryDrop(FALSE);
        if (llGetInventoryNumber(ItemType)) {
            notename=llGetInventoryName(ItemType,0);
            llWhisper(0,notename + " loading now ...");
            note_req = llGetNotecardLine(notename, read_line);
        } else {
            state default;
        }
    }
    
    dataserver(key queryid, string data) {
        if (data != EOF) {
            if (llGetFreeMemory()<9000) {
                llEmail(emailaddress, subject, message);
                llWhisper(0,"Message send complete.");
                state default;
            }
            message+=data +"\n";
            read_line ++;
            note_req = llGetNotecardLine(notename, read_line);
        } else {
            llEmail(emailaddress, subject, message);
            llWhisper(0,"Message send complete.");
            state default;
        }
    }

}

「使用方法」
1. スクリプトの1行目のstring emailaddress="zero_seven@hotmail.co.jp"のメールアドレス部分を
 送信したいアドレスに書き換えます。
2. オブジェクトを1つ作成します。(球でもボックスでも何でも構いません。)
3. オブジェクトにスクリプトをドラッグします。
4. オブジェクトにノードカードをドラッグします。
5. ノートカードの内容が、設定したメールアドレス宛てに送信されます。

「スクリプトの説明」
 今回のスクリプトのポイントは、llAllowInventoryDropという関数とノードカード読み込み、
電子メール送信コマンドでしょうか。通常オブジェクトへのアイテムのドラッグは、そのオブ
ジェクトのオーナーのみしか許可されません。しかし、llAllowInventoryDropという関数を利
用するとオーナー以外でもアイテムのドラッグが可能になります。
 最初にstate_entryが呼び出されます。ここでllAllowInventoryDropを利用してオブジェクト
へのドラッグを許可します。
	
	state_entry() {
		llSetText(ftext,<1,1,1>, 1.0);
		// インベントリの中をクリア
		ClearInvetory();
		// オブジェクトへのドラッグを許可する。
		// 括弧の中にTRUEと書くと許可する意味になる。
		llAllowInventoryDrop(TRUE);
	}

 オブジェクトにノートカードがドラッグされるとchangedイベントが発生します。

	changed(integer change){
		// オーナーがドラッグした場合は、CHANGED_INVENTORYのビットが立つ
		// オーナー以外からのドラッグだとCHANGED_ALLOWED_DROPのビットが立つ
		if(change & (CHANGED_INVENTORY | CHANGED_ALLOWED_DROP)) {
			// active_modeステートへ移行
			state active_mode;
		}
	}

 アイテムのドラッグが検出されるとactive_modeステートに移行します。active_modeでは、
最初にstate_entryが呼び出されます。ここでは、まず最初にllAllowInventoryDrop(FALSE)を
実行して、処理中のドラッグを一時的に禁止します。その後、ドラッグされたアイテムをチェック
し、アイテムがノードカードであれば、そのままノートカードの内容を読み込みます。
 ノートカードの読み込みについては、llGetNotecardLineを参照してください。

	state_entry() {
		read_line = 0;
		message="";
		// アイテムのドラッグを禁止
		llAllowInventoryDrop(FALSE);
		// アイテムがノートカードなのかを判定
		if (llGetInventoryNumber(ItemType)) {
			// アイテムがノードカードなら内容を読み込み
			notename=llGetInventoryName(ItemType,0);
			llWhisper(0,notename + " loading now ...");
			note_req = llGetNotecardLine(notename, read_line);
		} else {
			// アイテムがノートカード以外ならステートをdefaultへ戻し処理終了
			state default;
		}
	}

 ノートカードの読み込みが終了すると電子メールを送信します。
電子メールの送信については、llEmailを参照してください。

	dataserver(key queryid, string data) {
		if (data != EOF) {
			// オーバーフロー対策。ノートの内容が多すぎるとスクリプトのオーバーフロー
			// を起こすので、フリーメモリが9000を切ったらそこでメール送信する。
			if (llGetFreeMemory()<9000) {
			// 電子メール送信処理
			llEmail(emailaddress, subject, message);
			llWhisper(0,"Message send complete.");
			// ステートをdefaultへ移行
			state default;
		}
		message+=data +"\n";
		read_line ++;
		note_req = llGetNotecardLine(notename, read_line);
		} else {
			// ノートカードを最後まで読んだら電子メール送信処理
			llEmail(emailaddress, subject, message);
			llWhisper(0,"Message send complete.");
			// ステートをdefaultへ移行
			state default;
		}
	}

 電子メールの送信が終わるとステートをdefaultへ戻し、ClearInvetory()という関数を呼び出し、イベント
リの中のアイテムを削除します。


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





同じカテゴリー(リンデンスクリプトTips)の記事画像
サウンド再生スクリプト(リンデンスクリプト Tips)
カメラコントロール(リンデンスクリプト Tips)
標準時間表示スクリプト(リンデンスクリプト Tips)
プリムカウンター2(リンデンスクリプト Tips)
土地情報チェッカー(リンデンスクリプト Tips)
SIM負荷チェッカー(リンデンスクリプト Tips)
同じカテゴリー(リンデンスクリプトTips)の記事
 サウンド再生スクリプト(リンデンスクリプト Tips) (2009-12-16 20:13)
 カメラコントロール(リンデンスクリプト Tips) (2009-11-21 21:26)
 標準時間表示スクリプト(リンデンスクリプト Tips) (2009-11-02 00:34)
 プリムカウンター2(リンデンスクリプト Tips) (2009-10-12 20:40)
 土地情報チェッカー(リンデンスクリプト Tips) (2009-10-11 21:33)
 SIM負荷チェッカー(リンデンスクリプト Tips) (2009-08-09 20:26)
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。