Difference between revisions of "LlGetParcelPrimOwners/ja"

From Second Life Wiki
Jump to navigation Jump to search
m (カテゴリ変更)
 
(4 intermediate revisions by 2 users not shown)
Line 2: Line 2:
|func_id=324|func_sleep=2.0|func_energy=10.0
|func_id=324|func_sleep=2.0|func_energy=10.0
|func=llGetParcelPrimOwners|return_type=list|p1_type=vector|p1_name=pos
|func=llGetParcelPrimOwners|return_type=list|p1_type=vector|p1_name=pos
|func_desc
|func_desc='''pos''' のパーセルでオブジェクトを所有する住人の UUID とその所有プリム数のリストを返します。<br />リストは [ key agentKey1, integer agentCount1, key agentKey2, integer agentCount2, ... ] といった形式になります。[[UUID/ja|キー]] に応じてソートされ、最大で 100 名分までです。
|return_text='''pos''' のパーセルでオブジェクトを所有する住人の UUID とその所有プリム数のリスト
|func_footnote=パーセルの所有者に準じた権限が必要です。
|func_footnote=
* 戻り値は [ key agentKey1, integer agentCount1, key agentKey2, integer agentCount2, ... ] といった形式になります。[[UUID|key]] に応じてソートされ、最大で 100 名分までです。
* パーセルの所有者に準じた権限が必要です。
|spec
|spec
|caveats=
|caveats=
Line 17: Line 14:
|constants
|constants
|examples=
|examples=
<lsl>
<source lang="lsl2">
// Script by Falados Kapuskas
// Script by Falados Kapuskas


// The object has the same permisions to view prim parcel owners
// オブジェクトの区画内プリムのオーナー参照権限はそのオブジェクトのオーナーがもつ権限と同じになります。
// as its owner (In About Land >> Objects >> Object Owners )
// (土地情報 >> オブジェクト >> オブジェクトのオーナー )


// Example: If you can't return group object, you won't see group objects
// : グループオブジェクトを返却できない場合は、グループオブジェクトを参照することができません。
// If you can't return any objects, an empty list will be returned.
// オブジェクトを何も返却できない場合は、空のリストが返ります。
// If the prim is deeded to the right group, it should always get a full list
// プリムが適切なグループに移譲されていると、常に全ての一覧が表示されるはずです。


// Note: Only works when the when the owner is in the Sim
// 注意: オーナーが同じ SIM にいるときだけうまくいきます。
//      Deeded objects always work (group is always online?)
//      オブジェクトが移譲されていると、常にうまくいきます (グループは常にオンラインだから?)


// -- SETTINGS (Edit These!) -- //
// -- 設定 (ここを編集してね!) -- //


integer REFRESH_TIMER = 600;            // Refresh Time (in seconds)
integer REFRESH_TIMER = 600;            // 更新間隔 (秒単位)
vector  PARCEL_POS    = <128,128,0>;    // A Region coordinate of a point in the parcel
vector  PARCEL_POS    = <128,128,0>;    // 区画内にある位置をリージョン座標で指定
integer PAGE_SIZE    = 8;              // Number of owners to display per page on the prim
integer PAGE_SIZE    = 8;              // プリムで 1 ページに表示するオーナーの数
integer DATA_TIMEOUT  = 10;            // Number of seconds to wait before giving up on dataserver events
integer DATA_TIMEOUT  = 10;            // dataserver イベントのタイムアウト秒数


// -- END SETTINGS -- //
// -- 設定ここまで -- //


