もう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 コメント:
コメントを投稿