User:Cow Taurog/Interceptor

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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
    }
}