2011-07-09

グループギフトを渡すために(2)

さて前回は「出店しているモールのスペースでグループギフトを配りたい」など、
土地のグループとお店のグループが違う場合にグループギフトベンダーを置く方法
を書きました
良かったら参考にしてみてください



今回はそのベンダーに入れるスクリプトを載せてみました
土地のグループとお店のグループが同じでも違ってもどちらでも使えます

これといって特徴のないごくごく一般的なスクリプトですが、興味のある方は続きからどうぞ









タッチしたアバターのアクティブ・グループがオブジェクトに設定したお店のグループと同じだったとき
コンテンツにあるギフトをフォルダに入れてアバターに渡す、という内容のスクリプトです
(ギフト製作者=グループギフトベンダーの製作者=オーナーであることを前提としてます)

- 赤い文字のコメント文を含めてコピペしても大丈夫です
- 緑の文字の部分は" "にはさまれた文をお好みで変えられます
- ギフトの数は複数でも可、種類は問いません
- スクリプトの入ったオブジェクトに設定された名前がフォルダの名前として使われます
- オーナーにコピー権限及びトランス権限のない品は渡すことができません(※1)
(自分で作ったオブジェクト等のパーミッションをコピー不可やトランス不可にしたものは渡せます)


-----------------------------------------------------

// グループギフトを渡すスクリプト

// ギフトをフォルダに入れて渡します 複数個でも可 ノートカードやLMなど、種類は問いません
// このスクリプトが入っているオブジェクトに設定された名前をフォルダ名として使います


list gift_list;

key owner;
   
gift_set()
{ // コンテンツの中身をリスト化するユーザー関数
    integer i;

    owner = llGetOwner();
    integer number = llGetInventoryNumber(INVENTORY_ALL);
    string script_name = llGetScriptName();
    for (i = 0; i < number; i++)
    { // コンテンツの中身を順次調べる
        string gift_name = llGetInventoryName(INVENTORY_ALL, i);
        if (gift_name != script_name)
        { // このスクリプトをギフトにしないようリストから除外
            if ((llGetInventoryPermMask(gift_name, MASK_OWNER) & PERM_TRANSFER) == FALSE)
            { // オーナーがトランスできない品なら
                llInstantMessage(owner, "注意! "+gift_name+" はトランスできないので渡せません!");
            }
 // エラーメッセージを返す
            else if ((llGetInventoryPermMask(gift_name, MASK_OWNER) & PERM_COPY) == FALSE)
            {
 // オーナーがコピーできない品なら
                llInstantMessage(owner, "注意! "+gift_name+" はコピーできないので渡せません!");
            }
 // エラーメッセージを返す
            else
            { // それ以外のときは
                gift_list += gift_name; 
            } 
// リストに追加していく
        }
    }
    if (gift_list == [])
    { // 渡せるものが何もなかったら
       
llInstantMessage(owner, "ギフトがありません!"); 
    } // エラーメッセージを返す
}


default
{
    state_entry()
    { // まずはじめに
        gift_set();
    }
 // コンテンツの中身をリスト化する

    changed(integer change)
    {
 // プリムの何かが変わったとき
        if (change & CHANGED_INVENTORY)
        {  // 変わったのがコンテンツの内容だったら
            llResetScript();
        } 
// スクリプトをリセット
    }

    touch_start(integer total_number)
    { // タッチしたとき
        key id = llDetectedKey(0); // タッチしたアバターのキーを取得する
        if (gift_list == [])
        { // ギフトが何も入ってなかったら
           
llInstantMessage(id, "Sorry, The gift is not set."); // エラーメッセージを返す
            return;
        }
        if (llSameGroup(id))
        {  // グループが一致したら
            llGiveInventoryList(llDetectedKey(0), llGetObjectName(), gift_list); // ギフトの入ったフォルダを渡す
            llInstantMessage(id, "Please receive the group gift.");  // アバターにメッセージを送信
            llInstantMessage(
owner, "グループギフトを "+llKey2Name(id)+" さんに渡しました");  // オーナーに報告
        }
        else
        {  // グループが一致しなかったら
            llInstantMessage(id, "Wrong active group. Please activate our group tag and touch again.");

        } // エラーメッセージを返す
    }
}


-----------------------------------------------------


※1 参考 Second Life Wiki http://wiki.secondlife.com/wiki/LlGiveInventoryList/ja
引用 "警告
この関数は 3.0 秒間、スクリプトを停止します。
target が オーナーでなく、オーナーと共有もしておらず, かつ inventory が謙譲不可能の場合、 DEBUG_CHANNEL でエラーが叫ばれます。
inventory がコピー可能でない場合、 エラーがDEBUG_CHANNEL 上で叫ばれます。
target がプリムで同じ地域でない場合、 DEBUG_CHANNEL でエラーが叫ばれます。
スクリプトが持ち物間でコピーまたは移動された場合、これらの State は引き継がれません。メモリやイベントキューや実行位置は全て破棄されます。
inventory がプリムの中で見つからない場合、エラーが DEBUG_CHANNEL 上で叫ばれます。"
llGetInventoryPermMask のところで、『PERM_TRANSFER 且つ PERM_COPY』 としたかったのですが、つなぎ方が分からず if を重ねることにしました
もしお分かりの方がいらっしゃいましたら是非教えてください!


しかし・・・ SLの中でコピーしたスクリプトをそのままブログにペーストするとものすごく見づらいことになるのね。。。
勉強になりました

0 コメント:

コメントを投稿

TOP