ソラマメブログ
< 2008年07>
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    
アクセスカウンタ
オーナーへメッセージ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。 解除は→こちら
現在の読者数 3人

2008年04月29日

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

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

「スクリプト内容」

//
//    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 Intexへ




この記事へのトラックバックURL