2018年7月24日火曜日

[ゲーム:セカンドライフ]リンクナンバーと名前に関しての。


list LinkMap_list=["Link_map"];
       
integer LinkMax_integer = llGetNumberOfPrims();
llOwnerSay("Prims : " + (string)LinkMax_integer );

integer Loop_int;
list Sub_list;

LinkMax_integer += 1;
for(Loop_integer=1;Loop_integer<LinkMax_integer ;Loop_integer=-(~Loop_integer) ){
    LinkMap_list = (LinkMap_list = []) + LinkMap_list + llGetLinkPrimitiveParams(Loop_integer,[PRIM_NAME]);
}

integer i;
string Sub_str;
for(Loop_integer=1;Loop_integer<LinkMax_integer ;Loop_integer=-(~Loop_integer) ){
    llOwnerSay(llList2String(LinkMap_list,Loop_integer) );
}


~~~~~~~~


リスト:LinkMap_listにリンク順にプリムの名前を入れる処理です。


最初のオーナーセイは総プリム数確認の為だけなので省略可。


一つ目のfor分でLinkMap_listに名前を格納しています。
0にはダミーの"Link_map"を入れてあるので、1から順にリンクナンバーと同じ位置に名前が入ります。


二つ目のfor分はどう格納されたのか確認用に喋らせたものです。
実装するなら必要ありません。


リンクされていないオブジェは想定していません。
    if(1<lGetNumberOfPrims(); ){}
とでもやれば良いかとは思います。



〇取り出し方
・特定のリンクナンバーのプリムの名前が知りたい。

    string PrimName_string = llList2String(LinkMap_list,integer linknumber);

という感じでリンクバンバー指定でstringの取り出し。


・特定の名前のプリムのリンクナンバーを知りたい。

    string PrimName_string = "hoge";
    integer LinkNumber_integer;

    LinkNumber_integer = llListFindList(LinkMap_list,[PrimName_string]);


これでhogeという名前のプリムのリンクナンバーが分かります。

あとはこれを変数に入れておけば、hogeに対する処理は変数指定で行けるわけです。


注意点としては、オブジェ内に同名プリムが存在する場合、若い方のプリムのリンクナンバーしか取れないという事。なので基本的にプリム名は被らない方がいいです。


~~~~~


〇で、これ何に使うの?

リンクメッセージで送信したり、link系命令で親から子を操作する場合に、プリムの名前は判るんだけどリンクの仕方が変わったりしてリンクナンバーが変わっちゃったよ。幾つなのかもっかい調べて指定しなきゃってのを無くすために使います。

そして処理の度に取得してたら重いだけなので、リスト化し変数に入れ込んでおく処理を最初とかにしちゃうわけです。



~~~~~
という事でなにかしら作ってる際に有効な処理ではないでしょうか。

ぶっちゃけさ、editでリンクナンバーの管理を行えるUI入れろよとは思うんだけどねw



0 件のコメント:

コメントを投稿