Changed/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.

説明

イベント: changed( integer change ){ ; }

オブジェクト・プリムに対してさまざまな変更が行われると、このイベントが発生します。

• integer change CHANGE_* フラグの ビットフィールド

複数の変更が 1 つのイベントで現れてくることもあります。このため、ビット演算を使用しましょう。

フラグの種類にかかわらず、SIMを越えると拾う現象が起きていますので、乗り物には使わないほうが無難です。

フラグ 説明
CHANGED_INVENTORY 0x001 プリムのインベントリが変わりました。 (オーナーが追加したインベントリだけ)
CHANGED_COLOR 0x002 プリムの色か透過度が変わりました。
CHANGED_SHAPE 0x004 プリムの形が変わりました。
CHANGED_SCALE 0x008 プリムのサイズが変わりました。
CHANGED_TEXTURE 0x010 プリムのテクスチャかテクスチャの属性が変わりました。
CHANGED_LINK 0x020 オブジェクトを構成するプリムの数が変わったか、オブジェクトの上に座っているアバターの数が変わりました。
CHANGED_ALLOWED_DROP 0x040 オーナー以外のユーザ (編集不可能な場合はオーナーも含む) がプリムにインベントリを追加しました。
CHANGED_OWNER 0x080 オブジェクトのオーナーが変わりました。
CHANGED_REGION 0x100 オブジェクトのある地域が変わりました。
CHANGED_TELEPORT 0x200 オブジェクトが 装着 されたままテレポートしました。
CHANGED_REGION_START 0x400 地域が今オンラインになりました。
CHANGED_MEDIA 0x800 プリムメディア が変更されました。

警告

changed イベントの中で state を離れる場合、state を変更する直前にさらに変更が行われていると、この state に戻ってきたときに changed イベントが発生することになります。例えば、

default
{
    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            integer links = 0;
            if(llGetObjectPrimCount(llGetKey()) < (links = llGetNumberOfPrims()))
            {
                llUnSit(llGetLinkKey(links));
                state whatever;
            }
            else
            llOwnerSay("リンクかリンク解除かされましたが、上には誰も座っていません。");
            // default ステートに戻ってきた後にこれがチャットされます。
        }
    }
}
state whatever
{
    state_entry()
    {
        llSetTimerEvent(10.0);//秒
    }
    timer()
    {
        state default;
    }
}

サンプル

default
{
    changed(integer change)
    {
        // & です。 && ではありません ... ビット演算子です!
        if (change & CHANGED_INVENTORY)         
        {
            llOwnerSay("インベントリが変わりました。");
        }
        if (change & CHANGED_COLOR) 
        {
            llOwnerSay("色か透過度が変わりました。");
        }
        if (change & CHANGED_SHAPE) 
        {
            llOwnerSay("プリムの形が変わりました。");
        }
        if (change & CHANGED_SCALE) 
        {
            llOwnerSay("プリムのサイズが変わりました。");
        }
        if (change & CHANGED_TEXTURE) 
        {
            llOwnerSay("プリムのテクスチャかテクスチャの属性が変わりました。");
        }
        if (change & CHANGED_LINK) 
        {
            llOwnerSay("リンクされているプリムの数が変わりました。");
        }
        if (change & CHANGED_ALLOWED_DROP) 
        {
            llOwnerSay("インベントリが編集権限のないユーザによって変更されました "+
                       "プリムにアイテムが落とされ、スクリプトはそれを許可しました。");
        }
        if (change & CHANGED_OWNER) 
        {
            llOwnerSay("オブジェクトのオーナーが変わりました。");
        }
        if (change & CHANGED_REGION) 
        {
            llOwnerSay("オブジェクトのある地域が変わりました。");
        }
        if (change & CHANGED_TELEPORT) 
        {
            llOwnerSay("オブジェクトが装着されたままテレポートしました。");
        }
        if (change & CHANGED_REGION_START) 
        {
            llOwnerSay("地域が今再起動されました。");
        }
    }
}

複数の変更で同じアクションが呼ばれたときのために、以下の構文を使用するとよいでしょう。

default
{
    changed(integer change)
    {
        if(change & (CHANGED_OWNER | CHANGED_INVENTORY)) // どちらかの変更で true が返ります。
            llResetScript();
    }
}

注意点

llGetOwner に " (change & CHANGED_OWNER) " の完全な考察が載っています。

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