Second Lifeで気に入ったアイテムの記録です あ、ウソです。スクリプトとか他のことも書いてます

2009/06/20

Persimmonは柿です。Permissionの話(3/3)

Caroline Green Satin Ensemble by INSOLENCE
刑事物語のDVD出ますね。
「違うー!木のやつー!」ですよ。
って、このセリフの出るやつかな、どうかな

前回と今回は
スクリプトの出力を載せてますんで
文字サイズ小さくしたり
なんか工夫して見やすくしてください。

そうさ、見る気のある人だけ見ればいいさ




さて、ここからが本番です。

■重複 Yes/Yes(その1)
[22:55]  Object: state_entry perm[0] name[] key[00000000-0000-0000-0000-000000000000]
○you Xiao touch
[22:55] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:55] Object: llRequestPermissions
○you Xiao ダイアログ放置

●you Pizzicato touch
[22:56] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:56] Object: llRequestPermissions
●you Pizzicato ダイアログ放置

○you Xiao Yes押す
メッセージ出ません
●you Pizzicato Yes押す
[22:56] Object: run_time_permissions perm[16] name[you Pizzicato] key[a64ee0a7-3cf6-40f9-bb33-1138cf8be7d7]

ほー、こうなるんだ
llRequestPermissionsした瞬間、その前のllRequestPermissionsは無効ですか


■重複 Yes/Yes(その2)
[22:57]  Object: state_entry perm[0] name[] key[00000000-0000-0000-0000-000000000000]
○you Xiao touch
[22:57] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:57] Object: llRequestPermissions
○you Xiao ダイアログ放置

●you Pizzicato touch
[22:58] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:58] Object: llRequestPermissions
●you Pizzicato Yes押す
[22:58] Object: run_time_permissions perm[16] name[you Pizzicato] key[a64ee0a7-3cf6-40f9-bb33-1138cf8be7d7]

○you Xiao Yes押す
メッセージでません
この結果は、その1から考えても想像できますよね

一応、No/Yesもやっておきます

■重複 No/Yes
[22:59]  Object: state_entry perm[0] name[] key[00000000-0000-0000-0000-000000000000]
○you Xiao touch
[22:59] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:59] Object: llRequestPermissions
○you Xiao ダイアログ放置

●you Pizzicato touch
[23:00] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[23:00] Object: llRequestPermissions
●you Pizzicato No押す
[23:00] Object: run_time_permissions perm[0] name[you Pizzicato] key[a64ee0a7-3cf6-40f9-bb33-1138cf8be7d7]

○you Xiao Yes押す
メッセージでません
やはり、llRequestPermissionsした後の結果に関係なく
llRequestPermissionsを実行したら、前のは無効ってことですじゃのう


なるほどなぁ
理解が深まりましたよ、ほんとに。

えーと、あれだ
「2.無視して別の人の権限要求をする」でいいのかってことでしたね。
結論としては、
「最後のllRequestPermissionsだけが有効なので、それでいいさ」ってことですかね
ダイアログを押すタイミングは問題じゃありませんでした。

あ、ついでに補足実験
「llGetPermissionsKeyは、いつ変わるのか
 要求した瞬間変わってんじゃねーの?」です。

default
{
state_entry()
{
llOwnerSay("state_entry perm["+(string)llGetPermissions()
+"] name["+llKey2Name(llGetPermissionsKey())
+"] key["+(string)llGetPermissionsKey()+"]");
}
touch_start(integer total_number)
{
llOwnerSay("touch_start perm["+(string)llGetPermissions()
+"] name["+llKey2Name(llGetPermissionsKey())
+"] key["+(string)llGetPermissionsKey()+"]");

llRequestPermissions(llDetectedKey(0),PERMISSION_TRIGGER_ANIMATION);
llOwnerSay("llRequestPermissions");
llOwnerSay("touch_start perm["+(string)llGetPermissions()
+"] name["+llKey2Name(llGetPermissionsKey())
+"] key["+(string)llGetPermissionsKey()+"]");
}
run_time_permissions( integer perm )
{
llOwnerSay("run_time_permissions perm["+(string)perm
+"] name["+llKey2Name(llGetPermissionsKey())
+"] key["+(string)llGetPermissionsKey()+"]");
}
}


これはダイアログが押された時っぽいです
[0:41]  Object: state_entry perm[0] name[] key[00000000-0000-0000-0000-000000000000]
○you Xiao touch
[0:41] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[0:41] Object: llRequestPermissions
[0:41] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
○you Xiao Yes押す
[0:42] Object: run_time_permissions perm[16] name[you Xiao] key[f7d1fc77-08ac-47e1-8881-e9d9e03194e7]

Persimmonは柿です。Permissionの話(2/3)

Caroline Ivory Satin Ensemble by INSOLENCE
駐車場の隣の田んぼから
カエルの鳴き声がします。

