LlTakeControls/ja

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

要約

関数: llTakeControls( integer controls, integer accept, integer pass_on );

スクリプトが権限をもつエージェントのキーボードやマウスのクリックを、具体的には controls で指定したものを、傍受させます。

• integer controls CONTROL_* フラグのビットフィールド
• integer accept 真偽値。 control イベントが発生するかを指定します。
• integer pass_on 真偽値。コントロールを操作不能にするかを指定します。

実行するには、llRequestPermissions による PERMISSION_TAKE_CONTROLS 権限が必要です。 acceptFALSEpass_onFALSE の場合、指定したコントロールは通常通りにふるまい、他のコントロールは全て操作不能になります。
acceptFALSEpass_onTRUE の場合、全てのコントロールは通常通りにふるまいます。
acceptTRUEpass_onFALSE の場合、指定したコントロールは操作不能となり (しかし control イベントは発生する) 、他のコントロールは全て通常通りにふるまいます。
acceptTRUEpass_onTRUE の場合、指定したコントロールは control イベントを発生させ、全てのコントロールは通常通りふるまいます。

定数 説明
CONTROL_FWD 0x00000001 前進 (W)
CONTROL_BACK 0x00000002 後進 (S)
CONTROL_LEFT 0x00000004 左移動 (⇧ Shift-⇧ Shift-A [マウスルックならば A])
CONTROL_RIGHT 0x00000008 右移動 (⇧ Shift-⇧ Shift-D [マウスルックならば D])
CONTROL_ROT_LEFT 0x00000100 左回転 (A)
CONTROL_ROT_RIGHT 0x00000200 右回転 (D)
CONTROL_UP 0x00000010 上昇 (PgUpE)
CONTROL_DOWN 0x00000020 下降 (PgDnC)
CONTROL_LBUTTON 0x10000000 マウス左クリック
CONTROL_ML_LBUTTON 0x40000000 マウスルック中のマウス左クリック
(undocumented) 0x02000000 Avatar left rotation detected. Triggers llGetAnimation == "Turning Left"
(undocumented) 0x04000000 Avatar right rotation detected. Triggers llGetAnimation == "Turning Right"

警告

  • 権限の自動付与に頼らないようにしましょう。常に run_time_permissions イベントを使用しましょう。
  • スクリプトに PERMISSION_TAKE_CONTROLS の権限が不足していると、スクリプトはエラーを DEBUG_CHANNEL で叫び、操作に失敗します (しかしスクリプトは処理を続けます)。
  • PERMISSION_TAKE_CONTROLS 権限が付与された後は、スクリプトの中で (llReleaseControls か、新しい llRequestPermissions の呼び出しにより)、もしくはユーザがビューワから「キー制御を解除」を選択することで、権限をはく奪することができます。そうでなければ、スクリプトはオブジェクトが derez (削除、取り外し、取り込み) されない限り権限が失われません。

Important Issues

~ All Issues ~ Search JIRA for related Bugs
   llTakeControls overrides existing controls

サンプル

default
{
    state_entry()
    {
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);
    }
    run_time_permissions(integer perm)
    {
        if(PERMISSION_TAKE_CONTROLS & perm)
        {
            llTakeControls(
                            CONTROL_FWD |
                            CONTROL_BACK |
                            CONTROL_LEFT |
                            CONTROL_RIGHT |
                            CONTROL_ROT_LEFT |
                            CONTROL_ROT_RIGHT |
                            CONTROL_UP |
                            CONTROL_DOWN |
                            CONTROL_LBUTTON |
                            CONTROL_ML_LBUTTON |
                            0, TRUE, TRUE);
                            // | 0 は編集上の都合で、
                            // マスクを変更することはありません
        }
    }
    control(key id, integer level, integer edge)
    {
        integer start = level & edge;
        integer end = ~level & edge;
        integer held = level & ~edge;
        integer untouched = ~(level | edge);
        llOwnerSay(llList2CSV([level, edge, start, end, held, untouched]));
    }
}

注意点

スクリプトがコントロールを取得すると、そのスクリプトや、同じプリムに入っている他のスクリプトは、エージェントが「スクリプト禁止」の土地に入っても停止しません。これは、乗り物のコントロールを動作させ、 AO を機能させるためにあります。これは、意図した仕様です。

関連項目

イベント

•  run_time_permissions 権限取得イベント
•  control

関数

•  llGetPermissions 付与されている権限を取得します
•  llGetPermissionsKey 権限を許可したエージェントを取得します
•  llRequestPermissions 権限を要求します
•  llReleaseControls

記事

•  権限/スクリプト

特記事項

All Issues

~ Search JIRA for related Issues
   llTakeControls overrides existing controls

Signature

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