list gQueryKeys;
list gQueryKeys;
Line 49: Line 46:
integer gPageMax;
integer gPageMax;
   
   
//Updates the internal list of prim owners
//プリムのオーナーの内部リストを更新します。
//Returns TRUE if there were prim owners
//プリムのオーナーがリストにあったら TRUE を返します。
//Returns FALSE if the prim owner list was empty
//プリムのオーナーのリストが空であったら FALSE を返します。
integer UpdateOwnerList()
integer UpdateOwnerList()
{
{
     list owner_prim = llGetParcelPrimOwners(PARCEL_POS);
     list owner_prim = llGetParcelPrimOwners(PARCEL_POS);
     //Empty List either means no prims in the parcel
     //リストが空の場合は、区画内にプリムがないか、リストの取得に失敗しています。
     //Or we couldn't get the list.  The latter is more likely
     //後者のほうが可能性としては高いでしょう。
     if( owner_prim == [] )  
     if( owner_prim == [] )  
     {
     {
Line 65: Line 62:
     integer n = llGetListLength(owner_prim) / 2;
     integer n = llGetListLength(owner_prim) / 2;
      
      
     //Reset the lists
     //リストをリセットします。
     gPrims = [];
     gPrims = [];
     gNames = [];
     gNames = [];
Line 76: Line 73:
         key owner = llList2Key(owner_prim,i*2);
         key owner = llList2Key(owner_prim,i*2);
         string name = llKey2Name(owner);
         string name = llKey2Name(owner);
         if( name == "" ) { //Not in the sim
         if( name == "" ) { //SIM にいません
          
          
             //Add to the query list
             //問い合わせリストを追加します。
             gNames += ["[Unknown]"];
             gNames += ["[Unknown]"];
             gQueryIndex += [llGetListLength(gNames) - 1];
             gQueryIndex += [llGetListLength(gNames) - 1];
Line 93: Line 90:




// Shows the prim owners starting at index 9*page
// プリムオーナーを 9×ページ数のインデックスから表示します
// Returns TRUE if there are more pages
// さらにページがあるときは TRUE
// Returns FALSE otherwise
// もうないときは FALSE
integer ShowPrimOwners(integer page)
integer ShowPrimOwners(integer page)
{
{
Line 117: Line 114:
}  
}  


// Set-up phase
// 設定フェーズ
default
default
{
{
Line 133: Line 130:
         }
         }
     }
     }
     // If there is an error, touch to reset
     // エラーがあれば、タッチするとリセットします
     touch_start(integer i){llResetScript();}
     touch_start(integer i){llResetScript();}
}
}


// Display the list
// リストを表示します
// Allow page flipping via touch
// タッチでページをめくります
state display  
state display  
{
{
Line 160: Line 157:
}
}


// Look up all names for people that are not in the sim
// 現在 SIM にいない人の名前を全て検索します
// Go to the display state when finished
// 終了したら display ステートに遷移します
state lookup
state lookup
{
{
Line 194: Line 191:
     timer()
     timer()
     {
     {
         //Skip it, move on
         //スキップして続行します
         gQueryKeys = llDeleteSubList(gQueryKeys,0,0);
         gQueryKeys = llDeleteSubList(gQueryKeys,0,0);
         gQueryIndex = llDeleteSubList(gQueryIndex,0,0);
         gQueryIndex = llDeleteSubList(gQueryIndex,0,0);
         gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME );  
         gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME );  
     }
     }
}</lsl>
}</source>
|helpers
|helpers
|also_functions
|also_functions
Line 207: Line 204:
|notes
|notes
|permission
|permission
|cat1=Parcel/ja
|cat1=Parcel
|cat2=Owner/ja
|cat2=Owner
|cat3
|cat3
|cat4
|cat4
}}
}}

Latest revision as of 14:38, 25 February 2016

要約

関数: list llGetParcelPrimOwners( vector pos );

pos のパーセルでオブジェクトを所有する住人の UUID とその所有プリム数のリストを返します。
リストは [ key agentKey1, integer agentCount1, key agentKey2, integer agentCount2, ... ] といった形式になります。キー に応じてソートされ、最大で 100 名分までです。
list で返します。

• vector pos

パーセルの所有者に準じた権限が必要です。

警告

  • この関数は 2.0 秒間、スクリプトを停止します。
  • このスクリプトの入ったオブジェクトの所有者とパーセルの所有者が同じ場合は、(オブジェクトとパーセルが共にグループへ譲渡されている場合も含めて、) パーセル内の全てのオブジェクトの所有者を取得できます。
  • 上の条件に合致せず、かつパーセルがグループ所有の場合、
    • スクリプトの入ったオブジェクトの所有者が (グループ メンバーの能力として) 'グループ所有オブジェクトを返却' する権限を持っているならば、パーセルにグループ所有のオブジェクトがある限り、そのグループのリストを返します。
    • スクリプトの入ったオブジェクトの所有者が 'グループに設定されているオブジェクトを返却' する権限を持っているならば、パーセル内でそのグループに設定されたオブジェクトを所有する所有者のリストを返します。
    • スクリプトの入ったオブジェクトの所有者が '非グループ・オブジェクトを返却' する権限を持っているならば、上記のいずれの条件にも合致しないオブジェクトの所有者のリストを返します。
  • 上記のいずれにも合致しなかった場合、空のリストを返します。

サンプル

// Script by Falados Kapuskas

// オブジェクトの区画内プリムのオーナー参照権限はそのオブジェクトのオーナーがもつ権限と同じになります。
// (土地情報 >> オブジェクト >> オブジェクトのオーナー )

// 例: グループオブジェクトを返却できない場合は、グループオブジェクトを参照することができません。
// オブジェクトを何も返却できない場合は、空のリストが返ります。
// プリムが適切なグループに移譲されていると、常に全ての一覧が表示されるはずです。

// 注意: オーナーが同じ SIM にいるときだけうまくいきます。
//       オブジェクトが移譲されていると、常にうまくいきます (グループは常にオンラインだから?)

// -- 設定 (ここを編集してね!) -- //

