User:Cow Taurog/Interceptor
< User:Cow Taurog
Jump to navigation
Jump to search
Revision as of 14:38, 5 April 2015 by Cow Taurog (talk | contribs)
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
}
}