土地が変わると結果が変わる問題
同じスクリプトを使ってるのに、できる場所とできない場所があります。
ちなみに素人なので変なことを言ってるかもしれませんが
自分で調べたことをまとめました。
・やりたいこと
→オブジェクト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, "");
}
}
}
{
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);
}
}
{
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で試した場合
チャット欄には①②③がちゃんと発言されます。
しかし土地Bで試すと
②までしかでてきません。
なぜ???????????????????
③が出てこないってことは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, "");
}
}
}
{
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入れました。単純!!!
というわけで無事解決しました。みんなありがとう!!!