integer REFRESH_TIMER = 600;            // 更新間隔 (秒単位)
vector  PARCEL_POS    = <128,128,0>;    // 区画内にある位置をリージョン座標で指定
integer PAGE_SIZE     = 8;              // プリムで 1 ページに表示するオーナーの数
integer DATA_TIMEOUT  = 10;             // dataserver イベントのタイムアウト秒数

// -- 設定ここまで -- //

list gQueryKeys;
list gQueryIndex;
list gNames;
list gPrims;

key gDataserver_Name;

integer gPageNumber;
integer gPageMax;
 
//プリムのオーナーの内部リストを更新します。
//プリムのオーナーがリストにあったら TRUE を返します。
//プリムのオーナーのリストが空であったら FALSE を返します。
integer UpdateOwnerList()
{
    list owner_prim = llGetParcelPrimOwners(PARCEL_POS);
    //リストが空の場合は、区画内にプリムがないか、リストの取得に失敗しています。
    //後者のほうが可能性としては高いでしょう。
    if( owner_prim == [] ) 
    {
        llSetText("[ERROR]\n Couldn't get Parcel Prim Owners",<1,0,0>,1.0);
        return FALSE;
    }
    integer i;
    integer n = llGetListLength(owner_prim) / 2;
    
    //リストをリセットします。
    gPrims = [];
    gNames = [];
    gQueryKeys = [];
    gQueryIndex = [];
    
    
    for( i = 0; i < n; ++i)
    {
        key owner = llList2Key(owner_prim,i*2);
        string name = llKey2Name(owner);
        if( name == "" ) { //SIM にいません
        
            //問い合わせリストを追加します。
            gNames += ["[Unknown]"];
            gQueryIndex += [llGetListLength(gNames) - 1];
            gQueryKeys += [owner];
        } else {
            gNames += [name];
        }
        gPrims += llList2Integer(owner_prim,i*2+1);
    }
    gPageNumber = 0;
    gPageMax = llCeil( (float)llGetListLength(gNames) / PAGE_SIZE );
    return TRUE;
}


// プリムオーナーを 9×ページ数のインデックスから表示します
// さらにページがあるときは TRUE
// もうないときは FALSE
integer ShowPrimOwners(integer page)
{
    integer len = llGetListLength(gNames);
    integer offset = len-page*PAGE_SIZE;
    if(  offset < 0 )
    {
        return FALSE;
    }
    integer i;
    

    integer end = (integer)( llListStatistics(LIST_STAT_MIN,[len,(page+1)*PAGE_SIZE]) );
    string text;
    for( i = PAGE_SIZE*page; i < end; ++i)
    {
        text += llList2String(gNames,i) + " - " + (string)llList2Integer(gPrims,i) + "\n";
    }
    llSetText(text,<1,1,1>,1.0);
    return TRUE;
} 

// 設定フェーズ
default
{
    state_entry()
    {
        llSetText("",<1,1,1>,1.0);
        if(UpdateOwnerList())
        {
            if( gQueryKeys == [] )
            {
                state display;
            } else {
                state lookup;
            }
        }
    }
    // エラーがあれば、タッチするとリセットします
    touch_start(integer i){llResetScript();}
}

// リストを表示します
// タッチでページをめくります
state display 
{
    state_entry()
    {
        ShowPrimOwners(gPageNumber);
        llSetTimerEvent(REFRESH_TIMER);
    }
    touch_start(integer i)
    {
        if( !ShowPrimOwners(++gPageNumber) )
        {
            gPageNumber = 0;
            ShowPrimOwners(0);
        }
    }
    timer()
    {
        state default;
    }
}

// 現在 SIM にいない人の名前を全て検索します
// 終了したら display ステートに遷移します
state lookup
{
    state_entry()
    {
        if( gQueryKeys == [] ) state display;
        llSetTimerEvent(DATA_TIMEOUT);
        gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME );
    }
    dataserver( key request_id, string data)
    {
        if( request_id == gDataserver_Name )
        {
            llSetText("Loading Names .. " + (string)llGetListLength(gQueryKeys),<1,.5,0>,1.0);
            if( llStringTrim(data,STRING_TRIM) != "" )
            {
                integer i = llList2Integer(gQueryIndex,0);
                gNames = llListReplaceList(gNames,[data],i,i);
            }
            gQueryKeys = llDeleteSubList(gQueryKeys,0,0);
            gQueryIndex = llDeleteSubList(gQueryIndex,0,0);
            
            if( gQueryKeys != [] )
            {
                llSetTimerEvent(DATA_TIMEOUT);
                gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME );
            } else {
                state display;
            }
        }
    }
    timer()
    {
        //スキップして続行します
        gQueryKeys = llDeleteSubList(gQueryKeys,0,0);
        gQueryIndex = llDeleteSubList(gQueryIndex,0,0);
        gDataserver_Name = llRequestAgentData( llList2Key(gQueryKeys,0) , DATA_NAME ); 
    }
}

特記事項

Search JIRA for related Issues

Signature

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