2010年2月25日木曜日

(LSL)リログした時、llGetAgentLanguageで言語情報を取得できない

おはよーございます^^

昨日リリースしたアバターレーダー関連で遭遇したトラブルについてひとつ。

このアバターレーダー、今回の目玉機能の一つとしてバイリンガル対応ってのがあったんですけど、バイリンガルに自動対応するには、そのオブジェクトを装備した人がどんな言語でビューアを使っているか調べる必要があるんですね。で、そういった情報を知るために、LSLではllGetAgentLanguageって関数が用意されています。で、私もその関数を使って言語情報を取得することにしたんですが・・・・これがすべての苦労の始まり^^;

どんな苦労をしたのか・・・

HUDを装着したときにはちゃんと言語情報を取得できるんです。ところが、そのオブジェクトを画面に貼り付けたままリログすると、さっき取得できてたはずの言語情報がリセットされちゃってる。。。
日本語以外のビューアを使っている場合は英語モードになるような設定にしてるんですけど、リログすると英語モードに変化しちゃってるんです。何回やっても結果は同じ。
いろいろ調べてみましたが、似たような事例は見つからないし。。。結構悩みました。で、簡単なスクリプトを組んで実証実験w

default
{
attach(key attached)
{
llSetText(llGetAgentLanguage(attached),<1,1,1>,1);
}
}

こんなソースのスクリプトを作りました。attachイベントでllGetAgentLanguage関数が取得した言語情報をフローティングテキストで表示する。。。ただそれだけのスクリプトです。attachイベントは、オブジェクトをアタッチしたときだけではなく、リログ時も動いてるっぽいので、このソースで実験です。

1)このソースを組み込んだオブジェクトを画面に装着。結果、「ja」と表示されます。
2)リログします。
3)画面のオブジェクトから「ja」の文字が消えて、空白になっちゃってます@@;

うーん、原因はこれだったのか・・・これって、リンデンのバグ???

いろいろ悩んだけど、いい解決法が見つからないので、こんな風にバグ回避の処置をとりました。

attach(key agent)
{
lang = llGetAgentLanguage(agent); // ビューアの言語情報を取得
if (lang != "") { // 言語情報がヌルだったら、言語設定の処理をスキップする
言語判定後の処理
}
}

オブジェクトをアタッチしたときには言語種別を取得できてるので、リログ時に言語情報がリセットされてしまわないよう、llGetAgentLanguage関数の戻り値がヌルだったら言語設定の処理を迂回するようにしました。
とりあえず、これで無事リログしても期待どおりの動きを続けることができました。
このバグの原因究明で丸一日(いや、それ以上かも??)、時間をつぶしてしまいました。。。orz

まだwebのどこにも情報がなかったようなので、とりあえず記録としてw(私が探し出せてないだけかもしれませんが^^;)

2 件のコメント:

  1. こんにちわです。 同じような状況、経験ありますw

    私の場合はネタアイテムなので、言語確認が必要な時にその都度関数を呼んで確認という普通なら怒られそうな冗長なコードで対応しましたw

    JIRAにも情報があり
    https://jira.secondlife.com/browse/VWR-8910

    Fix Pendingなのでそのうち直るかなぁ~ と淡い期待ですw

    返信削除
  2. こんばんはー^^
    コメント頂いてるの気がつかなくて申し訳ありません><

    やっぱり、同じような経験した方がいらしたんですねー。ちょっと安心しました?^^;

    そうですかぁ。。。JIRAにもインシデント上がってたんですねぇ。。。ほんと、早く直ってほしいですね^^

    返信削除