Difference between revisions of "LlGetParcelPrimOwners/ja"
From Second Life Wiki
Mako Nozaki (Talk | contribs) 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 名分までです。 |
− | + | |func_footnote=パーセルの所有者に準じた権限が必要です。 | |
− | + | ||
− | + | ||
− | + | ||
|spec | |spec | ||
|caveats= | |caveats= | ||
Line 17: | Line 14: | ||
|constants | |constants | ||
|examples= | |examples= | ||
− | < | + | <source lang="lsl2"> |
// Script by Falados Kapuskas | // Script by Falados Kapuskas | ||
− | // | + | // オブジェクトの区画内プリムのオーナー参照権限はそのオブジェクトのオーナーがもつ権限と同じになります。 |
− | // | + | // (土地情報 >> オブジェクト >> オブジェクトのオーナー ) |
− | // | + | // 例: グループオブジェクトを返却できない場合は、グループオブジェクトを参照することができません。 |
− | // | + | // オブジェクトを何も返却できない場合は、空のリストが返ります。 |
− | // | + | // プリムが適切なグループに移譲されていると、常に全ての一覧が表示されるはずです。 |
− | // | + | // 注意: オーナーが同じ SIM にいるときだけうまくいきます。 |
− | // | + | // オブジェクトが移譲されていると、常にうまくいきます (グループは常にオンラインだから?) |
− | // -- | + | // -- 設定 (ここを編集してね!) -- // |
− | integer REFRESH_TIMER = 600; // | + | integer REFRESH_TIMER = 600; // 更新間隔 (秒単位) |
− | vector PARCEL_POS = <128,128,0>; // | + | vector PARCEL_POS = <128,128,0>; // 区画内にある位置をリージョン座標で指定 |
− | integer PAGE_SIZE = 8; // | + | integer PAGE_SIZE = 8; // プリムで 1 ページに表示するオーナーの数 |
− | integer DATA_TIMEOUT = 10; // | + | integer DATA_TIMEOUT = 10; // dataserver イベントのタイムアウト秒数 |
− | // -- | + | // -- 設定ここまで -- // |
list gQueryKeys; | list gQueryKeys; | ||
Line 49: | Line 46: | ||
integer gPageMax; | integer gPageMax; | ||
− | // | + | //プリムのオーナーの内部リストを更新します。 |
− | // | + | //プリムのオーナーがリストにあったら TRUE を返します。 |
− | // | + | //プリムのオーナーのリストが空であったら FALSE を返します。 |
integer UpdateOwnerList() | integer UpdateOwnerList() | ||
{ | { | ||
list owner_prim = llGetParcelPrimOwners(PARCEL_POS); | list owner_prim = llGetParcelPrimOwners(PARCEL_POS); | ||
− | // | + | //リストが空の場合は、区画内にプリムがないか、リストの取得に失敗しています。 |
− | // | + | //後者のほうが可能性としては高いでしょう。 |
if( owner_prim == [] ) | if( owner_prim == [] ) | ||
{ | { | ||
Line 65: | Line 62: | ||
integer n = llGetListLength(owner_prim) / 2; | integer n = llGetListLength(owner_prim) / 2; | ||
− | // | + | //リストをリセットします。 |
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 == "" ) { // | + | if( name == "" ) { //SIM にいません |
− | // | + | //問い合わせリストを追加します。 |
gNames += ["[Unknown]"]; | gNames += ["[Unknown]"]; | ||
gQueryIndex += [llGetListLength(gNames) - 1]; | gQueryIndex += [llGetListLength(gNames) - 1]; | ||
Line 93: | Line 90: | ||
− | // | + | // プリムオーナーを 9×ページ数のインデックスから表示します |
− | // | + | // さらにページがあるときは TRUE |
− | // | + | // もうないときは FALSE |
integer ShowPrimOwners(integer page) | integer ShowPrimOwners(integer page) | ||
{ | { | ||
Line 117: | Line 114: | ||
} | } | ||
− | // | + | // 設定フェーズ |
default | default | ||
{ | { | ||
Line 133: | Line 130: | ||
} | } | ||
} | } | ||
− | // | + | // エラーがあれば、タッチするとリセットします |
touch_start(integer i){llResetScript();} | touch_start(integer i){llResetScript();} | ||
} | } | ||
− | // | + | // リストを表示します |
− | // | + | // タッチでページをめくります |
state display | state display | ||
{ | { | ||
Line 160: | Line 157: | ||
} | } | ||
− | // | + | // 現在 SIM にいない人の名前を全て検索します |
− | // | + | // 終了したら display ステートに遷移します |
state lookup | state lookup | ||
{ | { | ||
Line 194: | Line 191: | ||
timer() | timer() | ||
{ | { | ||
− | // | + | //スキップして続行します |
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 ); | ||
} | } | ||
− | }</ | + | }</source> |
|helpers | |helpers | ||
|also_functions | |also_functions | ||
Line 207: | Line 204: | ||
|notes | |notes | ||
|permission | |permission | ||
− | |cat1=Parcel | + | |cat1=Parcel |
− | |cat2=Owner | + | |cat2=Owner |
|cat3 | |cat3 | ||
|cat4 | |cat4 | ||
}} | }} |
Latest revision as of 14:38, 25 February 2016
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
Contents
警告
- この関数は 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 ); } }
特記事項
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。