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

2009/06/20

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を押す

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

次に続く

0 コメント: