電想蟹記

Secondlife

電想蟹記

土地が変わると結果が変わる問題

同じスクリプトを使ってるのに、できる場所とできない場所があります。

ちなみに素人なので変なことを言ってるかもしれませんが

自分で調べたことをまとめました。

 

・やりたいこと

→オブジェクトAをタッチしたら、オブジェクトBがタッチした人に装着される。

(AはRezしてあり、それをタッチすると中に入ってるBが装着される感じ

 所有者かどうかに関わらず誰にでも装着させたい)

 

普通にやる方法がわからなかったんですが、「体験」を使えばできるということがわかったのでそれを使ってみることに。

Second Lifeでの体験 - 日本語 - Second Life Community

 

LlRequestExperiencePermissions/ja - Second Life Wiki

それでここにたどり着き、まずはそのままコピペしました。

でも、ある土地Aでは機能するのに別の土地Bでは機能しない。

 

とりあえず体験は後回しにして、

原因を突き止めるためにいろいろ削りました。

 

 HUD配布機用

default
{
          touch_start(integer num_detected)
         {
                   integer i = 0;
                   for(; i < num_detected; i++)
                   {
                           integer channel = llRound(llFrand(-1000));
                           llSay(0, "①" + (string)channel);
                           llRezObject(llGetInventoryName(INVENTORY_OBJECT, 0), llGetPos() + <0.0,0.0,-5.0>, ZERO_VECTOR, ZERO_ROTATION, channel);
                           llRegionSay(channel, "");
                    }
         }
}
 
タッチすると
integer channel = llRound(llFrand(-1000));
↑-1~-1000の数字(Xとする)がランダムでひとつchannelに代入される
llSay(0, "①" + (string)channel); ←目印。全チャでチャンネル数Xを発言
llRezObject(llGetInventoryName(INVENTORY_OBJECT, 0), llGetPos() + <0.0,0.0,-5.0>, ZERO_VECTOR, ZERO_ROTATION, channel);
↑5m下にオブジェクトをRez 引数にはチャンネル数Xが入る
llRegionSay(channel, ""); ←これなに?
 
Rezされるオブジェクト用
default
 {
          on_rez(integer start_parameter)
          { // Rezzer からのメッセージを受信開始します
                   llListen(start_parameter, "", NULL_KEY, "");
                   llSay(0, "②" + (string)start_parameter);
          }

           listen(integer channel, string name, key id, string message)
           { // Rezzer からのメッセージを、対象となるエージェントのキーを使用して受信します
                  llSay(0, "③" + (string)channel);
           }
}
 
Rezされた時(integer start_parameterは引数(=チャンネル数X))
llListen(start_parameter, "", NULL_KEY, ""); Xの発言を聞く
llSay(0, "②" + (string)start_parameter); ←目印
 
listen(integer channel, string name, key id, string message) ←Xで発言があったとき
llSay(0, "③" + (string)channel); ←目印
 
 
こんな感じの意味だと思っております。
これを土地Aで試した場合

f:id:kanisawadayo:20200317162848p:plain

チャット欄には①②③がちゃんと発言されます。
 
しかし土地Bで試すと

f:id:kanisawadayo:20200317163025p:plain

②までしかでてきません。
なぜ???????????????????
 
③が出てこないってことはlistenで聞けてないんだなってのはわかりますが
原因が全くわかりません。
 
ちなみに、
llRegionSay(channel, "");
を消すとどちらの土地でも②までしかでてきません。
llRegionSay(channel, ""); がどこに関わってるのかよくわかりません。
 
 

Second Life Maps | Sandbox - Weapons testing (no damag

↑のサンドボックでは成功するのでお暇でしたら試してください・・・。

 

 


 

追記

解決しました。

Second Life Status - Scripted Objects

 

要するにバグで土地のラグによって順番が前後しちゃうらしい。

で、発信が早くなるなら遅らせればいいってことで

HUD配布機用

default
{
          touch_start(integer num_detected)
         {
                   integer i = 0;
                   for(; i < num_detected; i++)
                   {
                           integer channel = llRound(llFrand(-1000));
                           llSay(0, "①" + (string)channel);
                           llRezObject(llGetInventoryName(INVENTORY_OBJECT, 0), llGetPos() + <0.0,0.0,-5.0>, ZERO_VECTOR, ZERO_ROTATION, channel);
                           llSleep(3.0);
                           llRegionSay(channel, "");
                    }
         }
}
 

 Sleep入れました。単純!!!

というわけで無事解決しました。みんなありがとう!!!