User:Cow Taurog/Interceptor
< User:Cow Taurog
Jump to navigation
Jump to search
Revision as of 14:37, 5 April 2015 by Cow Taurog (talk | contribs)
<lsl> float gfFreq=0.01; // The scanning speed float gfRange=15; // The scanning range vector gvOffset=<2,0,0>; // Shield plate offset from the avatar float gfTolerance=0.05; // The sensitivity for detecting speed (anything slower than this is considered to be still) float gfInnerLimit=0.95; // Object is too close, don't intercept to avoid putting panels through you integer giChan=74347; integer listen0; integer giStatus;
default{
link_message(integer sender,integer num,string mess,key id){ if(mess=="getstatus"){if(id=="interceptor"){llMessageLinked(LINK_SET,1,"status|interceptor|"+(string)giStatus,"status");}} if(llToLower(mess)=="touched"){if(id=="interceptor"){state running;}} } state_entry(){ giStatus=0; llMessageLinked(LINK_SET,1,"status|interceptor|"+(string)giStatus,"status"); }
} state running{
link_message(integer sender,integer num,string mess,key id){ if(mess=="getstatus"){if(id=="interceptor"){llMessageLinked(LINK_SET,1,"status|interceptor|"+(string)giStatus,"status");}} if(llToLower(mess)=="touched"){if(id=="interceptor"){llMessageLinked(LINK_SET,1,"status|interceptor|0","status");llOwnerSay("Interceptors off.");state default;}} if(llToLower(mess)=="held"){if(id=="interceptor"){ listen0=llListen(giChan,"","",""); llSetTimerEvent(30); llTextBox(llGetOwner(),"Say sensor range and rez distance seperated by commas\n(i.e. 15,2)\nRange: "+(string)llRound(gfRange)+"m, Rez distance: "+(string)llRound(gvOffset.x)+"m",giChan); }} } changed(integer change){if(change&CHANGED_OWNER){llResetScript();}} state_entry(){ giStatus=1; llMessageLinked(LINK_SET,1,"status|interceptor|1","status"); llOwnerSay("Interceptors on. Scan range: "+(string)llRound(gfRange)+"m. Intercept distance: "+(string)llRound(gvOffset.x)+"m."); llSensorRepeat("","",AGENT|ACTIVE,gfRange,PI,gfFreq); } timer(){llListenRemove(listen0);llSetTimerEvent(0);} listen(integer chan,string name,key id,string mess){if(llGetOwnerKey(id)==llGetOwner()){if(mess!=""){ list lR=llParseString2List(mess,[",","|","/"],[]); gfRange=(float)llList2String(lR,0); if((float)llList2String(lR,1)>10){llOwnerSay("The maximum inctercept distance is 10m.");gvOffset=<10,0,0>;} else{gvOffset=<(float)llList2String(lR,1),0,0>;} llSensorRepeat("","",AGENT|ACTIVE,gfRange,PI,gfFreq); llOwnerSay("Sensor range is now "+(string)llRound(gfRange)+"m, rez distance is now "+(string)llRound(gvOffset.x)+"m."); llListenRemove(listen0); }}} sensor(integer num){ integer x; integer i; for(i=0;i<num;i++){if(llDetectedOwner(i)!=llGetOwner()){ // if not the owner's if(llVecMag(llDetectedVel(i))>gfTolerance){ //if moving //if(llVecDist(llGetPos(),llDetectedPos(i))>=gvOffset.x){ if(llVecDist(llGetPos(),llDetectedPos(i))<=(gvOffset.x*PI)){ //*2 if(llVecDist(llGetPos(),llDetectedPos(i))<gvOffset.x){ // inner shield // vector vCloseOffset=<((llVecMag(llGetPos()-llDetectedPos(i)))/1),0,0>; ///pos/2 if(llVecDist(llGetPos(),llGetPos()+(<vCloseOffset.x,0,0>*llGetRot()*llRotBetween(<1.33,0,0>*llGetRot(),llDetectedPos(i)-llGetPos())))>gfInnerLimit){ // Inner shield llRezObject("Shield panel", llGetPos()+(<vCloseOffset.x-0.375,0,0>*llGetRot()*llRotBetween(<1.33,0,0>*llGetRot(),llDetectedPos(i)-llGetPos())), ZERO_VECTOR, llGetRot()*llRotBetween(<1.33,0,0>*llGetRot(),llDetectedPos(i)-llGetPos()),4 ); // Outer shield llRezObject("Shield panel", llGetPos()+(<vCloseOffset.x-0.25,0,0>*llGetRot()*llRotBetween(<1.33,0,0>*llGetRot(),llDetectedPos(i)-llGetPos())), ZERO_VECTOR, llGetRot()*llRotBetween(<1.33,0,0>*llGetRot(),llDetectedPos(i)-llGetPos()),4 ); return; } }} if(llVecMag(llDetectedVel(i))>gfTolerance){ // perimeter shield llRezObject("Shield panel", llGetPos()+(gvOffset*llGetRot()*llRotBetween(<1.33,0,0>*llGetRot(),llDetectedPos(i)-llGetPos())), ZERO_VECTOR, llGetRot()*llRotBetween(<1.33,0,0>*llGetRot(),llDetectedPos(i)-llGetPos()), 4); llRezObject("Shield panel", llGetPos()+((gvOffset+<0.125,0,0>)*llGetRot()*llRotBetween(<1.33,0,0>*llGetRot(),llDetectedPos(i)-llGetPos())), ZERO_VECTOR, llGetRot()*llRotBetween(<1.33,0,0>*llGetRot(),llDetectedPos(i)-llGetPos()), 4); } // distance check } // moving check }} // loop and owner check }
} </lsl>