LlCreateLink/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

関数: llCreateLink( key target, integer parent );

スクリプトの入っているオブジェクトと target のリンクを試みます。

• key target 同じ 地域 にある プリムUUID
• integer parent FALSE の場合、target はルートプリムになります。 TRUE の場合、スクリプトが入っているオブジェクトがルートプリムになります。

実行するには、llRequestPermissions による PERMISSION_CHANGE_LINKS 権限がオーナーから与えられなければなりません。 target は編集可能で同一オーナーが所有するものでなければなりません。
このオブジェクトは編集可能でなければなりません。

仕様

子プリムになるオブジェクト (parentTRUE の場合は targetparentFALSE の場合はスクリプトが入っているオブジェクト) は親となるオブジェクトのリンクセットに 2 から始まるリンク番号で挿入されます。例えば、親となるオブジェクトのリンク順が A1, A2, A3 で、子となるオブジェクトのリンク順が B1, B2, B3 である場合、できあがったオブジェクトのリンク順は A1, B1, B2, B3, A2, A3 となります。

警告

  • この関数は 1.0 秒間、スクリプトを停止します。
  • 権限の自動付与に頼らないようにしましょう。常に run_time_permissions イベントを使用しましょう。
  • スクリプトに PERMISSION_CHANGE_LINKS の権限が不足していると、スクリプトはエラーを DEBUG_CHANNEL で叫び、操作に失敗します (しかしスクリプトは処理を続けます)。
  • PERMISSION_CHANGE_LINKS がオーナー以外の人から許可され、関数が呼び出されると、 DEBUG_CHANNEL でエラーが叫ばれます。
  • いったん PERMISSION_CHANGE_LINKS 権限が付与されると、スクリプトの中で (例えば、新しい llRequestPermissions 呼び出しなどにより) 権限をはく奪することができません。スクリプトはオブジェクトが derez (削除、取り外し、取り込み) されない限り権限が失われません。
  • target が地域にない場合、プリムでない場合、アバターが装着している場合、エラーが DEBUG_CHANNEL で叫ばれます。
  • オブジェクトと target のどちらかが編集可能でない場合や双方のオーナーが異なる場合、エラーが DEBUG_CHANNEL で叫ばれます。
  • 親となるオブジェクトと target が離れすぎていると (物理的な大きさによって決まる) 、リンクに失敗します。
  • アタッチメントの内にあるスクリプトからこの関数が呼び出された場合、エラーを出さずに失敗します。

サンプル

// 新しいオブジェクトを作成し、子プリムとしてリンクします。
string ObjectName = "Object Name Here";
// 注意: オブジェクトのインベントリにあるオブジェクトの名前でなければなりません。

default
{
    touch_start(integer count)
    {
        // オブジェクトがタッチされると、できるかどうかを試す前に確認します。
        llRequestPermissions(llGetOwner(), PERMISSION_CHANGE_LINKS);
    }
    run_time_permissions(integer perm)
    {
        // リンクできるのであれば、ひと手間かけてオブジェクトを rez します。
        if (perm & PERMISSION_CHANGE_LINKS)
            llRezObject(ObjectName, llGetPos() + <0,0,0.5>, ZERO_VECTOR, llGetRot(), 0);
        else
            llOwnerSay("Sorry, we can't link.");
    }
    object_rez(key id)
    {
        // 注意: 状況によっては動作しない場合があります。
        // これは親オブジェクトです。新しく作った子とリンクします。
        llCreateLink(id, TRUE);
    }
}

便利なスニペット

// 子プリムのキー
key kChild = NULL_KEY;
integer bLink = TRUE;       // このスクリプトはリンクされるオブジェクトにあることが前提です
default
{
    
    state_entry()
    {
        // リンクを変更する許可を得ます
        llRequestPermissions(llGetOwner(), PERMISSION_CHANGE_LINKS);
                
        // 子プリムのキーを取得します
        kChild = llGetLinkKey(2);
    }
    
    
    touch_start(integer nTotalCliquor)
    {
        if (bLink)
        {
            // 自分のリンクを全て解除し、1.5 秒待機します
            llBreakAllLinks();
            llSleep(1.5);
            
            // リンクが解除されました
            llSay(0, "Unlinked, click to link");
            bLink = FALSE;
        }
        else
        {
            // リンクをやり直します
            llCreateLink(kChild, TRUE);   
            llSleep(1.5);
            
            // リンクしました
            llSay(0, "Linked, click to unlink");
            bLink = TRUE;
        }
    }
}

関連項目

イベント

•  run_time_permissions 権限取得イベント
•  changed CHANGED_LINK

関数

•  llGetPermissions 付与されている権限を取得します
•  llGetPermissionsKey 権限を許可したエージェントを取得します
•  llRequestPermissions 権限を要求します
•  llBreakLink リンクを解除します
•  llBreakAllLinks 全てのリンクを解除します

記事

•  権限/スクリプト
•  リンク規則

特記事項

Search JIRA for related Issues

Signature

function void llCreateLink( key target, integer parent );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。