Adsense

2011年5月1日日曜日

[LSL] 変更されたノートカードを探す

この数年、、、できないと思い込んでいたことが、今日できることに気がつきました!
オブジェクトのインベントリの中の「ノートカード」。これ、もう最初から「タイムスタンプとかないし、どれ修正したかわからない」と思い込んでいたんです。
で、スクリプトが扱うノートカードの制限ってあるにかしら?と思い wiki を見ていたら、、、「ノートカードは不変」の項目を見つけ、、、。
できるじゃん!!!!私、これ4~5年は無理だとあきらめてたのにっ!
wiki のノートカードの説明
つまり、、、修正した時点で実は新しいオブジェクトとなり、Key が変わる!ってことなんです。それだと修正されたノートカードがどれかわかりますね!
で、書いてみた~。
list noteKey = [];
list noteList = [];
integer noteNum;
init(){
    noteKey = noteList = [];
    noteNum = llGetInventoryNumber(INVENTORY_NOTECARD);
    if(noteNum>0){
        integer i = 0;
        for(;i<noteNum;++i){
            string tName = llGetInventoryName(INVENTORY_NOTECARD,i);
            noteList += tName;
            noteKey += llGetInventoryKey(tName);
        }
        llWhisper(0,(string)llGetListLength(noteList)+"個のノートカードをインベントリでチェック可能です。");
    }else{
        llWhisper(0,"ノートカードはインベントリにありませんでした。");
    }
}
default{
    state_entry(){
        init();
    }
    touch_start(integer total_number){
        llSay(0, "Touched.");
    }
   
    changed(integer change){
        if(change & CHANGED_INVENTORY){
            integer tNum = llGetInventoryNumber(INVENTORY_NOTECARD);
            llWhisper(0,(string)tNum+","+(string)noteNum);
            //追加
            if(tNum>noteNum){
                llWhisper(0,"ノートカードが追加されました。");
                init();
            }else if(tNum<noteNum){
                llWhisper(0,"ノートカードが削除されました。");
                init();
            }else if(tNum==noteNum){
                llWhisper(0,"ノートカードが変更されました。");
                integer i = 0;
                for(;i<noteNum;++i){
                    string tName = llGetInventoryName(INVENTORY_NOTECARD,i);
                    if(llListFindList(noteKey,[llGetInventoryKey(tName)])==-1){
                        llWhisper(0,tName+"が変更されました。");
                        i=noteNum;
                    }
                }
                init();
            }
        }
    }
}

先入観って怖いわ。。。