カエルは、種類を問わず苦手です。
カエルというか、両生類・爬虫類
実は鳥類も苦手です。
哺乳類もちょっとやばいかもしれない。
イヌ・ネコ程度が限界です。

ということで、基本的な動作確認からやってみます。




※冗長かもしれませんが、毎回resetしています

■権限要求にYesする
[22:49]  Object: state_entry perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:49] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:49] Object: llRequestPermissions
[22:49] Object: run_time_permissions perm[16] name[you Xiao] key[f7d1fc77-08ac-47e1-8881-e9d9e03194e7]
普通に権限とれてますね。これはわかります。


■権限要求にNoする
[22:50]  Object: state_entry perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:50] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:50] Object: llRequestPermissions
[22:50] Object: run_time_permissions perm[0] name[you Xiao] key[f7d1fc77-08ac-47e1-8881-e9d9e03194e7]
え、こうなんの?
run_time_permissionsそのものがこないのかと思ってた。
つまり、権限はとれなくても、「その人への権限要求はやったよ」ってことになるの?

ここにはこんなふうになってます。
http://wiki.secondlife.com/wiki/LlGetPermissionsKey
「Returns a key that is the agent that permissions are enabled for.
 NULL_KEY if not enabled.]

ここでちょっといやな予感がしてきました。

一応、muteもやってみます。

■権限要求にMuteする
[22:50]  Object: state_entry perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:50] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:50] Object: llRequestPermissions
[22:50] Object: run_time_permissions perm[0] name[you Xiao] key[f7d1fc77-08ac-47e1-8881-e9d9e03194e7]
これは想像できましたが、スクリプトの反応そのものはNoと一緒なんですね。

さて、ここから二人体制です。
と、いっても片方はAltです。
登場人物はyou Xiaoとyou Pizzicatoです。

■順番にYes
[22:51]  Object: state_entry perm[0] name[] key[00000000-0000-0000-0000-000000000000]
○you Xiao touch
[22:51] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:51] Object: llRequestPermissions
○you Xiao Yes押す
[22:51] Object: run_time_permissions perm[16] name[you Xiao] key[f7d1fc77-08ac-47e1-8881-e9d9e03194e7]

●you Pizzicato touch
[22:51] Object: touch_start perm[16] name[you Xiao] key[f7d1fc77-08ac-47e1-8881-e9d9e03194e7]
[22:51] Object: llRequestPermissions
●you Pizzicato Yes押す
[22:51] Object: run_time_permissions perm[16] name[you Pizzicato] key[a64ee0a7-3cf6-40f9-bb33-1138cf8be7d7]
まあ、これはそうなるでしょうね。普通です。

■順番にNo
[22:51]  Object: state_entry perm[0] name[] key[00000000-0000-0000-0000-000000000000]
○you Xiao touch
[22:52] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:52] Object: llRequestPermissions
○you Xiao No押す
[22:52] Object: run_time_permissions perm[0] name[you Xiao] key[f7d1fc77-08ac-47e1-8881-e9d9e03194e7]

●you Pizzicato touch
[22:52] Object: touch_start perm[0] name[you Xiao] key[f7d1fc77-08ac-47e1-8881-e9d9e03194e7]
[22:52] Object: llRequestPermissions
●you Pizzicato No押す
[22:52] Object: run_time_permissions perm[0] name[you Pizzicato] key[a64ee0a7-3cf6-40f9-bb33-1138cf8be7d7]
これも、そらそーだって感じです。

ということで、次の実験が、さっきの「イヤな予感」です。
you XiaoがYesした後、
you PizzicatoがNoするってパターンです。

■順番にYes/No
[22:52]  Object: state_entry perm[0] name[] key[00000000-0000-0000-0000-000000000000]
○you Xiao touch
[22:53] Object: touch_start perm[0] name[] key[00000000-0000-0000-0000-000000000000]
[22:53] Object: llRequestPermissions
○you Xiao Yes押す
[22:53] Object: run_time_permissions perm[16] name[you Xiao] key[f7d1fc77-08ac-47e1-8881-e9d9e03194e7]

●you Pizzicato touch
[22:53] Object: touch_start perm[16] name[you Xiao] key[f7d1fc77-08ac-47e1-8881-e9d9e03194e7]
[22:53] Object: llRequestPermissions
●you Pizzicato No押す
[22:53] Object: run_time_permissions perm[0] name[you Pizzicato] key[a64ee0a7-3cf6-40f9-bb33-1138cf8be7d7]
やっぱり、こうなんだ...
念のため、you Xiaoがタッチしてみます
[22:53]  Object: touch_start perm[0] name[you Pizzicato] key[a64ee0a7-3cf6-40f9-bb33-1138cf8be7d7]
[22:53] Object: llRequestPermissions
[22:53] Object: run_time_permissions perm[0] name[you Xiao] key[f7d1fc77-08ac-47e1-8881-e9d9e03194e7]
つまり、llRequestPermissionsを実行すると
そのYes/Noの結果に関係なく、
llGetPermissionsKeyとllGetPermissionsが返す値は変わるってことみたいです。

