送信箱にノートカードをドラッグすると、ノードカードの内容を指定したメールアドレス宛てに送信し
ます。伝言等に利用されてはいかがでしょう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へ