
modular.segment
vector whereibelong;
vector howiamsupposedtobe;
string corename;
integer datachan=-72492424;
goto(vector destination){
integer ok=0;
do{
if(llGetPos()!=destination)
llSetPrimitiveParams([PRIM_POSITION, destination]);
else ok=1;
} while(ok==0);
}
default{
on_rez(integer param){
if(param!=0)
datachan=param;
}
state_entry(){
llListen(datachan,"","","");
}
listen(integer chan,string who,key id,string msg){
if(msg=="compilelist"){
corename=who;
state compilemode;
}
else if(msg=="reorient")
state orientmode;
else if(msg=="x")
llDie();
}
}
state compilemode{
state_entry(){
llSensor(corename,"",SCRIPTED,200,PI);
}
sensor(integer no){
vector originpos=llDetectedPos(0);
vector originrot=llRot2Euler(llDetectedRot(0))*RAD_TO_DEG;
whereibelong=originpos-llGetPos();
howiamsupposedtobe=originrot-llRot2Euler(llGetRot())*RAD_TO_DEG;
llShout(datachan,llGetObjectName());
state default;
}
}
state orientmode{
state_entry(){
llSensor(corename,"",SCRIPTED,200,PI);
}
sensor(integer no){
vector poopPos=llDetectedPos(0);
vector poopRot=llRot2Euler(llDetectedRot(0))*RAD_TO_DEG;
goto(poopPos-(whereibelong*llDetectedRot(0)));
llSetRot(llEuler2Rot((poopRot-howiamsupposedtobe)*DEG_TO_RAD));
state default;
}
}