2007年10月30日
座り立ち制御モジュールver.2.01
sitModule links

座り立ち制御モジュールに機能を追加しました。(もう)
◆できる事◆
・1モジュールで複数のアバタを制御できます。
・アバタが座った時にイベントが取れます。
・アバタが立った時にイベントが取れます。
・アバタの位置を移動できます
・アバタの回転角度を変更できます
・座っているアバタを強制的に立たせる事ができます
・オブジェクトに座ることをできなくできます。(座った際すぐさまに立たせる)
実際の使用例は次のエントリーで。
モジュールソースはエントリーの最後に。

座り立ち制御モジュールに機能を追加しました。(もう)
◆できる事◆
・1モジュールで複数のアバタを制御できます。
・アバタが座った時にイベントが取れます。
・アバタが立った時にイベントが取れます。
・アバタの位置を移動できます
・アバタの回転角度を変更できます
・座っているアバタを強制的に立たせる事ができます
・オブジェクトに座ることをできなくできます。(座った際すぐさまに立たせる)
実際の使用例は次のエントリーで。
モジュールソースはエントリーの最後に。
使用できる命令 追加分
◆任意のアバタの位置を指定する
harayoki.setAvatarPosをlinkMessage経由で送ります。
プリム内ローカル座標を命令の後ろに半角スペースをはさんで文字列として並べます。
アバタのキー値はlinkMessageの引数に含めてください。
ex)
vector v = <1,1,2>;
llMessageLinked(LINK_SET,0,"harayoki.setAvatarPos "+(string)v,(key)"caade896-b36c-4480-aa50-8d5dc5f00ddc");
◆任意のアバタの回転角度を指定する
harayoki.setAvatarRotをlinkMessage経由で送ります。
ローテーションの値を命令の後ろに半角スペースをはさんで文字列として並べます。
アバタのキー値はlinkMessageの引数に含めてください。
ex)
rotation r = llEuler2Rot(<0,0,PI>);
llMessageLinked(LINK_SET,0,"harayoki.setAvatarRot "+(string)r,(key)"caade896-b36c-4480-aa50-8d5dc5f00ddc");
◆任意のアバタの位置と角度を同時に指定する
ばらばらに指定すると実行に時間がかかるので、同時に指定する場合はこちらを使います。
harayoki.setAvatarPosAndRotをlinkMessage経由で送ります。
プリム内ローカル座標とローテーションを"|"でつなげた文字列を
命令の後ろに半角スペースをはさんで並べます。(この辺がしょぼい…けど美しくするつもりはない;)
アバタのキー値はlinkMessageの引数に含めてください。
ex)
vector v = <1,1,2>;rotation r = llEuler2Rot(<0,0,PI>);
string s = (string)v+"|"+(string)r;
llMessageLinked(LINK_SET,0,"harayoki.setAvatarPosAndRot "+s,(key)"caade896-b36c-4480-aa50-8d5dc5f00ddc");
※他の命令・イベントは#3を見てください。
モジュールソース
◆任意のアバタの位置を指定する
harayoki.setAvatarPosをlinkMessage経由で送ります。
プリム内ローカル座標を命令の後ろに半角スペースをはさんで文字列として並べます。
アバタのキー値はlinkMessageの引数に含めてください。
ex)
vector v = <1,1,2>;
llMessageLinked(LINK_SET,0,"harayoki.setAvatarPos "+(string)v,(key)"caade896-b36c-4480-aa50-8d5dc5f00ddc");
◆任意のアバタの回転角度を指定する
harayoki.setAvatarRotをlinkMessage経由で送ります。
ローテーションの値を命令の後ろに半角スペースをはさんで文字列として並べます。
アバタのキー値はlinkMessageの引数に含めてください。
ex)
rotation r = llEuler2Rot(<0,0,PI>);
llMessageLinked(LINK_SET,0,"harayoki.setAvatarRot "+(string)r,(key)"caade896-b36c-4480-aa50-8d5dc5f00ddc");
◆任意のアバタの位置と角度を同時に指定する
ばらばらに指定すると実行に時間がかかるので、同時に指定する場合はこちらを使います。
harayoki.setAvatarPosAndRotをlinkMessage経由で送ります。
プリム内ローカル座標とローテーションを"|"でつなげた文字列を
命令の後ろに半角スペースをはさんで並べます。(この辺がしょぼい…けど美しくするつもりはない;)
アバタのキー値はlinkMessageの引数に含めてください。
ex)
vector v = <1,1,2>;rotation r = llEuler2Rot(<0,0,PI>);
string s = (string)v+"|"+(string)r;
llMessageLinked(LINK_SET,0,"harayoki.setAvatarPosAndRot "+s,(key)"caade896-b36c-4480-aa50-8d5dc5f00ddc");
※他の命令・イベントは#3を見てください。
モジュールソース
// SitAvManagerModule ver 2.01
//2007/7/29 リリース
//2007/8/6 setEnabled追加
//2007/10/30 ver2.00 child prim数を見張る制御に変更
// モジュールが一つですむようになった
//2007/10/30 ver2.01 アバタの位置と角度を指定できるようになった
//~ プリム数を監視して、アバタの座る、立つを制御します。
//~ 子プリムを動的に追加・削除した場合は正しく動かなくなります。
integer debug = FALSE;
Trace(string s){
//debug = TRUE;
if(debug) llOwnerSay(s);
}
string MODULE_NAME ="SitAvManagerModule2";
string EVENT_NAME1 = "harayoki.event.avatarSit";
string EVENT_NAME2 = "harayoki.event.avatarUnSit";
string EVENT_SEP = " ";
string COMMAND_NAME1 = "harayoki.avatarUnSit";
//integer ARGUMNET_LENGTH1 = 0;
string COMMAND_NAME2= "harayoki.setSitEnabled";
//integer ARGUMNET_LENGTH2 = 0;
string COMMAND_NAME3= "harayoki.sitModuleReset";
//integer ARGUMNET_LENGTH3 = 0;
string COMMAND_NAME4= "harayoki.setAvatarPos";
integer ARGUMNET_LENGTH4 = 1;
string COMMAND_NAME5= "harayoki.setAvatarRot";
integer ARGUMNET_LENGTH5 = 1;
string COMMAND_NAME6= "harayoki.setAvatarPosAndRot";
integer ARGUMNET_LENGTH6 = 1;
string ARGUMENT_SEP = " ";
list MyString2List(string s,string sep,integer len){
list res = [];
list l = llParseString2List(s,[sep],[]);
integer listLen = llGetListLength(l);
integer i;
if(len<=0) return res;
if(listLen<len) for(i=0;i<len-listLen;i++) l += [""];
for(i=0;i<-1+len;i++) res += [llList2String(l,i)];
res += llDumpList2String(llList2List(l,i,-1),sep);
return res;
}
integer IsMyCommand(string s,string cmd){
return (s==cmd) || (llSubStringIndex(s+ARGUMENT_SEP,cmd+ARGUMENT_SEP)==0);
}
list GetArguments(string s,integer argLen){
return MyString2List(s,ARGUMENT_SEP,argLen+1);
}
DispatchSitEvent(key av){
string s = EVENT_NAME1;//+EVENT_SEP;
llMessageLinked(LINK_SET,0,s,av);
}
DispatchUnSitEvent(key av){
string s = EVENT_NAME2;//+EVENT_SEP;
llMessageLinked(LINK_SET,0,s,av);
}
//**
//* 初期化
//*/
Init(){
Trace(MODULE_NAME+" Initialized.");//この時点でアバタは座っていないこと
UnSitAllAvatar();
avatars = [];
noUnsitEventAvatars =[];
primNum = llGetNumberOfPrims();
lastPrimNum = primNum;
SetSitEnabled(TRUE);//個別は不可能に
}
integer primNum;//元もとのプリム数
integer lastPrimNum;//ワーク用アバタを含めたプリム数
list avatars;//アバタ一覧
integer bEnabled = FALSE;//座らせるのが可能な状態か?
list noUnsitEventAvatars;//強制unsit(enabled==FALSE時)の際、イベントを投げないように用意したアバタリスト
//**
//* 今座ってる人たちのキー一覧を得る
//*/
list GetKeys(){
list res = [];
integer len= llGetNumberOfPrims();
integer i;
integer startIndex = 1;
if(len==1) startIndex = 0;
for(i = startIndex+primNum;i<len+startIndex;i++){
//string name = llGetLinkName(i);
key id = llGetLinkKey(i);
res += [id];
}
return res;
}
//**
//* リンク数が変更された
//*/
OnChangeLink(){
//Trace("OnChangeLink");
integer len = llGetNumberOfPrims();
if(lastPrimNum>len){
OnDecLink();
}else if(lastPrimNum<len){
OnAddLink();
}
lastPrimNum = len;
}
//**
//* リンク数が減った
//*/
OnDecLink(){
//Trace("OnDecLink");
integer i;
list keys = GetKeys();
integer len = llGetListLength(avatars);
for(i = 0;i<len;i++){
key id = llList2Key(avatars,i);
integer index = llListFindList(keys,[id]);
if(index==-1){
OnUnsitAvatar(id);
}
}
avatars = keys;
Trace("avatars :"+llList2CSV(avatars));
}
//**
//* リンク数が増えた
//*/
OnAddLink(){
//Trace("OnAddLink");
integer i;
list keys = GetKeys();
integer len = llGetListLength(keys);
for(i = 0;i<len;i++){
key id = llList2Key(keys,i);
integer index = llListFindList(avatars,[id]);
if(index==-1){
OnSitAvatar(id);
}
}
avatars = keys;
Trace("avatars :"+llList2CSV(avatars));
}
//**
//* 座ったアバタが増えた
//*/
OnSitAvatar(key id){
//Trace("sit av:"+llKey2Name(id));
if(bEnabled){
DispatchSitEvent(id);
}else{
UnSitAvatar(id,TRUE);
}
}
//**
//* 座ったアバタが減った
//*/
OnUnsitAvatar(key id){
//Trace("unsit av:"+llKey2Name(id));
integer index = llListFindList(noUnsitEventAvatars,[id]);
if(index==-1){
DispatchUnSitEvent(id);
}else{
noUnsitEventAvatars = llDeleteSubList(noUnsitEventAvatars,index,index);
Trace("No Unsit Event for "+llKey2Name(id)+"\n"+"noUnsitEventAvatars :"+llList2CSV(noUnsitEventAvatars));
}
}
//**
//* 座ることが可能か不可能かを切り替える
//* @param b 真偽値
//*/
SetSitEnabled(integer b){
Trace("SetSitEnabled "+(string)b);
if(bEnabled==b) return;
bEnabled = b;
}
//**
//* 座ることが可能か不可能かを切り替える
//* @param id アバタのキー
//* @param noEvent イベントを通知しない場合TRUE
//*/
UnSitAvatar(key id,integer noEvent){
if(!noEvent) Trace("UnSitAvatar "+llKey2Name(id));
integer i= llGetNumberOfPrims();
if(i<=primNum) return;
i++;
integer bLoop = TRUE;
while(bLoop){
i--;
key id2 = llGetLinkKey(i);
//Trace((string)i+"unshit?"+llKey2Name(id2));
if(i <= primNum){
bLoop = FALSE;
}else if(id==id2){
//Trace("unshit:"+llKey2Name(id));
if(noEvent){
noUnsitEventAvatars += [id];
}
llUnSit(id);//llBreakLinkではダメ
bLoop = FALSE;
}
}
}
//**
//* 全てのアバタを立たせる
//*/
UnSitAllAvatar(){
Trace("UnSitAllAvatar");
integer i= llGetNumberOfPrims();
if(i<=primNum) return;
i++;
integer bLoop = TRUE;
while(bLoop){
i--;
key id = llGetLinkKey(i);
//Trace((string)i+" unshit?"+llKey2Name(id));
if(i <= primNum){
bLoop = FALSE;
}else{
//Trace("unshit:"+llKey2Name(id));
llUnSit(id);//llBreakLinkではダメ
}
}
}
//**
//* アバタの位置と角度を指定する
//*/
SetPosAndRot(key id,string pos_s,string rot_s){
Trace("SetPosAndRot "+llKey2Name(id)+" pos:'"+pos_s+"' rot:'"+rot_s+"'");
integer i= llGetNumberOfPrims();
if(i<=primNum) return;
i++;
integer bLoop = TRUE;
while(bLoop){
i--;
key id2 = llGetLinkKey(i);
if(i <= primNum){
return;
}else if(id==id2){
bLoop = FALSE;
}
}
list param = [];
if(pos_s!=""){
vector v = (vector)pos_s;
param += [PRIM_POSITION ,v];
Trace("pos:"+(string)v);
}
if(rot_s!=""){
rotation r = (rotation)rot_s;
param+=[PRIM_ROTATION ,r];
Trace("rot:"+(string)r);
}
llSetLinkPrimitiveParams(i,param);//ここで0.2秒かかる
}
default{
state_entry(){
Init();
}
on_rez(integer num){
Init();
}
link_message(integer sender,integer num,string mes,key id){
if(IsMyCommand(mes,COMMAND_NAME1)){
if(id==NULL_KEY){
UnSitAllAvatar();
}else{
UnSitAvatar(id,FALSE);
}
}else if(IsMyCommand(mes,COMMAND_NAME2)){
SetSitEnabled(num);
}else if(IsMyCommand(mes,COMMAND_NAME3)){
Init();
}else if(IsMyCommand(mes,COMMAND_NAME4)){
list arguments = GetArguments(mes,ARGUMNET_LENGTH4);
SetPosAndRot(id,llList2String(arguments,1),"");
}else if(IsMyCommand(mes,COMMAND_NAME5)){
list arguments = GetArguments(mes,ARGUMNET_LENGTH5);
SetPosAndRot(id,"",llList2String(arguments,1));
}else if(IsMyCommand(mes,COMMAND_NAME6)){
list arguments = GetArguments(mes,ARGUMNET_LENGTH6);
//↓vectorやrotationには半角スペースおよびコンマが混じってしまうので違うセパレータを使う必要がある
list arguments2 = llParseString2List(llList2String(arguments,1),["|"],[]);
SetPosAndRot(id,llList2String(arguments2,0),llList2String(arguments2,1));
}
}
changed(integer ch){
if(ch& CHANGED_LINK){
OnChangeLink();
}
}
}
座り立ち制御モジュールver.2 サンプル2
座り立ち制御モジュールver.2 サンプル
座り立ち制御モジュールver.2
イスに座る立つを制御するモジュール(2)サンプル
イスに座る立つを制御するモジュール(1)
座り立ち制御モジュールver.2 サンプル
座り立ち制御モジュールver.2
イスに座る立つを制御するモジュール(2)サンプル
イスに座る立つを制御するモジュール(1)
Posted by harayoki at 13:04│Comments(0)
│sit動作の制御