integer sensorsize = 5; //センサー範囲 float sensorinterval = 5; //センサー周期 integer ownerchannel = 199; //命令用チャンネル integer maxlistlength = 5; //リストの最大長 list visitorlist = [];//来訪者リスト integer nowvisitors = 0;//現在の来訪者 string lastdate;//記録開始日時 string lasttime; string nowdate;//現在の日時 string nowtime; integer i; key ownerid;//オーナ-(所有者)のID string addZero(integer num) {//数字を強制的に2ケタの文字に return(llGetSubString("0"+(string)num , -2 , -1)); } string getClock() {//現在のグリニッジ標準時を文字列で得る integer nowsec = (integer)llGetGMTclock(); integer hour = nowsec / 3600; integer minute = (nowsec % 3600) / 60; integer second = nowsec % 60; return (addZero(hour)+":"+addZero(minute)+":"+addZero(second)); } checkAndAddList(key id) { //if (id != ownerid) {//リストからオーナーを除きたければ、このコメントを外す string name = llKey2Name(id); integer foundnum = llListFindList(visitorlist , [name]); if (foundnum == -1) { visitorlist = visitorlist + [name]; nowvisitors ++; } //} integer nowvl = llGetListLength(visitorlist); if (nowvl > maxlistlength) { visitorlist = llDeleteSubList(visitorlist , 0 , nowvl - maxlistlength - 1); } } resetList() { visitorlist = []; //reset list lastdate = nowdate; lasttime = nowtime; nowvisitors = 0; } string dumpList() { return (llDumpList2String(visitorlist , ","));//\n")); } dumpList2Chat() { integer listlength = llGetListLength(visitorlist); string chatlist = ""; for(i = 0 ; i < listlength ; i++) { string tempchatlist = llList2String(visitorlist , i); //コンマがつくので1023-1=1022文字が上限 if ((llStringLength(chatlist)+llStringLength(tempchatlist))>=1022) { llOwnerSay(chatlist); chatlist = tempchatlist; } else { chatlist = chatlist + "," + tempchatlist; } } if (chatlist != "") { llOwnerSay(chatlist); } } default { state_entry() { llSetText("Visitor Sensor Sample" , <1,1,1>,1); ownerid = llGetOwner(); llListen(ownerchannel , "" , ownerid , ""); llSensorRepeat("", NULL_KEY,AGENT,sensorsize,PI,sensorinterval); lastdate = llGetDate(); lasttime = getClock(); nowvisitors = 0; } on_rez(integer num) { llResetScript(); } sensor(integer totalnum) { integer i; //反応した全員のIDをcheckAndAddListに送る for (i = 0 ; i < totalnum ; i++) { checkAndAddList(llDetectedKey(i)); } } listen(integer channel, string name, key id, string message) { nowdate = llGetDate(); nowtime = getClock(); if (message == "reset") { resetList(); } else if (message == "dump") { llOwnerSay("visitor list from "+lastdate+" "+lasttime+" to "+ nowdate+" "+nowtime+" visitors="+(string)nowvisitors); //llOwnerSay(dumpList()); dumpList2Chat(); } } }