なんとなく、「Yesで権限とれた場合のみ変わる」という認識でした。
うへー

続く

Persimmonは柿です。Permissionの話(1/3)

Caroline Taupe Satin Ensemble by INSOLENCE
もうyouはblogをやめたのかという噂も
流れてるような気もしますが
単にコード書きとエロ画像収集に忙しかっただけです。
※ここんところ、文字ばっかりなので
 画像をつっこんでおきます










先週のOH(※1)では、midoriさんの記事(※2)から、
スクリプト管理(LnkMsgの量などの部分)にちらっと触れました。
この手の複数スクリプト管理は、すでに何度もやってるんですが、
権限がからむのはやったことがなかったので
ちょっとそそられてしまいました。

※1 Scripters Cafe
http://scripterscafe.slmame.com/
http://ja.secondlife.wikia.com/wiki/Scripters_cafe

※2 シンクロダンスボールのまとめ
分割しなければならないスクリプト4
http://midorin.slmame.com/e647638.html

ということで、今回はちょっとPermissionの話です。
  ※Permissionそのものについては例のごとく割愛
  ※これは先日、iNNXの大将と実験してた結果をまとめるために、再実験したものです

スクリプトを書いていると、いろんなところで権限が必要になります。
で、そのオブジェクトを身につけていたり、座っていたりすると
許可を得ずに権限をとることができます(PERMISSION_DEBIT等は別)。

ところが、身につけていないアイテムの場合
こんなダイアログが出ます。







私は、この「他人の権限を要求する」というアイテムを
ほとんど作ったことがなかったので
今まで深く考えたことがなかったのです。
今回、ちょっと考えてみたんですが、
なんだかすんなりいかない気がしてきました。

たとえば、タッチすると、権限の要求をするオブジェクトがあるとします。

こんなコードです。※誤解の余地がないように、かなりベタにしてあります
default
{
state_entry()
{
llOwnerSay("state_entry perm["+(string)llGetPermissions()
+"] name["+llKey2Name(llGetPermissionsKey())
+"] key["+(string)llGetPermissionsKey()+"]");
}
touch_start(integer total_number)
{
llOwnerSay("touch_start perm["+(string)llGetPermissions()
+"] name["+llKey2Name(llGetPermissionsKey())
+"] key["+(string)llGetPermissionsKey()+"]");

llRequestPermissions(llDetectedKey(0),PERMISSION_TRIGGER_ANIMATION);
llOwnerSay("llRequestPermissions");
}
run_time_permissions( integer perm )
{
llOwnerSay("run_time_permissions perm["+(string)perm
+"] name["+llKey2Name(llGetPermissionsKey())
+"] key["+(string)llGetPermissionsKey()+"]");
}
}

気になったのは「誰かがタッチしてダイアログを放置した場合」です。
llDialogなどはタイムアウト処理として
Listenを閉じてしまえばいいのですが
権限要求の場合、タイムアウトするにはどうすればいいのか
この場合のタイムアウトにはいくつかの処理が考えられます。

1.なんらかの方法で権限要求をなかったことにする
2.無視して別の人の権限要求をする

まず、1.ですが、結果的にいうと、スマートな方法はないようです。
  portalをじっくり見るまでは、こんなこと考えてました。

A)NULL_KEYに対して権限要求してみる
  llRequestPermissions(NULL_KEY,PERMISSION_TRIGGER_ANIMATION);
   →エラーになります
      "Unable to find specified agent to request permissions."

B)ゼロを権限要求してみる
  llRequestPermissions(llDetectedKey(0),0);
   →権限要求そのものが発生しません
    ダイアログがでませんでした。

llGetPermissionsのところに、jiraへのlinkがはられていました。
"Unable to release permissions" https://jira.secondlife.com/browse/SVC-1006
「とった権限をリリースする方法がねぇよ」って感じかな

これに関してはStrife Onizukaがこんなコメントつけてます
「Try this instead, It might work.
 llRequestPermissions(llGetOwner(), 1)」
 ※この1っていうのは、ここにもUnknownですが書いてありますね

 ああ、無効な権限の要求するのね、ゼロじゃダメなのかとやってみたら
 こんなダイアログでました。ちょっとヘンですね。








タイムアウトのたびに、ダイアログ出すわけにもいきません。

今のところの結論としては、スクリプトをresetするしかないようです。
何かいい方法をご存知の方はコメントでもください。

さて、2.なのですが、これは実験する前にこんなことを妄想してました。

ある人(Xiao)がタッチ
 ↓
ダイアログ出る
 ↓
寝落ち
  ↓
別の人(Pizzicato)がタッチ
  ↓
ダイアログ出る
  ↓
Yes押す
  ↓
Xiaoがハッと目覚めて、Yesを押す

これはどうなるんだろう...

次に続く